感觉进程未响应的时候就像是死循环了一样,但是如果一个进程死循环的话,操作系统并没有认为他未响应。
那么什么情况下会被认为是未响应,以及未响应的本质是啥?未响应的时候是否还占用 CPU 资源?
感觉一切有 UI 的都会出现未响应的情况,比如 Windows,macOS,Android。IOS 似乎没有见到过。
但是没有 UI 的,比如说 CentOS 几乎没有出现过进程未响应的情况。
很好神奇这是为啥。
以 Windows 来讲,每当用户操作窗口上的一个按钮或菜单,会产生一个事件( Event )。操作系统会把事件投递到应用程序的事件队列里。如果这个事件过了很久还没有被应用程序处理,那系统就会提示“未响应”。
我不太了解其他系统下的机制,不过应该也差不多。
应用程序未响应的原因很多,也许像你说的在占用 CPU,也可能是在等待 I/O 或者锁。
纠正一个名词,Windows 编程里面通常把这个事件叫做消息( Message )
个人理解是对于有限资源竞争过程中造成的死锁。
吃饭需要两个筷子,结果 A 程序拿到了一根筷子,B 程序也拿到了一根筷子。A/B 都不愿意释放自己手中的筷子,互相等待对方释放资源(筷子),以便于自己继续运行,最终因为谁都不释放资源造成程序死锁
同样吃饭需要两个筷子,A 程序功能拿到 2 个筷子,开始吃饭。此时 B 程序也要吃饭,发现没筷子了,系统告诉 B,让他等等,A 吃饭了,B 再去吃。但是 A 吃着吃着,出意外了(饭撒了一地,或者去上厕所去了),导致长时间没有释放资源(筷子)。但是 B 并不知道,于是傻傻的等待,用户就会认为 B 程序挂了。
android 有一个主线程,专门刷新 UI,如果你的程序阻塞主线程太久,就会弹出对话框提示
就是操作系统调用了你的程序等结果,你却迟迟不 return。命令行就不会未响应了。
我的理解是阻塞了或者死锁了,毕竟有的未响应能缓过来的
对操作系统来说就是事件处理程序没有在指定时间内完成。一般指的是 UI 主线程卡住导致 redraw 事件在数秒内无法完成。
我就说一个。plsql 天天未响应。