APUE读书笔记-第14章-高级I/O
14.1 引言
*高级I/O包括非阻塞I/O、记录锁、系统V流机制、I/O多路转换(select和poll函数)、readv和writev函数以及存储映射I/O(mmap)
14.2 非阻塞I/O
*非阻塞I/O使我们可以调用open、read和write这样的I/O操作,并使这些操作不会永远阻塞
14.3 记录锁
*记录锁(record locking)的功能是:当一个进程正在读或修改文件的某个部分时,它可以组织其他进程修改同一文件区
*考虑数据库访问例程库。如果该库中所以函数都以一致的方法处理记录锁,则称使用这些函数访问数据库的任何进程集为合作进程(cooperating process)。
*建议性锁并不能阻止对数据库文件有写权限的任何其他进程对数据库文件进行随意的写操作
*强制性锁使内核对每一个open、read和write系统调用都进行检查,检查调用进程对正在访问的文件是否违背了某一把锁的作用。强制性锁有时也被称为强迫方式锁(enforcement-mode locking)
*如果一个进程试图读、写一个强制性锁起作用的文件,而欲读、写的部分又由其他进程加上了读或写锁,此时会发生什么呢?对这一问题的回答取决于三方面的因素:操作类型(read或write),其他进程保有的锁的类型(读锁或写锁),以及有关描述符是阻塞还是非阻塞的
14.4 STREAMS
*流在用户进程和设备驱动程序之间提供了一条全双工通路。流无需和实际硬件会话,流也可以用来构造伪设备驱动程序
*任意数量的处理模块可以压入流。我们使用术语压入,是因为每一新模块总是插到流首之下,而将以前的模块下压(这类似于后进先出的栈)
*ioctl的第二个参数request说明执行哪一个操作。所有request都以I_开始。第三个参数的作用与request有关,有时它是一个整数值,有时它是指向一个整型或一个数据结构的指针
14.5 I/O多路转接
*问题:telnet进程有两个输入、两个输出。对这两个输入中的任一个都不能使用阻塞read,因为我们永远不知道哪一个输入有我们需要的数据
*一种方法是仍旧使用一个进程执行该程序,但使用非阻塞I/O读取数据。基本方法是将两个输入描述符都设置为非阻塞的,对第一个描述符发一个read。如果该输入上有数据,则读数据并处理它;如果无数据可读,则read立即返回。然后对第二个描述符作同样的处理。
*一种比较好的技术是I/O多路转换(I/O multiplexing)。先构造一张有关描述符的列表,然后调用一个函数,直到这些描述符中的一个已准备好进行I/O时,该函数才返回。在返回时,它告诉进程哪些描述符已准备好可以进行I/O
14.6 异步I/O
*除了调用ioctl说明产生SIGPOLL信号的条件以外,还应为该信号建立信号处理程序。对于SIGPOLL的默认动作是终止该进程,所以应当在调用ioctl之前建立信号处理程序
14.7 readv和writev函数
*readv和writev函数用于在一次函数调用中读、写多个非连续缓冲区。有时也将这两个函数称为散布读(scatter read)和聚集写(gather write)
14.8 readn和writen函数
*管道、FIFO以及某些设备,特别是终端、网络和STREAMS设备有下列两种性质:
(1)一次read操作所返回的数据可能少于所要求的数据,即使还没达到文件尾端也可能是这样。这不是一个错误,应当继续改设备
(2)一次write操作的返回值也可能少于指定的字节
14.9 存储映射I/O
*存储映射I/O(Memory-mapped I/O)使一个磁盘文件与存储空间中的一个缓冲区相映射
*mmap函数实现就告诉内核将一个文件映射到一个存储区域中
*void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);
*addr参数用于指定映射存储区的起始地址
*len是映射字节数
*prot参数说明对映射存储区的保护要求。对指定映射存储区的保护要求不能超过文件open模式访问权限
*flag参数影响映射存储区的多种属性
*filedes指定要被映射文件的描述符
*off是要映射字节在文件中的起始偏移量
转载于:https://www.cnblogs.com/jiangu66/p/3246776.html
APUE读书笔记-第14章-高级I/O相关推荐
- 《Spring实战》读书笔记-第3章 高级装配
<Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...
- Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理
Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...
- 《Spring实战》读书笔记-第3章 高级装配,zookeeper原理图
文章目录 3.1 环境与profile 3.2 条件化的bean 3.3 处理自动装配的歧义性 3.4 Bean的作用域 3.5 运行时植注入 3.6 小结 本章内容: Spring profile ...
- 《Spring实战》读书笔记-第3章 高级装配,字节跳动四面技术面
当自动装配bean时,遇到多个实现类的情况下,就出现了歧义,例如: @Autowired public void setDessert(Dessert dessert) { this.dessert ...
- APUE读书笔记-第15章-进程间通信
15.1 引言 *进程之间交换信息的方法可以经由fork或exec传送打开文件,或者通过文件系统 *进程之间相互通信的其他技术--IPC(InterProcess Communication)包括半双 ...
- APUE读书笔记-第十一章-线程
新创建的线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但是该线程的挂起信号集会被清除 新线程时调用pthread_self函数获取自己的线程ID,而不是从共享内存中读出,或者从线 ...
- 《Spring实战》读书笔记-第3章 高级装配,最新Java大厂高频面试题
<jee:jndi-lookup id="dataSource" lazy-init="true" jndi-name="jdbc/myData ...
- 《Spring实战》读书笔记-第4章 面向切面的Spring
<Spring实战>是学习Spring框架的一本非常经典的书籍,之前阅读了这本书,只是在书本上写写画画,最近整理了一下<Spring实战>的读书笔记,通过博客的方式进行记录分享 ...
- Unity Shader入门精要学习笔记 - 第14章 非真实感渲染
Unity Shader入门精要学习笔记 - 第14章 非真实感渲染 本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1 ...
最新文章
- es父子结构查询_ES 父子文档查询
- 100+篇技术文章推荐总有一篇你想看的
- Java多线程核心知识
- 顺丰快递单号的规律_顺丰快递单号查询跟踪(单号码查询)
- 自己动手调试Android源码(超简单)
- qhfl-6 购物车
- 计算机导论设计实验,基于抽象知识点的《计算机导论》实验软件设计
- [css] 说说响应式设计(responsive design)和自适应设计(adaptive design)的区别?
- SQL Server时间函数
- 百度启用Baidu.co.jp域名,有利于其在日本推广
- oracle 更新数据更新不进去_关于微软及Oracle安全更新汇总的通知
- braft的LogEntry日志记录存储LogStorage
- 【DFS + 记忆化递归】LeetCode 140. Word Break II
- 怎样设置电脑壁纸_怎样把C盘设置成禁止安装任何软件?教你两个方法,告别电脑卡顿...
- windows自带录屏_电脑版免费的录屏软件有哪些?
- GraphPad Prism 统计教程 :高斯分布
- Android字节码ASM插桩
- iOS 热敏打印机打印位图
- 平台型时间信号强度曲线_MRI对动态增强时间信号曲线呈平台型乳腺纤维.PDF
- android背光控制 自动关闭,Android P自动背光原理
热门文章
- 网络推广——网络推广专员优化网站有秘诀!
- 浅析网站SEO整站优化的优势!
- 网站SEO优化介绍搜索引擎给网站排名的过程
- hbase原理与实践_HBase 性能调优第一弹:内存篇
- javascript 高级程序设计_JavaScript 经典「红宝书」,几代前端人的入门选择
- 5G RRC——为NAS层提供连接管理,消息传递等服务; 对接入网的底层协议实体提供参数配置的功能; 负责UE移动性管理相关的测量、控制等功能...
- tsne pca 自编码器 绘图(CC2)——一定记得做无量纲化处理使用standardscaler,数据聚类更明显...
- mongodb给我们提供了fsync+lock机制把数据暴力的刷到硬盘上
- 2015年各银行无抵押信用贷款利率及额度是多少?
- 从pfx里面 解析出公私钥