下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一.阻塞I/O首先,要从你常用的10操作谈起,比如read和write,通常10操作 都是阻塞1/0的,也就是说当你调用read时,如果没有数据收到,那么 线程或者进程就会被挂起,直到收到数据。阻塞的意:思,就是一直等着。 阻塞I/O就是等着数据过来,进行读写操作。应用的函数进行调用,但是 内核一直没有返回,就一直等着。应用的函数长时间处于等待结果的状 态,我们就称为阻塞I/O。每个应用都得等着,每个应用都在等着,浪费 啊!很像现实中的悄况。大家都不干活,等着数据过来,过来工作一下, 没有的话继续等着。appikativnkcmdrccvtronno dabgrjm nZymH fur 3pn
2、Ko blocks incM to recvfroto*dlAt.igr.wti w-3dypy datagrjfncopy djta from kernel to usrrrtumOKwpy compklcprocizdkUdghmi二.非阻塞I/O或ioct 1 (Unix)设为非阻非阻塞10很简单,通过fcntl (POSIX)塞模式,这时,当你调用read时,如果有数据收到,就返回数据,如果 没有数据收到,就立刻返回一个错误,如EWOULDBLOCKo这样是不会阻塞 线程了,但是你还是要不断的轮询来读取或写入。相当于你去査看有没有 数据,告诉你没有,过一会再来吧!应用过一会再来问,有没
3、有数据?没 有数据,会有一个返回。但是依旧很不好。应用必须得过一会来一下,问 问内核有木有数据啊。这和现实很像啊!好多悄况都得去某些地方问问好 了没有?木有,明天再过来。明天,好了木有?木有,后天再过krmrl来忙碌的应用。ap pliuiionvacvfrMr如proc0 repratilly (olte rcvfroat zMh* 仙 onOK reUirn (polling)rccvfromrecv?rodaMgruiisvMem callgwevLssgeicsv(vm callBWgtfL5&gCK為、Mem callBWCVLS&SgKvtvm callno 占血gMin fvad
4、ydjtjgram readyvppy dalngramcopy dm, frvm kenw-I to userreturn CKmpy torn pic忖三、I/O多路复用多路复用是指使用一个线程来检查多个文件描述符状态,比如调用select和poll函数,传入多个文件描述符(Fil eDescript ion简称FD)如果有一个文件描述符(FileDescription)就绪,则返回,否则阻塞直到超时。得到就绪状态 后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如 使用线程池)。就是派一个代表,同时监听多个文件描述符是否有数据到 来。等着等着,如有有数据,就告诉某某你的数据
5、来啦!(Socket)的就绪赶紧来处理吧。jppllcjtionkrmtlselectnodjtdgrjTn readypiKxxg bkxbi ill vdLl lose-lecc, waiH 呷 for w W fMiM4bly nuny Mxfcets Io beconwecvCrooreUtm wLiWc妙利em GilluM*rreturn OKIcopy compleWjxwrw但是进行了改四.多路复用的三种方式(都是上面的I/O的多路复用, 进)1、selectsocket 0lOdlOFO ZER 0IteEen Cl I11每次调用select 0都需要把fd(文件描述符)从
6、用户态拷贝到内核 态,开销比较大2 每次都需要在内核遍历传入的fd (文件描述符)3 select支持文件数量比较小,默认是10242、pollpoll的实现和select非常相似,只是描述fd集合的方式不同,poll 使用pollfd结构而不是select的fd_set结构,支持的文件数量比较 多,不仅仅是10243、epollselect/poll只提供了一个函数,selct/poll函数,但是epoH 下 子就提供了 3个函数,真是人多力量大,难怪这么强,如下3个函数: epoll_create, epoll_ctl 和 epoll_wait, epoll_create 是仓U建一个 e
7、poll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待 事件的产生。epoll既然是对select和poll的改进,就应该能避免上述的三个缺 点。那epoll都是怎么解决的呢?在此之前,我们先看一下epoll和 select和poll的调用接口上的不同,select和poll都只提供了一个函 数select或者poll函数。而epoll提供了三个函数,epoll_create, epoll_ct 1 和 epoll_wait epoll_create 是创建一个 epoll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待事件的产生。对于
8、第一个缺点,epoll的解决方案在epoll_ct 1函数中。每次注册 新的事件到epoll句柄中时(在epoll_ct 1中指定EPOLL_CTL_ADD),会 把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll 保证了每个fd在整个过程中只会拷贝一次。对于第二个缺点,epoll的解决方案不像select或poll 一样每次都 把current轮流加入fd对应的设备等待队列中,而只在epoll_ctl时把 current挂一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设 备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回 调函数会把就绪的fd
9、加入一个就绪链表)。epoll_wait的丄作实际上就 是在这个就绪链表中査看有没有就绪的fd (利用schedule_timeout ()实 现睡一会,判断一会的效果,和select实现中的第7步是类似的)对于第三个缺点,epoll没有这个限制,它所支持的FD上限是最大可 以打开文件的数U,这个数字一般远大于204&举个例子,在1GB内存的机 器上大约是10万左右9具体数U可以cat /proc/sys/fs/file-max察看, 一般来说这个数U和系统内存关系很大。总结:1) select, poll实现需要自己不断轮询所有fd集合,直到设备就绪, 期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wait 不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪 时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在epoll_wait中 进入睡岷的进程。虽然都要睡眠和交替,但是select和poll在“醒着” 的时候要遍历整个fd集合,而epoll在“醒着”的时候只要判断一下就 绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来 的性能提升。2) select, pol
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版米厂水稻种植与电商平台合作销售合同4篇
- 2025年度智慧城市基础设施承包安装服务协议4篇
- 2025年度房地产交易会参展商服务保障协议3篇
- 2025版1A13365国际贸易实务操作手册授权合同3篇
- 2024-2030年中国耐磨陶瓷涂料行业市场深度分析及发展趋势预测报告
- 二零二五版海外科技园区劳务派遣与研发支持协议2篇
- 2025年房屋代持合同样本与资产评估协议4篇
- 个性化私人借贷合同(2024版)版B版
- 2025版国家级屠宰场高品质牛肉供货合同范本下载3篇
- 2025年离职后研发成果保密及竞业限制协议
- 中国成人暴发性心肌炎诊断和治疗指南(2023版)解读
- 新生儿低血糖课件
- 自动上下料机械手的设计研究
- 电化学储能电站安全规程
- 幼儿园学习使用人民币教案教案
- 2023年浙江省绍兴市中考科学真题(解析版)
- 语言学概论全套教学课件
- 大数据与人工智能概论
- 《史记》上册注音版
- 2018年湖北省武汉市中考数学试卷含解析
- 《肾脏的结构和功能》课件
评论
0/150
提交评论