{structtask_struct *tmp;if(!p)#没有进程等待就返回return;if(current == &(init_task.task)) panic ("task[0] trying to sleep"); tmp= *p;#在自己的内核堆栈中,暂时保存原来保存在**p中的进程,因为调度时,还没有退出interruptible_sleep_on函数*p =current;#**p保存当前进程 repeat: current->state...
{structtask_struct *tmp;if(!p)#没有进程等待就返回return;if(current == &(init_task.task)) panic ("task[0] trying to sleep"); tmp= *p;#在自己的内核堆栈中,暂时保存原来保存在**p中的进程,因为调度时,还没有退出interruptible_sleep_on函数*p =current;#**p保存当前进程 repeat: current->state...
(2)192:*p=NULL; 按照道理说,唤醒首进程xxx后,应将*p置为下一等待PCB的地址,但在sleep_on的分析中,下一PCB地址放在局部变量tmp中,也就是说要到xxx的内核栈寻找,此时xxx的栈中有schedule()的返回地址(163行的地址),函数schedule的局部变量,越过这些之后,应该可以找到tmp。 这里直接将*p=NULL,当再次wake_up此...
https://github.com/GreyZhang/little_bits_of_linux 这次看一下__sleeo_on函数。按照我的初步理解,我先做了一下注释说明如下: 接下来,看看这个函数的调度。 这个函数一共有两个调用的位置,接下来逐个看一下。 两个调度的信息全都在上面了,其中的一个是可中断的睡眠,另一个是睡眠。从这里看,还是没有找到...
Linux 0.11 中的阻塞与唤醒,就是 sleep_on 和 wake_up 函数。 其中sleep_on 函数将 state 变为 TASK_UNINTERRUPTIBLE。 // sched.cvoidsleep_on(structtask_struct**p){structtask_struct*tmp;...tmp=*p;*p=current;current->state=TASK_UNINTERRUPTIBLE;schedule();if(tmp)tmp->state=0;} ...
3.1 sleep类延时函数 下述函数将使得调用它的进程睡眠参数指定的时间,受系统 HZ 和进程调度的影响,msleep()类似函数的精度是有限的。msleep()、ssleep()不能被打断,而msleep_interruptible()则可以被打断。 voidmsleep(unsignedintmillisecs); unsignedlongmsleep_interruptible(unsignedintmillisecs); ...
我手边没有linux 0.11的代码,所以快速看了眼linux1.0 sleep on的代码, 然后对照了一下你的描述....
进程控制函数:pause、sleep、usleep 函数atexit on_exit atexit函数: #include<stdlib.h> 功能:注册终止函数(即进程执行结束后调用的函数) 用法:int atexit( void (*func)(void)); (参数为回调函数) 注意:按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用。atexit()注册的函数类型应为...
进程的睡眠是通过调用sleep_on函数,该函数修改了进程的状态并且通过schedule函数切换到其他进程执行,从而实现进程的挂起,TASK_UNINTERRUPTIBLE状态的进程只能被wake_up...} // 当前进程挂载到睡眠队列p中,p指向队列头指针的地址 void sleep_on(struct task_struct **p) { struct task_struct *tmp;...,即tmp指向第...
Linux系统进程状态 PROCESS STATE CODES Here are the different values that the s, stat and state output specifiers...Linux 进程有两种睡眠状态,一种interruptible sleep,处在这种睡眠状态的进程是可...