首页 > 作文

PHP7中I/O模型内核剖析详解

更新时间:2023-04-07 09:12:51 阅读: 评论:0

1.同步:我客户端(c端调用者)一个功能,该功能没有结束前,我死等结果。
2.异步:我(c端调用者)调用一个功能,不知道该功能结果,该功能有结果后通知我,即回调通知

3.阻塞:就是调用我(s端被调用者,函数),我(s端被调用者,函数)没有完全接受完数据或者没有得到结果之前,我不会返回。

4.非阻塞:就是调用我(s端被调用者,函数),我(s端被调用者,函数)立即返回,得出结果后通知调用者

五种i/o模型

(1) 阻塞i/o (blocking i/o)

当用户进程进行系统调用时,内核就开始了i/o的第一个阶段,准备数据到缓冲区中,当数据都准备完成后,则将数据从内核缓冲区中拷贝到用户进程的内存中,这时用户进程才解除block的状态重新运行。

(2) 非阻荆人欲袭宋塞i/o (non-blocking i/o)

用户进程只有在第二个阶段被阻塞了,而第一个阶段没有阻塞,但是在第一个阶段中,用户进程不需要盲等,不停的去轮询内核,看数据是否准备好了,因此该模型是比较消耗cpu的。

(3) i/o复用(i/o multiplexing)

i/o执行的两个阶段都是用户进程都是阻塞的,但是两个阶段是独立的,在一次完整的i/o操作中,该用户进程是发起了两次系统调用。和阻塞i/o不同的是第一段可以等待多个描述符就绪

(4) 信号驱动的i/o (signal driven i/o)

只有在i/o执行的第二阶段阻塞了用户进程,而在第一阶段是没有阻塞的。该模型在i/o执行的第一阶段,当数据准备完成之后,会主动的通知用户进程数据已经准备完成,即对用户进程做一个回调。该通知分为两秋的气味种,一为水平触发,即如果用户进程不响应则会一直发送通知,二为边缘触发,即只通知一次。

(5) 异步i/o (asynchrnous i/o)

当用户进程发起系统调用后,立刻就可以开始去做其它的事情,然后直到i/o执行的两个阶段都完成之后,内核会给用户进程发送通知,告诉用户进程操作已经完成了。

i/o多路复用技术

lect

(1).lect()的机制中提供一fd_t的数据结构,每一个元素都能与一打开的文件句柄(不管是socket句柄,还是其他 页面访问升级中文件或命名管道或设备句柄)建立联系,建立联系的工作由程序员完成, 当调用lect()时,由内核根据io状态修改fd_t的内容,由此来通知执行了lect()的进程哪一socket或文件可读或可写。主要用于socket通信当中。

(2).程序执行lect后,如果没有数据输入,程序会一直等待(阻塞时),直到有数据为止,也就是程序中无需循环和sleep。

(3).每次调用le作文材料ct,都需要把fd_t集合从用户态拷贝到内核态,这个开销在fd_t很多时会很大

(4).同时每次调用lect都需要在内核遍历传递进来的所有fd_t,这个开销在fd_t很多时也很大

(5).lect支持的文件描述符数量太小了,默认是1024

poll

(1).poll的实现和lect非常相似,只是描述fd_t集合的方式不同,poll使用pollfd链表结构而不是lect的fd_t结构,其他的都差不多。

(2).监视描述符个数无上限;

epoll/kqueue

(1).监视描述元素周期表之歌符个数无上限;

(2).效率提升,不是轮询的方式,不会随着fd数目的增加效率下降。只有活跃可用的fd才会调用callback函数;即epoll/kqueue最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll/kqueue的效率就会远远高于lect和poll。

(3).内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;

本文发布于:2023-04-07 09:12:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/758676eba5a9c025a37b701a618d2128.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP7中I/O模型内核剖析详解.doc

本文 PDF 下载地址:PHP7中I/O模型内核剖析详解.pdf

标签:进程   用户   内核   数据
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图