操作系统2-进程相关(进程概念与控制及线程概论)

操作系统2-进程相关(进程概念与控制)

2.1进程的基本概念

2.1.1 前趋图

前趋图是一个有向无循环图,记为DAG,可用于描述程序/进程之间执行的前后关系。

前趋图

2.1.2 程序的顺序执行

在计算机系统中只有一个程序在运行,这个程序独占系统中所有资源,其执行不受外界影响。一道程序执行完后另一道才能开始。
顺序执行

特性:

  • 顺序性:一个程序开始执行必须要等到前 一个程序已执行完成。
  • 封闭性:程序一旦开始执行,其计算结果不受外界因素影响。
  • 可再现性:程序的结果与它的执行速度无关(即与时间无关),只要给定相同的输入,一定会得到相同的结果。
2.1.3 程序的并发执行

若干程序同时在系统中执行,这些程序的执行在时间上是重叠的,一个程序的执行尚未结束,另一个程序的执行已经开始。
并发执行

特性:

  • 间断性
  • 失去程序的封闭性
    程序在并发执行时,是多个程序共享系统中的资源,因此这些资源的状态将由多个程序来改变。
  • 不可再现性

例:

循环程序A、B,共享变量N。
程序A执行N:=N+1;程序B执行Print(N),后将N置0。
两个程序以不同速度运行,可能出现三种情况:
N:=N+1在Print(N)和N=0之前,此时N值分为N+1,N+1, 0
N:=N+1在Print(N)和N=0之后,此时N值分为N, 0, 1
N:=N+1在Print(N)和N=0之间,此时N值分为N, N+1,

2.2 进程的定义

2.2.1 定义概念

进程有很多各式各样的定义:

  • 行为的一个规则叫做程序,程序在处理机上执 行时所发生的活动称为进程。
  • 一个具有一定功能的程序关于某个数据集合的 一次运行活动

  • 进程是一个程序与其数据一道通过处理机的执 行所发生的活动

进程实体:程序段、相关的数据段、进程控制块PCB

2.2.2 进程同程序的比较

程序是静态的,进程是动态的

  • 程序是指令的有序集合,其本身没有任何运行的含义,是一个静态的概念;
  • 进程是程序在处理机上的一次执行过程,它是一个动态的概念。

程序是永久的,进程是暂时的

  • 程序可以作为一种软件资料长期存在
  • 进程是有一定生命期的

笔者自己的话:进程是程序的一次生命活动,进行具备自己的身份证(PCB),有生存所需的资源(数据段),而程序中的指令规定了进程具体进行怎样的生命活动。进程是一个人类,它具有生老病死;程序是上帝,它永生,它造人,并规定怎样活动。

  • 进程更能真实地描述并发,而程序不能;
  • 进程是由程序和数据、进程控制块三部分组成的;
  • 进程具有创建其他进程的功能,而程序没有
  • 同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程。也就是说同一程序可以对应多个进程。

进程的特性:

  • 结构特征:由程序段、数据段、进程控制块三部分组成;
  • 动态性:进程是程序的执行;
  • 并发性:多个进程可同存于内存中,能在一段时间内同时运行;
  • 独立性:独立运行的基本单位,独立获得资源和调度的基本单位;
  • 异步性:各进程按各自独立的不可预知的速度向前推进。
2.2.3 状态及转换

进程有三种基本状态

  • 进程在生命消亡前处于且仅处于三种基本状态之一
  • 就绪、运行、阻塞

===================================================

1.就绪状态(Ready):当进程已经获得了除CPU以外的所有资源,一旦得到CPU,就立即可以运行,则这些进程所处的状态为就绪状态。

  • 就绪队列:所有处于就绪状态的进程所在的队列。

2.运行状态(Running):正在运行的进程所处的状态为运行状态。

  • 单处理机系统 一个进程处于运行状态
  • 多处理机系统有多个进程处于运行状态

3.阻塞/等待状态(Blocked/Wait):若一进程正在等待某一事件发生(如等待输入/输出工作完成),这时即使给它CPU,它也无法运行,称该进程处于等待状态,或阻塞、睡眠、封锁状态。

  • 阻塞队列:系统根据阻塞原因设置多个队列来管理处于阻塞状态的进程。

三状态转换图:
只有就绪,运行与阻塞
三状态

五状态转换图:
加入了拿到数据资源前的新建状态与运行完毕后的退出状态
五状态

七状态转换图:
七状态

引入了挂起状态(分就绪挂起与阻塞挂起)
引入原因:

  • 终端用户的请求
  • 父进程请求
  • 负荷调节的需要
  • 操作系统的需要
  • 对换的需要

