程序运行调度

这两天一直在学习程序启动的过程,操作系统是如何处理的,这里做一个总结。

我们知道,我们可以用高级语言如c或者C++编写程序。编译环境通过我们的设置,将程序代码和数据经过转换成二进制的机器码:exe或者dll。那么程序中的二进制数据怎么跑到cpu运算并得出结果的呢?什么是内存的静态分配和动态分配呢?

首先,我们人工编译的代码是放到硬盘或者其他存储器中。当程序运行时,操作系统将会开辟进程并为进程分配一定的资源(比如内存),进程将程序从硬盘中映射到虚拟内存中。由于进程是动态的,也即进程是有生命周期的。在这个加载过程中所进行的资源分配就叫做动态分配。之前进行程序编译时分配的资源就叫做静态分配。静态过程包括编译,连接等过程,这里就不再展开。

进程创建后,同时创建的有PCB(程序控制模块process control block)和页目表。pcb中包含了标识信息,控制信息,现场信息等内容。这些信息包含了当前进程的等级,状态,分配的cpu时间等,进程运行时将会用到这些信息。操作系统为pcb创建了一个表,操作系统通过扫描这些表来决定进程的运行。当pcb加入到表中,我们就称程序进入了就绪态。当操作系统(实际是微内核,负责任务调度的模块)扫描到表中该pcb时,微内核为pcb分配cpu时间片段。上一进程的pcb进入阻塞状态,本进程进入执行态。这就是进程的三大状态由来。当进程执行时,进程的页目表加载到CR3寄存器,cpu提供的逻辑地址通过cr3对应的页表进行匹配查询,查询到对应的物理地址上的操作数。然后进行运算,存储运算结果等操作。一旦cpu时间片段用完,该进程将中断,并保存相关现场数据进入阻塞态或者结束。操作系统(微内核)将调度下一进程,重复上述过程。如果进程结束,微内核将收回所有给该进程分配的资源。各个进程交替中断执行,这种行为称为进程的并发。

一个程序可以被装载进多个进程,并且这些进程能够共享一个程序作为调度的副本。这就是内存管理的内容了,以后的总结中将会重点展开。

猜你喜欢

转载自blog.csdn.net/wangyhwyh753/article/details/79671430