APUE 第十四章 高级I/O

博客讨论了I/O模型的两种主要类型:阻塞和非阻塞。阻塞I/O在等待数据时会挂起进程,而非阻塞I/O则立即返回并允许进程继续其他任务。文章提到了设置非阻塞I/O的方法,如open函数的O_NONBLOCK标志和set_fl。此外,介绍了记录锁的概念,以及I/O多路转接技术,如select和pselect,它们用于同时检查多个文件描述符的状态。poll函数也被提及,它允许对一组文件描述符的多种事件感兴趣。最后,文章探讨了异步I/O,包括systemV、BSD和POSIX AIO,它们使用信号量来处理I/O完成的通知。

I/O 分为阻塞和非阻塞,阻塞就是我要一个东西,然后得不到就在那等,非阻塞就是,我要一个东西,对方立马返回结果说没有,那我就继续做其他的事,要设置非阻塞,方法有:

1.open需要指定O_NONBLOCK

2. set_fl指定文件状态标志为O_NONBLOCK

标准输出是普通文件或者终端STDOUT,STDERR,那么结果可能是不同的

14.3 记录锁

更准去的来说,是字节范围锁,也即给部分文件加锁

看到父进程和子进程之间的关系图,太无聊了

加锁,没啥要读的 看到402 强制性锁和建议性锁

14.4 I/O多路转接

阻塞IO 就是我要一个东西,得不到就死等, 非阻塞就是 我要一个东西,得不到就立即返回,过一回再来要(轮询)
非阻塞IO可以提升效率,但是这种技术依赖于信号量,因此只适合终端设备和网络IO

14.4.1 select和pselect

Maxfdp1 为描述符最大值 + 1, readfds,writefds等为select关心的读,写的描述符集合,如果readfds有readfds[i]是准备好,则该readfds[i]置为1

pselect和select其实是类似的

14.4.2 poll函数


nfds为数组fdarray的长度,pollfd结构体如下:

 

events为我们对文件描述符fd感兴趣的事件, revents为在fd上发生过的时间:

 总而言之,poll就是把一堆感兴趣的fd传进去,并表明对这些fd的哪些事件感兴趣

14.5 异步I/O

14.5.1 ~14.5.2 system V和bsd异步I/O


其实都是用信号量来完成的

14.5.3 POSIX异步I/O


其实就是AIO

结构有个sigevent,用来表示IO完成以后,我们应该采取的的动作

其中字段sigev_notify表示通知的类型: 

SIGREV_NONE 不通知进程

SIGREV_SIGNAL 发给捕捉该信号的进程,入队

SIGREV_THREAD 执行sigev_notify_function指定的函数

看到424页
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值