IO多路复用
Posted python-road
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO多路复用相关的知识,希望对你有一定的参考价值。
IO 多路复用:
用户空间与内核空间:
操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的 所有权限;为了保证用户进程不能直接操作内核,操作系统将虚拟空间划分为两部分:1.内核空间,2.用 户空间,Linux将1G的空间划分为内核空间,3G的为用户空间
文件描述符fd:
其形式上是一个非负整数,实际上是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录 表,当程序打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符;文件描述符这一概 念 只适用于Linux系统
缓存I/O
又称为标准I/O,数据会先被拷贝到操作系统的内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝 到应用程序的地址空间
IO模式:
当一个read操作发生时,他会经历两个阶段:
1.等待数据准备(存到缓冲区)
2.将数据从内核拷贝到进程中
Linux操作系统的五种网络模式的方案:
1.阻塞I/O:特点:在IO执行的两个阶段都被阻塞了
2.非阻塞I/O:特点:如果数据没准备好,不会阻塞,会直接返回错误;用户进程需要不断的主动询问数 据好了没有
3.I/O多路复用:就是select,poll,epoll特点:通过一种机制使一个进程能同时等待多个文件描述符,而 这些文件描述符,其中的任意一个进入读就绪状态,select()函树就返回;
4.信号驱动I/O
5.异步I/O:用户进程发起read操作之后,立刻可以开始做其他事,而对于内核kernel来说,当他收到一个 asynchronous read(异步读)之后,首先它会立刻返回,所以不会对用户进程产生任何阻塞, 然后,kernel会等数据准备完成后将数据拷贝到用户内存,当这一切都完成后,kernel就会给用 户进程发送一个signal,告诉它read操作完成了
阻塞IO,非阻塞IO和IO多路复用都是同步IO;异步IO就是异步IO
IO多路复用:
epoll:当内存有数据时,直接返回给用户程序让用户程序取数据,并发送给用户该数据的文件描述符,如果用户不取,下次继续发送,则是“水平触发”。如果用户不取,下次不再发送,则是“边缘触发”
以上是关于IO多路复用的主要内容,如果未能解决你的问题,请参考以下文章
IO多路复用/基于IO多路复用+socket实现并发请求/协程