进程(process)/任务(task):
一个程序运行起来,完成一系列任务的模样。
一个可执行文件是“静态”的,当我们双击运行的时候,操作系统就会把这个可执行文件的关键信息加载到内存中,并且开始运行里面的代码,就形成了一个进程。同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
在一个操作系统上,同时跑着这么多的进程,就需要进行管理:管理分为两步,先描述,使用一个类或者结构体,把这个东西有啥特征,都表示出来;再组织,使用一个数据结构,把很多个这样的对象或者结构体给整理到一起。
管理的方式就是使用PCB进程控制块:
PCB(进程控制块)就是一个结构体,这个结构体里包含了一些表示进程的核心信息。
操作系统内核中,就把若干PCB串成了一个双向链表。
PCB中包含的信息:
1.进程的身份识别pid
2.内存指针——操作系统要把一些必要的数据加载到内存中,有些是要运行的指令(代码),有些是运行时依赖的数据(全局变量),内存指针就描述了该进程的内存中哪些部分是指令,哪些部分是数据。
3.文件描述符表——表示了当前进程都打开了哪些文件,在代码中打开一个文件fopen,就会在进程的文件描述符表(顺序表)里给这个文件分配一个表项,每个元素就代表一个打开的文件,对应的数组下标就是文件描述符。
总结:以上三点描述了进程持有哪些系统资源,也认为进程是操作系统中“资源分配”的基本单位。
进程的调度:
为什么会存在进程的调度问题?
当前的计算机,CPU是有限的,但是进程数量是比较多的,经常会出现“进程多,核心数少”的情况,操作系统是要做到尽可能的公平,让每一个进程都有运行的机会,所以就需要进行调度。
调度的方法:
用来实现进程的几个的关键的属性:
1.进程的优先级
2.进程的状态
3.进程的记账信息
4.进程的上下文
进程的虚拟地址空间:
为什么会存在进程的虚拟地址空间?
对于每一个进程使用内存时,可能会存在指针解引用出错,导致指针指向非法的内存地址