一.进程基本概念
1.多道程序设计是允许多个程序同时进入内存并运行,其目的是为了提高系统效率。
2.并发环境:一段时间间隔内,单处理器上有两个或两个以上的程序同时处于开始运行但尚未结束的状态,并且次序不是事先确定的。
在并发环境中执行的程序叫做并发程序。
3.进程的定义:(进程又称作CPU的抽象)
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。
二.PCB:ProcessControl Block
又称进程描述符、进程属性,是操作系统用于管理控制进程的一个专门的数据结构,记录进程的各种属性,描述进程的动态变化过程。
PCB是系统感知进程存在的唯一标志,进程与PCB是一一对应的。
进程表表示所有进程的PCB集合。进程表的大小即可以包含PCB的个数决定了操作系统同时可容纳进程的个数,也叫操作系统的并发度。
PCB包含的信息:
信息类别 | 包含内容 |
进程描述信息 | 进程标识符(Process ID),唯一,通常是一个整数 |
进程名,通常基于可执行文件名,不唯一 | |
用户标识符(User ID) | |
进程组关系 | |
进程控制信息 | 当前状态 |
优先级(priority) | |
代码执行入口地址 | |
程序的磁盘地址 | |
运行统计信息(执行时间、页面调度) | |
进程间同步和通信 | |
进程的队列指针 | |
进程的消息队列指针 | |
进程所拥有的资源和使用情况 | 虚拟地址空间的状况 |
打开文件列表 | |
CPU现场信息 | 寄存器值(通用寄存器、程序计数器PC、程序状态字PSQ、栈指针) |
只想该进程页面的指针 |
三.进程的基本状态
1.进程的三种基本状态有运行态、就绪态、等待态。
运行态(Running)指线程占有CPU,并在CPU上运行;
就绪态(Ready)指线程已经具备运行条件,但是由于没有空闲CPU,而暂时不能运行;
等待态(Waiting/Blocked)指的是线程因等待某一事件而暂时不能运行,如等待读盘结果。等待态又称作阻塞态、封锁态、睡眠态。
2.进程的其他状态
创建:已经完成创建一个进程所必要的工作如PID、PCB,但是尚未统一执行该进程因为资源有限;
终止:进程终止执行后,该进程就会进入该状态。可完成一些数据统计工作,并进行资源回收;
挂起:当操作系统中如果要进行负载调节时,可能会把一些线程编程这种状态。比如当线程个数比较多的时候就会把若干个线程变成挂起态。一旦线程编程挂起态,操作系统会把其内存空间收回来,然后把线程相关的内容写到磁盘上,当线程解除挂起态时则操作系统再将线程的相关内容读入内存。
五状态进程模型如下:
七状态进程模型:
四.进程队列
操作系统为每一类进程建立一个或多个队列,队列元素为PCB,伴随进程状态的改变,其PCB从一个队列进入另一个队列。
五.进程控制
进程控制操作完成进程各个状态之间的转换,由具有特定功能的原语完成。
原语(primitive)指的是完成某种特定功能的一段程序,具有不可分割性或不可中断性,即原语的执行必须是连续的,在执行过程中不允许被中断。也称原子操作。
1. 进程的创建
给新进程分配一个唯一标识以及进程块,为进程分配地址空间。然后初始化进程如设置默认值(如:状态为New,…),最后设置相应的队列指针如把新进程加到就绪队列链表中。
不同的操作系统提供了不同的创建进程的操作,Unix中主要是fork和exec的配合使用,widows则是createProcess的使用。
2. 进程的撤消
进程的撤消即结束进程,会收回进程所占有的资源,如关闭打开的文件、断开网络连接、回收分配的内存,最重要的是需要撤消该进程的PCB。
在Unix系统中调用exit则撤消了对应的进程,在windows中则是TerminatePrcoess撤消相应进程。
3. 进程阻塞
进程阻塞是处于运行状态的进程,在其运行过程中期待某一事件完成,如等待键盘输入、等待磁盘数据传输完成、等待其他进程发送消息等。当被等待的事件未发生时,由进程自己执行阻塞原语,使自己由运行态变为阻塞态。
Unix通过wait,windows通过WaitForSingleObject等操作函数完成进程阻塞。
4. Unix的几个进程控制操作
1) Fork() 通过复制调用进程来建立新的进程,是最基本的进程建立过程;
为子进程分配一个空闲的进程描述符(proc结构),父进程给子进程唯一标识pid,以一次一页的方式复制父进程地址空间。从父进程处继承共享资源,如打开的文件和当前工作目录等。父进程将紫禁城的状态设为就绪,插入到就绪队列,对进程返回标识符0,向父进程返回子进程的pid。
Fork()执行完后的父进程变成了两个进程即父进程和子进程。在fork创建子进程的过程中以一次一页的方式复制父进程地址空间给子进程,会把所有的内容拷贝给子进程,但是子进程并不是需要父进程的所有工作,并且还会浪费空间和时间。
到linux中为了改善创建子进程的效率,采用了写时复制技术COW加速创建进程。
2) Exec() 包括一系列系统调用,它们都是通过用一段新的程序代码覆盖原来的地址空间,实现进程执行代码的转换;
3) Wait() 提供初级进程同步操作,能使一个进程等待另外一个进程的结束;
4) Exit() 用来终止一个进程的运行。
上述几个进程控制操作都是以系统调用的形式作为借口呈现给用户程序,由用户程序调用。
六.关于进程的讨论
1. 进程的分类
1) 系统进程和用户进程
系统进程的级别要比用户进程的高,系统进程会被优先调用到CPU中执行。
2) 前台进程和后台进程
前台进程指的是直接和用户交互的进程,如用户敲键盘、动鼠标等直接控制进程。后台进程指操作系统在启动之后创建的进程,这些进程为用户服务如打印进程。还有一些应用进程在操作系统启动之后也被创建如防火墙、电子邮件的接收等这些进程在后台运行。对用户来说与其打交道的是前台进程。
3) CPU密集型进程和I/O密集型进程
CPU密集型在运行时需要大量计算。I/O密集型进程是需要大量的输入输出。
2. 进程层次结构
UNIX中有进程家族树:init为根,某些情况下某个进程结束则其子孙进程也必须全部结束;Windows中的进程则是地位相同。
3. 进程与程序的区别
1) 进程更能准确刻画并发,而程序不能
2) 程序是静态的,进程是动态的
3) 进程是有生命周期的,有诞生有消亡,短暂的;而程序是相对长久的
4) 一个进程可以对应多个进程
5) 进程具有创建其他进程的功能
4. 进程地址空间
操作系统给每个进程都分配了一个地址空间。
每个进程都会有其独立的地址空间。
5. 进程映像(IMAGE)
进程映像是对进程执行过程活动全过程的静态描述。可以把它看做是在某一瞬间的进程快照。包括地址空间内容、硬件寄存器内容以及与该进程相关的内核数据库、内容栈组成。
与用户相关:进程地址空间(包括代码段、数据段、堆和栈、共享库…)
寄存器相关:程序计数器、指令寄存器、程序状态寄存器、程序状态寄存器、栈指针、通用寄存器等的值
内核相关:静态部分有PCB以及各种资源数据结构;动态部份有内核栈(不同进程进入内核后使用不同的内核栈)
6. 上下文(Context)切换
将CPU硬件状态从一个进程切换到另一个进程的过程称为上下文切换。
进程运行时,其硬件状态保存在CPU上的寄存器中(程序计数器、指令寄存器、程序状态寄存器、程序状态寄存器、栈指针、通用寄存器、其他控制寄存器的值)。
进程不运行是,这些寄存器的值保存在进程控制块PCB中;当操作系统要运行一个新的进程时,将PCB中的相关值送到相应的寄存器中。
七.线程的引入
1. 为什么引入线程?
应用的需要、开销的考虑、性能的考虑。
1.1 应用的需要
在一个进程中会有多个线程任务,不同的线程完成的是不同的任务。示例有Web服务器;
1.2 开销的考虑
线程的开销小:创建一个新线程的花费时间少(撤销也是如此);两个线程切换花费的时间少;线程之间相互通信无需调用内核(同一进程内的线程共享内存和文件)。
1.3 性能的考虑
多个线程的情况下,有的线程负责计算,有的线程负责I/O。效率高。
八.线程的基本概念
线程:进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程.在同一进程中增加的多个执行序列(线程)。
线程的属性:(1)有标识符ID;(2)有状态及状态转换——>需要提供一些操作;(3)不运行时需要保存的上下文。有上下文环境:程序计数器等寄存器;(4)有自己的栈和栈指针。
同一进程的线程间共享所在进程的地址空间和其他资源。
线程也可以创建、撤消另一个线程。因为线程开始是一个单线程进程方式运行的。
九.线程机制的实现
1. 用户级线程
在用户空间建立线程库:提供一组管理线程的过程。运行时系统:完成线程的管理工作(操作、线程表)。内核管理的还是进程,并不知道线程的存在。线程切换不需要内核态特权。
优点:线程切换快;调度算法是应用程序特定的;用户级线程可运行在任何操作系统上(只需要实现线程库)。
缺点:内核只将处理器分配给进程,同一进程中的两个线程不能同时运行于两个处理器上;大多数系统调用是阻塞的,因此,由于内核阻塞进程,故进程中所有线程也被阻塞。
2. 核心级线程
内核管理所有线程管理,并向应用程序提供API接口;内核维护进程和线程的上下文;线程的切换需要内核支持;以线程为基础进行调度。
3. 混合—两者结合方法
线程创建是在用户空间完成的;线程调度等在核心态完成。
十.本章重点小结
1. 进程
1.1 并发性:任何进程都可以与其他进程一起向前推进
1.2 动态性:进程是正在执行程序的实例。进程是动态产生,动态消亡的;进程在其生命周期内,在三种基本状态之间转换。
1.3 独立性:进程是资源分配的一个独立单位。例如:各进程的地址空间相互独立。
1.4 交互性:指的是进程在执行过程中可能与其他进程产生直接或间接的关系。
1.5 异步性:每个进程都以其相对独立的、不可预知的速度向前推进。
1.6 进程映像:程序+数据+栈(用户栈、内核栈)+PCB
2. 线程
2.1 多线程应用场景
2.2 线程基本概念、属性
2.3 线程实现机制