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页
博客讨论了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完成的通知。
514

被折叠的 条评论
为什么被折叠?



