1.一般来说,对全局变量的安全访问通过原子操作来保证。
2.临界区(critical region)是这样的一段代码,进入这段代码的进程必须完成,之后另一个进程才能进入。
3.怎样同步内核控制路径?
3.1.如果内核支持抢占,那么在应用同步机制的时候,确保进入临界区前禁止抢占,退出临界区的时候启用抢占。
3.2.在单处理器系统上的另一种同步机制是:在进入一个临界区之前禁止所有硬件中断,离开的时候再启用中断。但这样的话,如果临界区比较大,那么在一个相对较长的时间内持续禁止中断就可能使所有的硬件活动处于冻结状态。
3.3.信号量仅仅是与一个数据结构相关的计数器。所有内核线程在试图访问这个数据结构之前,都要检查这个信号量。可以把每个信号量看成一个对象,其组成如下:
3.3.1.一个整数变量
3.3.2.一个等待进程的链表
3.3.3.两个原则方法:
3.3.3.1. down()方法对信号量的值减1,如果这个新值小于0,该方法就把正在运行的进入加入到这个信号量链表,然后阻塞该进程(即调用调度程序)。
3.3.3.2. up()方法对信号量的值加1,如果这个新值大于或者等于0,则激活这个信号链表中的一个或者多个进程。
每个要保护的数据结构都有它自己的信号量,其初始值为1.当内核控制路径希望访问这个数据结构的时候,它在相应的信号量上执行down()方法。如果信号量的当前值不是负数,则允许访问这个数据结构。否则,把执行内核控制路径的进程加入到这个信号量的链表并阻塞该进程。当另一个进程在那个信号量上执行up()方法的时候,允许信号量链表上的一个进程继续执行。
当所用内核信号量的数量较多的时候,死锁就成为一个突出问题,而Linux系统通过按规定的顺序请求信号量来避免死锁。
阅读(530) | 评论(0) | 转发(0) |