操作系统程序设计

<p><span style="font-family: Arial, Helvetica, sans-serif;">实验题目:
基于缓冲技术的消息通信发送/接收命令的模拟实现
实验要求:
功能要求
(1)动态显示缓冲池的变化过程;
(2)动态显示消息链缓冲区的变化过程;
(3)用信号量与P/V操作实现发送进程p_send与接收进程p_receive对缓冲池与消息链缓冲区的互斥与同步。
所需数据结构:
基于缓冲技术的消息通信发送/接收部分的数据结构:
struct MyMsg{// 消息缓冲结点
   long long mtype;
   Byte mtext[M];
};
struct MyMsgBuf{//链式缓冲区结点
   MyMsg mymsg;
   int userid;
   MyMsgBuf *next;//指向下一个缓冲区结点
   MyMsgBuf *next_free;//指向下一个空闲的缓冲区结点
};
pthread_mutex_t mutex;///用于对缓冲区链操作的互斥信号量,初始为1
pthread_mutex_t mutex1;//用于对消息队列操作的互斥信号量,初始为1
pthread_mutex_t filemutex;// 用于对文件操作的互斥信号量,初始为1
sem_t empty, full;///用于描述空闲缓冲区的数目,初始分别为N,0
sem_t msgtype[4];// 用于描述每种不同类型的消息的同步信号量,初始为0
动态展示界面部分的数据结构
vector<string>  send;
vector<pair<string, string> > receive;
这里的send存储的是发送进程的id
vector receive则存储的是一个string对,其实也相当于一个map,只不过在实验的时候是允许发送进程发送多条不同类型的(实验的时候是1,2,3三种)消息,接收进程按照类型接收消息,用以显示并发执行的效果,因此这里没有采用map而是采用vector<pair<string, string> >其中pair中的第一个string表示的是接收进程的id,第二个string表示的接收进程接收的消息。在这里实际就是所接收消息的发送进程的id。
算法设计:
基于缓冲技术的消息通信的实现部分
1.首先用init()函数,对所有的消息缓冲区进行初始化,以及用于控制进程同步的同步信号量和互斥信号量进行初始化,然后创建一个基于内核的消息队列,并设置消息队列的权限为可读可写,5个发送消息的进程,5个接受消息的进程,发送进程在发送消息时,首先需要申请缓冲区来将要发送的消息写入缓冲区,挂到消息队列的末端。接受进程在接受消息时,也是先申请一个消息缓冲区,通过消息队列将要接收的消息写入消息缓冲区中,至于进程同步机制这一块,设置了用于对消息链缓冲区操作的互斥信号量mutex,还有用于对消息队列操作的互斥信号量mutex1,以及缓冲区的数目同步信号量empty, full。因为有多个可用的缓冲区,但如果在申请或者释放中间被打断的话,就会出现问题,mutex是用来保护申请释放操作的互斥信号量
动态展示部分
主要就是设置时间戳,设置的是每隔100ms就进行一次刷新,刷新的同时读取一行文件中的数据,如果读到发送消息进程的信息,就从标示为队列的上方,在队列的后面下落一个包含有进程id的蓝色矩形,如果读到接受进程的信息,就从下方上升一个包含有该进程id的黄色矩形,在其要接受的信息的那个位置下落,最后会将队列上这个消息取下,同时该位置后面的消息往前移动(如果有的话)。下方为空闲缓冲区的使用情况。绿色为空闲,蓝色为正被发送进程使用,黄色为正被接受进程使用。
流程图:
主程序流程:
 
   p_send进程                p_receive进程   
 
测试结果:
文本输出:sunshine945@node2:~/os$ ./mytest.out
cur_bytes 0
number_of_que_messages 0
process 3664 send a message!
process 3664 send a message!
cur_bytes 256
number_of_que_messages 2
process 3664 send a message!
cur_bytes 384
number_of_que_messages 3
process 3667 send a message!
process 3667 send a message!
process 3665 receive a meessage from 3664
cur_bytes 512
number_of_que_messages 4
process 3667 send a message!
cur_bytes 640
number_of_que_messages 5
process 3665 receive a meessage from 3664
process 3669 send a message!
cur_bytes 640
number_of_que_messages 5
process 3668 receive a meessage from 3667
process 3669 send a message!
cur_bytes 640
number_of_que_messages 5
process 3665 receive a meessage from 3664
process 3669 send a message!
process 3668 receive a meessage from 3667
process 3672 send a message!
cur_bytes 640
number_of_que_messages 5
process 3671 receive a meessage from 3669
process 3672 send a message!
cur_bytes 640
number_of_que_messages 5
process 3668 receivea meessage from 3667//下面的截图显示的执行步骤就是到这一步
process 3672 send a message!
process 3671 receive a meessage from 3669
process 3675 send a message!
process 3673 receive a meessage from 3672
cur_bytes 512
number_of_que_messages 4
process 3675 send a message!
cur_bytes 640
number_of_que_messages 5
process 3671 receive a meessage from 3669
process 3675 send a message!
process 3673 receive a meessage from 3672
process 3676 receive a meessage from 3675
process 3673 receive a meessage from 3672
process 3676 receive a meessage from 3675
process 3676 receive a meessage from 3675
动态界面的截图:
 
动态界面的说明,下方的区域表示缓冲区,其中绿色表示可用部分,蓝色表示被
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值