[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

读写设备文件,同步或异步机制都可以,同步机制下,需要我们的应用程序自己不断去查询设备文件是否可读写,属于主动出击;而采用异步机制时,应用程序是被动接受信号,当设备文件可读写时,由设备驱动程序给应用程序发信号,应用程序然后才去读写设备文件,属于被动接受。

应用程序代码好写,最重要的是理解这些概念问题。


    


公众号'艾恩凝'
个人公众号
个人微信
个人微信
    吾心信其可行,
          则移山填海之难,
                  终有成功之日!
                                  ——孙文
    评论
    0 评论
avatar

取消