IO内存模型(持续更新)

同步IO

对文件设备数据的读写需要同步等待操作系统内核,即使文件设备并没有数据可读,线程也会被阻塞住,虽然阻塞时不占用CPU始终周期,但是若需要支持并发连接,则必须启用大量的线程,即每个连接一个线程。这样必不可少的会造成线程大量的上下文切换,随着并发量的增高,性能越来越差。

select模型/poll模型

通过一个线程不断的判断文件句柄数组是否有准备就绪的文件设备,这样就不需要每个线程同步等待,减少了大量线程,降低了线程上下文切换带来的性能损失,提高了线程利用率。这种方式也称为I/O多路复用技术。
select模型需要对数组进行遍历,因此时间复杂度是O(n)因此当高并发量的时候,select模型性能会越来越差。
poll模型和select差不对,但使用的是链表存储,因此不会受限于数组容量限制,解决了并发限制问题,但依旧存在大量连接,遍历查询是否有准备就绪的问题.

epoll模型

在linux2.6支持了epoll模型,epoll模型解决了select模型的性能瓶颈问题。它通过注册回调事件的方式,当数据可读写时,将其加入到一个可读写事件的队列中。这样每次用户获取时不需要遍历所有句柄,时间复杂度降低为O(1)。因此epoll不会随着并发量的增加而性能降低。随着epoll模型的出现C10K的问题已经完美解决。

I/O线程模型

从线程模型上常见的线程模型有Reactor模型和Proactor模型,无论是哪种线程模型都使用I/O多路复用技术,使用一个线程将I/O读写操作转变为读写事件,我们将这个线程称之为多路分离器。

对应上I/O模型,Reacor模型属于同步I/O模型,Proactor模型属于异步I/O模型。

Reactor模型

在Reactor中,需要先注册事件就绪事件,网卡接收到数据时,DMA将数据从网卡缓冲区传输到内核缓冲区时,就会通知多路分离器读事件就绪,此时我们需要从内核空间读取到用户空间。

同步I/O采用缓冲I/O的方式,首先内核会从申请一个内存空间用于存放输入或输出缓冲区,数据都会先缓存在该缓冲区。

Proactor模型

Proactor模型,需要先注册I/O完成事件,同时申请一片用户空间用于存储待接收的数据。调用读操作,当网卡接收到数据时,DMA将数据从网卡缓冲区直接传输到用户缓冲区,然后产生完成通知,读操作即完成。

异步I/O采用直接输入I/O或直接输出I/O,用户缓存地址会传递给设备驱动程序,数据会直接从用户缓冲区读取或直接写入用户缓冲区,相比缓冲I/O减少内存复制。

你可能感兴趣的:(操作系统)