实验三 进程同步

2020-05-24 09:45

集 美 大 学 诚毅学院信息工程系

实 验 报 告

课程名称 序号名称

计算机操作系统

实验三 进程同步

姓名 专业 成绩

评语: 孙幸杰 计算1191

学号 日期 教师

2011957032

13.11.22 洪联系

200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期

1.实验目的:

掌握用Linux信号灯集机制实现两个进程间的同步问题 2.实验环境

Win7系统虚拟机下运行的Linux系统。 3.实验内容

司机与售票员问题是两个进程的同步问题,司机要启动汽车前,要检查售票员车门是否已经关好;

售票员要打开车门之前要等司机把车停稳. 要求:需要的信号灯: System V信号灯实现

用于控制司机是否可以启动车辆的的信号灯 S1=0 用于控制售票员是否可以开门的信号灯 S2=0 4.实验程序 (有详细注释)

//--------------------------------------------------- //这是一个公共汽车的驾驶员与售票员之间的同步问题 //一个进程模拟驾驶员,一个进程模拟售票员; //驾驶员的动作:启动车辆--驾驶车辆--到站停车 //售票员的动作:关门--售票--开门;

//售票员把车门关好后,驾驶员才能启动汽车;

//当驾驶员在一个站把车子停稳后,售票员方能打开车门; //

//本程序采用System V的信号灯集实现两者的同步 // 2010.10.8

//-----------------------------------------------------

#include #include #include #include #include #include

union semun{

int val;//仅用于SETVAL命令

struct semid_ds *buf;//用于IPC_SET等命令 ushort *array;//用于SETALL等命令 };

//用于信号灯初始化 //semid--信号灯的ID

//val--欲设置的信号灯初值

200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期

//sn--信号灯集的分量

void seminit(int semid,int val,int sn) {

union semun arg; arg.val=val;

semctl(semid,sn,SETVAL,arg); };

//实现信号灯的P操作 //semid--信号灯的ID //sn--信号灯集的分量

void semdown(int semid,int sn) {/* define P operating*/ struct sembuf op; op.sem_num=sn;

op.sem_op=-1;//P操作为-1 op.sem_flg=0;

semop(semid,&op,1); }

//实现信号灯的V操作 //semid--信号灯的ID // sn--信号灯集的分量

void semup(int semid, int sn) {/*define V operating*/ struct sembuf op; op.sem_num=sn;

op.sem_op=1;//V操作为1 op.sem_flg=0;

semop(semid,&op,1); }

main() {

int i,j;

key_t semkey;

char *pathname=\ int semid; int rrand;

srand((int)time(0));//用于产生随机延时 semkey=ftok(pathname,45); if(semkey==-1)

200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期

{

printf(\ exit(-1); }

semid=semget(semkey,2,IPC_CREAT | 0666); if(semid==-1) {

printf(\ exit(-1); }

seminit(semid,0,0);//对信号灯集的0号分量进行初始化 seminit(semid,0,1);//对信号灯集的1号分量进行初始化 if(fork()==0) //Create a process {//子进程作为驾驶员进程 for(i=1;i<10;i++){

semdown(semid,0);//等待售票员关门

printf(\ printf(\

rrand=1+(int)(6.0*rand()/(RAND_MAX+1.0));//产生一个(1-6)的随机数表示车辆的行驶时间 sleep(rrand);

printf(\Arrive at a station. stop!\\n\ semup(semid,1);//唤醒售票员 } } else

{//父进程作为售票员进程 for(j=1;j<10;j++){

printf(\ semup(semid,0);//唤醒司机

printf(\ semdown(semid,1); //等待汽车到站

printf(\ sleep(1); } } }

5. 实验结果及其分析 输入程序:

程序:

200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期


实验三 进程同步.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:招标文件

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: