操作系统习题三

题目:

1.有8个程序段,他们之间的前驱关系如下,试用信号量实现这些程序段之间的同步

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

2.简述进程同步机制的基本原则。

答:在多道程序环境下,当程序并发执行时,由于资源共享和进程合作,使同处于一个系统中的进程之间可能存在着以下两种形式的制约关系(1)间接相互制约关系,同处于一个系统中的进程,通常都共享着某种资源。(2)直接相互制约关系,这种制约主要源于进程间的合作。所以使用系统中的临界资源时,诸进程应采取互斥方式,实现对资源的共享。为实现进程互斥的进入自己的临界区,可用软件方法,但更多的是在系统中设置专门的同步机制来协调各进程间的运行。
所有的同步机制都应遵循以下四条准则:
(1)空闲让进:因为,当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
(2)忙则等待:因为,当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
(3)有限等待:因为,对要求访问的临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态。
(4)让权等待:因为,当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”状态。

3.如何保证诸进程互斥地访问临界资源?

在这里插入图片描述

4.记录型信号量的实现

答:记录型信号量是不存在“忙等”现象的进程同步机制。除了需要一个用于代表资源数目的整型变量value外,再增加一个进程链表L,用于链接所有等待该资源的进程,记录型信号量是由于釆用了记录型的数据结构得名。记录型信号量可描述为

typedef struct{int value;struct process *L;
} semaphore;

相应的wait(S)和signal(S)的操作如下:

void wait (semaphore S) { //相当于申请资源S.value--;if(S.value<0) {add this process to S.L;block(S.L);}
}

wait操作,S.value–,表示进程请求一个该类资源,当S.value<0时,表示该类资源已分配完毕,因此进程应调用block原语,进行自我阻塞,放弃处理机,并插入到该类资源的等待队列S.L中,可见该机制遵循了“让权等待”的准则。

void signal (semaphore S) {  //相当于释放资源S.value++;if(S.value<=0){remove a process P from S.L;wakeup(P);}
}

signal操作,表示进程释放一个资源,使系统中可供分配的该类资源数增1,故S.value++。若加1后仍是S.value<=0,则表示在S.L中仍有等待该资源的进程被阻塞,故还应调用wakeup 原语,将S.L中的第一个等待进程唤醒。

5.DNA型信号量的实现

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

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

相关文章

[C++11]函数模板的默认模板参数

在C11中添加了对函数模板默认参数的支持。 代码如下: #include<iostream> using namespace std;template<typename T long ,typename U int > void myTest(T t A,U u B) {cout << "t " << t << " u " << u <…

揭秘!微软 Build 2020 开发者大会将启,邀您共赴线上新旅程

微软热爱的开发者&#xff0c;开发者热爱的新技术微软Build 2020开发者大会大幕将启行业技术大拿云集&#xff0c;全新技术重磅发布一场专属技术爱好者间的技术交流盛宴北京时间5月19日-20日&#xff0c;邀您会面&#xff01;大会年年有&#xff0c;今年何不同&#xff1f;本届…

JAVA基础知识+基础代码

Java基础知识 异常处理 try {} catch(Exception e) {} void work() throws Exception {} //抛出异常 throw new Exception("输入的字符不能为空&#xff01;"); class MyException1 extends Exception //自定义异常类 {String msg null;public MyException1(S…

linux查找应用主机,Linux 主机和服务器基本性能检查命令和工具

无论我们选择Linux 主机、服务器用来搭建网站&#xff0c;还是用来软件测试项目&#xff0c;在购买之前肯定要查看适合的性价比、配置&#xff0c;以及商家的口碑等一系列的问题。不过&#xff0c;最为重要的可能是在选择之后要进行服务器的各种性能测试&#xff0c;是否适合项…

[C++11]对模板右尖括号的优化

在泛型编程中&#xff0c;模板实例化有一个非常繁琐的地方&#xff0c;那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符&#xff0c;而不是模板参数表的结束。 C11改进了编译器的解析规则&#xff0c;尽可能地将多个右尖号(>)解析成模板参数结束符&#xff…

一文带解读C# 动态拦截覆盖第三方进程中的函数(外挂必备)

一、前言由于项目需要&#xff0c;最近研究了一下跨进程通讯改写第三方程序中的方法&#xff08;运行中&#xff09;&#xff0c;把自己程序中的目标方法直接覆盖第三方程序中的方法函数&#xff1b;一直没有头绪&#xff0c;通过搜索引擎找了一大堆解决方案&#xff0c;资料甚…

JAVA JFrame编程

