操作系统实验报告_进程与进程通信
- 格式:doc
- 大小:270.00 KB
- 文档页数:10
《计算机操作系统》实验报告(二)
目录
1、实验题目 (3)
2、实验目的 (3)
3、实验环境 (3)
4、实验原理 (3)
5、实验内容 (3)
5.1、fork()函数机理探索...........................................................错误!未定义书签。
5.1.1、原始代码段................................................................错误!未定义书签。
5.1.2、代码段修改一............................................................错误!未定义书签。
5.1.3、结论(1) .......................................................................错误!未定义书签。
5.1.4、fock()函数原理...........................................................错误!未定义书签。
5.1.5、代码段修改二............................................................错误!未定义书签。
5.2、并发执行测猜测................................................................错误!未定义书签。
5.2.1、并发执行改进............................................................错误!未定义书签。
5.2.2、代码段修改(3)......................................................错误!未定义书签。
5.3、小结....................................................................................错误!未定义书签。
1、实验题目
2、实验目的
掌握用邮箱方式进行进程通信的方法,并通过设计实现简单邮箱理解进程通信中的同步问题以及解决该问题的方法。
3、实验环境
Windows XP SP3
4、实验原理
邮箱机制类似于日常使用的信箱。对于用户而言使用起来比较方便,用户只需使用send()向对方邮箱发邮件receive()从自己邮箱取邮件,send()和receive()的内部操作用户无需关心。因为邮箱在内存中实现,其空间有大小限制。其实send()和receive()的内部实现主要还是要解决生产者与消费者问题。
5、实验内容
进程通信的邮箱方式由操作系统提供形如send()和receive()的系统调用来支持,本实验要求学生首先查找资料了解所选用操作系统平台上用于进程通信的系统调用具体形式,然后使用该系统调用编写程序进行进程间的通信,要求程序运行结果可以直观地体现在界面上。在此基础上查找所选用操作系统平台上支持信号量机制的系统调用具体形式,运用生产者与消费者模型设计实现一个简单的信箱,该信箱需要有创建、发信、收信、撤销等函数,至少能够支持两个进程互相交换信息,比较自己实现的信箱与操作系统本身提供的信箱,分析两者之间存在的异同。
5.1、Mutex和Semaphore区别
在windows环境下两者有着类似之处但不完全相同。
Semaphore可以比喻成是一个银行(临界区)有N人的服务窗口(最大允许同步进程数量),如果申请的客户(进程)少于N就可以办理业务,如果客户满了,就要等待某一个客户服务的结束。
Mutex可以比喻成是一个银行只有1各服务窗口,如果客户A正在办理,那么后续客户申请时只能等待,只有当客户A办理结束离开服务窗口时,后续客户依据申请顺序逐一获得被服务的资格。
Mutex在没有被任何线程所拥有时是有信号的,这时任何线程可以使用Wait functions去获取该对象的所有权。当Mutex被某个线程拥有后就处于没信号状态,并且只有当该线程使用ReleaseMutex释放该互斥对象时,它才能被其它线程获得。
在windows环境下一个线程中试图释放另个线程所拥有的Mutex是不会成功的,Mutex只能被所有者线程所释放。
在前面的例子中就是不允许插队。
在前面的例子中就是允许插队,这样会导致超过允许服务的进程上限
5.2、共享内存实现邮箱的数据结构
由于共享内存的方法不直接提供队列功能故采用循环队列思想模拟缓冲区,下面是共享内存的头部,用来存储索引信息
struct
{
DWORD MsgSize; //单个消息大小:字节数
int MsgMaxCount; //消息的总数
int MsgNum; //消息的个数
int ReadIndex; //可读消息索引
int WriteIndex; //可写消息索引
};
5.3、“实时”显示内容的处理与内存泄漏
这个显示消息的函数每隔50ms执行一次,所以实际上是是查询方式来实现实时显示
在此模式下可以发现一些被人遗忘的内存释放,我在实现这个函数时候发现进程占用内存和执行时间成正比,最后才发现内存泄漏的地方,尤其是读取共享内存的指针特别占内存
5.4、相关代码
5.4.1、声明类
1)enum operation {SpaceEnum,SendEnum,ReceiveEnum,MutexEnum};
2)typedef struct _MSGQ_HEADER
3){
4)DWORD MsgSize; //单个消息大小:字节数
5)int MsgMaxCount; //消息的总数
6)int MsgNum; //消息的个数
7)int ReadIndex; //可读消息索引
8)int WriteIndex; //可写消息索引
9)}MSGQ_HEADER, *PMSGQ_HEADER;
10)
11)class CMsgQ:public QDialog
12){
13)public:
14)CMsgQ(){}
15)
16)BOOL Create(LPCTSTR **strname,int nowProcess,int maxProcess,int
*MsgMaxCount,DWORD *MsgSize);
17)