【网络】【操作系统】详解select、poll、epoll

网络编程-select,poll.epoll区别于联系 select,poll,epoll都是IO多路复用中的模型。再介绍他们特点时,先来看看多路复用的 模型。 同其他IO的不同的是,IO多路复用一次可以等多个文件描述符。大大提高了等待数据准备好的时间的效率。为了完成等的效率,系统提供了三个系统调用:select,poll,epoll。 这里不再讲述三者具体实现,只总结三者的优缺点。 select的缺点 1.单个进程监控的文件描述符有限,通... 阅读详情

 

 看到这张图你能够完全理解吗。

相关视频讲解

基于linux epoll网络编程细节处理

网路io底层epoll

提升服务器底层性能,异步解决方案

1.多路复用的意思:

多路复用的意思,就是在任何一路 I/O 有“事件”发生的情况下,通知应用程序去处理相应的 I/O 事件,这样我们的程序就变成了“多面手”,在同一时刻仿佛可以处理多个 I/O 事件。

2.应用条件:

  • 标准输入文件描述符准备好可以读。
  • 监听套接字准备好,新的连接已经建立成功。
  • 已连接套接字准备好可以写。
  • 如果一个 I/O 事件等待超过了 10 秒,发生了超时事件。

3.中断的概念:

在cpu运行着进程A时,进程B发起一个中断请求IRQ,中断处理程序进行处理请求,将进程A挂起,然后运行进程B。

中断的过程:将当前运行的进程的运行信息保存到该进程的描述符。根据进程描述符的内核态堆栈指针切换到内核态。根据来到的IRQ在中断表里面查找所属的中断处理程序。运行该中断处理程序。(看似是进程执行的中断,但和进程没什么关系)

4.硬中断的概念:

对于计算机硬件的,一般来说是与当时CPU请求是异步的(没关系的),比如网关来了一个报文,

5.软中断的理解:

CPU在执行一段代码段是 遇到问题,进行中断,由用户态切换到内核态。

6.每次中断都有其对应的中断处理程序。

7每个进程都在用户态和内核态拥有一个堆栈。

8.为什么要有两种状态(内核态、用户态)

内核态和用户态的”权限不同“。防止每个程序都分配过多资源。用户态的进程能够访问的资源受到了极大的控制,而运行在内核态的进程可以“为所欲为”。

一个进程可以运行在用户态也可以运行在内核态,那它们之间肯定存在用户态和内核态切换的过程。

打一个比方:C库接口malloc申请动态内存,malloc的实现内部最终还是会调用brk()或者mmap()系统调用来分配内存。

9.从用户态到内核态切换可以通过三种方式:

  1. 系统调用,这个上面已经讲解过了,在我公众号之前的文章也有讲解过。其实系统调用本身就是中断,但是软件中断,跟硬中断不同。
  2. 异常:如果当前进程运行在用户态,如果这个时候发生了异常事件,就会触发切换。例如:缺页异常。
  3. 外设中断:当外设完成用户的请求时,会向CPU发送中断信号。

10.socket的小demo

 

 

 11.socket底层逻辑图

 

 12.阻塞模式下的情况

 

写 

(1)要传输的数据大于 输出缓冲区的大小,需要分开传输,还没传输的挂起。

(2)输出缓冲区TCP正在输出别的数据,需要TCP释放输出缓冲区才能写。

读

(1)如果输入缓存区没有数据,则系统调用的方法挂起。

(2)缓冲区数据太多,每次read只能读一部分,需要一直慢慢读直到读完

13.非阻塞模式下

文章福利 Linux后端开发网络底层原理知识学习提升 点击 学习资料 获取,完善技术栈,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。

写 

(1)如果向输出缓冲区写的数据太多了 ,分批发送,但是会马上告诉你发送了多少。

(2)如果空间为0,会马上告诉你缓冲区满了,由上次程序决定怎么做。(而阻塞则会一直挂起,等待缓冲区释放)

14.进程进行用户态到内核态的切换过程:

  1.从当前进程的描述符中提取其内核栈的ss0及esp0信息。

  2.使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了z暂停执行的程序的下一条指令。

  3.将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

15.Linux的一切都是文件fd。