=======================================================
思考题:
1、如果单处理机系统中有N个进程,运行的进程最多几个,最少几个;就绪进程最多几个最少几个;等待进程最多几个,最少几个?
1 , 1 , n-1 , 0 , n-1 , 0

2、有没有这样的状态转换,为什么?
阻塞—运行; 就绪—阻塞

2.2.4 进程控制块(Process Control Block)

定义:
1.为了描述和控制进程运行,系统为每个进程定义了一个数据结构,称为进程控制块(PCB)。
2.PCB中记录了OS所需的、用于描述进程当前情况以及控制进程运行的全部信息。
3.作用

  • 将一个不能独立运行的程序变成一个可以独立运行的基本单位,一个能与其他进程并发执行的进程。
  • OS利用PCB来对并发执行的进程进行控制和管理,PCB是OS感知进程存在的唯一标志。

4.进程与PCB是一一对应的。
5.PCB应常驻内存。
PCB

PCB的内容

1.进程控制基础信息:

  • 当前状态
  • 优先级(priority)
  • 代码执行入口地址
  • 程序的外存地址
  • 运行统计信息(执行时间、页面调度)
  • 进程间同步和通信
  • 阻塞原因
  • 进程的队列指针
  • 进程的消息队列指针

2.所拥有的资源和使用情况:

  • 虚拟地址空间的现状
  • 打开文件列表

3.CPU现场保护信息:

  • 寄存器值(通用、程序计数器PC、程序状态字PSW,地址包括栈指针)
  • 指向赋予该进程的段/页表的指针
PCB的组织

PCB表

  • 系统把所有进程的PCB组织在一起,并把它们放在内存的固定区域,就构成了PCB表。
  • PCB表的大小决定了系统中最多可同时存在的进程个数,称为系统的并发度。

表结构:
1.链接结构

  • 相同状态的进程PCB组成一个链表,不同状态对应多个不同的链表。
    就绪链表、阻塞链表
    链接结构

2.索引结构

  • 相同状态的进程,设置一个PCB索引表,存放这些进程PCB在PCB表中的地址。
    索引结构
2.2.5 思考

1.为什么要引入进程的概念?

程序的执行属于并发执行,此时它们将失去其封闭性,并具有间断性,以及其运行结果不可再现性的特征,所以,这决定了通常的程序不能参与并发执行,为了能使程序并发执行,引入了进程的概念。

2.请说说PCB的作用。

  • 将一个不能独立运行的程序变成一个可以独立运行的基本单位,一个能与其他进程并发执行的进程。
  • OS利用PCB来对并发执行的进程进行控制和管理,PCB是OS感知进程存在的唯一标志。

2.3 进程的控制

进程控制是对系统中的所有进程实施管理。

  • 创建一个新进程
  • 终止一个已完成的进程
  • 终止一个因出现某事件而无法运行下去的进程
  • 负责进程运行中状态的转换

进程控制一般由OS内核的原语来实现。

原语是一种特殊的系统功能调用,它可以完成一个特定的功能,其特点是原语执行时不可被中断

OS内核:

通常将OS中一些与硬件紧密相关的模块诸如中断处理程序、各种常用设备的驱动程序以及运行频率较高的模块(时钟管理、进程调度)以及许多模块公用的一些基本操作)都安排在紧靠硬件的软件层次中,并使它们常驻内存,以提高OS的运行效率,并对它们加以特殊的保护。这部分就是OS的内核。

OS内核应包含的功能
支撑功能

  • 中断处理:内核最基本的功能
  • 时钟管理
  • 原语操作:内核完成一些操作,如进程控制。

资源管理功能

  • 进程管理:全部或大部分放入内核
  • 存储器管理
  • 设备管理
2.3.1 进程创建
  • 获取进程的PID
  • 申请空白PCB
  • 为新进程分配资源 如内存
  • 初始化进程控制块
  • 将新进程插入就绪队列

用fork() 创建一个继承的子进程

  • 复制父进程的所有变量和内存
  • 复制父进程的所有CPU寄存器(有一个寄存器例外)
  • 子进程的fork()返回0
  • 父进程的fork()返回子进程标识符
  • fork() 返回值可方便后续使用,子进程可使用 getpid()获取PID

也就是说父进程进行一次方法,子进程也将同样进行
例:
循环创建子进程loop次:
第一次:初始父进程创建1次,进程总数:2
第二次:初始父进程和子进程一共创建2次,进程总数:4
第三次:初始父进程和子进程一共创建4次,进程总数:8
……………..
第loop次:初始父进程和子进程一共创建2^(loop-1)次,进程总数:2^loop

