操作系统实验报告
实验题目 进程同步与信号量的实现
学生姓名
合肥工业大学 计算机与信息学院
1. 实验目的和任务要求
加深对进程同步与互斥概念的理解。
掌握信号量的使用方法,并解决生产者—消费者问题。
掌握信号量的实现原理。
2. 实验原理
进程同步
生产煮和消费者是经典的进程同步问题.在这个问题中、生产者不断向缓冲区写入据.
而消费者则从缓冲区史读取数据。生产者进程和消费者对缓冲区的操作是互斥,即当前只能
有一个进程对这个缓冲区进行操作,生产者进入操作缓冲区之前,先要看缓冲区是否已满,
如果缓冲区已满,则它必须等待消费者进程将数据取出才能写入数据,同样的,消费者进程
从缓冲区读取数据之前,也要判断缓冲区是否为空,如果为空,则必须等待生产者进程写入
数据才能读取数据。
信号量
信号量机制是一种功能极强的机制,可用来解决互斥与同步问题,它只能被两个标准的
原语 wait(S)和 signal(S)访问,也可记为“P 操作”和“V 操作”。
3. 实验内容
3.1 在内核中实现信号量的系统调用
1.修改 unistd.h、system_call.s、sys.h 三个文件
2. 打开学生包文件夹,找到 sem.c 文件,将该文件的代码复制到 semaphore.c 文件中。
3. 生成项目
3.2
在 Linux 应用程序中使用信号量解决生产者—消费者问题
1.将 pc.c 文件复制到软盘 B 中
2.启动调试输入命令 mcopy b:pc.c pc.c、gcc pc.c -o pc
3.执行 pc 命令,查看生产者-消费者同步执行的过程,输入 pc > pc.txt 将输出保存
到文件 pc.txt 中,再使用 vi pc.txt 启动 vi 编辑器查看文本文件 pc.txt 中的文件。
思考问题
1. 生产者和消费者是如何使用 Mutex、Empty 和 Full 信号量实现同步的?在两个进
程中对这三个同步对象的操作能够改变顺序吗?
答:生产者和消费者通过下面的关系来实现同步的。
有产品(缓冲区没空)V 操作——full——P 操作——>消费者消费
生产者生产<——P 操作——empty——V 操作——缓冲区没满
对 empty 和 full 的 P 操作一定要在 mutex 的 P 操作前,比如缓冲区已经放满了,消费
者没有取产品,即 empty 为 0,当下次仍然是生产者进程的时,它先执行 P(mutex),再执行
P(empty)时会被阻塞,希望消费者取出产品后将其唤醒。轮到消费者运行时,它先执行
P(mutex),由于你之前已经进行了这个操作,所以阻塞,那么就永远不能唤醒。因此实现互
斥的操作一定要在实现同步的 P 操作之后。
2. 生产者在生产了 13 号产品后本来要继续生产 14 号产品,可此时生产者为什么必
须等待消费者消耗一个产品后才能生产 14 号产品呢?生产者和消费者是怎样使用信号量
实现该同步过程的呢?
答:因为此时消费者并未取走产品,缓冲区不为空,生产者 P 操作阻塞。生产者与消费
者通过下面的关系实现:有产品(缓冲区没空)V 操作——full——P 操作——>消费者消费
3.3 创建信号量
1. 在文件 semaphore.c 的 sys_sem-open 函数中调用 cli 函数添加一个断点。
2. 启动调试,在终端执行 pc 命令,调试停止在第 117 行,选中第 105 行信号量数组
“sem_array”,点击右键后选择“Add to Watch”,这样在左侧的监视窗口“Watch”中可以
查看相关信息。
3. 在 VSCode 的“View”菜单中选择“Command Palette...”,会 在 VSCode 的顶
部中间位置显示命令面板,输入“Lab: New Visualizer View”命令后,VSCode 会在其右
侧弹出一个窗口让读者查看可视化视图。在右侧可视化视图顶部的编辑框中输入命令“#sem”
后按回车,可以看到已经创建完毕的“empty”信号量
4. 按之前的步骤继续调试“full”和“mutex”信号量,在可视化视图中查看信号量的
创建结果。