16.select函数

    
#include <sys/select.h>   

    int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

1)maxfdpl   最大有效位。(因为fd_set是以bitmap来保存数据的 linux默认1024位bitmap 最大有效位之后不需要检查)

2)fd_set *readset   可读文件描述符集

3)fd_set *writeset   可写文件描述符集

4)fd_set *exceptset   异常文件描述符集

5)timeout  超时时间

Linux select函数的宏

 

#include <sys/select.h>   

int FD_ZERO(int fd, fd_set *fdset);  //将描述符集全部置0

int FD_CLR(int fd, fd_set *fdset);   //

int FD_SET(int fd, fd_set *fd_set);   //将某个位置位

int FD_ISSET(int fd, fd_set *fdset); //检查某个位是否被置位

 

select函数缺点:

1)固定文件描述符1024位的bitmap,请求过大则无法描述,有大小限制

2)fd_set不可重用,每次都有重新置位

3)有用户态到内核态切换的开销

4)每次函数返回都需要O(n)的时间进行遍历

17.poll函数

我们将select函数的bitmap结构的fd_set变为 自己实现的pollfd

 使用链表来进行文件描述,不存在大小限制问题。

 

18.epoll函数

 

19.同步调用、异步调用:

同步:B来向A拿取数据,B一直等到A正确交付数据。

异步:B来向A拿取数据,B见A还在准备则返回 进行自己的事情。

20.阻塞、非阻塞

A向B拿数据,C也向A要数据,C要等待 则是阻塞。

A向B拿数据,C也向A要数据,A同时服务B C 则是非阻塞。

同步与异步

  • 同步: 同步就是发起一个调用后,被调用者未处理完请求之前,调用不返回。
  • 异步: 异步就是发起一个调用后,立刻得到被调用者的回应表示已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其他的请求,被调用者通常依靠事件,回调等机制来通知调用者其返回结果。

同步和异步的区别最大在于异步的话调用者不需要等待处理结果,被调用者会通过回调等机制来通知调用者其返回结果。

阻塞和非阻塞

  • 阻塞: 阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
  • 非阻塞: 非阻塞就是发起一个请求,调用者不用一直等着结果返回,可以先去干其他事情。

21.网络通信例子

服务端

 

 客户端

 

 

 我们可以看到服务端有2个方法 accept和read都在阻塞,这就是我们的BIO(同步阻塞I/O模式)

优化:我们可以使用多线程、线程池等来优化,关键是有很多不活跃的线程时,占用资源过多,上下文切换过多。

 22.使用NIO优化通信例子(服务器端 客户端无所谓)

 

 

 

23.windows的NIO是select linux的NIO底层是eqpoll。

Redis的NIO是epoll,只能在Linux环境运行,但是有win版本,是大神修改了redis代码。

 

select/poll/epoll到底是什么一回事 面试题:说说select/poll/epoll的区别。 这是面试后台开发时的高频面试题,属于网络编程和IO那一块的知识。Android里面的Handler消息处理机制的底层实现就用到了epoll。 阅读详情

相关推荐

select poll epoll

select poll epoll 等简单使用demo。各自之前区别等。

【操作系统】select、poll和epoll详解

一、I/O多路复用       I/O多路复用通过一种机制,使得一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作,支持I/O多路复用的系统调用有 select、poll、epoll。它们本质上仍是同步I/O,因为他们都需要在读写事件就绪后负责进行读写,这个读写过程是阻塞的,而异步I/O无需自己进行读写,异步I/O会负责把数据从内核拷贝到用户空间。    &nbsp

Steven_L_的博客 2091

select、poll、epoll的区别使用示例代码

Linux系统编程——I/O多路复用select、poll、epoll的区别使用,相关教程如下: http://blog.youkuaiyun.com/tennysonsky/article/details/45745887

Socket网络编程之IO多路复用——select、poll、epoll详谈

select、poll、epoll详谈

weixin_42690036的博客 2509

Python-Opencv中的膨胀和腐蚀

