一、进程的概念
1、进程定义
OS系统从只能跑一个程序到能跑多个。进程可以描述程序的执行过程。
进程:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
只有当一个程序被OS加载到内存中,cpu对其执行时,这个过程是动态的,称为进程。
2、进程的组成
包含了正在运行的一个程序的所有状态信息 、程序的代码 、程序处理的数据
要知道现在执行哪条指令,程序计数器中的值指示将运行的指令。
CPU寄存器会动态变化,一组通用寄存器的当前值,堆,栈等;
各种系统资源,内存,外存,网络
3、进程与程序的联系
程序是进程的基础,代码控制操作,可以多次执行程序,每次构成不同的进程;
进程是程序功能的体现;多次执行——某一个程序对应多个进程;
调用关系——某一个进程包括多个程序
4、进程与程序的区别
①程序静态,有序代码的集合;进程动态,执行中可以是核心态/用户态,写的代码都是用户态,但有些操作比如读写文件只能由OS完成, OS代表进程在内核中执行,此时为核心态;
②进程是暂时的,是状态变化的过程,程序永久;
③组成不同,进程包括程序、数据(可能变化)、进程控制块(进程状态信息)
5、进程的特点
①动态性;
②并发性(在一段时间内有多个程序在执行,不同于并行,是一个时间点有多个在跑,需多个CPU即多核,进程可以被独立调度并占用处理机运行):
③独立性,正确性不受影响(通过OS给不同的进程分配不同页表);
④制约性,因访问共享数据/资源或进程间同步产生制约,要同步互斥;
二、进程控制块(PCB)
1、PCB进程控制块:进程存在的唯一标识,操作系统管理控制进程运行所用的信息集合,描述进程的基本情况和运行变化的过程。
用PCB的生成,回收,组织管理来完成进程的创建、终止和管理。
描述进程的数据结构:进程控制块(PCB:PROCESS control block)
OS给每个进程都维护了一个PCB,保存与之有关的所有状态信息。
2、PCB含有三大类信息:
① 进程标识,哪个程序在执行,执行了几次(本进程的标识),产生者标识(父进程标识),用户标识
② 处理机状态信息保存区,主要就是寄存器,保存进程的运行现场信息:
用户可见寄存器,程序使用的数据,地址
控制和状态寄存器,程序计数器pc,程序状态字PSW
栈指针,过程调用/系统调用/中断处理和返回时需要用到
③进程控制信息
调度和状态信息,用于操作系统调度进程并占用处理机使用。运行状态?等待?进程当前的执行现状
进程间通信信息,各种标识、信号、信件等
进程本身的存储管理信息,即指向本进程映像存储空间的数据结构,内存信息,占了多少?要不要回收?
进程所用资源,打开使用的系统资源,如文件
有关数据结构连接信息,父进程,子进程,构成一个链,进程可以连接到一个进程队列,或链接到其他进程的PCB
3、PCB的组织方式
①链表(便于插删,用于通用的OS):同一状态的进程PCB为一链表,多个状态对应更多个不同的链表,就绪链表,阻塞链表
②索引表(数组,不利于插删,使用于固定数目的进程,相对创建更快捷):同一状态的归入一个index表(每一个index指向PCB),就绪/阻塞索引表
三、进程的状态
1、进程生命周期
创建——>就绪——>运行——>抢占——>阻塞——>唤醒——>结束
①进程创建:引起进程创建的情况:系统初始化时,创建INIT进程,INIT再负责创建其他进程;用户请求创建一个NEW PROCESS;正在运行的进程执行了创建进程的系统调用。
②进程运行:内核选择一个就绪的进程,让它占用处理机(cpu)并执行
③进程阻塞(等待)的三种情况:请求并等待系统服务,无法马上完成;启动某种操作(和其他进程协调工作),无法马上完成;需要的数据没有到达
进程自己触发阻塞,因为只有自己才知道何时需要等待某事件
④进程抢占:进程会被抢占情况:高优先级进程就绪;进程执行当前时间用完。
⑤进程唤醒的情况:需要的资源可被满足;等待的事件到达
因为自身没有占用cpu执行,所以只能被OS或其他进程唤醒
⑥进程结束的情形:自愿(正常退出,错误退出),强制性的(致命错误,被其他进程所杀)
四、进程模型
运行状态:进程正在处理机上运行
就绪状态:进程获取了除处理机之外的资源,得到了处理机即可运行
阻塞状态:进程正在等待某一事件出现而暂停运行
创建状态:一哥进程正在被创建,还没转到就绪状态之前的状态
退出状态:一哥进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致
五、挂起进程模型
1、进程挂起:不同于进程阻塞。挂起时没有占用该内存空间,而是映像在磁盘上。类似虚存中,有的程序段被放到了硬盘上。 可以合理、充分地利用系统资源。
Suspend:把一个进程从内存转到外存。
2、挂起状态
①堵塞挂起状态:进程再外存并等待某事件的出现
②就绪挂起状态:进程再外存,但只要进入内存即可运行
3、状态转换
内存中被挂起:
①堵塞到堵塞挂起:没有进程处于就绪状态或就绪进程要求更多内存资源
②就绪到就绪挂起:当高优先级等待进程和低优先级就绪进程
③运行到就绪挂起:对抢占式分时系统,当有高优先级等待挂起进程因事件出现而进入就绪挂起
外存中激活:
①阻塞挂起到就绪挂起: 相关事件出现时,转变为就绪挂起但还在硬盘上。
②解挂/激活 activate:外存到内存,需要运行该进程时
就绪挂起到就绪态: 没有就绪进程或挂起就绪优先进程优先级高于当前就绪进程时
堵塞挂起到堵塞态:当一个进程释放了足够内存时,OS把高优先级阻塞挂起(认为很快出现等待的事件)转换为阻塞进程
4、OS要维护一组状态队列(重要的数据结构),表示系统中所有进程的当前状态。
各种类型的:就绪队列,阻塞队列,挂起队列
PCB根据状态排入相应队列,状态变化:加入和脱离队列
六、线程的概念
1、线程
线程(thread): 进程中的一条执行流程
线程有自己的TCB(thread control block), 只负责这条流程的信息,包括PC程序计数器,SP堆栈,State状态,和寄存器。有不同的控制流,需要不同的寄存器来表示控制流的执行状态,每个线程有独立的这些信息,但共享一个资源。
重新理解进程,由两部分功能组成:
(1)资源管理,包括地址空间(代码段,数据段),打开的文件等的资源平台(环境)等 和 (2)从运行的角度,线程,即代码在这个资源平台上的一条执行流程
一个进程所拥有的线程共用进程的资源平台。利于通信。
2、进程和线程关系
线程=进程-共享资源
线程是控制流,一个进程中可以同时存在多个线程,各个线程并发执行,共享地址空间和文件等资源。
多线程,在进程空间内有多个控制流且执行流程不一样,有各自独立的寄存器和堆栈,但共享代码段,数据段,资源。 如果一个线程写错了,崩溃,如破坏了数据,会导致这个进程的所有线程都崩溃。
3、线程与进程的比较
①进程是资源分配单元(内存,打开的文件,访问的网络),线程是CPU调度单位,CPU也是一种特殊的资源,要执行控制流需要的相关信息
②进程拥有一个完整资源平台,而线程只独享必不可少的资源如寄存器和栈
③线程同样具有就绪、阻塞和执行三种基本状态和转换关系
④线程能减少并发执行的时空开销:
— 线程的创建时间、终止时间、同一进程内线程的切换时间都更短,因为进程要创建一些对内存和打开的文件的管理信息,而线程可以直接用所属的进程的信息,因为同一进程内的线程有同一个地址空间,同一个页表,所有信息可以重用,无失效处理。而进程要切页表,开销大,访问的地址空间不一样,cache,TLB等硬件信息的访问开销大。另外线程的数据传递不用通过内核,直接通过内存地址可以访问到,效率很高。
七、用户线程
1、线程的实现
三种实现方式:
①用户线程:在用户空间实现,OS看不到,由应用程序的用户线程库来管理;POSIX Pthreads, Mach C-threads
②内核线程:在内核中实现,OS管理的;Windows
③轻量级进程lightweight process:内核中实现,支持用户线程。Solaris, Linux
④用户线程与内核线程间,可以是多对一,一对一,多对多。
2、用户线程
①在用户空间实现的线程机制,不依赖于OS内核,有一组用户级的线程库函数来完成线程的管理,包括创建、终止、同步和调度等。
②使用用户态线程的优缺点
优点:不依赖于操作系统的内核,OS只能看到线程所属的进程,可用不支持线程技术的多进程OS;每个进程都有私有的TCB列表来跟踪记录各个线程的状态信息(PC, 栈指针,寄存器),TCB由线程库函数来维护;切换线程也由线程库函数完成,无用户态/核心态切换,统一进程内的用户线程切换速度快;每个进程由自定义的线程调度算法。
缺点:一个线程发起系统调用而阻塞,那整个进程都在等待(OS只能判断进程);一个线程开始运行后,除非主动交出CPU使用权,否则所在进程中的其他线程都无法运行;由于时间片分给进程,多线程时时间片更少会慢。
八、内核线程
1、内核线程
OS内核来完成线程的创建终止和管理。OS的调度单位不再是进程而是线程。进程主要完成资源的管理。
内核维护PCB和TCB,PCB维护了一系列的TCB,具体调度是TCB完成,只要完成一次切换(或创建,终止)就要完成一次用户态到内核态的变化,系统调用/调用内核函数,OS开销比用户线程大。在一个进程中,某个内核线程阻塞不影响其他线程运行;时间片分给线程,多线程的进程自动获得更多CPU时间。Windows NT/2000/XP
2、轻量级进程 (LightWeight Process)
内核支持的用户线程。一个进程有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持。(Solaris/Linux)
3、用户线程与内核线程的对应关系