操作系统大作业

同步加密

问题描述

某加密系统中由K个数据发生器、一个长度为L的缓冲器、M个数字接收器、一个字母接收器、一个密钥生成器和一个字符加密器组成。数据发生器负责随机产生一个数字或者一个字母写入缓冲器,当缓冲器满的时候,数据发生器暂停发送数据。当缓冲器中没有数字时,数字接收器阻塞,缓冲区没有字符时,字符接收器阻塞。

数字接收器按顺序轮流从缓冲器中接收一个数字,当所有的数字接收器都接收到一个数字且密钥生成器为空闲时,启动密钥生成器进行密钥计算( 假设算法是将所有数字接收器中的数字求和),同时数字接收器开始重新从缓冲器中接收数字,此时密钥生成器一直阻塞直到该密钥被加密器取走。如果密钥生成器阻塞,数字接收器全部接收到数据后也会阻塞,直到密钥生成器变成空闲。

字母接收器每次缓冲器中接收一个字母,若密钥生成器中有密钥,则加密器取走密钥对字母接收器中的字母进行加密(加密算法为E(密钥,字母)),此时密钥生成器变为空闲状态。若没有密钥,则字母接收器阻塞直到密钥生成器生成密钥。

要求:请编写一个程序能够使发生器线程,数字接收器线程,字母接收器线程,密钥生成器线程和加密器线程按照上面的逻辑正确地执行。要求程序随机产生一些字符,能够通过输出观察到并发执行的过程。并输出每次产生的密钥和加密结果。

验收要点

1)实验结果必须能够验证有密钥但没有字符的情形

2) 实验结果必须能够验证有字符但没有的情形

3)必须用信号量的方法实现上述线程之间的同步和互斥

4)程序运行必须能够正常结束,不能出现死锁或其他异常情况,

5)在极端情况下的死锁可能性需要考虑,如全是数字或者字母的情形,请自己设计方案解决。

6)K、L、M在不为1时程序也能够正确运行

7)加密算法E(密钥,字母)可以简化处理,建议对ASCII码和密钥进行一个简单运算即可。

编程提示:参考吃水果问题的模型,但是略有不同。使用Pthread线程库中的方法,使用Linux下进程同步和互斥方法,建议程序中针对验收要点自行设计一些必要的输出信息,便于观察实验结果。

实验报告撰写要求(格式要求详见大作业模板):

1)实验原理应有你用到的各种函数介绍,可以查网络资料。

2)设计方案中应该系统框架图或者解决该问题的PV模型。

3)实验报告中必须要有对能够验证验收要点各部分的运行结果要截图,通过分析验证程序设计的正确性。

4)调试过程中的逻辑错误或者你从未碰到过的语法错误要注意截图保存,查阅

资料,分析错误原因并给出解决方法,代码前后对比要截图。

同步关系(问题1)

错误总结

缓冲区中只有字符或者数字

信号量没有初始化导致一直阻塞

sem_post 和sem_wait 因为疏忽写错

在一次密钥生成过程中数字接收器多次接收

image-20230510134606351

原因:

1
2
3
4
5
6
if(DigReceiver[0]==-1)//如果第一个数字接收器没有数字的话,使它接收
{
sem_post(&DigReceiverMutex[0]);
printf("%d",cnt2++);
}

代码编写有问题,应该在此修改DigReceiver[0]的值的时候

数字生成器0生成过多

image-20230510191200781


操作系统大作业
http://example.com/2023/05/09/cao-zuo-xi-tong-da-zuo-ye/
作者
CynicCat
发布于
2023年5月9日
许可协议