一些课本上对进程的定义:进行中的程序
即便知道定义,但进程依然十分抽象
在了解进程之前,我们需要先了解程序运行的整个流程......
一、进程的创建过程
程序都是以文件的形式存在于磁盘上的
运行程序时,我们通过程序加载器(exe文件)把程序加载到内存中
这个时候,进程就创建好了吗?不,还没有!!
进了清华园 ≠ 清华的学生
进了清华园 + 清华的学生证 = 清华的学生
OS会为加载到内存中的代码和数据创建一个进程控制块(PCB),进程控制块记录着当前进程的属性信息,如程序代码的指针、进程的优先级等各种信息
(除了PCB,还有虚拟地址空间、页表等内容,这里只需要知道PCB即可)
这个时候,进程才算创建完了!!!
进程 = 加载到内存的程序 + 进程控制块
这里的进程控制块可以用一个结构体来表示
二、程序的运行过程(进程被调用的过程)
上面说了进程的创建过程,下一步就是运行程序了
在冯诺依曼体系结构中,和CPU处理速度最接近的就是内存(存储器),所以一般都是内存和CPU打交道
内存中往往有很多个进程
CPU往往有一个运行队列,队列中的每个进程都设置了时间片轮着运行
(详细内容会在下面解释)
假设现在CPU不忙,然后对内存说:“内存,我现在不忙,给我一个进程跑跑”
内存:“收到,你接好了”
这个时候程序才真正开始运行起来了
问:CPU找内存要进程的时候,应该给哪个进程??
答:给哪个进程根据进程的优先级决定
问:把进程控制块放到CPU里,CPU要怎么运行对应的代码呢??
答:进程控制块中存了代码的指针,也就是地址信息,CPU会根据地址信息去物理内存中找到对应的代码
三、CPU运行队列是怎么管理进程的?
现在我们不考虑新增进程,仅考虑 运行队列中的进程是如何运作的?
如果轮到A进程运行,时间片是10ms,
— 进程A运行完了,那么就把进程A从运行队列中踢出去
—进程A没有运行完,此时存在大量的临时数据(临时数据在寄存器中),这个时候,进程A
需要取出寄存器中的临时数据,带着临时数据排到队尾
等到下一次 再轮到A进程,进程A再把临时数据放到寄存器中
这里的临时数据我们称之为 上下文数据(没轮到进程A时,上下文数据存在于进程控制块中)
可以是运行过程中生成的临时结果,也可以是函数执行到哪一行