JFrame编程 最基础的窗口 public test1() {setTitle("test1");setSize(300,300); //设置窗口大小setLocation(300,300); //设置窗口的位置jp new JPanel();JButton jbnew JButton("button");add(jb); //整个窗口可以增加一个按钮setDefaultCloseOpera…

linux卸载docker redis,【Docker】Redis在docker上的安装、启动、停止、删除操作

查找镜像按名称搜索图像docker search redis按名称搜索并显示非截断描述(--no-trunc)docker search --stars3 --no-trunc redis按名称redis搜索出星数至少为3颗星的镜像docker search --filter stars3 redis显示名称中包含“redis”的图像&#xff0c;并且是自动构建docker sea…

[C++11]override关键字的使用

override关键字确保在派生类中声明的重写函数与基类的虚函数有相同的签名&#xff0c;同时也明确表明将会重写基类的虚函数&#xff0c;这样就可以保证重写的虚函数的正确性&#xff0c;也提高了代码的可读性&#xff0c;和final一样&#xff0c;这个关键字要写到方法的后面。 …

Sql Server之旅——第二站 理解讨厌的表扫描

很久以前我们在写sql的时候&#xff0c;最怕的一件事情就是sql莫名奇妙的超级慢&#xff0c;慢的是几根烟抽完&#xff0c;那个小球还在一直转。。。这个着急也只有当事人才明白&#xff0c;后来听说有个什么“评估执行计划“&#xff0c;后来的后来才明白应该避免表扫描。。。…

JAVA JFrame画图基础和事件监听

JFrame画图基础和事件监听 消息框 JOptionPane.showMessageDialog(mine.this, "删除不成功!");画图 class MyJPanel extends JPanel //继承面板类 {public void paint(Graphics g) //覆盖父类的方法,paint相当于画图{g.drawOval(30, 30, 80, 80); //画圆g.drawLi…

[C++11]final关键字的使用

C中增加了final关键字来限制某个类不能被继承&#xff0c;或者或个虚函数不能被重写&#xff0c;和java的final关键字的功能是类似的。如果使用final修饰函数&#xff0c;只能修饰虚函数&#xff0c;并且要把final关键字放到类或者函数的后面。 1.如果使用final修饰函数&#…

Sql Server之旅——第一站 那些给我们带来福利的系统视图

本来想这个系列写点什么好呢&#xff0c;后来想想大家作为程序员&#xff0c;用的最多的莫过于数据库了&#xff0c;但是事实上很多像我这样工作在一线的码农&#xff0c;对sql 都一知半解&#xff0c;别谈优化和对数据库底层的认识了&#xff0c;我也是这样。。。一&#xff1…

c语言case怎么输入字母,如何使用switch case语句将字母转换为数字

我正在制作黑色插口游戏&#xff0c;并且需要使用switch case语句将A转换为11&#xff0c;将T&#xff0c;Q&#xff0c;J和K转换为10&#xff0c;但是我不确定如何执行代码。有人会帮助我解决这个问题吗&#xff1f;如何使用switch case语句将字母转换为数字到目前为止&#x…

JAVA JDBC连接mysql编程

JDBC连接mysql编程 基本操作 package jdbc;import java.sql.Statement; import java.util.Scanner; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet;public class test {public static void main(String[] args) throws Exception {…

[C++11]继承构造函数

C11中提供的继承构造函数可以让派生类直接使用基类的构造函数&#xff0c;而无需自己再写构造函数&#xff0c;尤其是在基类有很多构造函数的情况下&#xff0c;可以极大地简化派生类构造函数的编写。 先来看没有继承构造函数之前的处理方式: 代码如下: #include <iostrea…

.NET 程序员的 Playground :LINQPad

如果想执行一个简单的 C# 语句并获得运行结果&#xff0c;通常我们需要做几个步骤才能达成&#xff1a;打开 Visual Studio 并新建一个控制台项目。在 Program.cs 中编写代码并保存。点击运行按钮或者 F5 运行程序并查看结果。通常来说这并不会产生问题。但如果你和笔者一样为 …

c语言表达式5 gt 3 gt 1,C语言题目谁会做?

1.为表示关系X>y>z&#xff0c;应使用C语言表达式________2.选择题&#xff1a;C语言中&#xff0c;函数返回值的类型是&#xff1a;_____A。return语句中的表达式的类型。B。主调函数中指定的类型。C。定义函数时所指定的函数类型。D。函数调用时系统随机指定的类型3.1.…

JAVA 点菜系统数据库课程设计

点菜系统数据库课程设计 效果图 数据库建表 CREATE TABLE OrderDish (orderid int not null,money int,primary key(orderid) );CREATE TABLE Dish (id varchar(20) not null,name nchar(10),price int,type nchar(10),primary key(id) ); insert into Dish values(zhushi0,水…

[C++11]委托构造函数

委托构造函数允许使用同一个类中的一个构造函数调用其他的构造函数&#xff0c;从而简化相关变量的初始化。 注意点: 1.这种链式的构造函数调用不能形成一个闭环(死循环)&#xff0c;否则会在运行期抛异常。 2.如果要进行多层构造函数的链式调用&#xff0c;建议将构造函数的…