3.6.高级IO

请移步到这

http://note.youdao.com/noteshare?id=a89fc9ab105b08685fd309b0eca8a9a3&sub=6DBEB14ADE5C42A6B8D97CAFF3CDC359

可以参考我的博客:

https://blog.csdn.net/qq_40732350/article/details/82114876

3.6.1.非阻塞IO

3.6.1.1、阻塞与非阻塞

3.6.1.2、为什么有阻塞式

(1)常见的阻塞:wait、pause、sleep等函数;read或write某些文件时

(2)阻塞式的好处:当条件没有满足时,先交出CPU,让其他进程运行

3.6.1.3、非阻塞

(1)为什么要实现非阻塞

由于阻塞式类似于栈,前面阻塞的进程没有执行,后面阻塞的进程就无法执行

(2)如何实现非阻塞IO访问:

O_NONBLOCK: 只能在打开的时候设置

fcntl: 可以在文件打开后设置

 

3.6.2.阻塞式IO的困境

3.6.2.1、程序中读取键盘

3.6.2.2、程序中读取鼠标

3.6.2.3、程序中同时读取键盘和鼠标

3.6.2.4、问题分析

 

3.6.3.并发式IO的解决方案

3.6.3.1、非阻塞式IO

3.6.3.2、多路复用IO

3.6.3.3、异步通知(异步IO)

非阻塞式:

优点:可以不用等待条件,不论条件满不满足,都执行后面的程序。可以通过while不断检查条件的发生,来达到同时(宏观)运行多个非阻塞,例如(同时检查鼠标和键盘)

缺点:

1.如果我们想实现当条件发生时就立即响应这个功能,就得不断检查条件,太浪费CPU

2.如果while中有多个非阻塞,那么当在执行某个非阻塞时,可能另一个非阻塞的条件已经发生,这样就会导致漏掉一些信息

3.6.4.IO多路复用原理

3.6.4.1、何为IO多路复用

(1)IO multiplexing

(2)用在什么地方?多路非阻塞式IO。

(3)select和poll

(4)外部表现为阻塞式,内部非阻塞式自动轮询多路阻塞式IO

其实内部就是while加非阻塞(类似),但是它内部不会占用CPU 太多时间

3.6.4.2、select函数介绍

FD_ISSET(int fd, fd_set *set) 这个函数很有意思,当注册完一个文件后,再调用这个函数检查这个文件描述符,得到的值式非零,

当调用了select()后,再退出后,如果这个文件描述符的阻塞没有发生,则再调用这个函数就会返回0,如果发生了就会返回非0,

可以用于检测阻塞有没有发生

 

3.6.4.3、poll函数介绍

优点:不会浪费太多CPU时间,且达到while加非阻塞的效果

缺点:

1.select和poll本身时阻塞式的,当里面的条件没满足或者超时,就会一直阻塞,

2.这两个函数可以同时注册多个阻塞,但是只要有一个阻塞发生就会马上退出函数,而不会等其它阻塞发生,更不会等全部阻塞发生后才退出

3.6.5.IO多路复用实践

3.6.5.1、用select函数实现同时读取键盘鼠标

3.6.5.2、用poll函数实现同时读取键盘鼠标

 

 

3.6.6.异步IO

3.6.6.1、何为异步IO

(1)几乎可以认为:异步IO就是操作系统用软件实现的一套中断响应系统。

(2)异步IO的工作方法是:我们当前进程注册一个异步IO事件(使用signal注册一个信号SIGIO的处理函数),然后当前进程可以正常处理自己的事情,当异步事件发生后当前进程会收到一个SIGIO信号从而执行绑定的处理函数去处理这个异步事件。

类似中断

3.6.6.2、涉及的函数:

(1)fcntl(F_GETFL、F_SETFL、O_ASYNC、F_SETOWN)

设置文件的异步IO属性

(2)signal或者sigaction(SIGIO)

注册异步IO处理函数

3.6.3.代码实践

优点:

1.类似中断处理,可以一直检测,

2.当一个鼠标阻塞发生,然后执行相应处理函数后,还可以继续检测鼠标阻塞,而不用手动又来重新添加一个鼠标阻塞,

缺点:还没发现

展望:如何撤销这个阻塞事件

3.6.7存储映射IO

3.6.7.1、mmap函数

3.6.7.2、LCD显示和IPC之共享内存

3.6.7.3、存储映射IO的特点

(1)共享而不是复制,减少内存操作

(2)处理大文件时效率高,小文件不划算

3.6.8多进程实现多个IO同时检测

如父进程实现一个IO,子进程实现一个IO,就可简单实现多个IO同时检测

优点:简单

缺点:进程间切换浪费CPU,

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值