操作系统2

1前驱图和执行程序

前驱图:是一个有向的无环图,它用于描述程序执行的先后顺序。
图中每一个顶点:一个进程,一个程序,一个程序段,程序段中的语句等实体
边:两个顶点之间的前驱关系
前驱图描述了程序执行单位的先后顺序。
程序顺序执行
特点:

  • 顺序性
    程序运行时,处理器按程序的规定顺序执行。既程序的前一操作结束后,系统马上执行其后续的操作
  • 封闭性
    cheng'xu
  • 可再现行
    条件不变,多次执行,结果相同

程序并发执行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序并发执行的特点

  • 独立性:并发执行的程序在逻辑上相互独立
  • 间断性:走走停停
  • 失去封闭性:多个程序共享系统资源,资源状态由多个程序改变
  • 不可再现性:失去封闭性,计算结果不可再现

2进程的描述

进程控制块(Process control block)PCB
在这里插入图片描述
进程的定义:进程是进程实体的运行过程,它是系统进行资源分配和调度的一个独立单位。
在这里插入图片描述
程序 = 程序段+数据段
进程是动态的概念
程序是静态的概念
线程不能进行资源分配

进程的特征

  • 动态性:

在这里插入图片描述

  • 并发性:

在这里插入图片描述

  • 独立性:

在这里插入图片描述

  • 异步性

同步机制(重要)
在这里插入图片描述
进程分类
系统进程+用户进程
系统进程:
在这里插入图片描述
用户进程:
在这里插入图片描述
引入两种进程原因:
防止用户进程操作系统及关键数据的更改或破坏

进程的三种状态与转换
在这里插入图片描述
在这里插入图片描述
终止态的PCB暂时驻留内存,pcb记录了进程状态信息。
挂起状态
断点调试
用户需要:程序运行期间,修改,检查进程
父进程的需要:修改,协调子进程之间的活动
os的需要
进程运行中资源使用情况的检查和记账(终止状态)
负荷调节的需要:
负荷调节,保证实时任务的执行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2进程管理中的数据结构

os为了便于对计算机内的各类资源的使用与管理

  • os将资源抽象为相应的各类数据结构,并提供一组对资源进行操作的命令(oop的对象)
  • 用户可利用这些数据结构及操作命令来执行相关的操作,而不必关心其实现细节

os为了协调诸多用户对系统中共享资源的使用,它还必须记录和查询各种资源的使用,;各类进程运行情况的信息。
在这里插入图片描述

PCB的主要功能

  • PCB是用记录进程有关信息的一个数据结构,是进程实体的一部分,由系统建立
  • os调度进程的主要数据依据:记录os所需的,用于描述进程的有关信息,提供系统对进程控制
  • 使多道程序下不能独立运行的程序,成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程
  • PCB是进程存在的唯一标志,且常驻内存并存放于操作系统专用区

PCB的作用

  • 作为独立运行基本单位的标志
  • 能实现间断性运行方式(异步性)
  • 提供进程管理所需要的信息
  • 提供进程调度所需要的信息
  • 实现与其它进程的同步与通信

PCB中的信息

  • 进程标识符:用于唯一地标识一个进程

内部标识:一个进程的序号,设置内部标识符主要是为了方便系统使用
外部标识:由用户在访问该进程时使用,还设置父进程标识及子进程标识

  • 处理器状态信息:存放于寄存器中

通用寄存器
指令记数器(PC):下一条访问的地址
程序状态字PSW:状态信息(条件码,执行方式,中断屏蔽标志)
用户栈指针:存放过程,系统调用参数,调用参数,调用地址

  • 进程调度信息

进程状态,进程优先级,进程调度所需要的其他信息(如:等待,使用CPU时间),事件(执行-阻塞的原因)

  • 进程控制信息

程序和数据的地址:内存和外存首址
进程同步和进程通信机制:同步,通信机制(指针,信号量)
资源清单:除CPU以外的所有资源清单
链接指针:下一个进程的PCB首址

PCB的组织方式

  • 线性方式
  • 链接方式
  • 索引方式
    1.线性方式
    将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中
    优点:实现简单,开销小
    缺点:每次查找时都需要扫描整张表,因此,适合进程数目不多的系统。
    2.链接方式
    把相同状态的PCB分别链接成一个队列。这样,形成了就绪队列,若干(阻塞原因不同)个阻塞队列和空队列等。
    在这里插入图片描述
    3.索引方式
    系统根据进程状态的不同,建立几张索引表,把各索引表在内存中首地址记录在内存的一些专用单元中。
    在索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。
    在这里插入图片描述

3Linux的进程控制块

