I/O模型详解

网络IO:

本质是socket读取,利用套接字(IP地址+端口号),将数据发到socket文件(自建),通过socket发送到远程主机,并且使用socket接受数据。

每次IO都要经过两个阶段:

  1. 将数据从磁盘文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长。
  2. 将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短。

同步/异步

关注的是消息通信机制
同步:synchronous,调用者等待被调用者返回信息,才能继续执行(调用者主动问)。
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态。
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

阻塞/非阻塞

阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起。
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起。

I/O模型:

1.同步阻塞IO模型

● 同步阻塞IO模型是最简单的IO模型,用户进程在内核进行IO操作时被阻塞。
● 用户线程通过系统调用read发起IO读操作,由用户空间转到内核空间。内核等到数据包到达后,将接收到的数据拷贝到用户空间,完成read操作
● 用户需要等待read将数据读取到buffer后,才继续处理接收到的数据,整个IO请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。
● 用户面对的是程序,内核干的事情越多,程序就可以接收更多的请求且更快。

2.同步非阻塞IO模型

● 用户线程发起IO请求时立即返回,但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即"轮询"机制。
● 整个IO请求的过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据,仍需要不断地轮询、重复请求,消耗了大量的CPU资源。
● 比较浪费CPU的方式,一般很少直接使用这种模型,而是在其它IO模型中使用非阻塞IO这一特性。

3.IO多路复用模型

● 多个连接共用一个等待机制,本模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上而不是阻塞在真正的IO上。
● 用select函数进行IO请求和同步阻塞模型没太大区别,反而有由于添加了监视IO,以及调用select函数的额外操做,效率更差,并且阻塞了两次,但可以达到在同一个线程内处理多个IO请求的目的。

I/O多路复用含义

IO多路复用是指内核一旦发现进程指定的一个或多个IO条件准备读取,就通知该进程。
● 应用场景:

  • 当客户端处理多个描述符时(一般是交互式输入和网络套接字)。
  • 当一个TCP服务器既要处理监听套接字,又要处理已连接套接字。
  • 当一个服务器既要处理TCP,又要处理UDP时。
  • 当一个服务器要处理多个服务或多个协议
4.信号驱动IO模型

● 半阻塞,性能已经有所提高。
● 用户进程通过会注册一个信号处理程序,然后主程序可以继续向下执行,当有IO操作准备就绪时,由内核通知触发一个信号处理程序执行,然后将用户进程所需要的数据从内核空间就拷贝到用户空间。
● 此模型优势在于等待数据报到期间进程不被堵塞,用户主程序可以继续执行,只需要等待来自信号的处理函数的通知。

5.异步IO模型

● 异步IO由内核告诉用户线程IO操作何时完成。操作系统对于异步IO的支持并不完善,所以并不常用,更多的是采用IO多路复用模型+多线程任务处理的架构。

缓存IO

缓存I/O又被称作标准I/O,大多数文件系统的默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,数据先从磁盘复制到内核空间的缓冲区,然后从内核空间缓冲区复制到应用程序的地址空间。

读操作:操作系统检查内核的缓冲区有没有需要的数据,如果已经缓存了,那么就直接从缓存中返回;否则从磁盘中读取,然后缓存在操作系统的缓存中。

写操作:将数据从用户空间复制到内核空间的缓存中。这时对用户程序来说写操作就已经完成,至于什么时候再写到磁盘中由操作系统决定,除非显示地调用了sync同步命令。

  • 缓存I/O的优点:
    • 在一定程度上分离了内核空间和用户空间,保护系统本身的运行安全;
    • 可以减少读盘的次数,从而提高性能。
  • 缓存I/O的缺点:
    在缓存 I/O 机制中,DMA 方式可以将数据直接从磁盘读到页缓存中,或者将数据从页缓存直接写回到磁盘上,而不能直接在应用程序地址空间和磁盘之间进行数据传输,这样,数据在传输过程中需要在应用程序地址空间(用户空间)和缓存(内核空间)之间进行多次数据拷贝操作,这些数据拷贝操作所带来的CPU以及内存开销是非常大的。

你可能感兴趣的:(操作系统,网络,服务器,linux)