宿迁网站推广公司旅游企业seo官网分析报告
io深层理解
- 1.内核态
- 2.用户态
- 3. select IO多路复用执行原理
- 4. select io多路复用限制和不足
1.内核态
一个进程会涉及多文件的修改,比如说。那么在内核态就会维护一个表,这个表叫文件描述符bitmap,这个表会传递给内核态,当然肯定传递的是地址咯!
- 用户态关心的文件,执行select,等待网络io回来。。。
- 那么用户态将关心的fd_map 取地址传递给内核,内核扫描这个fd_map,当然select的是一个最大为1024的bit数组,这个fd_map,对应索引为fd_id的位置上,就会置为1,传递给内核后,内核空间会轮训这个map,判断是否有数据到来,并从网卡拷贝到了内核的数据缓存队列。
2.用户态
- 用户态执行select之后,会阻塞,等待数据到来,注意此时进程内部的线程是挂起的,进程也会挂起,也就是说,目前的线程是服从操作系统的调度,可以干其他任务的。而当数据到来之后,操作系统恢复上下文,恢复寄存器变量等,继续执行业务代码。
图文说明:
3. select IO多路复用执行原理
- 将当前进程的所有文件描述符,一次性地从用户态拷贝到内核态
- 在内核中快速无差别地遍历每个id,判断是否有数据到来
- 将所有fd状态,从内核态拷贝到用户态,并返回已就绪的fd的个数
- 在用户态遍历判断具体哪个fd已就绪,然后进行相应的事件处理
4. select io多路复用限制和不足
- 文件描述符表为bitmap,有长度限制1024的限制
- fdset无法做到重用,每次循环必须重新创建
- 频繁的用户态和内核态的拷贝,性能开销很大
- 需要对文件描述符进行遍历,O(n)的轮训时间复杂度