IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 概念篇——I/O多路复用 -> 正文阅读

[系统运维]概念篇——I/O多路复用

说明
??本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。
??QQ 群 号:513683159 【相互学习】
内容来源
??《Unix环境高级编程》

一、I/O多路复用的引出

不同的I/O使用情形:

情形一:一个输入(写),一个输出(读)

??常使用以下形式循环中使用阻塞I/O

while( (n = read(STDIN_FILENO,buf,BUFSIZE)) > 0 )
	if( write(STDOUT_FILENO,buf,n) != n )
		fprintf(stderr,"write error");

情形二:两个输入,两个输出

??两个输入中任一个都不能使用阻塞read(),因为我们永远不知道哪个输入有我们需要的数据。
??方案一
???? 描述fork()将一个进程变成两个进程,每个进程处理一条通路(执行阻塞read()
???? 产生问题:操作何时终止?
???? 解决问题:根据不同终止情形进行处理,如:使用信号机制。(使得程序复杂)
??方案二
????描述一个进程中的两个线程(执行阻塞I/O)
????避免终止的复杂度但要求处理线程之间的同步(使得程序复杂)。
??方案三
????描述一个进程中的两个线程(执行非阻塞I/O)
????缺点:浪费CPU时间。(在多任务系统中应该避免使用该方法)
??方案四
????描述使用异步I/O技术
????基本思想:进程告诉内核,当一个描述符已准备好可进行I/O时,用一个信号通知它。
????存在问题
??????1.并非所有系统都支持该机制。
??????2.这种信号对每个进程而言仅有一个起作用。(若两个都起作用则无法分辨)
??方案五
????描述使用I/O多路转接技术
????基本思想:先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中一个已准备好进行I/O时,该函数才返回,返回时,它告诉进程哪些描述符已准备好可进行I/O。
??

二、 I/O多路复用概念

??1.I/O多路复用是什么?
?? ?? 允许应用在多个文件描述符上同时阻塞,并在其中某个可读写时收到通知。
??2.设计遵循的原则
????①当任何文件描述符指向的文件准备好输入输出时进行通知。
????②在一个或更多文件描述符就绪前始终处于睡眠状态
????③唤醒
????④在不阻塞情况下处理所有I/O就绪的文件描述符
????⑤回到①,循环

三、函数简介

(1)函数简介:

详细请查看:函数简介篇——IO多路转接函数:select()/pselect()/poll()/ppoll()
??1??select()/pselect()——同步I/O多路复用
????程序监视多个文件描述符,直到其中一个或多个文件描述符“就绪的”进行某种I/O操作
??2??poll()/ppoll()——等待文件描述符上的某个事件
????等待一组文件描述符中的一个准备好执行I/O

(2)poll()与select()的优缺点

??poll()select()功能相同,但poll()系统调用仍然优于select().
1.poll()的优点:
????①poll()无需使用者计算最大的文件描述符值加一和传递该参数。
????②poll()在应对较大值的文件描述符时更具效率。

想像一下用select() 监视值为900的文件描述符——内核需要检查每个集合中的每个比特位,直到第九百个。

????③ select()的文件描述符集合是静态大小的,所以要作出权衡:要么集合很小,限制了select()可以监视的文件描述符的最大值,要么较大,但是效率不高。尤其是当不能确定集合的组成是否稀疏时,对较大位掩码的操作效率不高。 使用poll()则可以创建合适大小的数组。只需要监视一项或仅仅传递一个结构体。

????④若用select(),文件描述符集合会在返回时重新创建,这样的话之后每个调用都必须重新初始化它们。poll()系统调用分离了输入(events字段)和输出(revents字段),数组无需改变即而重用。
????⑤select()timeout参数在返回时是未定义的。可移植的代码需要重新初始化它。然而pselect()没有这个问题。
2.select()的优点:
????①poll()由于某些Unix系统不支持poll(),所以 select()的可移植性更好
????②select()提供了更好的超时方案:直到微秒级。ppoll()pselect()在理论上都提供纳秒级的精度,但在实际中,没有任何调用可以可靠的提供哪怕是微秒级的精度。
????比poll()select()更好的是epoll接口,一个Linux特有的IO多路复用解决方案,我们将在第四章探讨。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:46:32  更:2022-04-15 00:48:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 21:38:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码