现代操作系统何时会发生死锁?
When deadlocks occur in modern operating systems?
我知道死锁在过去是一个热门的研究课题。但是,即使我研究了很多现代操作系统,我现在也看不出死锁有什么大问题。我知道一些(大多数)资源可能会发生死锁,这些资源是由操作系统本身严格管理的,并且似乎以某种方式防止了死锁,我真的没有看到任何与死锁相关的案例。我知道在具有不同设计原则的流行系统中,关于资源处理的许多特性与其他资源不同,但是,它们都可以保持系统无死锁。
尝试在您的程序中使用两个互斥体,并在第一个线程中按顺序关闭:mutex1、sleep(500ms)、mutex2,在第二个线程中:mutex2、sleep(1000ms)、mutex1。
在系统中。在 windows(包括 8.1)中,如果您的应用程序使用 SendMessage
和广播 HWND_BROADCAST
- 如果一个应用程序挂起,您的应用程序也将处于挂起状态。同样在部分 DDE 通信情况下(包括 ShellExecute
部分程序),如果一个应用程序没有响应,则您的应用程序可能处于挂起状态。
但是你可以使用 SendMessageTimeout...
如果进程或线程将被同步,死锁将始终是可能的。进程和线程的同步是应用程序的 "must-have" 元素。
AND...系统范围的死锁(Windows):
在此操作之前保存所有文档。
Create HWND h1 with parent=0 or parent=GetDesktopWindow and styles 0x96cf0000
Create HWND h2 with parent=h1 and styles 0x96cf0000
Create HWND h3 with parent=h2 and styles 0x56cf0000 (here must be a child window).
Use ::SetParent(h1, h3);
然后单击其中任何一个 windows。
系统将按循环(三角形)顺序尝试重新排序windows。该应用程序已挂起,但如果任何其他应用程序将尝试使用 SetWindowPos,该应用程序将从该函数更新 return。任务管理器无济于事,Alt+Ctrl+Del 也停止工作。 CPU 的 100% 使用...只有硬重置才能帮助您。
有可能阻止它,但必须尽快检测到这种情况。
操作系统死锁仍然发生。当系统竞争资源有限且无法回收时,仍有可能出现死锁。
在 linux 中,查看内核停顿,这些发生在 I/O 没有及时释放时。内核停顿在 vmware 和来宾操作系统之间特别有趣。
对于外部煽动者,当 san 系统和网络出现问题时会发生死锁。
新版本死锁在内核成熟时经常发生,不是每个用户,而是整个社区。
遇到过蓝屏或即时重启吗?其中一些是由于资源丢失造成的。
内核相当成熟,在回收资源方面做得很好,但并不完美。
大多数现代资源处理程序现在倾向于呈现为服务,而不是可锁定的对象。操作系统内的大多数资源共享都依赖于单独的通道,从而减少了大部分重叠。对队列和切换的依赖程度更高,而不是对共享缓冲区的直接锁定争用。这些是 OS 部分的一般趋势,有助于减少死锁的机会,但没有办法保证系统不会出现死锁。
我知道死锁在过去是一个热门的研究课题。但是,即使我研究了很多现代操作系统,我现在也看不出死锁有什么大问题。我知道一些(大多数)资源可能会发生死锁,这些资源是由操作系统本身严格管理的,并且似乎以某种方式防止了死锁,我真的没有看到任何与死锁相关的案例。我知道在具有不同设计原则的流行系统中,关于资源处理的许多特性与其他资源不同,但是,它们都可以保持系统无死锁。
尝试在您的程序中使用两个互斥体,并在第一个线程中按顺序关闭:mutex1、sleep(500ms)、mutex2,在第二个线程中:mutex2、sleep(1000ms)、mutex1。
在系统中。在 windows(包括 8.1)中,如果您的应用程序使用 SendMessage
和广播 HWND_BROADCAST
- 如果一个应用程序挂起,您的应用程序也将处于挂起状态。同样在部分 DDE 通信情况下(包括 ShellExecute
部分程序),如果一个应用程序没有响应,则您的应用程序可能处于挂起状态。
但是你可以使用 SendMessageTimeout...
如果进程或线程将被同步,死锁将始终是可能的。进程和线程的同步是应用程序的 "must-have" 元素。
AND...系统范围的死锁(Windows): 在此操作之前保存所有文档。
Create HWND h1 with parent=0 or parent=GetDesktopWindow and styles 0x96cf0000
Create HWND h2 with parent=h1 and styles 0x96cf0000
Create HWND h3 with parent=h2 and styles 0x56cf0000 (here must be a child window).
Use ::SetParent(h1, h3);
然后单击其中任何一个 windows。
系统将按循环(三角形)顺序尝试重新排序windows。该应用程序已挂起,但如果任何其他应用程序将尝试使用 SetWindowPos,该应用程序将从该函数更新 return。任务管理器无济于事,Alt+Ctrl+Del 也停止工作。 CPU 的 100% 使用...只有硬重置才能帮助您。
有可能阻止它,但必须尽快检测到这种情况。
操作系统死锁仍然发生。当系统竞争资源有限且无法回收时,仍有可能出现死锁。
在 linux 中,查看内核停顿,这些发生在 I/O 没有及时释放时。内核停顿在 vmware 和来宾操作系统之间特别有趣。
对于外部煽动者,当 san 系统和网络出现问题时会发生死锁。
新版本死锁在内核成熟时经常发生,不是每个用户,而是整个社区。
遇到过蓝屏或即时重启吗?其中一些是由于资源丢失造成的。
内核相当成熟,在回收资源方面做得很好,但并不完美。
大多数现代资源处理程序现在倾向于呈现为服务,而不是可锁定的对象。操作系统内的大多数资源共享都依赖于单独的通道,从而减少了大部分重叠。对队列和切换的依赖程度更高,而不是对共享缓冲区的直接锁定争用。这些是 OS 部分的一般趋势,有助于减少死锁的机会,但没有办法保证系统不会出现死锁。