【高并发服务器 01】—— 基础知识回顾

接下来四周时间,我将会做一个高并发服务器相关的项目。
前置知识:操作系统系统编程、网络编程、基础的数据结构、C语言。
开发环境:VMware虚拟机:Ubuntu 20.04.6 LTS、vscode
今天先回顾一些基础知识。

1.文件与IO

标准IO(缓冲IO)

  • fread->FILE*
  • fwrite
  • fclose

基础IO

  • open->fd
  • read(recv recvfrom)
  • write
  • close

一切接文件
缓冲池、线程池、连接池

非阻塞IO(nonblock)

  • 如何使用?
    • 如何设置一个非阻塞IO
    • O_NONBLOCK
  • 应用场景?
    • 返回-1:EAGAIN
    • 轮询地去查看IO是否完成
    • 或者使用IO多路复用机制:EPOLL(边缘模式、水平模式)

同步和异步

协议三要素:语法、语义、同步
异步适合于并发。

高级IO

  • select:select count(*) from fds where fd become ready;
  • poll
  • epoll

IO多路复用、IO感知、IO多路转接

selectpollepoll是Linux系统中用于实现IO多路复用的三种机制。它们允许程序同时监控多个文件描述符(file descriptor),以便知道哪个或哪些文件描述符已经准备好进行读写操作。这三种机制的发展体现了从简单到高效的递进关系。

1. select

  • 基本概念:`select`是最早的IO多路复用机制。它允许程序监控多个文件描述符,等待一个或多个文件描述符成为非阻塞状态。
  • 限制:
    • 它支持的文件描述符数量有限,通常受到FD_SETSIZE的限制,默认值通常是1024。
    • 每次调用`select`时,都需要把整个文件描述符集合从用户空间复制到内核空间,这在文件描述符数量较多时会造成较大的性能开销。
    • 每次调用返回时,需要遍历整个文件描述符集合来找出已经准备好的描述符,这也增加了额外的开销。

2. poll

  • 基本概念:`poll`提供了与`select`类似的功能,但解决了`select`的一些限制。
  • 改进:
    • `poll`使用链表而非固定大小的数组,因此不再受FD_SETSIZE的限制,可以监控更多的文件描述符。
    • 与`select`类似,`poll`也需要在每次调用时将整个文件描述符集合从用户空间复制到内核空间,并在返回时检查哪些文件描述符已准备就绪。

3. epoll

  • 基本概念:`epoll`是在Linux 2.6中引入的,它在性能和可扩展性方面对`select`和`poll`进行了显著的改进。
  • 改进:
    • `epoll`可以处理数以万计的并发连接,而不会显著降低性能。
    • 它通过在内核中使用一个事件表来避免每次调用时复制整个文件描述符集合的开销。只有当IO状态真正改变时,应用程序才需要与内核交互。
    • 支持两种模式:LT(水平触发)和ET(边缘触发)。ET模式可以进一步减少系统调用的次数,提高效率。
    • 只有准备就绪的文件描述符会被返回,减少了不必要的遍历。

从`select`到`poll`,再到`epoll`,这三种机制在设计上越来越高效和灵活。`select`和`poll`适合管理少量连接,而`epoll`适合处理大量并发连接,特别是在高性能服务器环境中。随着网络应用对高并发和高性能的需求不断增加,`epoll`成为了Linux下实现高效IO多路复用的首选方案。

2.进程

什么是进程?

程序的映像(image),实例(instance)、运行的程序,动态的、资源分配的基本单位(虚拟内存)、封闭性、独立性

程序、进程、线程、管程、协程的区别?

  • 程序(Program): 是一组指令和数据的集合,是静态的,存储在磁盘上,需要加载到内存中才能执行。
  • 进程(Process): 是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位,具有独立的内存空间和系统资源,进程之间相互独立。
  • 线程(Thread): 是进程中的实际执行单位,一个进程可以包含多个线程,线程共享进程的内存空间和系统资源,但拥有独立的执行路径。
  • 管程(Monitor): 是一种用于并发编程的同步机制,通过提供对共享资源的互斥访问和条件变量的支持来实现线程之间的协作。
  • 协程(Coroutine): 是一种轻量级的线程,可以在不同的执行路径之间切换,但不需要操作系统的支持,由程序员自行控制协程的调度。

