linux 2.6源代码情景分析笔记之进程5
等待队列在内核中很多用途,尤其用在中断处理、进程同步及定时。等待队列实现了在事件上的条件等待:希望等待特定事件的进程把自己放进合适的等待队列,并放弃控制权。因此,等待队列表示一组睡眠的进程,当某一条件变为真时,由内核唤醒它们。
等待队列由双向链表实现,其元素包括指向进程描述符的指针。每个队列都有一个等待队列头,等待队列头是一个类型为wait_queue_head_t的数据结构。
struct __wait_queue_head {
spinlock_t lock;
struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;
等待队列由中断处理程序和主要内核函数修改。同步是通过等待队列头中的lock自旋锁达到的,task_list字段是等待进程链表的头。
等待队列链表中的元素类型为wait_queue_t:
struct __wait_queue {
unsigned int flags;
#define WQ_FLAG_EXCLUSIVE 0x01
struct task_struct * task;
wait_queue_func_t func;
struct list_head task_list;
};
每个元素代表一个睡眠进程,该进程等待某一事件的发生,它的描述符地址放在task字段中。task_list字段中包含的是指针,由这个指针把一个元素连接到等待相同时间的进程链表中。
有两种睡眠:互斥进程(等待队列元素的flags字段为1)由内核有选择地唤醒,而非互斥进程(flags数值为1)总是由内核在事件发生时唤醒。
#define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \
.lock = SPIN_LOCK_UNLOCKED, \
.task_list = { &(name)
相关文档:
例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......
一:前言
最近在研究android的sensor driver,主要是E-compass,其中用到了Linux input子系统.在网上也看了很多这方面的资料,感觉还是这篇分析的比较细致透彻,因此转载一下以便自己学习,同时和大家分享!
(这篇博客主要是以键盘驱动为例的,不过讲解的是Linux Input Subsystem,可以仔细的研究一下!)
键盘驱动将检 ......
ACE库中专门对线程同步提供了两个类,一个是ACE_Thread_Mutex另一个是ACE_REcursive_Thread_Mutex。 在我看 来,在linux下进行线程同步,不要使用ACE_Thread_Mutex,用ACE_REcursive_Thread_Mutex就可以了。原因很 简单,因为ACE_Thread_Mutex不支持线程重入。一旦重入(同一个线程调用两次ACE_Thread_Mutex: ......
为内核寻找新进程在cpu上运行时,必须只考虑可运行进程(TASK_RUNNING)。
提高调度程序运行速度的诀窍是建立多个可运行进程链表,每种进程优先权对应一个不同的链表。每个task_struct描述符包含一个list_head类型的字段run_list。如果进程的优先权等于k(0-139),run_list字段把该进程链入优先权为k的可运行进程的链表中。 ......