




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、甘肃政法学院本科生实验报告(五)姓名:xxx学院:信息工程学院专业:计算机科学与技术班级:2013级计算机科学与技术本科班实验课程名称:操作系统 实验日期: 2016年5月20 日开课时间:2015-2016 学年 第二学期甘肃政法学院实验管理中心印制实验题目进程的共享主存通信、进程的信号量通信小组合作否姓名谢慧敏班级2013级计算机科学与技术本科班学 号201381010144一、实验目的1、 了解和熟悉了共享存储机制;2、 加深对进程通信的理解。 3、 熟悉消息通信机制、共享存储器通信机制,进一步认识其与信号量通信的区别。二实验环境Windows 7操作系统Vmware 软件Red hat
2、 linux操作系统三、 实验内容与步骤一、进程的共享主存通信1. 共享主存段使用的数据结构(1)共享主存段控制块(或共享主存段头)每个共享主存段都有一个控制块,用来描述共享主存段的一些属性,共享主存段控制块定义在sys/shm.h中,其结构如下:struct shmid_dsstruct ipc_perm shmperm; / * 共享主存段访问控制结构 * /int shmsegsz; / * 共享段以字节为单位的长度 * /struct ptentry * shmptbl; / * 共享页表始址 * /ushort shmlpid; / * 最近执行共享段操作的进程标识 * /ushor
3、t shmcpid; / * 创建共享段的进程标识 * /ushort shmnattch; / * 当前附件段号 * /ushort shmcnattch; / * 主存中的附加段号 * /time_t shmatime; / * 最近一次附件操作的时间 * /time_t shmdtime; / * 最近一次与进程分离操作的时间 * /time_t shmctime; / * 最近一次修改时间 * /为了便于管理,系统将维持的共享主存段组成一个表,共有SHMMNI=100个元素,其结构如下:struct shmid_ds shmenSHMMNI; / * 共享段表 * /其访问控制结构定义
4、如下:struct ipc_perm key_t key; ushort uid; /* owner euid and egid * / ushort gid; ushort cuid; ushort cgid; ushort mode; /*lower 9 bits of shmflg*/ ushort seq /*sequence number*/;(2)共享主存段的数据结构每个共享主存段都对应一个页表和允许的存取权限,结构如下;struct shmptdsint shmspte; /*开始也表项*/int shmsflg; /*对共享段的读/写权限*/每个进程最多允许6个共享主存段(SH
5、MSEG=6).2. 申请一个共享主存段参与通信的进程,通信前要先申请一个共享主存段,若是第一次申请,则要为其分配一个主存空间及页表,并对共享主存区控制块进行初始化,申请共享主存段调用语法如下:# include<sys/ipc.h># include<sys/shm.h>int shmget(key_t key,size_t size,int shmflg)其中,key为共享主存段的关键字,size是共享主存段字节长度,shmflg为创建和访问标志。返回值:成功时,为与key值相关的共享主存段的标识号,且大小是页对齐;失败时,为-1。如果key的值为IPC_PRIVA
6、TE,或不为IPC_PRIVATE,创建的共享段与key无关,关键字由系统分配。Shmflg由如下成分组成:.IPC_CREAT,创建一个新段。如果该标志没有设置,将查找与key相关的段,且该段允许用户访问。.IPC_EXCL,与IPC_CREAT一起使用,确保创建一个新的共享段。若该段已经存在,出错。低9位为三类用户的访问方式的定义。3. 将共享段附加到申请通信的进程空间对于已申请通信所需的共享段,进程需把它附加到自己的虚拟空间后才能对其进行读写,将共享段附加到申请通信的进程空间的函数调用语法:#include < sys/sem.h >void shmat ( int shmi
7、d,void * shmadd,int shmflg);这里shmid是进程调用shmget后返回的共享段标识号;shmadd是给出的应附加到进程虚空间的地址;shmflg为允许对共享段的访问方式。返回值:成功时为附加到进程地址空间的虚地址,失败时为-1。连接到进程虚空间的地址规则为:.shmadd为0,则将该共享段附加到系统选择的进程的第一个可用地址之后。.shmadd为非0,如果shmflg指定了SHM_RND标志,则将该共享段附加shmadd取整后指定的地址上。.shmadd为非0,如果shmflg未指定SHM_RND标志,则将该共享段附加shmadd指定的地址上。通常将shmadd指定
8、为0,由系统安排连接地址。4.将共享段与进程之间解除链接当进程不再需要共享段时,将其从它的地址空间拆下,调用语法为:#include < sys/sem.h >int shmdt( void * shmaddr );其中,shmaddr是共享段在进程地址空间的虚地址。返回值为0。5.对共享段进行控制#include < sys/sem.h >int shmctl(int shmid,int cmd,struct_ds * buf);返回值:成功时为0,失败时为-1。系统调用shmctl根据控制命令cmd对共享段进行控制。cmd可能的取值有:. IPC_STAT,将有关共
9、享段的信息复制到具有shmid_ds结构的buf中;. IPC_SET,用于用户和用户组,或对其存取权限进行修改,要求用户必须为超级用户或拥有者;. IPC_RMID,用于标志删除共享段。在共享段与所有进行分离时,实际进行删除;. IPC_LOCK,在Linux环境下,将共享段锁在主存中;. IPC_UNLOCK,在Linux环境下,允许将共享段锁换出主存。二、进程的信号量【预备知识】在Linux中,一个或多个信号量构成一个信号量集合。使用信号量机制用来实现进程之间的同步和互斥,允许并发进程一次对一组信号量进行相同或不同的操作。每个P、V操作不限于减1或加1,而是可以加减任何整数。在进程终止时
10、,系统可根据需要自动消除所有被进程操作过的信号量的影响。1.信号量机制中使用的数据结构系统中的每个信号量都有一个数据结构定义在sys/sem.h中。结构定义如下:struct sem ushort semval; /*信号量的当前值*/ short sempid; /* 最近一次对该信号操作的进程标识*/ ushort semncnt; /*等待信号量值增加的进程数*/ ushort semzcnt; /*等待信号量值等于0的进程数*/2.信号量集合的数据结构系统为每个信号集合保持一个头文件定义在sys/sem.h中。结构定义如下:struct semid_dsstruct ipc_perm
11、sem_perm; /*对信号量的访问方式,见消息缓冲*/time_t sem_otime; /*最后操作信号量集合的时间*/time_t sem_ctime; /*最后修改信号量集合的时间*/struct sem *sem_base; /*指向集合中第一个信号量的指针*/ ushort sem_nsems; /*集合中的信号量个数*/ 3.信号量集合的建立任何进程在使用信号量之前,通过使用如下函数申请建立一个信号量集合:# include <sys/types.h># include <sys/ipc.h># include <sys/sem.h>int
12、semget(key_t key,int nsems,int semflg)其中,key为用户进程指定的信号量集合的关键字,nsems为信号量集合中的信号量数,semflg为访问标志。返回值:成功时,返回信号量集合的标识号,失败时,返回-1。semflg 由以下成分组成:·IPC_CREAT,创建一个新的信号量集合。如果该标志没有设置,将查找于key相关的信号量集合。·IPC_EXCL,与IPC_CREAT一起使用,确保创建一个新的信号量集合。若该段已经存在,出错。低9位为三类用户的访问方式的定义。4.对信号量的操作通过调用semop()函数,进程对一信号量集合中的一个或多
13、个信号执行P/V操作,其操作命令由用户提供的信号操作模版(sembuf)定义,该模版的结构如下:Structsembuf ushort sem_num; /*信号量的序号*/ short sem_op /*具体执行的操作(即P或V操作)* / short sem_flg; /*访问标志*/调用语法为:# include <sys/sem.h>int semop(int semid,struct sembuf *sops,unsigned nsops);其中,semid是进程调用semget后返回的信号量集合的标识,sops是用户提供的信号量操作模版数组(sembuf)的指针,nso
14、ps为数组sembuf中的元素数(即一次需进行的操作数)。正常返回值为0。5.对信号量执行控制操作当要读取和修改信号量集合的有关状态信息,或撤销信号量集合时,调用命令semctl()对信号量执行控制操作。其调用语法为:int semctl(int semid,int semnum,int cmd,union semun arg);其中,semid是信号量集合的标识,semnum是要处理信号量集合中的信号量序号,cmd为要执行的操作命令,arg为控制操作需要的参数,是一个指向联合semun的指针。函数semctl成功返回时为0。semun定义为:union semun int val;/ * v
15、alue forSETVAL * / struct semid_ds * buf ; / * buffer for IPC_SET & IPC_STAT */ ushort array ;/ * buffor for IPC_INFO * / arg;cmd的可能取值有:GETPID 返回最近一个队信号量操作的进程标识 GETVAL 返回索引为semnum的信号量的值 GETALL 返回一个集合中所有信号量的值到arg.array中GETNCNT 返回睡眠等待信号量值为正的进程的数GETZCNT 返回睡眠等待信号量值为0的进程数SETVAL 设置索引为semnum的信号量的值为arg.
16、valSETALL 按照数组arg.array,设置一个集合中所有信号量的值IPC_STAT 若为读,可将指定semid的信号量头结构读入arg.buf中获得信号量的值IPC_SET 按照arg.buf设置用户标识、组标识和访问权限。若不是给定的有效用户标识,立即返回IPC_RMID 删除指定标识的信号量集合四、实验过程与分析一、进程的共享主存通信1、编程实现一个是进程向共享段写信息的例子。程序源代码:#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SHMKEY 75
17、#define K 1024int shmid;main() int i,*pint; char *addr; extern char *shmat(); shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT); /*申请创建一个16K大小的共享存储段,其标识号为SHMKEY*/ addr=shmat(shmid,0,0); /*缺省地址将共享段附加到系统指定位置*/ printf(“addr ox%xn”,addr);/*打印附加到进程地址空间的地址*/ pint=(int *) addr; for (i=0;i<256;i+) *pint+=i; /*向共享
18、主存段写入0255个数*/ pint=(int *)addr; *pint=256; /*共享段第一个字中写入信息长度256,以便接收进程读*/ pause(); /*暂停等待接收进程读*/运行结果:2、 编程实现从共享段读信息的例子程序源代码:#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SHMKEY 75#define K 1024int shmid;main() int i,*pint; char *addr; extern char *shmat(); sh
19、mid=shmget(SHMKEY,8*K,0777); /*由SHMKEY得到共享段标识号*/ addr=shmat(shmid,0,0); /*将共享段与本进程相连*/ pint=(int *) addr; while (*pint=0); /*若共享区无信息时,在此等待*/for (i=0;i<256;i+) printf(“%dn”,*pint+);运行结果:二、进程的信号量通信1、编程实现多个进程对同一文件的互斥写入。程序源代码:#include < stdio.h >#include < stdlib.h >#include < unistd.h
20、 >#include < time.h >#include < sys/types.h >#include < sys/wait.h >#include < linux/sem.h >#define NUM_PROCS 5#define SEM_ID 250#define FILE_NAME ”/tmp/sem_MUTEX” /* 互斥共享写入的文件名称 */#define DELAY 400000/各子进程互斥写文件的通用函数void update_file(int sem _set_id,char *file_name_path,int
21、 number) struct sembuf sem_op;FILE *file;/相当于执行P操作,申请写文件sem_op.sem_num=0;sem_op.sem_op=-1;sem_op.sem_flg=0;semop(sem_set_id,&sem_op,1);/向文件写,写入的数据是进程的标识file=fopen(file_name_path,”w”);if(file) fprintf(file,”%dn”,number); printf(“%dn”,number); fclose(file);/相当于执行V操作,释放文件的使用权 sem_op.sem_num=0; sem_
22、op.sem_op=1; sem_op.sem_flg=0; semop(sem_set_id,&sem_op,1);/子进程准备写文件的通用函数void do_child_loop(int sem_set_id,char *file_name) pid_t pid=getpid(); /得到本进程的标识 int i,j; for(i=0;i<3;i+) update_file(sem_set_id,file_name,pid); for(j=0;j<200000;j+); /*暂停一段时间*/ /主函数int main(int argc,char*argv) Int sem_set_id,child_pid;union semun sem_val;int i,rc;/创建一个信号量集合,标识为225,只有一个信号量sem_set_id=semget(SEM_ID,1,IPC_CREAT|0600);if(sem_set_id=-1) perr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年变电运行安规试题及答案
- 农品鲜配站创新创业项目商业计划书
- 网红农业科技与智慧农业推广创新创业项目商业计划书
- 移动营销创新创业项目商业计划书
- 电商会员管理系统SaaS创新创业项目商业计划书
- 2025年事业单位工勤技能-山西-山西收银员五级(初级工)历年参考题库含答案解析(5套)
- 河南省部分重点高中2025届高三下学期第二次联考生物试题(解析版)
- 六年级下册数学试题-小学毕业升学考试挑战奥数题测试卷(二)人教版
- 2025年影像科介入导管室理论知识考核试题及答案
- 2025年车间管理制度试题及答案
- 农业机械化概论概述课件
- 农业机械学课件
- 风电场运维安全培训内容
- 抖音违规考试试卷
- 运维安全生产培训内容记录
- 音乐制作与编曲技术培训
- 2024年创业计划书篮球馆
- 医德医风档案表
- 柱上镀锌预埋钢板施工方案
- 互联网法律法规知识培训课件
- 图书供货项目实施方案
评论
0/150
提交评论