我正在尝试学习操作系统概念。这是两个简单的Python代码:
while True:
pass
Run Code Online (Sandbox Code Playgroud)
和这个:
from time import sleep
while True:
sleep(0.00000001)
Run Code Online (Sandbox Code Playgroud)
问题:为什么运行第一个代码时 CPU 使用率为 100%,但运行第二个代码时 CPU 使用率约为 1% 到 2%?我知道这可能听起来很愚蠢,但为什么我们不能实施类似的事情sleep
在不使用睡眠系统调用的情况下实现用户空间模式之类的东西?
注意:我试图理解Linux 内核的睡眠系统调用,但说实话我不明白那里发生了什么。我还搜索了 NOP 汇编代码,结果发现它并不是真的什么都不做做,而是做了一些无用的事情(比如 xchg eax、eax),也许这就是 100% CPU 使用率的原因。但我不确定。
究竟有哪些睡眠系统调用的汇编代码是我们无法在用户空间模式下执行的?是不是类似 HLT 的东西
我还尝试HLT
在代码中使用汇编,如下所示:
section .text
global _start
_start:
hlt
halter:
jmp _start
section .data
msg db 'Hello world',0xa
len equ $ - msg
Run Code Online (Sandbox Code Playgroud)
但运行此代码后,我看到内核一般保护错误如下:
[15499.991751] traps: hello[22512] general protection fault ip:401000 sp:7ffda4e83980 error:0 in hello[401000+1000]
Run Code Online (Sandbox Code Playgroud)
不知道是不是和保护环有关,或者是我的代码错误?这里的另一个问题是操作系统是否在系统HLT
调用下使用或其他受保护的汇编命令 …