struct task_struct{
	volatile long state;//进程状态-1unrunnable,0runnable,>0stopped
	void *stack;//进程内核栈,用户态,系统态
	unsigned int flags;//进程当前的标志状态,不是运行状态,用于内核识别进程当前的状态(当前属性)
	unsigned int ptrace;//提供一种父进程控制子进程运行机制,并可以检查和改变他的核心iamge,它主要用于实现断点调试
	int prio,static_prio,normal_prio;//进程运行的优先级。prio:表示进程动态优先级。static_prio:进程的静态优先级。normal_prio:优先级取取决于静态优先级和调度策略
	unsigned int rt_priority;//实时优先级
	const struct sched_class *sched_class;//调度策略相关
	struct sched_entity se;//普通调度策略相关
	struct sched_rt_entity rt;//实时调度策略相关
	unsigned int polity;//SCHED_OTHER分时调度策略;SCHED_FIFO实时调度策略,先到服务;SCHED_RR实时调度策略,时间片轮转
	struct list_head tasks;//用于构建进程链表
	int exit_code,exit_signal;//用于设置进程的终止代码
	pid_t pid;//进程标识符
	pid_t tgid;//tpid时线程组号
	struct task_struct *real_parent;
	struct task_struct *parent;
	struct list_head children;
	struct list_head sibling;
	struct task_struct *grop_leader;
	cputime_t utime,stime,utimescaled,stimescaled;//utime/stime:使用定时器记录进程在用户态/内核态下所经过的节拍数----utimescaled,stimescaled记录进程在用户态/内核态时间,但它们以处理器的频率为刻度
	cputime_t gtime;
	cputime_t prev_utime,prev_stime;
	unsigned long nvcsw,nivcsw;
	struct timespec start_time;
	struct timespec real_start_time;
	struct mutex_waiter *blocked_on;//死锁检测
	struct reclaim_state *reclaim_state;//内存回收
	struct futex_pi_state *pi_state_cache;//同步机制
} 

4进程控制

进程控制一般有os的内核原语来实现。
操作系统内核
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。
为防止os本身及关键数据遭受其应用程序的破坏,处理机的执行状态分为系统态用户态

  • 系统态(内核态,管态):具有较高的特权,能执行一切命令,访问所有寄存器和存储区
  • 用户态(目态):具有较低特权,只能执行规定的命令,访问指定的寄存器和存储区
    一般情况,应用程序只能在用户态运行,不能去执行os指令及访问os区域

操作系统内核的功能
1.支撑功能

  • 中断处理

    在这里插入图片描述

  • 时钟管理
    在这里插入图片描述

  • 原语(原子语言)操作
    在这里插入图片描述

为什么原语不能并发执行?
原语一旦开始执行,就要连续执行完,不允许中断

2.资源管理功能
(1)进程管理:进程调度与分派,进程创建与撤销,进程同步的原语,进程通信原语等。
(2)存储器管理:用户逻辑地址变换为内存空间的物理地址,内存分配与回收,内存保护和对换功能
(3)设备管理:各类设备的驱动程序,缓存管理,设备分配等。
进程创建
1.进程的层次结构
os,允许一个进程创建另一个进程->父进程与子进程->进程的层次结构
在这里插入图片描述
2.引起进程创建的事件

在这里插入图片描述
3.进程的创建
(1)申请空白PCB。从空白PCB队列中申请一个PCB
(2)为新进程分配资源
(3)初始化PCB
在这里插入图片描述
(4)将新进程插入就绪队列
进程的终止

(1)正常结束
在这里插入图片描述
(2)异常结束

  1. 越界错误
  2. 保护错误(只能读的文件,你偏要写)
  3. 非法指令
  4. 特权指令错
  5. 运行超时
  6. 等待超时
  7. 算术运算错
  8. i/o故障

(3)外界干预:进程应外界的请求而终止运行

  • 操作员或操作系统干预

  • 父进程请求。父进程终止其子孙进程的权力

  • 父进程终止。当父进程终止时,OS也将其他的所有子孙进程终止。

进程终止过程
在这里插入图片描述
进程的阻塞与唤醒
在这里插入图片描述
进程阻塞过程

在这里插入图片描述
进程唤醒过程
在这里插入图片描述
进程的挂起与激活
进程的挂起
原语:suspend()
过程:
在这里插入图片描述
进程的激活
active()
外存的对换区
在这里插入图片描述
Linux系统中的进程间关系
Linux即使分时系统又是实时系统
在这里插入图片描述

5进程同步

