操作系统(二):IO模型、同步异步、epoll

1、五种I/O模型

任何I/O过程都包含了等待和拷贝两个步骤;等待发生阻塞,准备就绪就执行拷贝。
准备就绪含义:内核将数据拷贝到用户空间(缓冲区)
(1)阻塞式I/O
应用程序一旦调用了一个I/O函数,要一直等待数据从内核拷贝到用户空间(缓冲区)完成,收到返回数据,在完成之前进程会一直阻塞。(必须等到返回才能进行下一步)
(2)非阻塞式I/O
非阻塞式会立即返回,应用程序调用了一个I/O函数,进程不断询问内核数据是否就绪,并返回(-1表示错误未完成,0表示正常断开,正数表示已读取数据),未就绪就执行其他。
(3)信号驱动IO
当内核数据准备就绪时,发送一个SIGIO信号,应用程序收到SIGIO信号进行读取数据操作。
(4)I/O多路复用
I/O是指的我们设备I/O;
多路指多个网络连接(Socket);
复用指共用一个或少量线程;
I/O多路复用就是很多个网络I/O请求共用一个进程来处理这些连接。
一个进程可以监视多个描述符,一旦某个描述符就绪,应用程序进行读写操作。
文件描述符(fd)是内核创建的已打开文件的索引,是一个非负整数,代表被打开的文件(文件的ID)。
(5)异步I/O
前面4种方式属于同步I/O。
异步I/O是当用户发起I/O请求,会立即返回,不需要去频繁询问数据是否准备就绪;内核会在准备就绪后发送一个信号,应用程序收到这个信号再去读取。异步I/O整个过程没有进程被阻塞。


2、同步与异步、阻塞与非阻塞

同步是按照顺序一件一件的去完成,一件事情没有返回结果之前,不会执行下一件。
比如A、B两进程都要使用某资源,A进程正占用资源,那么B进程必须等A使用完才能访问资源,B等待时为阻塞状态。
异步是互相不影响,一个进程的执行过程不受另一个进程影响。
同步与异步区别是访问数据时是否会发生阻塞。
阻塞是指调用返回结果之前,进程会被挂起等待,此时为阻塞状态。
非阻塞与阻塞对应,不能立刻返回结果时,进程不会阻塞,而是立刻返回。
阻塞与非阻塞区别为是否立刻返回结果。


3、select、poll、epoll区别

Linux系统下I/O多路复用的系统调用有select、poll、epoll三种方式。
文件描述符(fd)是内核创建的已打开文件的索引,是一个非负整数,代表被打开的文件(文件的ID)。
区别:
(1)文件描述符数量(最大连接数)
select打开的文件数受限制,最大2048(FD_SETSIZE设置);
poll没有上限(基于链表存储的);
epoll也没有上限。
(2)操作效率
select每次只是通知需要处理,具体位置需要通过遍历的方式(轮询机制)查找文件描述符(fd)的I/O是否就绪,时间复杂度O(n)。
poll和select一样,也是需要遍历的方式(轮询机制)查找,时间复杂度O(n)。
epoll只对活跃的描述符队列进行操作,不需要遍历,时间复杂度O(1)。
(3)拷贝
select需要将fd集合从用户空间拷贝到内核空间;
poll也需要将fd集合从用户空间拷贝到内核空间;
epoll的用户空间和内核空间利用mmap()映射来共享内存,避免不必要拷贝。


4、用户态和内核态

用户态: 只能受限访问内存, 且不允许访问外围设备。占用的CPU资源可以被其他程序剥夺。(非特权指令——应用程序)
内核态: CPU可以访问内存所有数据, 包括外围设备, CPU也可以将自己从一个程序切换到另一个程序。( 特权指令——内核程序)
为什么要有用户态和内核态?
由于需要限制不同程序的访问权限, 防止越界获取内存数据, CPU划分出两个权限等级——用户态和内核态。
用户态与内核态的切换:
用户态切换到内核态的唯一途径——>中断/异常/陷入
内核态切换到用户态的途径——>设置程序状态字


5、epoll水平触发和边缘触发

Linux系统下的I/O多路复用中有水平触发和边缘触发两种模式。
水平触发(LT):epoll的默认工作方式。
epoll_wait()检测到文件描述符fd准备就绪,触发通知,可以不立即处理,如果不执行,下次继续通知处理。
如果没有把数据一次性读写完(如读写缓冲区太小),下次调用 epoll_wait(),会通知上次没读写完的文件描述符继续读写。

边缘触发(ET):epoll的高速工作方式。
epoll_wait()检测到文件描述符fd状态发生改变,触发通知,执行后返回(需要立即处理)。
如果没有把数据一次性读写完(如读写缓冲区太小),下次调用epoll_wait(),不会通知上次没读写完,直到该文件描述符状态发生改变才会通知。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值