Python-Opencv中的膨胀和腐蚀 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。 膨胀就是图像中的高亮部分进行膨胀,“邻域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中高亮部分被腐蚀,“邻域被蚕食”,效果图拥有比原图更小的高亮区域。 1.膨胀 膨胀过程是有一个结构元素或者模板去在原图像素比对,当比对过程中,中心像素位置的值根据其八邻域取或运算,或运算为1就取自己的中心值,...

qq_44262417的博客 1万+

NAO V6 开发环境的配置(附所有文件)

NAO V6开发环境配置前言环境Robot SettingsChoregraphe 2.8.5.10python2.7+naoqi2.8+opencv4.1.0putty与FileZilla 前言 学校的机器人摸索了一段时间,之前摸爬滚打探索环境,之前没接触这类机器人可能会非常艰辛,希望能给需要的人一些帮助。Nao与pepper通用 环境 win10(x64)+naoqi2.8 1、Robot S...

wbhhello的博客 3221

Linux Kernel Select/Poll/Epoll源码深度历险(一)---- 探索Select底层运行原理

文章目录前引Linux Kernel Select/Poll/Epoll源码深度历险(一)---- 探索Select底层运行原理1、先得到Linux Kernel Source Code2、开始历险 顺藤摸瓜探索Select1、初得用户态 Select调用代码表层2、 欲求无果用户态调用 直接转向内核调用Select入口3、 仔细查看core_sys_select select核心实现1、先从fd_set结构体入手2、看看fd_set 相关的宏定义3、转回core_sys_select 开始分析(上半部分)

Love 6's Private Blog 1937

并网逆变器学习笔记5---三电平DPWM

三电平DPWM

圆桌骑士的博客 1万+

操作系统-select、poll、epoll之间的区别

操作系统-select、poll、epoll之间的区别 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: select、poll、epoll之间的区别(搜狗面试) 作者:aspirant 出处:cnblogs 0x01 select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是: 单个进程可监视的fd数...

迷路剑客个人博客 1881

Python大数据舆情分析系统开发实战

舆情监测系统是大数据分析的重要应用场景,通过自然语言处理(NLP)技术解析社交媒体文本情感倾向。基于Python技术栈的解决方案整合了Scrapy爬虫框架进行数据采集,PySpark处理海量文本数据,结合SnowNLP和Jieba实现中文语义分析。系统采用微服务架构设计,包含数据采集层、处理层、存储层和应用层,通过情感分析优化和实时热点检测算法提升监测准确率。典型应用包括企业品牌监测、公共事件预警等场景,开发过程中需特别注意数据合规性和分布式集群的性能调优。

weixin_34408624的博客 388

Centos7.6操作系统安装+Bond配置(600GB磁盘版本)

1.安装前准备工作 准备centos7.6操作系统镜像 CentOS-7-x86_64-DVD-1810.iso 服务器安装一般都是在BMC界面操作,所以安装前需要在BMC界面挂载好操作系统镜像 重启服务器后自动进入安装界面。 华为大数据集群安装操作系统配置

小时光 6013

select, poll, 和 epoll区别

select, poll, 和 epoll 都是 Linux 下用于实现 I/O 多路复用的机制。

qq_41979948的博客 671

Captcha must be filled out,解决Kaggle新用户注册无法弹出验证提示的问题

Captcha must be filled out

weixin_46713695的博客 5万+

深入理解select、poll和epoll及区别

问题:如果我们先前创建的几个进程承载不了目前快速发展的业务的话,是不是还得增加进程数?我们都知道系统创建进程是需要消耗大量资源的,所以这样就会导致系统资源不足的情况。 那么有没有一种方式可以让一个进程同时为多个客户端端提供服务? 接下来要讲的IO复用技术就是对于上述问题的最好解答。 对于IO复用,我们可以通过一个例子来很好的理解它。( 例子来自于《TCP/IP网络编程》) 某教室有10名...

$好记性还是要多记录$ 10万+

安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

pytorch 51 GroundingDINO模型导出tensorrt并使用c++进行部署,53ms一张图

博主基于https://github.com/hpc203/GroundingDINO-onnxrun项目分享的onnx c++推理代码,修改为GroundingDINO模型的tensorrt推理代码。对于600x400的输入,在3060显卡下,cuda 12.1,TensorRT-10.4.0,window环境下53ms处理完一张图片。

