恶补《操作系统》2_3——王道学习笔记

2024-04-24 23:44

本文主要是介绍恶补《操作系统》2_3——王道学习笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2.3_1 进程同步、进程互斥

1、进程同步

指为了完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调他们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作。

2、进程互斥

把一个时间段内只允许一个进程使用的资源称为临界资源。

对临界资源的互斥访问,可以在逻辑上分为四个部分:

do{entry section;  //进入区  对访问的资源检查或进行上锁critical section; //临界区(段) 访问临界资源的那部分代码exit section;   //退出区  负责解锁remainder section; //剩余区  其它处理} while(true)

需要遵循的原则:

1)空闲让进。 空的可以直接进去

2)忙则等待。 繁忙不能进去

3)有限等待。 不能让进程等待无限长时间

4)让权等待。 不能进去,不要堵着

2.3_2 进程互斥的软件实现方法(重点

1、单标志法

两个进程在访问完临界区后会把使用临界区的权限教给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予

int turn =0;//p0进程while(turn!=0);critical section;turn = 1;remainder section;//p1进程while(turn!=1);critical section;turn = 0;remainder section;

可以实现互斥

存在的问题:p1要访问的话,必须p0先访问,违背:空闲让进原则

2、双标志先检查

算法思想:设置一个bool数组flag[]来标记自己是否想要进入临界区的意愿,先检查后上锁。

bool flag[2]={false,false};//p1进程while(flag[1]);flag[0]=true;critical section;flag[0]=false;remainder section;//p2进程while(flag[0]);flag[0]=true;critical section;flag[1]=false;remainder section;

主要问题:由于进程是并发进行的,可能会违背 忙则等待 的原则;“检查”和“上锁”并不能一气呵成。

3、双标志后检查

算法思想:设置一个bool数组flag[]来标记自己是否想要进入临界区的意愿,不过是先上锁后检查。

bool flag[2]={false,false};//p1进程flag[0]=true;while(flag[1]);critical section;flag[0]=false;remainder section;//p2进程flag[0]=true;while(flag[0]);critical section;flag[1]=false;remainder section;

主要问题:由于进程是并发进行的,可能会两个同时上锁,都进不去,违反 空闲让进 有限等待 原则,从而会饥饿。

4Peterson 算法

主动让对方先使用处理器(孔融让梨)

bool flag[2]={false,false};int turn=0;//p1进程flag[0]=true;turn=1;while(flag[1]&&turn==1);critical section;flag[0]=false;remainder section;//p2进程flag[1]=true;turn=0;while(flag[0]&&turn==0);critical section;flag[1]=false;remainder section;

遵循空闲让进、忙则等待、有限等待三个原则,但是未遵循 让权等待(卡在while循环)的原则。

2.3_3 进程互斥的硬件实现方法

1、中断屏蔽方法

关中断(不允许进程中断)

临界区

开中断

简单、高校

多处理机,可能会同时访问临界资源

使用OS内核进程

2TestAndSetTSL指令)

TSL是用硬件实现的,上锁、检查一气呵成

不满足让权等待,会盲等

C语言描述逻辑:

//true表示已经上锁bool TestAndSet(bool *lock){bool old;old=*lock;*lock=true;return old;}​//以下是使用TSL指令实现互斥的算法逻辑while(TestAndSet (&lock));//上锁并检查临界区代码段lock=false; //解锁​

3Swap指令

别称:Exchange指令、XCHG指令

Swap指令是用硬件实现的

//true表示已经上锁void Swap(bool *a,bool *b){bool temp;temp=*a;*a=*b;*b=temp;}​//以下是使用Swap指令实现互斥的算法逻辑bool old=true;while(old=true)Swap(&lock,&old);临界区代码段lock=false; //解锁//剩余代码段

简单;适用多处理机;不能让权等待

2.3_4 信号量机制

信号量:信号量是一种变量,表示系统中某种资源的数量;

一对原语:waitS)原语和signalS)原语,分别简称PS)、VS),这一对原语可以对信号量进行操作。

1、整形信号量

用一个整数表示系统资源的变量,用来表示系统中某种资源的数量

int S=1;void wait(int S){ //wait原语,相当于:“进入区”(检查和上锁一气呵成)while(S<=0); //如果资源数不够,就意志循环等待S=S-1;    //如果资源数够,则占用一个资源}
void signal(int S){//signal原语,相当于“退出区”S=S+1;    //使用完资源后,在退出区释放资源}

可能会出现盲等

2、记录型信号量(重点

记录型数据结构表示的信号量

//记录型信号量的定义typedef struct{int value;struct process *L;} semaphore;//某进程需要使用资源时,通过wait原语申请void wait (semaphore S){S.value--;if(S.value<0){block (S.L);//将该进程加入到消息队列中}}//进程使用完资源后,通过signal原语释放void signal (semaphore S){S.value++;if(S.valie<=0){wakeup(S.L);}}

除非特别说明,否则默认S为记录型信号量

2.3_5 用信号量机制实现进程互斥、同步、前驱关系(重点

1、实现进程互斥

设置互斥信号量mutex,初值为1mutex表示 “进入临界区的名额”

对不同的临界资源需要设置不同的互斥信号量(只有1个名额)

PV必须成对出现,P申请,V释放

2、实现进程同步

1)保证一前一后的操作顺序

2)设置同步信号量S,初始为0

3)前VP:在前操作之后执行VS);在后操作之后执行PS

3、实现进程的前驱关系(多级同步)

1)要为每一对前驱关系各设置一个同步变量

2)在前操作之后对相应的同步变量执行V操作

3)在后操作之前对相应的同步变量执行P操作

———————————下面介绍几个经典进程同步/互斥问题——————————

2.3_6 生产者-消费者问题(互斥、同步综合问题)

  1. 只有缓冲区没满时,生产者才能把产品放入缓冲区,否则必须等待;
  2. 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待;
  3. 缓冲区是临界资源,各个进程互斥访问;(如果同时访问,可能会产生数据覆盖的问题)
  4. 实现互斥P操作要放在实现同步P操作之后,不能交换顺序,不然会发生死锁;(V操作可以交换)
  5. V操作不会导致进程发生阻塞的状态,所以可以交换;
  6. 相同的操作不要放在临界区,不然并发度会降低;

2.3_7 多生产者-多消费者模型

在生产-消费者问题中,如果缓冲区大小为1,那么有可能不需要设置互斥信号量就可以实现互斥访问缓冲区;分析同步问题是,应该从事件的角度来考虑。

PV操作:

互斥:在临界区前后分别PV

同步:前VP

2.3_8 吸烟者问题

解决可以让生产多个产品的单生产者问题提供一个思路;

若一个生产者要生产多种产品(或者说会引发多种前驱事件),那么各个V操作应该放在各自对应的事件发生之后的位置。

这篇关于恶补《操作系统》2_3——王道学习笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/933161

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件