您的位置:首页 > 理论基础 > 计算机网络

I/O模型

2016-03-01 17:16 375 查看
        线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时操作系统会剥夺这个线程的CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当I/O 操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种I/O 模式就是通常的同步式I/O(Synchronous I/O)或阻塞式I/O (Blocking I/O)。   相应地,异步式I/O (Asynchronous I/O)或非阻塞式I/O (Non-blocking
I/O)则针对所有I/O 操作不采用阻塞的策略。当线程遇到I/O 操作时,不会以阻塞的方式等待I/O 操作的完成或数据的返回,而只是将I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成I/O 操作时,以事件的形式通知执行I/O 操作的线程,线程会在特定时候处理这个事件。为了处理异步I/O,线程必须有事件循环(轮询),不断地检查有没有未处理的事件,依次予以处理。

        我们姑且的认为同步和阻塞是一个意思,异步和非阻塞是相同的,(其实这是他们是有区别的,下面可以看到)。

        对于一个IO操作,例如read操作,它大体上会经历两个阶段:

       1.数据准备阶段,由recvfrom这个系统调用开始;

       2.数据拷贝阶段,即数据从OS内核拷贝到进程中去。
        我们就以这两个阶段的read操作来说明各种I\O模型。

1.阻塞I/O(同步)模型:



        当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。用户进程整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。blocking IO的特点就是在IO执行的两个阶段都被block了,即:进程会一直阻塞,直到数据拷贝完成。

2.非阻塞I/O模型



        用户进程一旦启动了I/O系统调用,便一直轮询。kernel不管准没准备好数据,调用马上返回,而用户线程可以做别的工作,返回时,若kernel没有准备好数据,则返回一个错误码,若准备好数据,则开始拷贝数据,在数据拷贝的过程中进程是阻塞的。非阻塞IO的特点是通过进程反复调用IO函数(多次系统调用,并马上返回)(轮询);在数据拷贝的过程中,进程是阻塞的。

3.异步I/O模型



        用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。异步IO的特点是:整个数据拷贝的过程进程无需阻塞。

除了以上几种I/O模型,典型的I/O模型还有:

4.I/O复用模型(select,poll和epoll系统调用)



         这几个系统调用函数本身是阻塞的,即调用他们的用户线程会在系统调用返回前阻塞,和阻塞I/O模型相比本身没有优越性,但是该模型可以同时监听多个I/O端口(文件描述符)。它的主要特点是:对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听。

5.信号驱动I/O



       允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。即在数据准备阶段不阻塞,在数据拷贝阶段进程阻塞。

总结:五种I/O模型的特点总结:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  io 通信 网络 socket