《操作系统》第二章作业题

《操作系统》第二章作业题

T1

设公共汽车上有一个司机和一个售票员,它们的活动如下图所示。请用信号量机制实现他们的同步。

在这里插入图片描述

  • 定义信号量
int CloseDoor = 1	//初始化门的状态为【关】
int Arrived	  = 0	//初始化到达状态为【未到达】
  • 司机活动
while(true)
{
    wait(CloseDoor);	//等待售票员发出【门已关】的信号,门关了才能启动汽车
    启动汽车;
    正常行车;
    到站停车;
    signal(arrived);	//发出【车辆到站】的信号,售票员依据此信号决定是否开门
}
  • 售票员
while(true)
{
    关车门;
    signal(CloseDoor)	//发送【门已关】的信号,司机依据此信号决定是否启动汽车
    售票;
    wait(Arrived);		//等待司机发出【车辆到站】的信号,到站了才能开车门让乘客下车
    开车门;
}
T2

三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。

P1每次用produce()生成一个正整数并用put()送入缓冲区的某一空单元中;

P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;

P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。

请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。

  • P1
semaphore  mutex=1//缓冲区是互斥共享的,因此定义互斥信号量
semaphore odd=0;			//P1与P2的信号量
semaphore even=0//P1与P3的信号量
semaphore empty=N;	//定义一个同步信号量,因此P1与P2、P3具有同步关系(缓冲区有空位前者才能写;缓冲区未满后两者才能读)
P1(){
	while(true){
		wait(empty);			//等到缓冲区有空位了,才开始产出正整数,要不没地儿放嘛
			num = produce();		//存下新生的正整数儿
		wait(mutex);			//要想放入缓冲区,还得给缓冲区加锁才行,避免出现统计错误
		put();					//将正整数放入缓冲区
        if(num%2 == 0)	
			signal(even);		//产出了偶数,偶数自增1
		else
			signal(odd);		//产出了奇数,奇数自增1
		signal(mutex);			//写入完成后,可以释放锁
	}
}
  • P2
P2(){
	while(true){
		wait(odd);		//缓冲区有奇数才能读
		wait(mutex);	//给缓冲区加锁
            getodd();		//从缓冲区取出奇数
            countodd();		//统计奇数
        //下面的锁释放顺序可对调(因为3个方法在操作缓冲区前,都会检查锁),但为了对称美还是按照下面的写好
		signal(mutex);	//释放锁
		signal(empty);	//腾出一个空位
	}
}
  • P3
//原理同P2,为了代码的简洁性,此处不再注释
P3(){
	while(true){
		wait(even);
		wait(mutex);
            geteven();
            counteven();
		signal(mutex);
		signal(empty);
	}
}
T3

问题描述

哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,准备吃饭。餐桌上有五碗意大利面,每位哲学家之间各有一只筷子。因为用一只筷子很难吃到意大利面,所以假设哲学家必须用两只筷子吃东西。他们只能使用自己左右手边的那两只筷子。

试用写出不会死锁的哲学家进餐问题的算法

  • 错误示例

    当每个哲学家都拿起左侧的筷子,等待右侧的筷子可用时,就会进入死锁状态,每个哲学家将永远都在等待(右边的)另一个哲学家放下筷子。

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量,表示五只筷子的可用状态
Error(){
     while(true){
                wait(mutex[i]);			//判断哲学家左边的筷子是否可用
                wait(mutex[(i+1)%5]);	//判断哲学家右边的筷子是否可用
                //进餐
                signal(mutex[i]);		//释放左筷子,允许别的哲学家使用左边的筷子
                signal(mutex[(i+1)%5]);	//释放右筷子,允许别的哲学家使用右边的筷子
            }
		}
  • 正确方法1(记录型信号量)

    限制至多只允许有四位哲学家同时去拿左边的筷子,我们可以简单的通过增加一个count信号量实现

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量,表示五只筷子的可用状态
right1(){
 while(true){
        wait(count);			//判断是否超过四人准备进餐
        wait(mutex[i]);			//判断哲学家左边的筷子是否可用
        wait(mutex[(i+1)%5]);	//判断哲学家右边的筷子是否可用
        //进餐
        signal(mutex[i]);		//释放左筷子,允许别的哲学家使用左边的筷子
        signal(mutex[(i+1)%5]);	//释放右筷子,允许别的哲学家使用右边的筷子
        }
	}
  • 正确的方法2(AND型信号量)

    也就是使用AND型信号量,同时对哲学家左右两边的筷子同时申请。下面是伪代码:

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量,表示五只筷子的可用状态

