-
进程,process:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
进程的组成:
程序的代码;程序处理的数据;程序计数器中的值,指示下一条运行的指令;一组通用的寄存器的当前值,堆,栈;一组系统资源(如打开的文件),总之,进程包含了正在运行的一个程序的所有状态信息。
进程和程序的联系:
程序是产生进程产生的基础;程序的每次运行构成不同的进程;进程是程序功能的体现;通过多次执行,一个程序可对应多个进程,通过调用关系,一个进程可包括多个程序。
进程与程序的区别:
进程是动态的,程序是静态的;程序是有序代码的结合;进程是程序的执行,进程有核心态/用户态。
进程是暂时的,程序是永久的;进程是一个状态变化的过程,程序可以长久保存。
进程与程序的组成不同,进程的组成包括程序,数据和进程控制块(即进程状态信息)。
例子:
-
进程的特点:
动态性:可动态的创建,结束进程。
并发性:进程可以被独立调用并占用处理机运行。并发/并行:并发是看上去一起执行实际上只执行一个。并行是多个CPU同时执行多个进程。
独立性:不同进程的工作不相互影响。
制约性:因访问共享数据/资源或进程间同步而产生制约。描述进程的数据结构:进程控制块(Process Control Block, PCB)。
操作系统为每个进程都维护了一个PCB,用来保存与该进程有关的各种状态信息。 -
进程控制结构:
进程控制块(PCB):操作系统用PCB来描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识。
进程的创建,终止,组织管理通过对PCB生成回收和组织管理来实现。PCB包含三大类信息:
1.进程标识信息:本进程的表示,本进程产生者标识(父进程标识);用户标识
2. 处理及状态信息保存区:保存进程的运行现场信息。
用户可见寄存器:用户可以使用的数据,地址等寄存器。
控制和状态寄存器:如程序计数器(PC),程序状态字(PSW)。
栈指针:过程调用/系统调用/中断处理和返回时需要用到它。
3. 进程的控制信息:
PCB的组织方式:
链表:同一状态的进程其PCB成一链表,多个状态对应多个不同的链表
索引表:同一状态的进程归入一个index表(index指向PCB),多个状态对应多个不同的index表 -
进程的生命期管理:
进程创建,进程运行,进程等待,进程唤醒,进程结束进程创建:引起进程创建的3个主要事件:
系统初始化时;用户请求创建一个新进程;正在运行的进程执行了创建进程的系统调用进程运行:
内核选择一个就绪的进程,让它占用处理及并执行。(选择哪个呢?:进程调度)进程等待:
以下情况下,进程等待/阻塞:
1. 请求并等待系统服务,无法马上完成
2. 启动某种操作,无法马上完成
3. 需要的数据没有到达
进程只能自己阻塞自己。因为只有进程自己才能知道何时需要等待某件事的发生。进程唤醒:
原因:被阻塞进程需要的资源可以被满足;被阻塞进程等待的事件到达;将该进程的PCB插入到就绪队列。
进程只能被别的进程或者操作系统唤醒。进程结束:
正常退出(自愿);错误退出(自愿的);致命错误(强制性的);被其他进程所杀(强制性的)
5.进程状态变化模型:
进程的三种基本状态: 在生命结束前处于且仅处于三种基本状态之一:
运行状态;就绪状态(获得了除处理机以外所需的一切资源);等待/阻塞状态
6. 进程挂起:
进程挂起意味着没有占用内存空间。处在挂起状态的进程映像在磁盘上
阻塞挂起状态blocked suspend:进程在外村等待某事件出现
就绪挂起状态ready suspend:进程在外存,但只要进入内存,即可运行
挂起相关的状态转换:把一个内存转到外存,可能有以下几种状况:
状态队列:
操作系统维护一组队列,用来表示系统中所有进程的当前状态。不同状态分别用不同的队列来表示(就绪队列,各种阻塞类型的队列)。每个进程的PCB都根据他的状态加到相应的队列中,当一个进程的状态发生变化时,他的PCB从一个状态队列中脱离出来,加入到另一个队列。
-
线程(Thread)管理:
更小的独立运行的基本单位
为什么使用线程: 各函数若不能并发执行,影响资源的使用效率。 问题:进程之间如何通信?共享数据?维护进程系统开销较大。创建进程时,分配资源,建立PCB;撤销进程时,回收资源,撤销PCB,进程切换时,保存当前进程信息。
我们需要一种新的实体:满足:
实体之间可以并发执行;实体之间共享相同的地址空间(进程很难做到)。 这种实体就是线程。什么是线程:
线程是进程当中的一条执行流程。 从两个角度来理解:
从资源组合角度:
进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码段。数据段)打开的文件等各种资源。
从运行的角度:代码在这个资源平台上的一条执行流程。线程=进程-共享资源。 线程的优点:一个进程可以同时存在多个线程;各个线程可以并发执行;各个线程可以共享地址空间和文件等资源。 线程的缺点:一个线程崩溃,会导致其所属进程的所有线程崩溃。
进程和线程的比较:
进程是资源分配单位;线程是CPU调度单位
进程拥有一个完整的资源平台;线程只独享必不可少的资源(如寄存器和栈)
线程同样有就绪,阻塞,执行三种基本状态
线程能减少并发执行的时间和空间开销:
线程创建时间更短;终止时间更短;同一进程内线程切换时间比进程更短;由于同一进程各线程之间共享文件和内存资源,可直接进行不通过内核的通信 -
线程的实现:三种方式
用户线程:在用户空间实现
内核线程:在内核中实现
轻量级进程:在内核中实现,支持用户线程用户线程与内核线程的对应关系:多对一,一对一,多对多
用户线程(操作系统不直接参与管理,由用户级的线程库函数来完成线程的管理):
用户线程的缺点:
阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞,则整个进程在等待(因为操作系统感受不到线程,只能感受到进程)。
当一个线程开始执行后,除非它主动交出CPU使用权,否则它所在的进程当中其他的线程将无法执行。
由于时间片分配给进程,故与其他进程相比,多线程执行时,每个线程得到的时间片较少,执行会比较慢。内核线程:
切换的开销更大
轻量级进程:
内核支持的用户线程,一个进程由一个或多个轻量级进程,每个量级进程由一个单独的内核线程来支持。 -
上下文(context)切换:
停止当前运行进程(从运行状态改变成其他状态)并且调度其他进程(转变为运行状态):
必须在切换前存储许多部分的进程上下文,必须能够在之后恢复他们,所有进程不能显示它曾经被暂停过;必须快速(上下文转换是非常频繁的)
需要存储什么上下文?:寄存器、CPU状态;有时可能会费时,所以我们应该尽可能避免。操作系统为活跃进程准备了进程控制块(PCB)
操作系统将进程控制块放置在一个合适的队列里。 就绪队列/等待I/O队列/僵尸队列 -
进程控制——创建进程:
B站这部分缺失了,找不到 -
进程控制——加载和执行进程:
-
进程控制——等待和终止进程:
11,12因为是用c讲的,不太看得懂,算了。