信号量实际上是如何实现的(可能没有队列)?

时间:2014-02-16 22:35:02

标签: c operating-system kernel semaphore

我在内核中实现了一个信号量,我得到了两个用于阻塞/解除阻塞进程的内核工具。 <{1}}和Block(pid)

编辑:Block()获取进程的pid并阻止内核进一步调度该进程,直到使用该pid调用Unblock()指令。

我必须实现两个控制信号量的内核方法

Unblock(pid)

关于如何跟踪阻塞和解除阻塞机制,我还没有完全理解。 例如,我有两个过程

/*
*pid:calling process id, there is an array keeps tract of all pid
*sem: shared semaphore id, there is an array keeps tract of all sem
*/
void Take(pid,sem){} 
void Give(pid,sem){} 

现在,在流程A调用#define Semaphore sem1; Process A{ kernel_take(sem1); //..do something kernel_give(sem1); } Process B{ kernel_take(sem1); //..do something else kernel_give(sem1); } 之前,可能会调用流程B的take(),B会被B give()阻止。如何在进程A的take()中解锁B?或者A的give()信号B give()是否要解锁B? 也可以没有队列吗?由于我们不能在内核中使用任何外部库,因此创建自己的队列可能会使内核膨胀

0 个答案:

没有答案