fork干了什么事情?

pid判断谁是父亲,谁是孩子、统计信息等不同。
进程三大部分:PCB、数据段、程序段完全拷贝父进程。
写拷贝,如果不做修改,就不拷贝。进程采用段页式管理。拷贝只拷贝一页。
linux采用完全公平算法,放弃了时间片轮转算法。但是仍然具有时间片轮转调度算法的特点。所以往往是父进程先运行。不太可能刚好卡在时间片结束的时候创建子进程。

exec族函数

- p - path (路径): 使用环境变量`PATH`来查找可执行文件。
- v - vector (向量): 参数以字符串数组形式传递。
- l - list (列表): 参数逐个列出。
- e - environment (环境): 允许设置环境变量。

#include <stdio.h>
#include <unistd.h>int main() {// 使用execlp执行ls命令execlp("ls", "ls", "-l", NULL);// 使用execvp执行ps命令char *args[] = {"ps", "aux", NULL};execvp("ps", args);// 使用execl执行echo命令execl("/bin/echo", "echo", "Hello, World!", NULL);// 使用execve执行自定义程序char *cmd = "./custom_program";char *args[] = {"arg1", "arg2", NULL};char *env[] = {"PATH=/usr/bin", NULL};execve(cmd, args, env);// 如果exec函数执行成功,下面的代码将不会被执行perror("exec failed");return 1;
}

特殊进程

  • 孤儿进程:当一个父进程结束或终止时,它的子进程还在运行,这些还在运行的子进程就会变成孤儿进程。操作系统通常会让init进程(进程号为1的进程)接管这些孤儿进程。接管后,init进程将成为它们的新父进程,负责收集它们的退出状态。

  • 僵尸进程:当一个子进程结束运行,但其父进程尚未通过调用wait()或waitpid()函数来收集子进程的退出状态时,该子进程将成为僵尸进程。僵尸进程已经释放了大部分资源,不再执行任何代码,但在进程表中仍保留一个条目,直到父进程收集其状态信息。

  • 闲逛进程(空闲进程):在操作系统中,闲逛进程(也称为空闲进程或空转进程)是一个特殊的系统进程,当系统中没有其他可运行的进程时,它就会被执行。闲逛进程的主要目的是占用CPU,保证CPU不会处于空闲状态。在多数系统中,闲逛进程的进程号为0。

  • 守护进程:是一种在后台运行的特殊进程,它独立于控制终端,周期性地执行某种任务或等待处理某些发生的事件。守护进程通常在系统引导装入时启动,在系统关闭时终止。与普通的前台进程相比,守护进程的特点是独立于用户和终端,不与任何终端交互。

进程间通信

  • 基于文件的进程间通信
  • 共享内存(shmget、mmap数据的拷贝)
  • pipe(匿名、有名)
  • 条件变量:pthread_cond_signal、pthread_cond_wait(惊群效应)
  • 消息队列
  • socket
  • 信号

3.线程

 什么是线程?

Pthread(Process thread):共享性(共享的是进程空间、竞争、同步 & 互斥:PV操作、信号量)、调度的基本单位,虚拟处理器(让线程感觉自己独占CPU)。

用户线程 & 内核线程

内核能感知到线程吗?内核能感知到内核线程,但是感知不到用户线程。

线程模型

  • 1:1:频繁地对内核线程进行切换。
  • N:1:内核就一个线程,用户N个线程。假设N中的一个阻塞,所有的都会阻塞。
  • M:N:M代表程序的逻辑分支,N代表着程序被调度的机会。 

线程的同步

  • PV
  • 互斥锁
    • 死锁问题
    • 怎么处理死锁(死锁的定义:两个以上资源,资源有限,进程&线程推进不当、死锁避免:银行家算法、死锁预防、死锁检测)

线程的安全

  • 什么是线程的安全?
    • 临界资源:多线程环境下recv能否正确接收
    • 临界区:访问临界资源的那段代码,锁的是临界资源
  • 某个函数线程安全吗?

线程池

  • 池化技术(TCP三次连接的时候很费事,搞个池子一直连着,不需要频繁地创建销毁线程)
  • 怎么实现:构建一个循环任务队列(理发店的等候区)、多个线程(理发店的理发师)、CPU(理发店的工作台)

4.网络编程

socket

应用程序和运输层之间的接口:进程寻址(端口+IP地址)、地址复用

socket编程基础

  • socket
  • bind
  • listen:backlog(backlog参数的意义在于指定了socket可以排队的最大连接数)
  • accept:返回一个新的socketfd
  • connect
  • send & recv(read, write)
  • close

UDP & TCP

  • 区别
  • 三次握手
    • 为什么不是两次,四次可以吗
    • 每次发的都是什么包?
  • 四次挥手
    • 为什么要等2个MSL
    • 为什么四次?
    • 状态转换
  • TCP拥塞控制
  • UDP编程
    • connect
    • recvfrom
    • sendto

网络编程只是系统编程的点缀,本质还是进程间通信。

5.小作业:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759577.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows下hydra(海德拉/九头蛇)暴力猜解RDP的简单渗透实践

attscker machine&#xff1a;windows10 靶机&#xff1a;windoes server 2003 环境&#xff1a;网络可达 && mstsc开启 hydra字典&#xff1a; 123456 123admin admin123 123Com&#xff08;正确密码&#xff09; 进入hydra目录&#xff0c;字典与hydar.exe同一目录…

MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

Python 解析json文件 使用Plotly绘制地理散点图

目录 0、任务说明 1、解析json文件 2、使用Plotly绘制地理散点图 2.1 函数scatter_geo介绍 2.2 官方示例 3、根据json文件数据&#xff0c;准备绘制地理散点图的‘数据结构’ 4、完整代码及运行效果 0、任务说明 json文件中存放了关于地震的地理信息。 使用plotly模块…

Java柠檬班Java全栈自动化课程

Java柠檬班Java全栈自动化课程旨在教授学员Java编程技能与全栈开发知识&#xff0c;包括自动化测试、前端开发和后端开发。学员将学习如何构建完整的应用程序&#xff0c;并掌握自动化测试框架&#xff0c;为职业发展打下坚实基础。 课程大小&#xff1a;14G 课程下载&#x…

流畅的 Python 第二版(GPT 重译)(四)

第二部分&#xff1a;函数作为对象 第七章&#xff1a;函数作为一等对象 我从未认为 Python 受到函数式语言的重大影响&#xff0c;无论人们说什么或想什么。我更熟悉命令式语言&#xff0c;如 C 和 Algol 68&#xff0c;尽管我将函数作为一等对象&#xff0c;但我并不认为 Py…

爬虫基础:Web网页基础

爬虫基础&#xff1a;Web网页基础 前言Web网页基础网页的组成网页的结构节点树及节点间的关系选择器 前言 用浏览器访问不同的网站时&#xff0c;呈现的页面各不相同&#xff0c;你有没有想过为何会这样呢&#xff1f;了解一下网页的组成、结构和节点等内容。了解这些内容有助于…

挖掘网络宝藏:利用Scala和Fetch库下载Facebook网页内容

介绍 在数据驱动的世界里&#xff0c;网络爬虫技术是获取和分析网络信息的重要工具。本文将探讨如何使用Scala语言和Fetch库来下载Facebook网页内容。我们还将讨论如何通过代理IP技术绕过网络限制&#xff0c;以爬虫代理服务为例。 技术分析 Scala是一种多范式编程语言&…

用pdf2docx将PDF转换成word文档

pdf2docx是一个Python模块&#xff0c;可以将PDF文件转换为docx格式的Word文档。 pdf2docx模块基于Python的pdfminer和python-docx库开发&#xff0c;可以在Windows、Linux和Mac系统上运行。它可以从PDF文件中提取文本和图片&#xff0c;并将其转换成可编辑的Word文档&#xf…

分布式游戏服务器

1、概念介绍 分布式游戏服务器是一种专门为在线游戏设计的大型系统架构。这种架构通过将游戏服务器分散部署到多台计算机&#xff08;节点&#xff09;上&#xff0c;实现了数据的分散存储和计算任务的并行处理。每个节点都负责处理一部分游戏逻辑和玩家请求&#xff0c;通过高…

DM-达梦数据库实时主备搭建

