IO模型

I/O模型

阻塞IO模型

用户调用了recvfrom这个系统调用,线程在等待内核获取数据和拷贝数据的两个阶段,线程都是被阻塞的

socket.accept 
socekt.recv
都会进入阻塞态

如何让闲置的cpu运行起来

1.在等待文件io的过程中,另外开起一个线程,让其他的连接不用排队,缺点是开启多线程是非常消耗系统资源的,线程的切换也是需要消耗时间的

非阻塞IO模型

应用程序以轮询的方式不断询问io的读取状态,用户调用recvfrom之后进程不会阻塞,会得到一个错误,当内核向用户内存拷贝数据时会进入阻塞状态,缺点是会大量的进行用户态到内核态的切换非常消耗时间

socket.setblocking()#默认是True  
socket.setblocking(False) #False的话就成非阻塞了

IO多路复用模型

select/epoll这个function不断轮询所有的socket,当数据准备好内核会通知select就会返回,用户在调用read操作将数据拷贝到用户内存中

socket.setblocking(False)

select.select(read_l,[],[])

异步IO模型

当用户读取数据时,回立刻进行返回,当数据拷贝到用户内存时,主动给用户进程发送一个signal信号

模型比较

1.阻塞与非阻塞,阻塞式IO模型会阻塞进程的执行知道操作完成,而非阻塞IO会立刻返回

2.同步与异步,同步IO会将进程阻塞,当数据还没准备好,系统不对进程进行阻塞,当数据准备好后进程会进入阻塞一段时间,异步IO模型,整个过程都不会阻塞

3.非阻塞与异步,非阻塞IO大部分时间不会被阻塞,但是需要进程主动检查数据的接收状态,一旦完成,需要手动调用recvfrom来将数据拷贝到用户内存,异步IO的方式操作系统完成接收到拷贝数据到内存的过程

IO模型分类

1.同步IO
  1.阻塞IO
  2.非阻塞IO
  3.IO多路复用
2.异步IO
  1.异步IO
posted @ 2019-10-18 23:50  pluscat  阅读(223)  评论(0编辑  收藏  举报