一、进程(PROCESS)描述
1、进程定义
- 进程: 一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程
在静态程序中,操作系统将执行程序调入到内存后, 执行起来后,能通过CPU来执行这个程序的一条条指令,对数据进行处理,完成功能。这是一个动态过程。这个执行过程称为进程。 - 可以将运行的程序,看为进程。
- CPU的利用率忽高忽低代表进程占用CPU多与少。
- 进程在某种形式上,代表一种运行程序执行的过程,同时也会消耗计算机各种资源,CPU、内存、网络、i/o…
- 为什么要有进程?
当时操作系统只能支持跑一个程序,经过发展CPU能力越强,从而可以在内存中存放更多地程序。 在操作系统中多个程序运行,用程序表示多个程序不太合适了,因为一个程序可能跑了多份进程。所以引出了进程,进程可以更好的表示程序运行的过程。
2、进程的组成
1. 一个进程包括:
- 程序的代码;
- 程序处理的数据
- 程序计数器中的值,指示下一条将运行的指令
- 一组通用的寄存器当前值,堆栈;(一直会动态的变化)
- 一组系统资源(如打开的文件)
- 一组系统资源(如打开的文件、内存资源、文件系统、网络等)
总之,进程包含了正在运行的一个程序的所有状态信息。
2. 进程和程序的联系 (对多对的映射关系)
- 程序是产生进程的基础;进程执行的所有功能,是在程序中有具体的描述。进程执行的功能受制于程序的代码。代码限制了进程能完成何种功能。
- 程序的每次运行构成不同的进程;程序只有一份,放在硬盘中,可以多次执行程序,由于数据可能不一样,那么执行的结果也是不一样的,但功能是一样的。所以说进程也不同。
- 进程是程序功能的体现;
- 通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包含多个程序。进程也可以包含多个程序,因为可能多个程序包含一起完成一个功能。
3. 进程和程序的区别
- 进程是动态的,程序是静态的:程序是有序代码的集合;
- 进程是程序的执行,进程有核心态、用户态的区分。
核心态:核心态在操作系统中运行,程序员写的代码都是用户态,代码没有写操作系统的代码。那为什么进程还有核心态呢?。是因为 进程在运行时需要完成特定的功能,只有操作系统才能提供,比如说读文件(操作系统来完成),进程对操作系统发出请求,操作系统代表进程在内核中进行,这时进程处于核心态。所以说进程有核心态。 - 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序是可长久保存。。:进程在程序中运行,有开始和结束,结束后进程也就结束了。程序是永久保存在硬盘中。
- 进程与程序组成不同;进程的组成包括程序、数据和管理系统建立的进程控制块(及进程状态信息)
3、进程的特点
- 动态性:动态的创建进程、结束进程; 还可以进行进程切换
- 并发性:进程可以被独立调度并占用处理运行;并发并行。
并发是指:一段时间内有多个进程在执行。 并行是指:一个时刻有多个进程在执行。(一个CPU不可能出现并行) - 独立性:不同进程的工作不相互影响。
对独立性的解释:操作系统不停的在调度不同进程来进行,进程的执行时间,可能受到其他进程的影响。但是正确性不受到影响,操作系统保障,进程之间不会相互破坏。操作系统如何保障进程正确执行?通过页表可以使得不同的程序,访问不同的地址空间,所以说不可能越过不属于范围的地址空间。如果越过地址空间,那么就会缺页异常,从而操作系统判断是否可以访问,越过范围之内,肯定不可以进行访问。这个页表保护进程独立的机制。有了页表可以不同的进程在独立的空间中运行。从而进程不会相互影响。 - 制约性:因访问共享数据/资源或者进程间同步而产生制约。
进程之间可能有交互、时序,不能完全独立。操作系统根据时序等特点,进行管理,从而有相互制约。
- 图一:不同的进程有切换。体现动态性。
- 图二:相互独立进行
- 图三:操作系统进行了时间调度,开始执行A,在执行B…
4、进程控制结构(PCB与进程是一对一的关系)
- 进程控制结构:操作系统管理控制进程运行所用的信息集合。操作系统用PCB来秒描述进程的基本情况以及运行变化的过程,PCB是进程存在的唯一标识。
- 一个进程的存在,必然有PCB。PCB是跟随进程,创建以及结束。
- 进程的创建:为该进程生成一个PCB
- 进程的终止:回收它的PCB
- 进程的组织和管理:通过对PCB的组织管理来实现。
1.PCB含有以下三大类信息:
- 进程表示信息:
如本进程的表示,本进程的产生者标识(父进程标识);用户标识 - 处理机状态信息保护区。
保存进程的运行现场信息:cpu会使用寄存器很多事情,比如说加减乘除,将数据存在寄存器,进行保护状态,比如是否溢出。 1.用户可见寄存器,用户程序可以使用的数据,地址等寄存器 2.控制和状态寄存器,如程序技术器pc,程序状态字psw 3.栈指针,过程调用/系统调用/中断处理和返回时需要用到它。 - 进程控制信息:
1.调度和状态信息,用于操作系统调度进程并占用处理机使用 2.进程间通信信息,为支持进程间的与通信相关的各种标识、信号、信件等,这些信息存在接收方的进程控制块中。 3.存储管理信息,包含有指向本进程映像存储空间的数据结构 4.进程所用资源,说明由进程打开、使用的系统资源,如打开的文件等。 5.有关数据结构连接信息,进程可以连接到一个进程队列中,或连接到先关的其他进程的pcb
2.PCB的组织方式
通常使用链表:因为进程是一个动态过程,需要进行动态插入删除等… 链表比数组的插入删除效率略高。
二、进程状态(State)
1、进程的生命期周期
1. 进程创建 引起进程创建的三个主要事件:
- 系统初始化时;—— 简称init进程,负责创建新进程。
- 用户请求一个新进程;——新进程:用户发出请求,操作系统完成创建进程。
- 正在运行的程序执行了创建进程的系统调用;——可能进程也需要进程,由操作系统创建。
2. 进程运行 内核选择一个就绪的进程,让它占用处理机并执行,那么为何选择?如何选择? ——有了新进程不一定运行,还需要让我们的操作系统选择一个可以执行的进程(称为就绪进程),再执行。 3. 进程等待 在执行过程中,肯能产生等待,是可能要完成一个事情,这个事情没法马上完成。 一个进程需要执行下去,某种原因不得不等待,这时操作系统把进程从运行态转换为等待态,等待时不占CPU,其他就绪就可以占用CPU运行。进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。 - 在以下情况,进程等待(阻塞):
- 请求并等待系统服务,无法马上完成;
- 启动某种操作,无法马上完成;
- 需要的数据没有到达;
例如1:读文件,文件存在硬盘上,从硬盘读到内存中来,这个过程相对于CPU很慢。这时候让CPU等待的话,浪费CPU的资源。这时候就让进程进行等待,先让其他就绪的进程运行。自身等待操作系统读到内存中。 例如2:与其他进程协调完成某种工作,其他没有进行,该进程也需要等待。 例如3:等待数据到达。
4. 进程唤醒 既然有“等待”,就有唤醒。唤醒就是等待情况的满足。 进程只能被别的进程或操作系统唤醒。
- 被阻塞进程需要的资源可以被满足;
- 被阻塞进程等待的事件到达;
- 将该进程的PCB插入到就绪队列;
唤醒后,就会将“等待态”变为就绪态,也就说被操作系统的调用,CPU的执行。 5. 进程结束 进程从 执行、等待、唤醒可能多次重复,最后会结束 - 正常退出(自愿的)——完成了所有功能
- 错误退出(自愿的)——可能没有完成功能,出现错误
- 致命错误(强制性的)——操作系统强制退出。比如说访问其他地址空间,操作系统是不允许的。
- 被其他进程所杀(强制性的)——比如说管理进程,进程占用太多了,破坏其他进程的安全性。
2、进程状态变化模型
1、进程的三种基本状态: 进程在生命结束前处于且仅处于三种基本状态之一,不同系统设置的进程状态数目不同。
- **运行状态(Running):**当一个进程正在处理机上运行时。
- **就绪状态(Ready):**一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。
- 等待状态(又称阻塞状态Blocked): 一个进程正在等待某一事件,而暂时停止运行时。如等待某自愿,等待i/o完成
2、进程其它的基本状态: 创建状态(New):一个进程正在被创建,还没有被转到就绪状态之前的状态。 结束状态(Exit):一个进程正在从系统中消失时的状态,这是因为进程结束或由于其他原因所导致的。 3、可能的状态变化如下:
- NULL —>New :一个新进程被产生出来执行一个程序。——一开始没进城,由操作系统创建一个PCB,对PCB进行初始化工作,从空到New 状态,产生PCB了。
- New —>Ready:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态。是否会持续很久??——从new到ready,是说数据结构初始化完毕了,进程就可以执行了。并不会很久,很快。因为只是完成一个pcb的初始化过程。
- ready–>running:处于就绪状态的进程被进程调度程序选中后,就分配到处理机上来运行。 进程调度算法来选择进程去运行
- runnning–>Exit:当进程表示它已经完成或者因出错,当前运行进程会由操作系统作结束处理。
- runing–>ready:处于运行状态的进程在其他运行过程中,由于分配给它的处理机时间片用完而让出处理机。谁完成?
- Runing–>Blocked:运行到阻塞状态。 当进程请求某样东西且必须等待时。例如,读写文件。
- Bocked->Ready:当进程要等待某事件到来时,由操作系统来完成,它从阻塞状态变到就绪状态。
3、 进程挂起模型
进程没有占用内存空间,就需要进行挂起。
- 阻塞挂起状态(Blocked-suspend):进程在外存并等待某事件的出现。
进程本身处于阻塞状态,然后在挂起。进程在磁盘上,等待某个事件出现,1已经落在磁盘上了,2等待某个事件出现。 - 就绪挂起状态(Ready-suspend):进程在外存,但只要进入内存,即可运行;
进程本身就是就绪态,被挂起。 - OS怎么通过PCB和定义的进程状态来管理PCB,帮助完成进程的调度过程?
三、线程(THREAD)
1、为什么使用线程
例子:
- 单进程方式:这种方式 能否连贯进行播放声音,,如果CPU不够强,可能是断断续续。因为在read时,可能进程处于等待时刻,是因为要读文件,而文件放在硬盘中,读出来的速度远远慢于内存和CPU的时间,等很长时间才可以进行减压在播放。也可能是read处于阻塞状态。各个程序不能并行进行,所以效率可能比较差。
- 那我们应该用多进程方式来实现,可以将三个部分,进行拆开。三者处于有序的集合,实现高效音频播放。看起来是可行的,问题是:进程之间如何通行?创建和切换,需要对进程信息的保存与恢复。
怎么解决这些问题? 需要提出一种新的实体,满足以下特征: 1.实体之间可以并发地执行; 2.实体之间共享相同的地址空间、相同的资源; 那么这个实体就是线程(Thread)
2、什么是线程
- 线程就是进程当中的一条执行流程。
- 从两个角度来重新理解进程:
- 从资源组合的角度:进程把一组相关的资源组合起来,构成了一个资源平台(环境),包括地址空间(代码、数据段)、打开的文件等各种资源; ——进程就是来管理资源的,将进程的执行功能、状态,交给线程来管理。
- 从运行的角度:代码在这个资源平台上的一条执行流程(线程)。——认为是线程,线程是进程的组成部分。进程除了完成管理资源之外,还有线程来完成执行过程。
- 进程有两部分组成:资源管理、一部分是线程。
- 线程=进程 减去 共享资源
- 线程是共享进程提供的资源平台。
- 线程=进程 减去 共享资源
- 线程的优点:
- 一个进程中可以同时存在多个线程;
- 各个线程之间可以并发地执行;
- 各个线程之间可以共享地址空间和文件等资源
- 一个线程崩溃,会导致其所属进程的所有线程崩溃
1.线程和进程的比较:
线程比进程的空间、时间效率要高。
- 进程是资源分配单位(资源:内存、文件、网络等)。线程是CPU调度单位(CPU是一种特殊的资源,对控制流所需要的相关信息)
- 进程拥有一个弯针的资源平台。 线程是只独享必不可少的资源,如寄存器和栈。
- 线程同样具有就绪、阻塞和执行三种基本状态,同样具有状态之间的转换关系。
- 线程能减少并发执行的实际和空间开销:
1.线程的创建时间比进程短。——因为进程在创建时,需要创建其他管理信息(内存管理),而线程直接用进程创建好的资源。 2.线程的终止时间比进程短。——同理,线程不考虑释放问题。 3.同一进程内的线程切换时间比进程短。——切换进程需要切换页表,线程不同。 4.由于同一进程的个线程共享内存和文件资源,可直接进行不通内核的通信。——直接通过内存地址可以通信。
3、线程的实现
1.线程的三种实现方式:
-
用户线程:在用户空间实现; 操作系统看不到的线程,由应用程序的库来管理线程。 -
内核线程:在内核中实现; 有操作系统管理起来的线程。操作系统来管理线程。 -
轻量级进程:在内核中实现,支持用户线程。
2.用户线程与内核线程的对应关系
多对一:n个用户线程,对应一个内核线程 一对一:1个用户线程,对应一个内核线程 多对多:n个用户线程,对应n个内核线程
3.用户线程:
- 用户态的库,来完成线程控制的管理。线程控制块在库里面进行实现,对操作系统来说,看不到TCB,只能看到进程信息。而进程中的线程信息,是库实现的。所以说整个线程的调度和管理,操作系统不直接参与,是由线程库直接完成。
- 在用户空间实现的线程机制,它不依赖操作系统的内核,由一组用户级的线程库函数来完成线程的管理,包含进程的创建、终止、同步和调度等。
- 用户线程的缺点:
- 阻塞性的系统调用如何实现?如果一个线程发起系统调用而阻塞,则整个进程在等待;
阻塞性系统调用:比如说 读文件可能很长,则堵塞。如果是用户线程发生了堵塞,那么整个进程都会等待。其他用户线程没有堵塞,也会发生等待现象。因为操作系统感受不到线程,因为操作系统只能看到进程,会将此进程堵塞,那么所有属于进程和线程的都会进行堵塞,从而停下来。 - 当一个线程开始运行后,除非它主动地交出CPU使用权,否则它所在的线程中其他的线程无法运行;
- 由于时间片分配给进程,故与其他进程相比,在多线程执行时,每个线程得到的时间片较少,执行会较慢。
4.: 内核线程:操作系统可以看到的线程
TCB是放在内核里面的。 比如windows就是内核线程。CPU调用单位是线程,不是进程。 所有的线程的创建终止管理是操作系统来完成。进程主要是对资源的管理。 一个进程PCB会管理到一系列的线程。
5.: 轻量级线程:
在Linux机制。
4、上下文切换 多线程编程接口举例
- 什么是上线文切换?
当运行不同程序的时候,各个进程是共享CPU资源。 - 切换的过程称为:进程的上下文切换。
- 进程切换涉及到两个进程,当A进程执行一段时间后,操作系统说“现在应该执行B进程了”,进程B开始执行。这次进程A将各种寄存器信息保存在进程控制块中(PCB).将B进程的进程控制块中保存到的上下午信息,恢复到CPU中。这样来实现进程的切换。这些操作都是由硬件完成,基本上都是汇编代码进行写。
|