操作系统3——进程的描述与控制

操作系统3——进程的描述与控制

——2018.12.10

零、目标

  • 进程的定义和特征
  • 进程的基本状态及转换
  • 进程控制块
  • 内核、原语
  • 临界资源、临界区
  • 同步机制应遵循的规则
  • 记录型信号量、利用记录型信号量解决生产者

一、进程的描述

1. 进程的概念
  1. 进程的定义:是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
  2. 进程的特征:动态性、并发性、独立性、异步性
  3. PCB 描述和控制进程运行,系统为每个进程定义的一个数据结构
  • 程序的代码和数据、CPU寄存器的数值、堆和栈
  • 系统资源
  • 地址空间
  • 打开的文件
2.进程的状态
  1. 就绪(Ready)状态
  • 可运行,已获得除CUP外的所需资源,等待分配CPU
  1. 执行(Running)状态
  • 占用CPU运行,处于此状态的进程数目=CPU的数目
  1. 阻塞(Blocked)状态
  • 等待某种条件(如I/O)操作或进程同步,在满足条件前无法执行
3.进程的管理
  1. 引起进程创建的原因:
  • 用户登录:为终端用户建立进程
  • 作业调度:选中的作业建立进程
  • 提供服务:为用户提供的服务进程
  • 应用请求:应用程序自己创建的进程
  1. 原语:由若干条指令构成,用于完成一定功能的一个过程
  2. 原子操作:一个操作中的所有动作,要么全做,要么全不做,是一个不可分割的操作。
  3. 进程控制块的组织方式
  • 链接方式:把具有同一状态的PCB,用其中的链接字链接成一个队列
  • 索引方式:系统根据所有进程的状态建立几张索引表

二、线程的描述

1.线程的概念
  1. 线程的定义:
  • 将进程的两个属性分开,作为调度和分派的基本单位,不同时作为资源的拥有者,就形成了线程的概念
  • 线程:有时称轻量级进程,进程中的一个运行实体,是一个CPU调度单位,资源的拥有者还是进程或称任务
  • 一个被调度和分派的基本单位并可独立运行的实体
  1. 线程的分类
  • 内核支持线程:依赖内核进行控制和管理
  • 用户级线程:在用户级创建、撤销和切换
  1. 在引入线程的OS系统中,则把线程作为调度和分派的基本单位,而把进程作为资源的拥有基本单位。
  2. 在同一进程中的线程切换不会引起进程切换
  3. 在不同一进程中的线程切换会引起进程切换

三、进程同步

1.相关的概念
  1. 互斥——间接相互制约关系
  • 同处于一个系统中的进程必然共享某种资源,如CPU、I/O设备等,间接相互制约即源于共享资源
  1. 同步——直接相互制约关系
  • 源于进程进程之间的合作关系,如进程A向B提供数据,当输入缓冲空时,B不能得到数据而阻塞
  1. 临界资源
  • 一次仅允许一个进程使用的资源
  • 系统中的许多硬件,如打印机,诸进程之间只能用互斥的方式进行访问
  1. 临界区
  • 在每个进程中访问临界资源的那段代码称为临界区
2.同步机制应遵循的原则
  1. 空闲让进
  • 当无进程处于临界区时,应允许一个进程进入临界区
  1. 忙则等待
  • 当已有进程进入临界区时,其他进程必须等待
  1. 有限等待
  • 应保证在有限时间内进入自己的临界区,防止“死等”
  1. 让权等待
  • 应立即释放处理机,防止“忙等”
3.互斥与同步的解决方法:
  1. 软件方法
  • 由进程通过执行相应的程序指令,实现与其他进程的互斥与同步
  1. 硬件方法
  • 通过屏蔽中断(单CPU)或是采用专门的机器指令控制互斥与同步
  1. 信号量方法
  • 经典信号量——表示资源的物理实体
  • 记录型信号量——更有效地利用资源,解决忙等的问题
typedef struct{
	int value;
	struct process_control_block *list;
}semaphore;
wait(semaphore *S){
	S->value--;//请求一个该类资源
	if(S->value<0) block(S->list);//该类资源已分配完毕,调用block原语进行自我阻塞并放弃处理机、插入到信号量列表S->list中
}
signal(semaphore *S){
	S->value++;//释放一个资源
	if(S->value<=0) wakeup(S->list);//有进程被阻塞
}
  • AND型信号量机制——防止系统出现不安全性
  1. 管程方法
  • 管程:⼀个管程定义了⼀个数据结构和能为并发进程所执⾏的⼀组操作,这组操作能同步进程和改变管程中的数据

四、经典进程的同步问题

1 .利用记录型信号量解决生产者-消费者问题

问题描述:
有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能并发执行,在两者之间设置了- -个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。

int in = 0, out = 0;//in: 输入指针, out: 输出指针;
item buffer[n];//n个缓冲区组成的数组;
semaphore mutex = 1, full = 0, empty = n;
//mutex: 互斥信号量, 生产者进程和消费者进程都只能互斥访问缓冲区;
//full: 资源信号量, 满缓冲区的数量;
//empty: 资源信号量, 空缓冲区的数量;//信号量不允许直接参与运算, 故都要定义;

//生产者程序;
void producer() {
  do {
      producer an item nextp;//生产者生产一个产品
      ...
      wait(empty);//申请一个空缓冲区;
      wait(mutex);//申请临界资源;
      buffer[in] = nextp;//将产品添加到缓冲区;
      in = (in + 1) % n;//类似于循环队列;
      signal(mutex);//释放临界资源;
      signal(full);//释放一个满缓冲区;
  } while (TRUE);
}

//消费者程序;
void consumer() {
  do {
      wait(full);//申请一个满缓冲区;
      wait(mutex);//申请临界资源;
      nextc = buffer[out];//将产品从缓冲区取出;
      out = (out + 1) % n;//类似于循环队列;
      signal(mutex);//释放临界资源;
      signal(empty);//释放一个空缓冲区;
      consumer the item in nextc//消费者将一个产品nextc消费; 
 } while (TRUE);
}
void main(){
	cobegin
		producer(); consumer();
	coend
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章