a486259的博客 1221

Linux 网络 IO 多路复用:select、poll、epoll 详解

多路转接方法是一种高效的网络通信手段,它通过允许单个进程或线程同时监听多个IO事件,实现了在单线程/进程场景下的并发处理。在选择具体的实现方法时,需要根据应用场景和需求进行权衡和选择。

小羊的博客 1519

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

select、poll、epoll的原理

在 select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait() 时便得到通知。(此处去掉了遍历文件描述符,而是通过监听回调的的机制。这正是epoll的魅力所在。epoll的优点主要是一下几个方面:1.监视的描述符数量不受限制,它所支持的FD上限是最大可以打开文件的数目。

m0_45164511的博客 1514

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Select、Poll、Epoll详解

同步异步与阻塞非阻塞 用户空间和内核空间 操作系统为了支持多个应用同时运行,需要保证不同进程之间相对独立(一个进程的崩溃不会影响其他的进程 , 恶意进程不能直接读取和修改其他进程运行时的代码和数据)。 因此操作系统内核需要拥有高于普通进程的权限, 以此来调度和管理用户的应用程序。 于是内存空间被划分为两部分,一部分为内核空间,一部分为用户空间,内核空间存储的代码和数据具有更高级别的权限。内存访问的相关硬件在程序执行期间会进行访问控制( Access Control),使得用户空间的程序不能直接读写内核空间的

Redisread的博客 2034

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Select、Poll、Epoll 详解

从源码到使用。

松生的博客 1233

网络io的多路复用:select/poll/epoll详解

本文详细介绍了三种网络I/O多路复用技术:select、poll和epoll。首先分析了一请求一线程方式的弊端,指出多路复用技术可以有效解决高并发问题。select通过比特位集合管理文件描述符,但存在参数复杂、效率低下等缺点;poll采用结构体数组pollfd,比select更灵活高效;epoll则是Linux内核的重大改进,通过事件触发机制显著提升性能。文章分别展示了三种技术的代码实现,对比了它们的工作原理和优缺点,为开发高并发网络应用提供了技术参考。

adagio9z的博客 1884

select、poll、epoll详解

select、poll、epoll详解

aofeng9的博客 722

详解select/poll/epoll

特性selectpoll文件描述符上限受FD_SETSIZE(1024)无(仅受系统限制)无(仅受系统限制)用户态拷贝每次调用拷贝整个集合每次调用拷贝整个数组仅epoll_ctl时拷贝就绪检查效率O (n)(遍历整个集合)O (n)(遍历整个数组)O (1)(直接返回就绪列表)触发模式水平触发水平触发水平触发 / 边缘触发跨平台好(Windows/Linux)一般(无 Windows 原生)差(仅 Linux)适用场景低并发、简单场景中等并发高并发(如服务器)

m0_74455373的博客 938

Select、Poll和Epoll

看到一篇写得很不错的博文,有必要收藏一下: 原文:https://cloud.tencent.com/developer/article/1005481 提到select、poll、epoll相信大家都耳熟能详了,三个都是IO多路复用的机制,可以监视多个描述符的读/写等事件,一旦某个描述符就绪(一般是读或者写事件发生了),就能够将发生的事件通知给关心的应用程序去处理该事件。本质上,select...

ajuse的博客 4269

网络编程中select、poll与epoll详解

网络编程中select、poll与epoll详解 ​ 在C/S中,存在多种I/O模型(详见历史文章—C/S编程中常见的I/O模型介绍)。select、poll与epoll用于其中的I/O复用模型中,其读写是同步阻塞的。相比普通的read、write操作,可以检测多个描述符。 通过阅读,能够了解select、poll与epoll的优缺点,能掌握什么时候应该使用epoll,什么时候应该使用select/poll。 文章目录网络编程中select、poll与epoll详解1.select函数1.1 函数

Clark_Sev的博客 1476
上一篇: 后端底层开发人员必须要彻底搞懂的redis存储原理丨redis跳表与B+树详细对比
下一篇: 理解各种设计模式原则及区别丨浅谈Nginx中核心设计模式-责任链模式丨C++后端开发丨Linux服务器开发丨web服务器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值