一、进程
1.1 进程的概念
进程(Process),是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度的一个独立单位。
要点:
- 进程是程序的一次执行;
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动;
- 进程是程序在一个数据集合上运行的过程;
- 进程是系统进行资源分配和调度的一个独立单位;
注意:程序和进程之间的区别(程序是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合;进程是动态的,是程序的一次执行过程。)
1.2 进程的组成
- 控制块(PCB):进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息;
- 程序段:程序的代码(指令序列);
- 数据段:运行过程中产生的各种数据(如:程序中定义的变量)。
1.3 进程的特征
- 动态性:进程是程序的一次执行过程,是动态产生、变化和消亡的;
- 并发性:内存中多个进程实体,各进程可并发执行;
- 独立性:进程是能独立运行、独立获得资源、独立接收调度的基本单位;
- 异步性:各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题;
- 结构性:每个进程都会配置一个PCB。
1.4进程的状态
(1)三种基本状态:
运行态:占有CPU,并在CPU上运行;
就绪态:已经具备运行条件,但由于没有空闲CPU,而暂时不能运行;
阻塞态(等待态):因等待某一事件而暂时不能运行。
(2)另外两种状态:
创建态(新建态):进程正在被创建,操作系统为进程分配资源,初始化PCB;
终止态(结束态):进程正在从系统中撤销,操作系统会回收进程拥有的资源,撤销PCB;
1.5 进程控制
操作系统对进程实现有效的管理,包括创建新进程、撤销已有进程、挂起、阻塞和唤醒、进程切换等多种操作。操作系统通过原语操作实现进程控制。
1.原语的概念:由若干条指令组成,完成特定的功能,是一种原子操作;
2.原语的特点:原子操作,要么全做,要么全不做,执行过程不会被中断;在内核态下执行,常驻内存;是内核三大支撑功能(中断处理、时钟管理、原语操作)之一。
3.原语种类:
(1)创建原语:申请空白PCB;为新进程分配所需要资源;初始化PCB;将PCB插入就绪队列;
引起进程创建的事件:
用户登录、作业调度、提供服务、应用请求
(2)撤销原语:从PCB集合中找到终止进程的PCB;若进程正在运行;立即剥夺CPU;将CPU分配给其他进程;终止其所有子进程;将该进程拥有的所有资源归还给父进程或操作系统;删除PCB;
引进进程终止的事件:
正常结束、异常结束、外界干预
(3) 阻塞原语:找到要阻塞的进程对应的PCB;保护进程运行现场,将PCB状态信息设置为“阻塞态”,暂时停止进程运行;将PCB插入相应事件的等待队列;
引起进程阻塞的事件:
需要等待系统分配某种资源、需要等待相互合作的其中进程完成工作
(4)唤醒原语:在事件等待对列中找到PCB;将PCB从等待对列移除,设置进程为就绪态;将PCB插入就绪队列,等待被调度;
引起进程唤醒的事件:
等待的事件发生;
1.6 进程通信
进程间的信息交换(进程是资源分配的基本单位,各进程内存空间彼此独立;一个进程不能随意访问其它进程的地址空间。)
(1)共享存储
基于共享数据结构的通信方式
- 多个进程共用某个数据结构(os提供并控制)
- 由用户(程序员)负责同步处理
- 低级通信:可以传递少量数据,效率低
基于共享存储区的通信方式
- 多进程共用内存中的一块存储区域
- 由进程控制数据的形式和方式
- 高级通信:可以传递大量数据,效率高
(2)消息传递
直接通信:点到点发送
- 发送和接收时指明双方进程的ID
- 每个进程维护一个消息缓冲队列
间接通信:广播信箱
- 以信箱为媒介,作为中间实体
- 发进程将消息发送到信箱,收进程从信箱读取
- 可以广播,容易建立双向通信链
(3)管道通信
管道
- 用于连续读/写进程的共享文件,pipe文件
- 本质是内存中固定大小的缓冲区
半双工通信
- 同一时段只能单向通信,双工通信需要两个管道;
- 以先进先出(FIFO)方式组织数据传输;
- 通过系统调用read()/write()函数进行读写操作
1.7 进程同步
同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。
1.8 进程互斥
对临界资源的访问,需要互斥的进行。即同一时间段内只能允许一个进程访问该资源
(1)四个部分:
进入区:检查是否可进入临界区,若可进入,需要“上锁”;
临界区:访问临界资源的那段代码;
退出区:负责“解锁”;
剩余区:其余代码部分;
(2)需要遵循的原则:
空闲让进:临界区空闲,应允许一个进程访问;
忙则等待:临界区正在被访问时,其他试图访问的进程需要等待;
有限等待:要在有限时间内进入临界区,保证不会饥饿;
让权等待:进不了临界区的进程,要释放处理机,防止忙等;
(3)软件实现方法:
单标志法:违背“空闲让进”(两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予)
双标志先检查:违背“忙则等待”(设置一个布尔型数组falg【】,数组中各个元素用来标记各进程想进入临界区的意愿)
双标志后检查:违背“空闲让进”、“有限等待”
Peterson算法:违背“让权等待”,会发生“忙等”(结合双标志法、单标志法的思想。如果双方都争着想进入临界区,那可以让进程尝试,做一个有礼貌的进程)。
(4)硬件实现方式:
中断屏蔽方法:关中断、开中断
- 禁止一切中断,CPU执行完临界区之前不会切换;
- 关中断可能会被滥用;
- 关中断时间影响效率;
- 不适用于多处理机,无法防止其它处理机调度其它进程访问临界区;
- 只适用于内核进程(该指令运行在内核态)
Test-And-Set(TS指令/TSL指令)
- 读出标志并设置为true,返回旧值,原子操作;
- 也被称作TSL指令;
- 违背“让权等待”,会发生忙等
Swap 指令(EXCHANGE,XCHG指令)
- 交换两个变量的值,原子操作;
- 违背“让权等待”;
1.9 信号量机制
用户进程可以通过使用操作系统提供一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步;
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量;
一对原语:wait(S)原语和signal(S)原语,简称为P、V操作;
(1)整型信号量
- 用一个整数型变量作为信号量,数值表示某种资源数;
- 整型信号量与普通整型变量的区别:对信号量只能执行初始化、P、V三种操作;
- 整型信号量存在的问题:不满足让权等待原则
(2)记录型信号量
- S.value表示某种资源数,S.L指向等待该资源的队列;
- P操作中,一定是先S.value--,之后可能需要执行block原语;
- V操作中,一定是先S.value++,之后可能需要执行wakeup原语;
- 注意:要能够自己推断在什么条件下需要执行block或wakeup;
- 可以用记录型信号量实现系统资源的“申请”和“释放”;
- 可以用记录型信号量实现进程互斥、进程同步
二、线程
2.1 线程的概念
(1)Thread,进程的轻型实体,也叫“轻量级进程”,是一系列活动按事先设定好的顺序依次执行过程,是一系列指令的集合;
(2)是一条执行路径,不能单独存在,必须包含在进程中;
(3)线程是OS中运算调度的最小单元;
2.2 线程的属性
(1)轻型实体;
(2)独立调度和分派的基本单位;
(3)可并发执行;
(4)共享进程资源。