Operating system 如果说一台电脑';挂起';还是冷冻?

Operating system 如果说一台电脑';挂起';还是冷冻?,operating-system,computer-architecture,freeze,Operating System,Computer Architecture,Freeze,我们知道,所有在计算机上运行的程序都是一个由许多人协作的庞大程序。 那么,当一台计算机挂起而我们什么都做不了时,会发生什么呢?另外,在这个场景中,所有东西都冻结了,这也是程序中实现的吗?或者是程序计数器卡住了,无法增加,处理器也出现了一些问题 计算机在不同情况下可能会冻结。这些是我现在能想到的: x86和指令CLI禁用中断,因此没有异步事件(如计时器中断或按键)可以将CS:EIP指令指针移动到另一条指令,而HLT实际上会停止处理器。该指令很少使用,仅在引导代码中的某些初始化例程失败时才允许内核

我们知道,所有在计算机上运行的程序都是一个由许多人协作的庞大程序。

那么,当一台计算机挂起而我们什么都做不了时,会发生什么呢?另外,在这个场景中,所有东西都冻结了,这也是程序中实现的吗?或者是程序计数器卡住了,无法增加,处理器也出现了一些问题

计算机在不同情况下可能会冻结。这些是我现在能想到的:

  • x86和指令<代码>CLI禁用中断,因此没有异步事件(如计时器中断或按键)可以将
    CS:EIP
    指令指针移动到另一条指令,而
    HLT
    实际上会停止处理器。
    该指令很少使用,仅在引导代码中的某些初始化例程失败时才允许内核使用。尽管在这里重新启动是一个更好的选择。
    请注意,
    HLT
    仅停止其运行的核心,并非所有核心

  • 窗口没有响应(通常在Windows上找到)。这因应用程序而异。更多信息

  • 试图获取资源,但该资源受锁保护,并且已被获取。进程等待(实际上是繁忙的循环或产生另一个进程),直到它最终能够获取资源。不过,这只是一种临时状态,而不是

  • 僵局。可能发生这种情况的多种情况,但常见的情况是两个进程试图同时获取彼此提供的资源。没有一个进程可以处理采集请求,因为两个进程都在等待其他进程,因此这两个进程都是不可中断的。这就是Linux上出现不间断进程的原因,尽管已将信号发送到,但无法终止这些进程

  • 在速度较慢的处理器或线程较少的处理器上进行多任务处理。糟糕的调度算法会使情况更加糟糕。
    由于一个进程至少占用一个线程,因此有效并发运行的进程数量非常少。不过,这可以通过非常快的处理器来稳定。
    这导致对鼠标单击等事件的响应时间较长

对于x86系统,
HLT
是唯一真正阻碍指令指针前进的指令。

所有其他情况都只是(可能是无限的)循环或程序/操作系统错误。

既然你把“多任务处理放在一个慢处理器上”,我认为你也应该加上“在一个RAM很少的系统上高交换流量”。他们的想法是一样的:有限的硬件资源。一个有趣的问题是:用户进程中的一个bug是否可以完全冻结整个系统,或者操作系统或系统驱动程序中也必须有一个bug才能实现这一点?@bolov这确实是一个哲学问题。好的旧叉子炸弹是一个用户程序,很容易使系统崩溃。操作系统没有禁止它的事实:这到底是不是一个bug?“哲学”这个词在这里可能不合适,但我希望你明白我的意思。注意:稍后我将根据您的第一条评论调整我的答案,但目前无法调整。@cad所以我现在看到的是,由于HLT是一个初始化例程场景,当您的系统启动了可以暂停/挂起/冻结它的CLI时,我想知道为什么要运行CLI以及如何运行CLI,并且代码不会重新启动CLI。然而,主要的问题似乎是优先级反转和死锁,既然一个操作系统已经开发了这么长时间,为什么不能避免死锁呢?线程安全规则有帮助吗prevent@Anurag
CLI
HLT
是两条指令。中断不必重新启用,因为系统将永远停止。只有重新启动才有帮助。死锁当然可以避免,但程序员也会犯错误。是的,他们会有所帮助,但不会使问题完全消失。