2.3.2 进程终止
  • 根据被终止进程的标识符,从PCB表中检索出该进程的PCB;
  • 若被终止进程处于运行状态,应立即终止执行,并置调度标志为真;
  • 结束该进程所有子孙进程的执行,以防成不可控进程;
  • 将进程所拥有的资源交给父进程或系统进程;
  • 释放PCB 。
2.3.3 进程的阻塞与唤醒

阻塞:

当一个进程所期待的某一事件尚未出现时,该进程调用阻塞原语将自己阻塞。
进程阻塞是进程的自身的一种主动行为。

唤醒:

当被阻塞进程所期待的事件出现时,则由有关进程调用唤醒原语将该进程唤醒。
处于阻塞状态的进程是绝不可能叫醒自己的,它必须由合作进程用唤醒原语唤醒它。

进程在什么情况下会变为阻塞状态?

  • 请求系统服务
  • 启动某种操作
  • 新数据尚未到达
  • 无新工作可做
2.3.4 进程的挂起与激活

挂起:当出现了引起进程挂起的事件时,系统利用挂起原语将指定进程或处于阻塞状态的进程挂起。

激活:当发生激活进程的事件时,系统利用激活原语将指定进程激活。

2.4 线程

2.4.1 线程的引入

引入进程的目的是为了使多个程序并发执行,以改善资源利用率、提高系统吞吐量。

引入线程则是为了减少程序并发执行时的所付出的时空开销。

进程的两个基本属性:

  1. 进程是一个拥有资源的基本单位。
  2. 进程是一个独立调度的基本单位。

问题参生:进程作为一个资源拥有者,在创建、撤消、切换中,系统必须为之付出较大时空开销。所以系统中进程的数量不宜过多,进程切换的频率不宜过高,但这也就限制了并发程度的进一步提高。

为了解决此问题,将进程的两个属性分开:

  • 对作为调度的基本单位,不同时作为独立分配资源的单位;
  • 对拥有资源的单位,不对之进行频繁切换。

线程因此参生,线程的描述:

  • 在引入线程的OS中,线程是进程中的一个实体,是被系统独立调度和分派的基本单位。
  • 线程基本不拥有系统资源,只拥有少量必不可少的资源:程序计数器、一组寄存器。
    资源拥有量

线程的描述

  • 线程可与同属一个进程的其它线程共享进程所拥有的全部资源。
  • 一个线程可以创建和撤消另一个线程
  • 同一进程中的多个线程之间可以并发执行
  • 线程之间是无保护
2.4.2 线程与进程的比较
  • 在引入线程的OS中,每一进程都拥有多个线程,至少一个。
  • 线程具有进程的许多特征,故又称轻型进程,传统进程称重型进程。

1、调度

  • 在传统OS中,拥有资源、独立调度和分派的基本单位都是进程,在引入线程的系统中,线程是调度和分派的基本单位,而进程是拥有资源的基本单位。
  • 在同一个进程内线程切换不会产生进程切换,由一个进程内的线程切换到另一个进程内的线程时,将会引起进程切换。

2、并发性

  • 在引入线程的系统中,进程之间可并发,同一进程内的各线程之间也能并发执行。因而系统具有更好的并发性。

3、拥有资源

  • 无论是传统OS,还是引入线程的OS,进程都是拥有资源的独立单位,线程一般不拥有系统资源,但它可以访问隶属进程的资源。即一个进程的所有资源可供进程内的所有线程共享。

4、系统开销

  • 进程的创建和撤消的开销要远大于线程创建和撤消的开销,进程切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程切换时只须保存和设置少量寄存器,并不涉及存储管理方面的操作,因此进程切换的开销远大于线程切换的开销。
  • 同一进程内的各线程由于它们拥有相同的地址空间,它们之间的同步和通信的实现也变得比较容易。
2.4.3 用户级线程和内核支持线程

对于线程可分为两类:

  • 内核支持线程,线程是依赖于内核的,即无论是用户进程中的线程,还是系统进程中的线程,它们的创建、撤消、切换都由内核实现。
  • 用户级线程,对于这种线程的创建、撤消和切换,都不用系统调用来实现。内核并不知道用户级线程的存在。

用户级线程:

  • 由应用程序完成所有线程的管理
    通过用户空间的线程库(一组管理线程的函数)提供一个线程运行管理系统(运行时系统)。
  • 内核不知道线程的存在
  • 线程切换不需要核心态特权
  • 调度是应用特定的

猜你喜欢

转载自blog.csdn.net/maniacxx/article/details/80876074