right2(){
  while(true){
    wait(mutex[i], mutex[(i+1)%5]);	//判断哲学家左边和右边的筷子是否同时可用
    //进餐		
    signal(mutex[i], mutex[(i+1)%5]);	//进餐完毕,释放哲学家占有的两只筷子
  }
}
  • 正确的方法3

    这种方法原理是限制奇数号哲学家只能先拿左边的筷子;偶数号哲学家只能先拿右边的筷子,这样就一定不会产生死锁了(大家可以画图试试)。

    我画了一个,可以看看。比如哲学家4先选了右边的,哲学家3先选择了左边的,那哲学家3和哲学家4之间的那只筷子,哲学家3和哲学家4总有一个人会拿到吧,那样就会有一个人可以吃意面了。
    ← 1 ∣ 2 → ∣ ← 3 ∣ 4 → ∣ ← 5 ∣ \leftarrow1|2\rightarrow|\leftarrow3|4\rightarrow|\leftarrow5| 1∣23∣45∣

semaphore mutex[5] = {1,1,1,1,1}; 		//初始化信号量,表示五只筷子的可用状态

right3(){
  while(true){
    if(i%2 == 1){
      wait(mutex[i]);			//判断奇数号哲学家左边的筷子是否可用
      wait(mutex[(i+1)%5]);		//判断奇数号哲学家右边的筷子是否可用
    }else{
      wait(mutex[(i+1)%5]);		//判断偶数号哲学家右边的筷子是否可用
      wait(mutex[i]);			//判断偶数号哲学家左边的筷子是否可用
    }
    //进餐		
    signal(mutex[i]);			//释放左筷子,允许别的哲学家使用左边的筷子
    signal(mutex[(i+1)%5]);		//释放右筷子,允许别的哲学家使用右边的筷子
  }
}
T4

问题描述:请用信号量解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。

int countA=0, countB=0;    				// countA、countB 分别表示 A、B 两个方向过桥的行人数量
semaphore bridge=1;         			// 用来实现不同方向行人对桥的互斥共享
semaphore mutexA=1, mutexB=1;  			// 分别用来实现对 countA、countB 的互斥共享

PA(){
    wait(mutexA);   					// 等待获取对 countA 的互斥访问权
    	if(countA == 0) wait(bridge);   // 如果当前没有 A 方向的行人过桥,等待获取对桥的互斥访问权
        countA++;   					// 记录 A 方向过桥的行人数量加一
    signal(mutexA);   					// 释放对 countA 的互斥访问权
    // 过桥;
    wait(mutexA);   					// 等待获取对 countA 的互斥访问权
        countA--;   					// 记录 A 方向过桥的行人数量减一(因为有人过桥了)
        if(countA == 0) signal(bridge); // 如果当前没有 A 方向的行人过桥,释放桥的互斥访问权
    signal(mutexA);   					// 释放对 countA 的互斥访问权
}
T5

