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