在互斥锁中,处理器(CPU)如何知道要解锁的进程?

时间:2017-02-05 04:03:14

标签: multithreading linux-kernel mutex

根据我的知识,锁定互斥锁的过程是必须解锁互斥锁的过程。我怀疑是 处理器如何知道解锁哪个进程?是否有任何数据结构可以在等待中保存pid(或)特定进程(内部)的某些内容?因此,处理器只能解锁特定进程。

请回答。在我的一次采访中提出这个问题。

2 个答案:

答案 0 :(得分:0)

获取互斥锁的线程/进程是唯一一个在代码中向前移动的进程。稍后在该线程的代码中应该释放互斥锁。没有互斥锁的其他线程/进程将等待它,因此在1个正在运行的进程进入互斥锁版本之前,它们既不接受也不释放它。

答案 1 :(得分:0)

  

处理器如何知道要解锁的进程?

处理器并不知道任何事情;它只是盲目地执行已经提供给它的机器指令链。

另一方面,线程库经过精心设计,可以处理这类事情。此外,每个现代/多任务操作系统都包含一个在启动时加载到内存中的线程调度程序,它管理哪些线程可以运行,以及何时运行。它与线程库一起正确处理锁定/解锁问题。

所以问题就变成了:当互斥锁解锁时,操作系统软件如何知道下一个唤醒哪个线程?

当然实际的实现会因操作系统而异,但从概念上讲,你可以想象每个互斥对象包含一个链表,当一个线程试图锁定一个已经锁定的互斥锁时,该线程会将自己添加到尾部。链接列表然后告诉调度程序将它(线程)置于休眠状态。

稍后,当互斥锁解锁时,解锁例程会弹出链接列表中的第一个休眠线程(如果有),将互斥锁的所有权重新分配给该线程,然后要求调度程序唤醒该线程线程尽快。

(警告:实际的实现可能会比这更复杂,因为它需要小心避免竞争条件并最大限度地提高性能,但我认为这可以让您了解如何完成它。请注意,在此示例实现中,线程将以先到先得的方式获取互斥锁,即以与它们调用lock()相同的顺序获取,但在许多实际实现中,不能保证该顺序,因此你不应该依赖它)