试对进程和程序,以及进程和线程进行比较。

  1. 进程和程序:

    • 程序(Program是一组指令的集合,是静态的,通常保存在存储介质中。程序本身是一个静态实体,它只是一个文件,未运行时不占用系统资源,也不执行任何操作。
    • 进程(Process)是程序的一次执行过程,是动态的,具有独立的内存空间和系统资源。进程是操作系统进行资源分配调度的基本单位。
  2. 进程和线程:

    • **进程(Process)**是操作系统中的一个独立的执行单位,拥有独立的内存空间和系统资源,可以进行独立的调度和管理。每个进程都是独立的,彼此之间相互隔离。
    • 线程(Thread)是进程中的一个执行单元,是进程的一个实体。同一个进程中的多个线程共享相同的内存空间和系统资源,它们可以并发执行,共同完成进程的任务。线程之间的通信更加容易,但需要注意同步和互斥问题。
  3. 资源开销:

    • 进程相比线程,资源开销更大。因为每个进程都有独立的内存空间和系统资源,创建和销毁进程需要更多的系统资源和时间。
    • 线程相比进程,资源开销更小。因为线程共享进程的内存空间和系统资源,创建和销毁线程的开销较小。
  4. 通信与同步:

    • 进程之间的通信比较复杂,通常需要借助于操作系统提供的进程间通信(IPC)机制,如管道、消息队列、共享内存等。
    • 线程之间共享同一个进程的地址空间,可以直接访问进程的全局变量和数据,通信更加方便,但需要注意线程安全和同步的问题。建和销毁进程需要更多的系统资源和时间。
    • 线程相比进程,资源开销更小。因为线程共享进程的内存空间和系统资源,创建和销毁线程的开销较小。
  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《操作系统》在线作业.pdf是北京理工大学关于操作系统课程的一份在线作业。根据题目要求,我将简要说明该作业的内容和特点。 该作业主要涵盖了操作系统的基本概念和原理,包括进程管理、内存管理、文件系统、输入输出管理等内容。作业为学生提供了一系列问题和练习,旨在帮助学生巩固对操作系统的理解和应用。 《操作系统》在线作业.pdf的特点如下: 1. 综合性:作业覆盖了操作系统的多个方面,从进程管理到文件系统,涵盖了操作系统的各个模块和组成部分,旨在使学生全面了解操作系统的相关知识。 2. 难度适中:作业的问题和练习难度适中,适合学生在课后进行巩固和复习。同时,作业提供了参考答案和解析,方便学生查阅和学习。 3. 在线形式:作业以PDF格式在线发布,学生可以在电脑或者平板电脑上阅读和完成作业。这种形式灵活方便,学生可以随时随地进行学习和作答。 4. 系统性:作业内容按照操作系统课程的章节顺序编排,有利于学生按部就班地学习和掌握知识,同时也方便教师进行作业的批改和评估。 总而言之,《操作系统》在线作业.pdf是一份涵盖多个方面的综合性作业,通过问题与回答的形式帮助学生巩固和应用操作系统的知识。无论是对于学生来说还是对于教师来说,都是一份有益的学习和教学资源。 ### 回答2: 《操作系统》在线作业.pdf是一份由北理工(北京理工大学)提供的操作系统课程的在线作业文件。这份文件是为了帮助学生深入理解和掌握操作系统的知识而设计的。 从文件名称可以看出,这是一份PDF格式的文件,意味着我们可以通过电子设备方便地阅读和使用它。这对学生而言十分便利,因为他们可以随时随地查看和完成相应的作业。 这份在线作业文件很可能包含操作系统课程的重要概念、理论知识和实践练习等内容。作为操作系统课程的一部分,学生需要深入研究这份作业文件,并完成其中的习题和任务。通过这份作业,学生能够进一步巩固课堂上所学的理论知识并将其应用到实际操作中。这种练习对于学生来说非常重要,因为操作系统作为计算机科学的基础课程,系统地学习和练习操作系统的概念和技术对于他们未来的学习和实践都十分关键。 总而言之,《操作系统》在线作业.pdf是北理工为学生提供的在线作业文件,旨在加深学生对操作系统的理解和掌握。学生们需要仔细阅读并完成其中的习题和任务,以巩固所学知识并提高操作系统应用能力。这份作业文件对于学生来说是一个重要的资源,能够帮助他们更好地学习和应用操作系统知识。 ### 回答3: 《操作系统》在线作业.pdf 是一份由北理工学院提供的操作系统课程的在线作业文档。这份文档主要包含了操作系统相关的一系列习题和问题,供学生进行练习和思考。 该在线作业的目的是帮助学生深入理解操作系统的基本概念、原理和技术,并培养学生的问题解决能力和实践能力。这些习题涉及到进程管理、内存管理、文件管理、设备管理等操作系统的核心知识点和技术。 在这份作业中,学生需要通过阅读题目和给出答案的方式来完成作业。题目类型有选择题、简答题、计算题等,旨在检验学生对操作系统的掌握程度和理解水平。同时,作业中可能也包含一些编程题,需要学生根据要求编写和调试相应的代码。 这份在线作业的好处在于,学生可以根据自己的学习进度和时间安排自由完成作业。同时,作业的难度和题型设置也能够根据不同学生的理解能力和兴趣倾向进行调整。通过这种方式,学生可以更好地发现自己的知识空白、深化对操作系统的理解,并及时纠正和强化自己的学习内容。 综上所述,北理工《操作系统》在线作业.pdf 是一份有助于学生掌握操作系统相关知识和技能的作业文档。学生可以通过完成这份作业,提高对操作系统的理解和应用能力,为今后的学习和工作打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值