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

news2024/12/27 5:36:13

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操作应该放在各自对应的事件发生之后的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024年火爆全网的三款ai智能直播系统,你知道哪一种?

2024年火爆全网的三款ai智能直播系统,你知道哪一种&#xff1f; 如今网络时代&#xff0c;信息运转的速度非常迅猛。 有句话说的好&#xff1a;“若水三千只取一瓢饮&#xff0c;”快速筛选有价值的信息&#xff0c;过滤掉对自己有害的垃圾信息。不要想着把所有钱都赚完&…

基于Spring Boot的家具销售电商平台设计与实现

基于Spring Boot的家具销售电商平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 系统功能界面图&#xff0c;在系统首页可以查看首页…

面试:ThreadLocal

目录 1、ThreadLocal可以实现〔资源对象】的线程隔离&#xff0c;让每个线程各用各的【资源对象】&#xff0c;避免争用引发的线程安全问题 2、ThreadLocal同时实现了线程内的资源共享 3、原理 4、为什么ThreadLocalMap 中的 key (即 ThreadLocal &#xff09;要设计为弱引用…

强力的应用容器引擎---------Docker的资源控制

目录 一、CPU 资源控制 1.1cgroups有四大功能 1.2设置CPU使用率上限 1.2.1查看CPU使用率 1.2.2进行CPU压力测试 1.2.3设置50%的比例分配CPU使用时间上限 1.3设置CPU资源占用比&#xff08;设置多个容器时才有效&#xff09; 1.3.1创建两个容器为hua1 和hua2&#xff0c…

小白学自动化测试​:数据驱动DDT​!

大家好&#xff0c;今天我们开始学习自动化相关的内容&#xff0c;一讲到软件行业的自动化测试一般对于刚入门的同学来讲学习接口测试是一个不错的选择。入门相对容易并且在工作中去实践产生的收益也比较大&#xff0c;所以我们后面会来学习接口自动化测试相关内容。 今天给大…

芒果YOLOv8改进组合161:动态标签分配ATSS+新颖轻量化非对称多级压缩LADH检测头组合改进,LADH作为原创可以发表SCI顶刊论文,小目标高效涨点

💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第四集】芒果YOLOv8改进组合161:动态标签分配ATSS+新颖轻量化非对称多级压缩LADH检测头组合改进,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖轻量化非对称多级压缩LADH检测头组合改进,适用于 YOLOv…

C语言洛谷题目分享(10)最厉害的学生和明明的随机数

目录 1.前言 2.俩则题目 1.最厉害的学生&#xff08;p5740&#xff09; 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 2. 明明的随机数 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 3.小结 1.前言 哈喽大家好啊&#xff0c;今天继续为大…

C/C++程序设计实验报告5 | 结构体和指针实验

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

2. 多机多卡运行nccl-tests对比分析

系列文章 第2章 多机多卡nccl-tests 对比分析 目录 系列文章前言一、本地环境1. 网卡接口2. RDMA3. TOPO信息pcie信息nvidia-smi topo -m 二、nccl-test对比分析1. 相关环境变量2. 不同情况的对比3. 总结与分析 前言 NCCL&#xff08;NVIDIA Collective Communications Libra…

ruoyi-nbcio-plus基于vue3的flowable收回任务后重新进行提交表单的处理

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

CUDA入门系列课程,从最基础着手

CUDA入门系列课程&#xff0c;从最基础着手&#xff0c;突出的就是一个字“细”&#xff01;&#xff01; github项目包含代码、博客、课件pdf下载地址&#xff1a;https://github.com/sangyc10/CUDA-code! 在这里插入图片描述 CUDA编程基础入门系列 https://github.com/sang…

Java冲突

本身 父类 接口(多) 如果出现同样名字的方法,就会出现冲突 * 情况描述1: * 当一个类,继承了父类,实现了某接口,父类中的成员方法和接口中的方法重名 * 解决方法: * 子类就近选择父类成员方法 亲爹优先原则 * *使用格式: * 父类:super.方法名 * 父接口:父接口名.super.方…

指针学习总结

当指针本身定义的类型不同十&#xff0c;指向的一次性取值长度也不同 数组元素的指针 数组存放字符串 数组存放字符串时存放在栈区&#xff0c;sizeof(str1) 128字节 字符指针指向字符串 str2此时存放的是h的地址&#xff0c;因此sizeof(str2) 4字节或者8字节 并且文字常量…

快速回复app是什么样

在电商领域&#xff0c;掌握一些必备的软件工具是提高工作效率、优化运营流程以及提升用户体验的关键。本文将为您介绍做电商必备的几个软件&#xff0c;帮助您更好地开展电商业务。 ​ 快速回复APP&#xff1a;重新定义沟通效率 在快节奏的现代社会中&#xff0c;人们对于沟通…

Python实现“黑猫投诉平台,舆论监控系统”

黑猫投诉平台&#xff0c;舆论监控系统 BuzzMonitor https://github.com/nangongchengfeng/BuzzMonitor.git 简介 "黑猫投诉"舆论监控系统是一款专为快速识别和响应网络投诉而设计的应用&#xff0c;旨在帮助企业或机构第一时间掌握公众意见和反馈。通过实时监控网…

C++:运算符重载和“const”成员

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;运算符重载》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 文章目录 赋值运算符重载1. 运算符重载2.赋值运算符重载第一个点第二个点&…

C++感受5-HelloWorld 函数版

借助 Hello (std::string_view XXX) 函数&#xff0c;快速向你心目中的女神问好。 视频 ffls08-HelloWorld-函数版 函数简述 函数用于封装程序中需要反复执行的事情。事情每一次执行时&#xff0c;所需要的初始数据的变化&#xff0c;由函数参数体现。 定义函数时所写的参数&…

小孩子不懂事,写着玩的

目录 Web攻防 特有漏洞 ASP安全 ASPX&#xff08;.NET&#xff09;安全 PHP安全 JavaWeb安全 JS&#xff0c;Node.js安全 Java安全 Python安全 通用漏洞 SQL注入 MySQL-root高权限读写注入 PostgreSQL-高权限读写注入 MSSQL-sa高权限读写执行注入 SQL注入体系 o…

虹科Pico汽车示波器 | 免拆诊断案例 | 2006 款林肯领航员车发动机怠速抖动

故障现象 一辆2006款林肯领航员车&#xff0c;搭载5.4 L发动机&#xff0c;累计行驶里程约为26万km。该车因发动机怠速抖动故障进厂维修&#xff0c;维修人员更换了火花塞、点火线圈及凸轮轴位置传感器&#xff0c;清洗了积炭和喷油器&#xff0c;故障依旧&#xff0c;于是向笔…

Linux系统硬盘读写慢,如何排查

若服务器硬盘读写慢&#xff0c;导致处理性能降低&#xff0c;用户响应慢&#xff08;例如&#xff1a;ssh登录操作文件&#xff0c;处理很慢说明磁盘很慢&#xff09; 1.查看硬盘是否繁忙 top 若值比较大&#xff0c;说明当前硬盘比较繁忙&#xff0c;有大量读写操作&#x…