我在内核中实现了一个信号量,我得到了两个用于阻塞/解除阻塞进程的内核工具。 <{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?
也可以没有队列吗?由于我们不能在内核中使用任何外部库,因此创建自己的队列可能会使内核膨胀