操作系统实验三

这是一个关于操作系统实验的概述,包括四个部分:通过fork创建进程,火车票同步问题,生产者消费者线程同步,以及进程上下文切换。实验涉及进程间通信,如信号量的使用,以及Pintos操作系统的进程上下文切换流程分析。
摘要由CSDN通过智能技术生成

目录

 

一.实验目的

二.实验题目

1)通过fork的方式,产生4个进程P1,P2,P3,P4,每个进程打印输出自己的名字,例如P1输出“I am the process P1”。要求P1最先执行,P2、P3互斥执行,P4最后执行。通过多次测试验证实现是否正确。

2)火车票

3)一个生产者一个消费者线程同步。

4)进程通信问题

         5)阅读Pintos操作系统,找到并阅读进程上下文切换的代码,说明实现的保存和恢复的上下文内容以及进程切换的工作流程。


一.实验目的

1、系统调用的进一步理解;2、进程上下文切换;3、同步与通信方法。

二.实验题目

1)通过fork的方式,产生4个进程P1,P2,P3,P4,每个进程打印输出自己的名字,例如P1输出“I am the process P1”。要求P1最先执行,P2、P3互斥执行,P4最后执行。通过多次测试验证实现是否正确。

1、进程前驱图

2、程序代码

设置三个信号量,初始值均为0,分别用来记录进程1、2、3是否执行。

起初使用while(P2!= 0)语句判断是否进入子进程,发现程序会顺序执行而非互斥。于是改为if判断。

3、运行结果

运行的整个流程,因为没关闭进程所以P1会一直执行(题目未做要求),但能够按照P1-P3-P2-P4顺序进行。多次试验结果相同。

4、为体现互斥,在进程3中加入sleep()函数,再次运行。

此时P2先于P3。证明互斥。

2)火车票

余票数ticketCount 初始值为1000,有一个售票线程,一个退票线程,各循环执行多次。添加同步机制,使得结果始终正确。要求多次测试添加同步机制前后的实验效果。(说明:为了更容易产生并发错误,可以在适当的位置增加一些pthread_yield(),放弃CPU,并强制线程频繁切换)

1、程序代码

起初将循环写在了sold、cancel内,发现线程顺序执行,并不是预期的同步,于是修改代码将while写入主函数,创建多个线程。

 

问题:在使用pthread_yield()发生编译错误,显示未声明

查询得知要在编译时加上-D_GNU_SOURCE选项

 

2、运行结果

结果正确。初始值与最终值相同。

 

3、为了测试信号量作用,将信号量代码删去再次运行

结果错误。在运行过程中出现读脏数据、不可重复读的现象。例如测试中,卖出时读取的数据并没有更新退还后数据。可见互斥信号量能够保证同步机制。

 

3)一个生产者一个消费者线程同步。

设置一个线程共享的缓冲区, char buf[10]。一个线程不断从键盘输入字符到buf,一个线程不断的把buf的内容输出到显示器。要求输出的和输入的字符和顺序完全一致。(在输出线程中,每次输出睡眠一秒钟,然后以不同的速度输入测试输出是否正确)。要求多次测试添加同步机制前后的实验效果。

 

1、程序代码

经典的生产者消费者问题,非互斥,设置两个信号量。

empty:代表缓冲区空闲数,即空间

full:代表缓冲区填充数,即数据

2、运行结果

慢速输入时如上。

 

快速输入时,仍旧可以按序输出。

 

4)进程通信问题

阅读并运行共享内存、管道、消息队列三种机制的代码

https://www.cnblogs.com/Jimmy1988/p/7706980.html

https://www.cnblogs.com/Jimmy1988/p/7699351.html

https://www.cnblogs.com/Jimmy1988/p/7553069.html  )

a)通过实验测试,验证共享内存的代码中,receiver能否正确读出sender发送的字符串?如果把其中互斥的代码删除,观察实验结果有何不同?如

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值