当我研究进程调度时,这个问题浮现在我脑海中。
操作系统如何执行和控制二进制和编译文件的执行?我想也许操作系统将二进制文件的一部分复制到某个内存位置,跳转到那里,在执行该块后返回并执行下一个。但是它不会对其进行任何控制(例如,程序可以在任何地方进行跳转并且不会返回)。
在 JVM 的情况下,它非常有意义,VM 正在解释每条指令。但在二进制文件的情况下,指令是真正的 CPU 可执行指令,所以我认为操作系统不像 VM 那样工作。
当我研究进程调度时,这个问题浮现在我脑海中。
操作系统如何执行和控制二进制和编译文件的执行?我想也许操作系统将二进制文件的一部分复制到某个内存位置,跳转到那里,在执行该块后返回并执行下一个。但是它不会对其进行任何控制(例如,程序可以在任何地方进行跳转并且不会返回)。
在 JVM 的情况下,它非常有意义,VM 正在解释每条指令。但在二进制文件的情况下,指令是真正的 CPU 可执行指令,所以我认为操作系统不像 VM 那样工作。
它正是这样做的。操作系统,按某种顺序,
并发性不是由被分割成块的程序来处理的。任务之间的切换是通过中断完成的:在给进程分配 CPU 之前,会设置一个计时器。当定时器结束时,CPU 注册一个中断,将指令指针压入堆栈并跳转到操作系统定义的中断处理程序。该处理程序将 CPU 状态存储在内存中,交换虚拟内存表并恢复其他一些准备好执行的线程。如果线程由于某些其他原因必须暂停(等待用户/磁盘/网络...)或让步,则会发生相同的交换。
http://en.wikipedia.org/wiki/Multitasking#Preemptive_multitasking.2Ftime-sharing
请注意,依赖进程产生 CPU 是可能的,但不可靠(进程可能不会产生,阻止其他进程运行)
http://en.wikipedia.org/wiki/Multitasking#Cooperative_multitasking.2Ftime-sharing
安全性是通过将 CPU 切换到应用程序代码无法运行某些指令的保护模式来处理的(因此随机跳转几乎是无害的)。请参阅@SkPhilipp 提供的链接
请注意,现代 JVM 不会解释每条指令(这会很慢)。相反,它编译为本机代码并运行代码或(在即时编译的情况下)首先解释,但编译“热点”(经常运行的代码)。