IO模型

匿名 (未验证) 提交于 2019-12-03 00:15:02

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

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

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

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

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

socket.setblocking(False)  select.select(read_l,[],[])

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

1.阻塞与非阻塞,阻塞式IO模型会阻塞进程的执行知道操作完成,而非阻塞IO会立刻返回  2.同步与异步,同步IO会将进程阻塞,当数据还没准备好,系统不对进程进行阻塞,当数据准备好后进程会进入阻塞一段时间,异步IO模型,整个过程都不会阻塞  3.非阻塞与异步,非阻塞IO大部分时间不会被阻塞,但是需要进程主动检查数据的接收状态,一旦完成,需要手动调用recvfrom来将数据拷贝到用户内存,异步IO的方式操作系统完成接收到拷贝数据到内存的过程
1.同步IO   1.阻塞IO   2.非阻塞IO   3.IO多路复用 2.异步IO   1.异步IO
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!