Linux-0.12内核sleep_on函数分析

sleep_on用于进程休眠,原型如下:

void sleep_on(struct task_struct **p)

当进程访问某个互斥资源时,如果资源被另外进程占用,当前进程就需要休眠。

假设资源的结构如下:

struct res

{

....

struct task_struct *wait;

}

其实我们参考下文件系统的i节点就会发现,i节点也是一种资源,它的结构体中就有一个变量i_wait。那么我们就用i节点举例。如果进程访问某个i节点,发现i节点被锁住,当前进程就需要睡眠:sleep_on(&i_wait),这样当前进程就在i节点的i_wait队列上睡眠,那么重点是i_wait睡眠队列是如何形成的呢?用下面的图片叙述。

注意点:p和current是全局变量,tmp是进程私有,在进程栈中。i_wait=NULL,并且i_lock=1,代表inode被锁住没法访问。

Linux-0.12内核sleep_on函数分析

时间: 2024-11-07 05:20:31

Linux-0.12内核sleep_on函数分析的相关文章

Linux 0.12 内核管理存储器

其分段,用分段的机制把进程间的虚拟地址分隔开. 每一个进程都有一张段表LDT.整个系统有一张GDT表.且整个系统仅仅有一个总页表. 其地址翻译过程为: 程序中给出的32位地址(实际上被看做段内偏移地址),再依据代码段寄存器CS中的16位段选择子,可在GDT或LDT中查找对应的段描写叙述符.从段描写叙述符中提取段的基地址,与程序给出的32位地址相加.得到结果为线性地址. 依据此线性地址查找系统页文件夹表,再查二级或是多级页表,终于得到物理地址. 此方式系统仅仅有一个4G的线性地址空间由各进程共享(

《linux 内核完全剖析》编译linux 0.12 内核 Ubuntu 64bits 环境

我×...终于好了,大概3 4个小时吧...各种毛刺问题.终究还是闯过来了.... [email protected]:~/Downloads/linux-0.00-050613/linux-0.00$ make ld -s -x -M head.o  -o system > System.map dd bs=32 if=boot of=Image skip=1 16+0 records in 16+0 records out 512 bytes (512 B) copied, 0.000605

第一次作业 基于Linux 0.12的进程模型分析

作业内容 挑选一个开源的操作系统,深入源码分析其进程模型,具体包含如下内容: 操作系统是怎么组织进程的 进程状态如何转换(给出进程状态转换图) 进程是如何调度的 谈谈自己对该操作系统进程模型的看法 1.操作系统是怎么组织进程的 1.1什么是进程 程序是一个可执行的文件,而进程是一个执行中的程序实例.Linux操作系统上利用分时技术,可同时运行多个进程.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片,让每个进程在一个时间

Linux 0.12内核与现代内核在内存管理上的区别

0.12内核的内存管理比较简单粗暴,内核只用了一个页目录,只能映射4G的线性空间,所以每个进程的虚拟空间(逻辑空间)只能给到64M,最多64个进程:每个进程都有对应的任务号nr,当一个进程需要分配进程空间时,只需要nr乘以64M就可以得出该进程空间的线性起始地址.然后该进程的代码段.数据段描述符里面的基址字段会被设定为(nr x 64M),同时可以为进程分配页目录项和页目录表用以承载映射关系. 之后如果进程要访问自己空间内的某个地址时就会首先用基地址与程序内32位偏移地址(逻辑地址)合成出线性地

《linux 内核全然剖析》编译linux 0.12 内核 Ubuntu 64bits 环境

我×.. . 最终好了,大概3 4个小时吧...各种毛刺问题.终究还是闯过来了.. .. [email protected]:~/Downloads/linux-0.00-050613/linux-0.00$ make ld -s -x -M head.o  -o system > System.map dd bs=32 if=boot of=Image skip=1 16+0 records in 16+0 records out 512 bytes (512 B) copied, 0.000

Linux-0.11内核源码分析系列:进程调度sleep_on()函数分析

</pre><pre name="code" class="cpp">/* *Author : DavidLin *Date : 2014-12-10pm *Email : [email protected] or [email protected] *world : the city of SZ, in China *Ver : 000.000.001 *history : editor time do * 1)LinPeng 2014-1

Linux 0.12和Linux 0.11内核学习——Google邮件列表

亲,你在学习Linux 0.12或0.11内核吗?快来加入我们吧,就缺你了!!! 为什么选用邮件列表呢?因为赵炯博士那个论坛交流不是很方便,经常发了贴没人回,人气相比十年前论坛刚成立时弱了不少.很多人,很多元老级别的人物,消失了...再也没有出现过. 而QQ群很繁杂,比如你肯定会因为一些兴趣爱好加入一些QQ群,但是也就刚加进去或者自己有什么要问的时候说几句,之后就屏蔽了,因为每天都有人在聊天,什么内容都有,想退群却又怕以后有用,不退吧又很烦,只能屏蔽了潜水. 而邮件列表,你可以订阅主题,实时追踪

Linux 0.12的编译与链接

昨天花了很长时间去编译链接linux 0.12版的kernel,发现在64位ubuntu下,这位兄台的文章写得最全最好,几乎涵盖了我遇到的所有问题,在此记录一下. 编译linux 0.12 链接linux 0.12

Linux 0.12 sched.c代码理解

最近看看linux0.12,对自己理解内核有很大帮助,但是有些东西也确实需要时间去认真分析,今天看看了sched.c的代码,和大家分享一下.先上代码 /* * linux/kernel/sched.c * * (C) 1991 Linus Torvalds */ /* * 'sched.c' is the main kernel file. It contains scheduling primitives * (sleep_on, wakeup, schedule etc) as well a