目录
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发送的字符串?如果把其中互斥的代码删除,观察实验结果有何不同?如