Linux 核心--12.Linux内核机制(2)

2008-02-23 07:23:42来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



  


11.4  等待队列
进程经常要等待某个系统资源。例如某个进程可能需要描叙文件系统中某个目录的VFS inode但是此inode可 能不在buffer cache中。此时这个进程必须等到该inode从包含此文件系统的物理介质中取出来才可以继续 运行。 



wait_queue 
*task 
 
*next 
图11.4 等待队列 


Linux核心使用一个非常简单的队列:等待队列(见图11.4)。它包含一个指向进程task_struct结构的指针以及等待队列中下一个元素的指针。加入到等待队列中的进程既可以是可中断也可以是不可中断的。可中断 进程能够被如定时器到期或者信号等时间中断。此等待进程的状态必须说明成是INTERRUPTIBLE还是 UNINTERRUPTIBLE。由于进程现在不能继续运行则调度管理器将接过系统控制权并选择一个新进程运行而等待进程将被挂起。处理等待进程时,每个处于等待队列中的进程都被置为RUNNING状态。如果此进程已经从运行队列中删除则它将被重新放入运行队列。下次调度管理器运行时, 由于这些进程不再等待所以它们都将是运行候选者。 等待队列可以用来同步对系统资源的访问, 同时它们还被Linux用于信号灯的实现中。 


11.5  Buzz 锁
它使用更频繁的名字叫自旋锁。这是一种保护数据结构或代码片段的原始方式。在某个时刻只允许一个进程访问临界区内的代码。Linux还同时将一个整数域作为锁来限制对数据结构中某些域的存取。每个希望进入 此区域的进程都试图将此锁的初始值从0改成1。如果当前值是1则进程将再次尝试,此时进程好象在一段紧循环代码中自旋。对包含此锁的内存区域的存取必须是原子性的,即检验值是否为0并将其改变成1的过程不能被任何进程中断。多数CPU结构通过特殊指令提供对此方式的支持,同时我们可以在一个非缓冲主存中实现这个流言锁。 

当控制进程离开临界区时它将递减此Buzz锁。任何处于自旋状态的进程都可以读取它,它们中最快的那个将递增此值并进入临界区。 


11.6  信号灯
信号灯被用来保护临界区中的代码和数据。请记住每次对临界区数据, 如描叙某个目录VFS inode的访问, 是通过代表进程的核心代码来进行的。允许某个进程擅自修改由其他进程使用的临界区数据是非常危险的。防止此问题发生的一种方式是在被存取临界区周围使用buzz锁,但这种简单的方式将降低系统性能。Linux使用信号灯来迫使某个时刻只有唯一进程访问临界区代码和数据,其他进程都必须等待资源被释放才可使用。这些等待进程将被挂起而系统中其他进程可以继续运行。 

一个Linux semaphore结构包含了以下信息: 


count 
此域用来保存希望访问此资源的文件个数。当它为正数时表示资源可用。负数和0表示进程必须等待。当它初始值为1时表示一次仅允许一个进程来访问此资源。当进程需要此资源时它们必须将此count 值减1并且在使用完后将其加1。 
waking 
这是等待此资源的进程个数,同时也是当资源可利用时等待被唤醒的进程个数。 
wait queue 
当进程等待此资源时,它们被放入此等待队列。 
lock 
访问waking域时使用的buzz锁。 
假设此信号灯的初始值为1,第一个使用它的进程看到此记数为正数,然后它将其减去1而得到0。现在此进程 拥有了这些被信号灯保护的段代码和资源。当此进程离开临界区时它将增加此信号灯的记数值,最好的情况 是没有其他进程与之争夺临界区的控制权。Linux将信号灯设计成能在多数情况下有效工作。 

如果此时另外一个进程希望进入此已被别的进程占据的临界区时,它也将此记数减1。当它看到此记数值为-1 则它知道现在不能进入临界区, 必须等待到此进程退出使用临界区为止。在这个过程中Linux将让这个等待 进程睡眠。等待进程将其自身添加到信号灯的等待队列中然后系统在一个循环中检验waking域的值并当waking非0时调用调度管理器。 

临界区的所有者将信号灯记数值加1,但是如果此值仍然小于等于0则表示还有等待此资源的进程在睡眠。在 理想情况下此信号灯的记数将返回到初始值1而无需做其他工作。所有者进程将递增waking记数并唤醒在此 信号灯等待队列上睡眠的进程。当等待进程醒来时,它发现waking记数值已为1,那么它知道现在可以进入临界区了。然后它将递减waking记数,将其变成0并继续。所有对信号灯waking域的访问都将受到使用信号灯 的buzz锁的保护。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Linux 核心--15.Linux内核资源

下一篇:Linux 核心--11.网络