什么是进程?
进程是由程序变换而来,介绍进程时,需要先从程序说起。
(1)当程序没有运行时
当程序没有被运行时,该程序(可执行文件)只是存放在硬盘上的静态数据,与你写的word文件中的数据没有本质区别,当然程序只有运行起来后,才能体现出其价值。
(2)进程就是运行中的程序
当程序运行起来后,进程是所有与“程序运行”有关的代码和数据的集合体,简单的理解就是“进程”就是行进中的程序。
事实上说一个程序就对应一个进程,这个说法有些欠妥,但是目前大家先认为一个程序就对应着一个进程。
(3)进程也有生有死
(a)开始运行为生,运行结束即为死。
(b)程序好比人,进程好比人生,人活着时的一切就是人生,程序活着时所涉及的一切就是进程。
(4)进程应包含三部分内容
(a)应用程序本身的代码和数据,这一部分称为应用代码部分,习惯称为应用空间(运行在内存上)
(b)应用程序调用OS函数时,所涉及的OS中的代码和数据,这一部分称为内核代码部分,习惯称为内核空间
(c)OS记录的进程在运行时的各种管理信息
专门进行进程管理的叫PCB(不是电路板),英文为process control block,即进程控制块
进程控制
(1)为什么要进行进程控制
在有OS的计算机上,应用程序必须在OS的支持下才能运行,换句话说,必须在OS的控制之下才能运行。
(2)控制做些啥事情
(a)分配内存空间,然后将程序调入内存并启动运行,运行起来后就变成了一个进程。
(b)OS调度器对其进行调度
在OS上,众多进程是交替运行的,每个进程只运行一个ms(毫秒)级的时间片,在这个时间片内可以占有CPU以运行自己。
OS上往往会运行很多的应用程序(进程),大家都要占用CPU运行,但是CPU只有一个,大家必须轮流运行,每个人轮流占用CPU运行一段时间,这个时间被称为时间片(ms级),大家轮流交替运行,由于时间片很短,宏观上给人的错觉就是,所有的程序都在独占CPU运行,但是事实上每个具体的时刻cpu只运行一个程序(进程)。
当前进程运行完毕后,下一次轮到谁运行呢,这个时候就需要一个仲裁者,它来决定下一次谁运行,这个仲裁者就是OS提供的调度器,负责按照某个规则调度进程的运行,这个调度规则就是调度的优先级算法。
调度算法有一个核心的地方,就是一定要体现对所有的进程的公平公正,不能让有些进程被宠着一直运行,而另一些进程被打入冷宫,长时间不运行。
(c)OS进行进程控制时,会负责记录进程从生到死所涉及的各个方面的管理信息,这些控制(管理)信息都记录在了PCB中。
(d)意外事件处理
比如当前运行的进程需要键盘输入的数据,但是一直等不到键盘输入的数据,那么调度器会将CPU占有权收回,让出CPU运行另一个进程。
(e)当进程运行结束之后,回收内存空间、记录有各方面进程信息的PCB,因为PCB块记录的信息是存在内存中的,显然占据着内存空间,进程死了,肯定就得把占据的这个内存空间收回。
这就好比某个农村的人去世了,活着时候被分给的土地和山林就会被收回从新给别人使用,道理是一样的,否者就是占着茅坑不拉屎。
多进程并发运行
在计算机上运行的绝不是只有一个进程,而是很多进程同时并发运行,进程在并发运行时
(1)所有进程都是交替运行的,每个进程只运行一个ms级的时间片。
(2)调度器会根据调度优先级算法,决定下一个时间片运行哪一个进程
(3)从宏观上看,所有进程是同时并发运行的,但在微观上,在每个时刻,CPU只运行一个进程。
区别并发与并行:
(1)并发
多个进程相互交替运行,表面上看所有进程似乎都是同时在运行,但是实际上在每个时间片里,CPU只运行一个进程。
在早期单核CPU时代,所有的进程都是并发运行的,因为CPU只有一个,所以CPU在每个时间片内也只能运行一个进程。
(2)并行
并行的意思就是,所有进程同时被CPU执行,在每个时刻CPU同时运行多个进程。
当然对于单核CPU来说,是不可能做到并行的,只能是并发,不过对于现在多核cpu来说,可以做到并行,不同的CPU核可以同时并行的运行不同的进程。
对于现在多核CPU来说,并发与并行是同时存在的。
进程控制块(PCB)
我们说进程是在OS控制下运行的,OS会使用PCB管理各种进程信息,以Linux系统为例,PCB就是一个C语言的结构体,该结构体名叫
task_struct,该结构体非常大,成员项达300个左右,用于记录该进程被OS控制运行时的各种管理信息。
(1)Linux系统的tasck_struct结构体
图:
(2)task_struct中的各种进程管理信息
(a)进程信息
进程ID:用于唯一标识进程的编号,好比人的身份证号
程序名称:就是可执行文件的名字
因为进程由程序得到,程序的代码数据被放在了可执行文件中,所以运行的进程名字就是程序名字,而程序名字也就是可执行文件的名字。
可执行文件的格式:
程序的代码和数据放在了可执行文件中,我们在前面介绍编译器的时候中就说过,在不同操作系统下,需要的可执行文件的格式是不同的,如果操作系统识别到该可执行文件格式不是自己要的,OS就会说“非我族类,其心必异”,将无法运行。
格式其实就是一个可执行文件身份识别,比如Windows要求PE格式、Linux要求ELF格式。
进程时间:进程什么时候开始运行的
(b)进程调度信息
进程运行状态:就绪态,执行态,等待态等
优先级:进程被调度的优先级,优先级高的会被优先被调度
调度标志:标记该进程是否被调度
时间片:运行时间片大小
(c)文件信息:记录正在被进程操作文件的各种信息
(d)内存信息:进程运行时所需内存的管理信息
(e)休眠时间:比如当进程调用sleep函数,进程就会进入休眠。