PHP7中输入输出模型内核的详细分析
1.同步一个:我的客户端(C端调用者)的函数,没有结果比如我还没结束就死了。2.异步:我(C端调用者)调用一个函数,但是不知道函数的结果,所以当函数有结果的时候通知我,也就是回调通知。
3.阻塞:意味着调用我(s端被调用者,函数),在我(s端被调用者,函数)完全接收到数据或者得到结果之前,我不会返回。
4.非阻塞:表示调用我(S端被调用方,函数),我(S端被调用方,函数)立即返回,得到结果后通知调用方
五种输入输出模式
(1)阻塞输入输出(阻塞输入输出)
当用户进程进行系统调用时,内核启动第一阶段的输入/输出,将数据准备到缓冲区中。当所有数据准备好后,数据从内核缓冲区复制到用户进程的内存中,然后用户进程释放block状态,重新运行。
(2)无阻塞输入输出
用户进程仅在第二阶段被阻止,但在第一阶段不会被阻止。但是在第一阶段,用户进程不需要盲目等待,一直轮询内核看数据是否准备好了,所以这个模型消耗CPU。
(3)输入输出复用
用户进程在输入/输出执行的两个阶段被阻塞,但这两个阶段是独立的。在完整的输入/输出操作中,用户进程启动了两次系统调用。与阻塞输入/输出不同,第一段可以等待多个描述符准备就绪
(4)信号驱动的输入输出
用户进程仅在输入/输出执行的第二阶段被阻止,但在第一阶段不会。在I/O执行的第一阶段,当数据准备好时,模型会主动通知用户流程数据准备好了,也就是对用户流程做一个回调。通知有两种,一种是水平触发,即如果用户进程没有响应,总是会发送通知,另一种是边缘触发,即只通知一次。
(5)异步输入输出(异步输入输出)
当用户进程发起系统调用时,它可以立即开始做其他事情,然后在I/O执行的两个阶段完成后,内核会向用户进程发送通知,告诉用户进程操作已经完成。
输入输出复用技术
挑选
(select()的机制提供了fd_set的数据结构,每个元素都可以与一个打开的文件句柄(无论是Socket句柄、其他文件还是命名管道或设备句柄)建立联系,建立联系的工作由程序员完成。当调用select()时,内核根据IO状态修改fd_set的内容,从而通知执行select()的进程在Socket通信中可以读取或主要使用哪个Socket或文件。
(2)程序执行select后,如果没有数据输入,程序会一直等到有数据,即程序中不需要循环休眠。
(3)每次调用select时,都需要将fd_set集从用户模式复制到内核模式。当有许多fd_set时,这种开销会很大
(4).同时,每次调用select时,都需要遍历内核中传入的所有fd_set,这在有很多fd_set时也非常昂贵
(select支持的文件描述符数量太少,默认值为1024
投票
(1)实施。poll与select非常相似,只是描述fd_set集合的方式不同。poll使用pollfd链表结构,而不是select的fd_set结构,其他都是类似的。
(2)监控描述符的数量没有上限;
epoll/kqueue
(1)监控描述符的数量没有上限;
(2)效率提升不是轮询方式,不会随着fd数量的增加而降低。只有活动且可用的fd才会调用回调函数;也就是说,epoll/kqueue最大的优势在于它只关心你的“活跃”连接,而与连接总数无关。因此,在实际的网络环境中,epoll/kqueue的效率远远高于select和poll。
(3).内存拷贝,使用mmap()文件映射内存,以内核空间加速消息传输;
版权声明:PHP7中输入输出模型内核的详细分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。