[Linux]基于按键-poll异步同步互斥阻塞
[Linux]基于按键-poll异步同步互斥阻塞
艾恩凝
2021/4/8
INSTRUCTION
每天学一点,总结一下这几个东西吧,代码很简单,理解理解概念
INSTANCE
举个例子
妈妈怎么知道卧室里小孩醒了?
① 时不时进房间看一下:查询方式
优缺点:简单,但是累
② 进去房间陪小孩一起睡觉,小孩醒了会吵醒她:休眠-唤醒
优缺点:不累,但是妈妈干不了活了
③ 妈妈要干很多活,但是可以陪小孩睡一会,定个闹钟:poll方式
优缺点:要浪费点时间,但是可以继续干活。妈妈要么是被小孩吵醒,要么是被闹钟吵醒。
④ 妈妈在客厅干活,小孩醒了他会自己走出房门告诉妈妈:异步通知
优缺点:妈妈、小孩互不耽误
POLL
使用休眠-唤醒的方式等待某个事件发生时,有一个缺点:等待的时间可能很久。我们可以加上一个超时时间,这时就可以使用poll机制。
① APP不知道驱动程序中是否有数据,可以先调用poll函数查询一下,poll函数可以传入超时时间;
② APP进入内核态,调用到驱动程序的poll函数,如果有数据的话立刻返回;
③ 如果发现没有数据时就休眠一段时间;
④ 当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记录数据、唤醒APP;
⑤ 当超时时间到了之后,内核也会唤醒APP;
⑥ APP根据poll函数的返回值就可以知道是否有数据,如果有数据就调用read得到数据
具体如何调用内核函数先不谈,先学会应用。
ASYNCHRONIZATION
异步,简单来说就是,一个应用程序不用主动去查询这个设备的状态,而是当它自己准备好,或者结束了某件事,主动告诉应用程序,然后应用程序进行某些操作。一般用信号量来进行操作
SYNCHRONIZATION or MUTEX or BLOCK
首先举个例子,小明房间里有一双滑板鞋,早上起床上学时看到还在,于是在学校里和同学约好下课一块玩滑板,结果小明房间的门没有锁,在小明离开房间期间,他的弟弟进入房间将滑板拿走了,等小明回去一看,滑板鞋已经不在了。造成的后果就是小明将失信于同学,解决办法就是将房间锁住。
把同步互斥阻塞放在一起说说,大体上其实就是为了解决问题,这个问题大体差不多。
在多进程状态下,如果多进程对一个资源进行操作,那么问题就来了,并发状态下,多进程需要合理并且正确的用资源,这就是同步问题,这里只谈两种解决同步问题的操作,原子操作和信号量。
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。
常用原子操作函数举例:
1atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0
2atomic_read(atomic_t *v); //返回原子变量的值
3void atomic_inc(atomic_t *v); //原子变量增加1
4void atomic_dec(atomic_t *v); //原子变量减少1
5int atomic_dec_and_test(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false。
信号量(semaphore)是用于保护临界区的一种常用方法,只有得到信号量的进程才能执行临界区代码。当获取不到信号量时,进程进入休眠等待状态。
常用信号操作函数举例:
1//定义信号量
2struct semaphore sem;
3//初始化信号量
4void sema_init (struct semaphore *sem, int val);
5void init_MUTEX(struct semaphore *sem);//初始化为0static DECLARE_MUTEX(button_lock);//定义互斥锁//获得信号量
6void down(struct semaphore * sem);
7int down_interruptible(struct semaphore * sem);
8int down_trylock(struct semaphore * sem);
9//释放信号量
10void up(struct semaphore * sem);
阻塞操作
是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。
总之,这节归结起来都是同步问题,为了解决问题产生出来的解决办法
CONCLUSION
读写设备文件,同步或异步机制都可以,同步机制下,需要我们的应用程序自己不断去查询设备文件是否可读写,属于主动出击;而采用异步机制时,应用程序是被动接受信号,当设备文件可读写时,由设备驱动程序给应用程序发信号,应用程序然后才去读写设备文件,属于被动接受。
应用程序代码好写,最重要的是理解这些概念问题。
则移山填海之难,
终有成功之日!
——孙文