dm实时主备说明 将主库产生的 Redo日志传输到备库&#xff0c;备库接收并重演Redo日志&#xff0c;从而实现备库与主库的数据同步。 一、环境准备 1.1、配置环境准备 首先搭建实时主备&#xff0c;要规划好机器的&#xff0c;我准备两台机器服务器 主服务器 mast…

监控系统prometheus+grafana+发送告警信息

1、基础环境准备两台或更多的主机 2、关闭selinux vi /etc/selinux/config&#xff0c;修改SELINUX的值为disabled 3、关闭防火墙 systemctl disable firewalld systemctl stop firewalld 4、prometheus官网下载 https://prometheus.io/download/ 5、grafana官网下载 https…

Cronos zkEVM 基于 Covalent Network(CQT)数据可用性 API,推动其 Layer2 DeFi 生态更好地发展

在一项旨在显著改善 DeFi 生态的战略举措中&#xff0c;Cronos 与 Covalent Network&#xff08;CQT&#xff09;携手合作&#xff0c;以期待 Cronos zkEVM 的推出。这一整合&#xff0c;预计将进一步降低以太坊生态系统的交易成本、提升交易速度&#xff0c;并带来更好的交易体…

【Qt】使用Qt实现Web服务器(三):QtWebApp中HttpRequest和HttpResponse

1、HttpRequest 1.1 示例 1)在Demo1的Dump HTTP request示例 在浏览器中输入http://127.0.0.1:8080点击Dump HTTP request 2)切换到页面:http://127.0.0.1:8080/dump 该页面显示请求和响应的内容: Request: Method: GET Path: /dump Version: HTTP/1.1 Headers: accep…

C语言 指针练习

一、 a、b是两个浮点型变量&#xff0c;给a、b赋值&#xff0c;建立两个指针分别指向a的地址和b的地址&#xff0c;输出两个指针的值。 #include<stdio.h> int main() {float a,b,*p1,*p2;a10.2;b2.3;p1&a;p2&b;printf("a%f,b%f\n",a,b);printf("…

Python 深度学习第二版(GPT 重译)(三)

七、使用 Keras&#xff1a;深入探讨 本章涵盖 使用 Sequential 类、功能 API 和模型子类创建 Keras 模型 使用内置的 Keras 训练和评估循环 使用 Keras 回调函数自定义训练 使用 TensorBoard 监控训练和评估指标 从头开始编写训练和评估循环 您现在对 Keras 有了一些经…

【Spring Cloud】微服务通信概述

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凯楠&#x1f4f7; 友情赞助播出 目录 前言 1. Dubbo&#xff08;Spring Cloud Alibaba&#xff09;和 Spring Cloud 的适…

Python利用pygame实现飞机大战游戏

文章目录&#xff1a; 一&#xff1a;运行效果 1.演示 2.思路和功能 二&#xff1a;代码 文件架构 Demo 必备知识&#xff1a;python图形化编程pygame游戏模块 一&#xff1a;运行效果 1.演示 效果图◕‿◕✌✌✌ Python利用pygame实现飞机大战游戏运行演示 参考&#x…

AMPQ和rabbitMQ

RabbitMQ 的 Channel、Connection、Queue 和 Exchange 都是按照 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;标准实现的。 AMPQ的网络部分 AMQP没有使用HTTP&#xff0c;使用TCP自己实现了应用层协议。 AMQP实现了自己特有的网络帧格式。 一个Connection…

[网鼎杯 2020 朱雀组]Think Java

[网鼎杯 2020 朱雀组]Think Java swagger [[swagger]] 首先下载源码&#xff0c;查看之后发现 查找swagger资料&#xff0c;或者扫描&#xff0c;得到&#xff1a;swagger-ui.html swagger-ui 提供了一个可视化的UI页面展示描述文件。接口的调用方、测试、项目经理等都可以…

[激光原理与应用-76]:光束指向性与影响因素

目录 一、光束指向性 1.1 概述 2.2 光束指向性与光斑大小的区别 2.3 光束指向性与时间的关系 二、激光器的光束指向性的测量方法 2.1 概述 2.2 计算方法 三、激光器中影响光束指向性的因素 一、光束指向性 1.1 概述 光束指向性是指光束传播方向的特性&#xff0c;也可…