原因:进程的异步性
主要任务:程序的执行具有可再现性
进程同步机制:信号量机制,硬件同步机制,管程机制
进程间存在两种制约关系
1.资源共享关系:
在这里插入图片描述
2.相互合作关系
在这里插入图片描述
进程同步的基本概念
临界资源:在某段时间内只允许一个进程使用的资源
硬件资源:打印机,磁带机
软件资源:变量,文件
临界区:每个进程访问临界资源的那段代码
进入区:在临界区前面增加一段代码,用于对临界资源的访问的检查
退出区:临界区后面以增加一段代码,用于将临界区正在访问标志改为未被访问的标志
**访问临界资源的循环进程描述 **

repeat
	进入区
	临界区
	退出区
	剩余区(剩余的其他代码)
until false

多个进程访问临界资源的循环进程
在这里插入图片描述
同步机制遵循的四条准则
1.空闲让进
2.忙则等待
3.有限等待
避免‘死等’
4.让权等待
进程不能进入自己的临界区,应立即释放处理机,以免陷入‘忙等’

软件解决进程互斥问题的4种方案
1.设置访问编号
在这里插入图片描述
违背了
让权等待:no_op
空闲让进:这个程序必须是i先执行j后执行,如果i开始不想访问临界资源,而继续邻接资源,则违背了空闲让进
2.设置访问标志
在这里插入图片描述
违背了
让权等待:no-op
忙则等待:
设置欲访问标志
在这里插入图片描述
违背了
空闲让进
让权等待
有限等待
Peterson算法(编号+欲访问标志)
在这里插入图片描述
违背了:
让权等待
硬件同步机制
1.关中断
2.利用Test-ans-Set指令实现互斥
3.利用Swap指令实现互斥

进程同步机制

信号量机制Semaphores
有Dijkstra提出
信号量经历了从整型信号量,记录型信号量,信号量集
整型信号量
资源数目的整型量
原子操作:wait(s):申请资源P
signal(s):释放资源V
在这里插入图片描述
违背了让权等待
记录型信号量机制
解决了让权等待

typedef struct{
	int value;//当前资源数目
	struct process_control_block *list;//等待资源的进程阻塞链表
}semaphore;

在这里插入图片描述
AND信号量
将进程在整个运行过程中需要的资源一次性全部分配给进程,待进程使用完后一起释放。只要有一个资源未能分配给进程,其它有可能分配给它的资源也不分配给它。这样可以比避免死锁发生。

Swait(semaphore s1,s2,...,sn){
	while(TRUE){
		if(s1.value>=1&&...&&sn.value){
			for(i=1;i<=n;i++){
				si.value--;
			}
			break;
		}else{
			place the process int the waiting queue associated with thr first si found with si<1,and set the program count of this process to the beginning of Swait operation.
		}
	}
}
boolean flag=false;
for(i=1;i<=n;i++){
	if(si.value<1){
		flag=true;
		break;
	}
}
if(flag){ResetPC();block(si.L);}
else{
	for(i=1;i<=n;i++){
		si.value--;
	}
}
Ssignal(semaphore s1,s2,...,sn){
	while(TRUE){
		for(i=1;i<=n;i++){
			si.value++;
			remove all process waiting in the queue associated with si into the ready queue.
		}
	}
}

信号量集
信号量机制:一次需 N 个某类临界资源
在需要 N 个资源时,先看资源数量是否低于 某个下限值 t 。在有些情况下,为确保系统的安全性,当所申请的资源数量低于某一下限值 t 时,还必须进行管制,不予以分配。因此,当进程申请某类临界资源时,在每次分配之前,都必须测试资源的数量,判断是否大于可分配的下限值 t ,决定是否予以分配。
对 AND 信号量机制加以扩充,形成一般化的“信号量集“

semaphore s1,s2,...,sn;//sn系统存在的资源,tn下限值,dn进程需要的资源
Swait(s1,t1,d1,...,sn,tn,dn){
	while(TRUE){
		if(s1.value>=t1&&...&&sn.value>=tn.value){
			for(i=1;i<=n;i++)	si.value-=di;
			break;
		}else{
		place the process int the waiting queue associated with thr first si found with si.value<ti,and set the program count of this process to the beginning of Swait operation.
		}
	}
}
boolean flag=false;
for(i=1;i<=n;i++){
	if(si.value<ti){
		flag=true;
		break;
	}
}
if(flag){ResetPC();block(si.L);}
else{
	for(i=1;i<=n;i++){
		si.value=si.value-di;
	}
}
Ssignal(semaphore s1,s2,...,sn){
	while(TRUE){
		for(i=1;i<=n;i++){
			si.value=si.value+di;
			remove all process waiting in the queue associated with si into the ready queue;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值