欢迎来到天天文库
浏览记录
ID:20708149
大小:1.25 MB
页数:31页
时间:2018-10-15
《阻塞和非阻塞型io》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、上章回顾从并发的需要,引起的竞争状态,到解决竞争状态的方法机制:禁止中断信号量自旋锁Completion原子操作阻塞和非阻塞型I/O第4章本章目标掌握进程睡眠和唤醒的方法掌握阻塞型I/O的实现方法掌握poll/select系统调用的实现方法本章结构阻塞型I/O阻塞和非阻塞型I/O异步通知非阻塞I/O非阻塞I/Opoll/select进程休眠和唤醒方法阻塞型I/O实例4-1阻塞型I/O当用户程序调用read函数时,驱动程序的read并没有准备好数据,怎么办?当用户程序调用write时,驱动程序的write的缓冲区已满,此时怎么办?1.用户程序不会管理这些问题。
2、2.驱动程序默认情况下,阻塞该进程。将其置入休眠状态直到请求可继续3.直接返回,这是非阻塞IO4-1-1进程休眠和唤醒方法休眠的意义?从调度器的运行队列某个等待队列等到某个事件发生,在从等待队列返回到运行队列。如何将进程安全的进入休眠状态?不能在原子上下文进行休眠:休眠时,对外界一无所知,进程必须重新检测等待条件进程只有确保会被其他进程唤醒,才能进入休眠需要等待队列来管理和维护这些信息:等待队列就是一个进程链表,其中包含了等待某个特定事件的所有进程4-1-1进程休眠和唤醒方法等待队列的作用实现阻塞进程的唤醒实现内核中的异步事件通知机制队列的数据结构系统的调
3、度机制同步系统资源的访问Semaphore可以用waitqueue来实现4-1-1进程休眠和唤醒方法等待队列通过”等待队列头”来管理Structwait_queue_head_tDECLARE_WAIT_QUEUE_HEAD(name);wait_queue_head_txxx_queue;init_waitqueue_head(&xxx_queue);4-1-1进程休眠和唤醒方法等待事件在休眠的同时,也检查进程等待的条件休眠函数wait_event(queue,condition);wait_event_interruptible(queue,condit
4、ion);wait_event_timeout(queue,condition,timeout);wait_event_interruptible_timeout(queue,condition,timeout);休眠前后都要对该表达式求值;在条件为真之前,进程会保持休眠等待队列头,通过”值传递”4-1-1进程休眠和唤醒方法唤醒函数wake_up(wait_queue_head_t*queue);wake_up_interruptible(wait_queue_head_t*queue);约定的做法是成对使用wake_up_nr(wait_queue_hea
5、d_t*queue,intnr);wake_up_interruptible_nr(wait_queue_head_t*queue,intnr);唤醒nr各独占等待进程,而不是一个,当nr=0时,唤醒所有的独占等待进程。wake_up_all(wait_queue_head_t*queue);wake_up_interruptible_all(wait_queue_head_t*queue);wake_up_interruptible_sync(wait_queue_head_t*queue);4-1-1进程休眠和唤醒方法staticDECLARE_WAIT
6、_QUEUE_HEAD(wq);staticintflag=0;ssize_tsleepy_read(structfile*filp,char__user*buf,size_tcount,lofft*pos){printk(KERN_DEBUG“process%i(%s)goingtosleep”,current->pid,current->comm);wait_event_interruptible(wq,flag!=0);flag=0;printk(KERN_DEBUG“awoken%i(%s)”,current->pid,current->co
7、mm);return0;}定义并初始化wait_queue_head_t打印出是哪个进程调用驱动程序。在调用前后都要检查condition,如果满足条件,就不再休眠,否则进入休眠状态4-1-1进程休眠和唤醒方法ssize_tsleepy_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*pos){printk(KERN_DEBUG“process%i(%s)awakeningthereaders…”,current->pid,current->comm);flag=1;wake_up
8、_interruptible(&wq);return
此文档下载收益归作者所有