IO模型

来源:互联网 发布:mymps seo伪静态 编辑:程序博客网 时间:2024/04/30 04:58

     在学习nginx的时候咱们知道,它处理请求的方式是异步非阻塞的,这就是一种IO模型,这里简单介绍四种基本的IO模型。

  IO模型:同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。

  同步和异步:相对于用户线程和内核,同步是用户线程发起IO调用,内核处理,等内核处理完后用户线程才继续执行。异步:用户线程发起请求了,继续执行,内核调用后通知用户线程。

  阻塞和非阻塞:阻塞是IO操作彻底完成后才返回用户空间,非阻塞:IO操作被调用后立即返回用户一个状态,不用等到IO操作彻底完成。

1.同步阻塞

    

       用户发起read请求,然后由用户空间转到内核空间,等到数据到达后,将数据包拷贝到用户空间,完成read操作。整个IO请求过程中用户线程是被阻塞的,导致用户在发出IO请求后不能做任何事情,造成了cpu空缺,利用率不高。

2.同步非阻塞

 

     用户线程发起IO请求后立即返回一个状态,但是并没有数据,接下来用户线程不断的发出IO请求,直到数据到达后,才将数据拷贝到用户空间内。虽然每次发起IO请求可以立即返回,但为了等到数据需要轮询的发出,消耗大量的cpu资源。

3.异步阻塞

 

       将需要进行IO操作的socket添加到select中,阻塞等待select系统调用返回,当数据到达时,socket被激活,用户线程发起IO请求,读取数据并继续执行。

  使用select的优势:可以在一个线程中同时处理多个socked的IO请求,在同步阻塞中以多线程的方式才能实现。

4.异步非阻塞

   


      在异步阻塞中用户线程自行读取、处理数据。在异步非阻塞中,当用户线程收到通知时,内核已经处理好了数据,并放到用户线程指定的缓冲区中,内核在IO完成后通知用户线程直接使用。

    对这四种IO模型的简单介绍希望对大家有帮助,有个整体上的认识。

1 0