操作系统04——IO

49 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

*什么是IO多路复用?*怎么实现?

IO多路复用(IO Multiplexing)指单个进程/线程可以同时处理多个IO请求

实现原理:将要监视的文件描述符添加到select/poll/epoll函数中由内核监视,函数会阻塞线程。有文件描述符就绪监视或者超时,函数会返回,然后该进程可以进行相应的读/写操作。

select/poll/epoll三者的区别?

  • select:将文件描述符放入一个集合中,调用select时,将集合从用户空间拷贝到内核空间(缺点1:开销大)每次都要复制。(缺点2:集合大小有限制)32位机默认是1024(64位:2048).(缺点3:轮询的方式效率较低)当文件描述符的数量增加时,效率会线性下降.
  • poll:和select几乎相同,区别在于文件描述符的存储方式不同,poll采用链表的方式存储,没有最大存储数量的限制
  • epoll:通过内核空间和用户空间共享内存避免了不断复制的问题采用回调机制避免了轮询效率下降问题;支持的同时连接数上限很高(1G左右的内存支持10W左右的连接数);支持水平触发和边缘触发,采用边缘触发机制时,只有活跃的描述符才会触发回调函数。

总结,区别主要在于:

  • 一个线程/进程所能打开的最大连接数
  • 文件描述符传递方式(是否复制)
  • 水平触发 or 边缘触发
  • 查询就绪的描述符时的效率(是否轮询)

什么时候使用select/poll,什么时候使用epoll?连接数较多并且有很多的不活跃连接时epoll的效率比其它两者很多;但是当连接数较少并且都十分活跃的情况下,由于epoll需要很多回调,因此性能可能低于其它两者。

什么是文件描述符?

文件描述符形式上是一个非负整数实际上是一个索引值,指向内核,为每一个进程所打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

内核通过文件描述符来访问文件,文件描述符指向一个文件

什么是水平触发?什么是边缘触发?

  • 水平触发(LT,Level Trigger)模式下,只要一个文件描述符就绪就触发通知,如果没有一次性把数据读写完,下次还会通知
  • 边缘触发(ET,Edge Trigger)模式下,当描述符从未就绪变为就绪时通知一次,之后不会再通知,直到再次从未就绪变为就绪(缓冲区从不可读/写变为可读/写)。
  • 区别:边缘触发效率更高,减少了被重复触发的次数,函数不会返回可能不需要的文件描述符。
  • 为什么边缘触发一定要用非阻塞(non-block)IO:避免由于一个描述符的阻塞读/阻塞写操作,让处理其它描述符的任务出现饥饿状态。

有哪些常见的IO模型?

  • 同步阻塞IO(Blocking IO):用户线程发起IO读/写操作之后,线程阻塞,直到可以开始处理数据;对CPU资源的利用率不够
  • 同步非阻塞IO(Non-blocking IO):发起IO请求之后可以立即返回,如果没有就绪的数据,需要不断地发起IO请求直到数据就绪;不断重复请求消耗了大量的CPU资源
  • IO多路复用
  • 异步IO(Asynchronous IO):用户线程发出IO请求之后,继续执行,由内核进行数据读取并放在用户指定的缓冲区内,在IO完成之后通知用户线程直接使用