📄 semaphore.h.txt
字号:
这个头文件提供了内核机制中的信号量的定义,其中所定义的信号量的数据结构和各种处理函数只适用于内核态的调用,而并不提供给用户态的程序来使用。
(1):struct semaphore{
atomic_t count; 定义了信号量的数量。
int sleepers; 定义了睡眠的进程数。
wait_queue_head_t wait; 定义了休眠的进程的链表。
long __magic; 魔数(?)
}
(2):sema_init(struct semaphore *sem, int val)
信号量的初始化函数,任何一个声明过的信号量在使用之前都必须先进行初始化,其中参数val就是信号量的初始值,也就是代表临界区资源的数量。这个值要首先赋给sem种的count变量。然后将sleepers的值设为0,然后对等待队列进行设置(init_waitqueue_head).
(3):init_MUTEX(struct semaphore *sem)
只是调用了sema_init(sem,1)
(4):down(struct semaphore * sem)
使用汇编语言对sem->count的值进行减一操作。如果count小于0,这调用__down_failed(在arch\i386\kernel\semaphore.c中),并将参数sem传进去。其中__down_failed将调用另一个函数将当前的进程转入休眠状态。
(5):down_interruptible(struct semaphore *sem)
和函数down基本一样。
(6):up(struct semaphore *sem)
使用汇编语言对sem->count的值进行加一操作。然后调用__up_wakeup函数(在arch\i386\kernel\semaphore.c中)。将当前的进程唤醒。
注意:本文件和arch\i386\kernel\semaphore.c紧密相关,相应的函数请参照相关文件。
信号量在内核程序中的使用方法:
声明一个信号量型变量;
首先使用sema_init初始化信号量;
使用down或者down_interruptible;
使用up;
up函数以下的函数都是为多处理机而设置的,不必理会。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -