这行代码定义了一个等待函数wait,使用woken_wake_function作为回调函数。当等待的条件满足时,woken_wake_function会被调用,唤醒等待的进程。 (2)等待是靠sk_wait_event函数实现,他的原理如下 至于上下文的计数器,是写等待计数。这个先忽略。 检查指定条件是否满足(这里是检查sk->sk_err和sk->sk_state)。 如果条件...
1. 通过add_wait_queue()函数将一个进程添加到等待队列,首先获得队列的自旋锁,然后调用__add_wait_queue()实现将新的等待进程添加等待队列(添加到等待队列的头部),然后解锁;代码如下: 1. static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new) 2. { 3. new->task_list,...
1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙);2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作;init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于task_interruptible状态,“收尸”过程中则处于task_running状态。
1. 通过add_wait_queue()函数将一个进程添加到等待队列,首先获得自旋锁,然后调用__add_wait_queue()实现将新的等待进程添加等待队列(添加到等待队列的头部),然后解锁;代码如下: static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new) { list_add(&new->task_list, &head-...
// file:net/core/sock.c int sk_wait_data(struct sock *sk, long *timeo, const struct sk_buff *skb) { DEFINE_WAIT_FUNC(wait, woken_wake_function); int rc; // 向sock等待队列添加等待项 add_wait_queue(sk_sleep(sk), &wait); sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); // 等待条件为...
atomic_dec(&task_rq(p)->nr_iowait); } activate_task(rq, p, en_flags); // 将待唤醒的进程加入CFS就绪队列中,也就是将进程调度实体加入红黑树中 ttwu_do_wakeup(rq, p, wake_flags, rf); // 检查待唤醒的进程是否应该发生抢占 } voidactivate_task(structrq *rq,structtask_struct *p,intflags...
| | | |--1.07%--wait_woken | | | | schedule_timeout | | | | schedule | | | | __schedule | | | | finish_task_switch | | | | | | | --0.54%--tty_write_room | | | tty_buffer_space_avail | | | | | --0.80%--__virt_addr_valid ...
幸运的是实时Linux具有一种可在时间上减弱实时与非实时操作的机制,这种机制表现为一种称为实时FIFO的驱动程序。当insmod将rtl_fifo.o驱动程序插入Linux内核时,该驱动程序将自己注册为RTLinux的一部分,并成为Linux驱动程序。一旦插入Linux内核,用户空间进程和实时任务都可使用实时Linux FIFO。 在深入探讨实时FIFO的细节之...
至此,一个进程就已经终结了,但是注意这个进程只是作为一个僵尸进程存在,并没有真正的消亡。它的实体task_struct也即进程描述符仍然存在,需要等待其父进程调用wait来收集它,这个进程才算是真正的消亡了。 小结 总结一下,除去安全等防御性编程外,进程的exit大概做了以下的三件事: ...
pthread_wait_np(); // wait to be woken up.。. // process interrupt now in realtime kernel context 。.. } } // interrupt handler unsigned int irq_handler(unsigned int irq, struct pt_regs *regs) { pthread_wakeup_np(pp_thread); // wake up thread to do IRQ post-processing ...