一、课程设计目的
本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、课程设计要求
从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:
每位同学从所给题目中任选一个(如自拟题目,需经教师同意),且必须独立完成课程设计,不能相互抄袭。
设计完成后,将所完成的作品交由老师检查。
要求写出一份详细的设计报告。
三、课程设计题目
编程模拟多进程共享临界资源
四、课程设计功能和目标
1、要求产生至少3个进程:
2、两个进程模拟需要进入临界区的用户进程,当需要进入临界区时,显示:进程x请求进入临界区…”,同时向管理进程提出申请;在临界区中等待一段随机时间,并显示:进程x正在临界区linux下的sleep函数…”;当时间结束,显示:进程x退出临界区…”,同时向管理进程提出退出申请。
3、一个进程作为原语级管理进程,接受其他进程的临界区进入请求:如果允许进入,则设置相应变量,然后返回;如果不允许进入,则进入循环等待,直到允许为止;
4、对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。
5、进程间通信可以采用信号、消息传递、管道或网络通信方式。
五、课程设计实现原理
    通过编写,创建两个进程模拟需要进入临界区,另外编写一个进程作为原语的管理进程,
其负责两个进程的进入!接着设置一个临界区,让其进程在其中访问遵循空闲让进、忙则等待、有限等待、让权等待的准则。
当进程和临界区建立好后,临界区的数据传输,受到了系统硬件的支持,不耗费多余的资源;而进程间通信传递,由软件进行控制和实现,需要消耗一定的CPU资源。从这个意义上讲,临界区更适合频繁和大量的数据传输。
进程信息的传递,自身就带有同步的控制。当等到信息的时候,进程进入睡眠状态,不再消耗CPU资源。而共享队列如果不借助其他机制进行同步,接收数据的一方必须进行不断的查询,白白浪费了大量的CPU资源。
六、课程设计思想、方法和技术(含数据结构、算法、流程图)
6.1 设计思想和设计函数功能:
6.1.1 、总体构思:
软件主要是由两部分组成:用户进程和管理进程
管理进程:控制设置相应的临界区,实现对临界区的访问应遵循空闲让进、忙则等待、有限等待、让权等待的准则。
用户进程:循环的随机申请进入临界区,进入临界区执行一段时间,再申请结束。
6.1.2 、具体功能:
用户进程随机的进入cpu执行,先向在信息队列中写入自己的信息(已经约定好的信息类型)然后给管理进程发送信号(告知管理进程申请进入临界区并已在消息队列中写入自己的信息)。
然后循环的读取管理进程给用户进程发回的回馈信息(针对当前临界区的状态)——允许进入、临界区忙等待。如果允许进入则在临界区执行一段时间以后,申请退出,给管理进程发退出的信号,管理进程再给用户进程发送回馈信息。取会指导回馈信息以后则这次过程结束,进入新的过程。 
管理进程接收申请进入的信号,在消息队列中取下申请进入队列的用户进程的信息,针对当前临界区状态,写一个回馈信息放入消息队列。
6.2、包含的数据结构
6.1.1 、临界区:
Struct crform
Int sem; //临界区的信号量值sem 
Int head; //临界区等待队列的头,指向的是最先到的进程
Int tail; //临界区等待队列的尾,指向的是进入等待队列的进程
Int duilie[20]; //存放的是等待的进程的信息,以便唤醒
}cr; 
Cr.sem=1; //初始临界区信号量必须为一,因为只允许一个进程进入临界区
Cr.head=0; //初始时指向等待队列的第一个单元
Cr.tail=0;
6.1.2 、消息队列:
Struct msgform
Long msgtype; //消息的类型,在取消息队列时用于区分哪些是该取的信息
Int mtext; //信息的内容,在这里是申请退出进程的信息
};
6.3、主要用到的技术
6.3.1进程创建和控制:
系统调用:fork()
包含头文件<unistd.h>
关键的语句:
int x,y; 
while((x=fork())==-1);//创建子进程1
if(x==0)
    //子进程1执行程序段
}
else
    while((y=fork())==-1);
    if(y==0) 
    //子进程2执行程序段
else
    //父进程执行程序段
}
软中断:
系统调用kill()和signal()
包含头文件:<sys/types.h>和<signal.h> 
Kill(pid,signalname) 发送信号给pid号为pid的进程,中断类型为signalname
消息队列:
系统调用msgget()、msgsnd()、msgrev()、msgctl()
包含头文件:<sys/msg.h>
6.4、设计流程图
图1 用户进程流程图
图2 管理进程
图3 申请进入临界区处理子进程
图4 申请退出处理子程序
七、运行环境
Linux操作系统
C++编译器
八、开发工具和编程语言
开发工具:C++编译器
编程语言:C语言
九、详细设计
子函数一:
void into()//申请进入临界区
{
  msgqid=msgget(MSGKEY,0777|IPC_CREAT);
  sem--;一旦申请进入临界区,减一
  msgrcv(msgqid,&msg,4,1,0); //接收消息--申请进入进程发送的类型为1
  msg.; //并把接收到的消息内容作为回馈消息的消息类型
  if(sem>=0) //判断此时进程的状态,sem>=0 可以获得临界区
  {
    ==3)
      printf(" p1 IN area\n\n");
    else
      printf(" p2 IN area\n\n");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。