【问题标题】:When deadlocks occur in modern operating systems?现代操作系统何时发生死锁?
【发布时间】:2017-09-27 17:59:54
【问题描述】:

我知道死锁是过去的热门研究课题。但是,即使我研究了很多现代操作系统,我现在也看不到任何关于死锁的重大问题。我知道一些(大多数)资源可能会发生死锁,由操作系统本身严格管理,并且似乎它以某种方式防止死锁,我真的没有看到任何与死锁相关的案例。我知道在具有不同设计原则的流行系统中处理资源的许多特性与其他特性不同,但是它们都可以保持系统无死锁。

【问题讨论】:

  • 在 Linux/Windows 中死锁几个线程并不难。下次编写 Windows GUI 应用程序时,请在事件处理程序中创建一个线程,然后立即加入它。在线程中,在退出之前对 GUI 线程进行 SendMessage() 调用。在线程退出之前,GUI 线程将不再处理任何消息。在 SendMessage() 调用返回之前,线程不会退出。死锁。

标签: operating-system deadlock


【解决方案1】:

尝试在程序中使用两个互斥锁,并在第一个线程中依次关闭:mutex1、sleep(500ms)、mutex2,在第二个线程中:mutex2、sleep(1000ms)、mutex1。

在系统中。在 Windows(包括 8.1)中,如果您的应用程序使用 SendMessage 和广播 HWND_BROADCAST - 如果一个应用程序挂起,您的应用程序也将处于挂起状态。同样在 DDE 通信的部分情况下(包括部分程序的ShellExecute),如果一个应用程序没有响应,您的应用程序可能处于挂起状态。

但是你可以使用 SendMessageTimeout...

如果进程或线程将被同步,死锁总是可能的。进程和线程的同步是应用程序的“必备”元素。

并且...系统范围的死锁(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);

然后单击这些窗口中的任何一个。

系统将以循环(三角形)顺序尝试重新排列窗口。应用程序已挂起,但如果任何其他应用程序将尝试使用 SetWindowPos,则该应用程序将更新从此函数返回。任务管理器无济于事,Alt+Ctrl+Del 也停止工作。 100% 的 CPU 使用率...只有硬重置才能帮助您。

有可能阻止它,但必须尽快发现这种情况。

【讨论】:

    【解决方案2】:

    操作系统死锁仍然会发生。当系统的竞争资源有限而无法回收时,死锁仍然是可能的。

    在 linux 中,查看内核停顿,这些发生在 I/O 没有及时释放时。内核停顿在 vmware 和来宾操作系统之间特别有趣。

    对于外部煽动者,当 san 系统和网络出现问题时会发生死锁。

    新版本死锁在内核成熟时经常发生,不是每个用户,而是整个社区。​​p>

    曾经出现蓝屏或即时重启?其中一些是由于资源丢失造成的。

    内核相当成熟,并且擅长回收资源,但并不完美。

    大多数现代资源处理程序现在倾向于呈现为服务,而不是可锁定的对象。操作系统内的大多数资源共享依赖于单独的通道,从而减轻了大部分重叠。对队列和切换的依赖程度更高,而不是对共享缓冲区的直接锁定争用。这些是有助于减少死锁机会的操作系统部件和部件的普遍趋势,但没有办法保证系统减少死锁。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2011-02-02
      • 2015-02-09
      • 1970-01-01
      相关资源
      最近更新 更多