




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验题目进程间的共享存贮区和信号量通信小组合作否姓名班级学 号一、实验目的熟悉UNIX中的信号量机制中使用的数据结构。熟悉信号量机制的操作以及控制。了解共享主存段机制。学会对共享主存段的系统调用。二实验环境操作系统Windows XP集装有虚拟机Linux的系统三、实验内容与步骤一、信号量机制在UNIX系统V中,一个或多个信号量构成一个信号量集合。使用信号量机制用来实现进程间的同步和互斥,允许并发进程一次对一组信号量进行相同或不同的操作。每个P,V操作不限于减1或加1,而是可以加减任何整数。在进程终止时,系统可以根据需要自动消除所有被进程操作过的信号量的影响。例子用于互斥共享文件的信号量的使用。代码如下:#include #include #include #include #include #include#include#define NUM_PROCS 5#define SEM_ID 250 #define FILE_NAME tmp/sem_MUTEX#define DELAY 400000void update_file(int sem_set_id, char *file_name_path, int number) struct sembuf sem_op; FILE *file; 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); fclose(file); sem_op.sem_num =0; sem_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;i3;i+) update_file(sem_set_id, file_name,pid); for(j=0;j200000;j+); int main(int argc, char *argv) int sem_set_id,child_pid; union semun sem_val; int i,rc; sem_set_id = semget(SEM_ID, 1,IPC_CREAT |0600); if(sem_set_id =-1) perror(mains semget error); exit(1); sem_val.val =1; rc =semctl(sem_set_id,0,SETVAL,sem_val); if(rc =-1) perror(main:setctl); exit(1); for(i =0;iNUM_PROCS; i+) child_pid = fork(); switch(child_pid) case -1: perror(fork(); exit(0); case 0: do_child_loop(sem_set_id,FILE_NAME); exit(0); default:break; for(i = 0;i10;i+) int child_status; wait(&child_status); printf(main is done);fflush(stdout);return 0;运行结果:二、共享主存段机制共享主存段为进程提供了直接通过主存进行通信的有效手段,不像消息缓存机制那样需要系统提供缓存,也不像pipe机制那样需要事先建立一个特殊文件,而是有通信双方直接访问某些共享虚拟存储器空间。在系统V中,系统管理一组共享主存段控制块。通信进程在使用共享主存段以前,首先提出申请,系统为止分配存储空间并返回共享主存段标识号。一个共享段建立后,进程把它被附加到自己的虚拟存储空间中。一个进程可以附加多个共享主存段。一个主存段一旦被附加到进程的虚拟机空间后,对它的访问以其他虚拟机的访问完全相同。但为了保证共享主存段数据完整性,通信的进程之间要互斥的进行访问。当通信进程不再需要该共享主存段时,可使用命令将其与进程分离,从而使其进程的虚空间删除。为了理解进程通过共享主存段的通信过程,下面举例,一个是进程向共享段写信息的例子:一个是进行从共享段读信息的例子。代码如下:进程向共享段些信息的例子;#include#include#include#include#define SHMKEY 75#define K 1024int shmid;main() int i,*pint; char *addr; extern char *shmat(); shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT); addr=shmat(shmid,0,0); printf(addr ox%xn,addr); pint=(int *)addr; for(i=0;i256;i+) *pint+=i; pint=(int *)addr; *pint=256; pause();进程从共享段读信息的例子#include#include#include#define SHMKEY 75#define K 1024int shmid;main() int i,*pint; char *addr; extern char *shmat(); shmid=shmget(SHMKEY,8*K,0777); addr=shmat(shmid,0,0); pint=(int *)addr; while(*pint=0); for(i=0;i256;i+)printf(%dn,*pint+);运行结果:四、实验过程与分析一、信号量机制 在第一个例子的程序中创建了5个并发子进程,互斥地对文件进行写操作,将自己的进程号写到文件中去,信号量的初值为1,当地一个进程执行update_file函数时首先将信号量值-1,(相当于P操作)致使其它进程等待无法操作文件,直到其结束后,将其值变为1后(相当于V操作),其它进程并发竞争对文件的写操作,并将自己的pid写入文件中。在linux中信号量机制的执行既步骤如下所示:(1)信号量的定义:struct semaphore spinlock_t lock;unsigned int count;struct list_head wait_list;在linux中,信号量用上述结构体表示,我们可以通过该结构体定义一个信号量。(2)信号量的初始化:可用void sema_init(struct semaphore *sem, int val);直接创建,其中val为信号量初值。也可以用两个宏来定义和初始化信号量的值为1或0:DECLARE_MUTEX(name) : 定义信号量name并初始化为1DECLARE_MUTEX_LOCKED(name) : 定义信号量name并初始化为0还可以用下面的函数初始化:void init_MUTEX(struct semaphore *sem); /初始化信号量的值为1void init_MUTEX_LOCKED(struct semaphore *sem); /初始化信号量的值为0(3)信号量的原子操作:p操作:* void down(struct semaphore *sem); /用来获取信号量,如果信号量值大于或等于0,获取信号量,否则进入睡眠状态,睡眠状态不可唤醒* void down_interruptible(struct semephore *sem); /用来获取信号量,如果信号量大于或等于0,获取信号量,否则进入睡眠状态,等待信号量被释放后,激活该程。* void down_trylock(struct semaphore *sem); /试图获取信号量,如果信号量已被其他进程获取,则立刻返回非零值,调用者不会睡眠v操作:* void up(struct semaphore *sem); /释放信号量,并唤醒等待该资源进程队列的第一个进程二、共享主存段机制在第二个例子中,首先进程向共享段写信息。该进程创建了长度为K的共享主存段,并将共享段附加到了地址空间为Addr的地址上。然后从共享段的起始单元开始写入0255个自然数。等待接收进程读。然后进程从共享段读信息的例子,该进程首先将进程写信息共享段的共享段连接到自己的地址空间,之后,判断共享段是否有信息,若无,则等待,否则,读信息并显示。write进程创建了长度16k的共享主存段,并将共享段附加到了地址空间为addr的地址上,也显示了addr的值,然后从共享段的起始单元开始写入0-255个自然数,然后将首地址赋值为256,故读进程read运行后,第一个数显示256,后面是1-255。这个程序最好在root下运行,在一般用户下运行不出结果。五、实验总结共享存储区(Share Memory)是UNIX系统中通信速度最高的一种通信机制。该机制可使若干进程共享主存中的某一个区域,且使该区域出现(映射)在多个进程的虚地址空间中。另一方面,一个进程的虚地址空间中又可连接多个共享存储区,每个共享存储区都有自己的名字。当进程间欲利用共享存储区进行通信时,必须先在主存中建立一共享存储区,然后将它附接到自己的虚地址空间上。此后,进程对该区的访问操作,与对其虚地址空间的其它部分的操作完全相同。共享主存段在系统调用时,首先得申请一个共享主存段之后才能对共享存储进行操作。应当指出,共享存储区机制只为进程提供了用于实现通信的共享存储区和对共享存储区进行操作的手段,然而并未提供对该区进行互斥访问及进程同步的措施。因而当用户需要使用该机制时,必须自己设置同步和互斥措施才能保证实现正确的通信。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省海阳市美宝学校八年级环境教育说课稿:人类让地球变得伤痕累累
- 11.2.1 三角形的内角(第2课时)说课稿 2023-2024学年人教版数学八年级上册
- 古代学士考试题目及答案
- 古代官员考试题目及答案
- 公墓管理岗考试题及答案
- 高级法制员考试题及答案
- 职教课堂互动性提升策略及其数智化实现路径
- 复合肥考试题及答案
- 网络安全人才培养的实战演练与实践基地建设
- 中医基础章节试题及答案
- 2025年煤矿企业主要负责人安全生产理论考试笔试试题含答案
- 苗族舞蹈课件
- 监狱公选面试题库及答案
- 具有法律效应的还款协议书6篇
- 2025年中国铁建集团招聘面试模拟题及答案详解
- T-AOPA0062-2024电动航空器电推进系统动力电机控制器技术规范
- 2025特种设备(电梯)安全管理人员A证考试试卷(200道)及答案
- 2024年一级建造师《民航机场工程管理与实务》真题及答案
- 2025年全国企业员工全面质量管理知识竞赛题及参考答案
- 2025年广东省中考英语试卷深度评析及2026年备考策略
- (2025年标准)买月饼协议书
评论
0/150
提交评论