操作系统实验报告 进程管理.doc_第1页
操作系统实验报告 进程管理.doc_第2页
操作系统实验报告 进程管理.doc_第3页
操作系统实验报告 进程管理.doc_第4页
操作系统实验报告 进程管理.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数学与计算机科学系实验报告课程:计算机操作系统 地点:软件实验室二 时间:2013 年05月17日学生姓名 *班级* 学号*仪器编号组别同组姓名实验项目试验五、进程同步与共享内存管理 指导教师 实验目的1、理解Linux关于共享内存的概念,掌握Linux支持进程间内存共享的系统调用。2、巩固掌握进程同步概念。 实验要求使用共享内存来完成进程间通信。 要求建立一个利用共享内存机制的,关于经典同步问题readers/writers 的解决方案。writer从用户处获得输入,然后将其写入共享内存,reader从共享内存获取信息,然后再在屏幕上打印出来。 实验环境实验内容及实验结果请写出具体的实验步骤,并给出相应的实验结果,附上编写的程序及其运行结果截图!实验步骤:1)关于共享内存的系统调用 程序首先调用shmget()函数建立一块共享内存,大小为1024个字节,该函数返回创建的共享内存的标识符。然后fork一个子进程,子进程调用shmat()函数将该共享内存连接(attach)到自己的虚存空间,即可通过普通的内存写操作(例如strcpy等),在该共享内存写入一个字符串,然后调用shmdt()函数断开(detach)与该共享内存的连接。 在这段时间里,父进程sleep,等待子进程完成上述操作,然后调用shmctl()函数得到关于这块共享内存的相关信息,并打印出来。然后调用shmat()函数将这块共享内存连接(attach)到自己的虚存空间,即可通过普通的内存读操作(例如printf等),将该共享内存中的字符串读出来。最后,调用shmctl()函数,销毁该共享内存。 xin1.c /* xin1.c 一个简单的使用共享内存的例子 */ 2、读者写者问题编写一个利用共享内存来传递信息的程序,一个writer,一个reader,writer从用户处获得输入,然后将其写入共享内存,reader从共享内存获取信息,然后再在屏幕上打印出来。用信号量(semaphore)来解决这个程序对于共享内存进行操作的同步问题,使用两个信号量,一个用于读(SN_READ),一个用于写(SN_WRITE)。SN_READ初始化为0,SN_WRITE初始化为1。即SN_READ这个信号量在最初的时候就是被锁住的,而SN_WRITE这个信号量则不是。writer在往共享内存里写信息时,首先要锁定SN_WRITE信号量。在写完之后,释放SN_READ信号量,使得reader 可以读取该信息;锁定SN_WRITE这个信号量,是为了防止writer多次打印共享内存中的信息。reader读取共享内存的信息时,相应地要先锁定SN_READ这个信号量,读取信息后,释放SN_WRITE这个信号量,使得writer又可以往共享内存里面写入信息。 /* xin2.c 一个利用共享内存进行进程通信的程序 */ 3、改进上面的读者写者程序,使得程序能够支持任意数目的reader和writer。#include #include #include #include #include #include #include #include #include /* The union for semctl may or may not be defined for us.This code,defined in linuxs semctl() manpage,is the proper way to attain it if necessary */ #if defined (_GNU_LIBRARY_)& !defined (_SEM_SEMUN_UNDEFINED) /* union semun is defined by including */ #else /* according to X/OPEN we have to define it ourselves */ union semun int val; /* value for SETVAL */ struct semid_ds *buf; /* buffer for IPC_STAT,IPC_SET */ unsigned short int *array; /* array for GETALL,SETALL */ struct seminfo *_buf; /* buffer for IPC_INFO */ ; #endif #define SHMDATASIZE 1000 #define BUFFERSIZE (SHMDATASIZE - sizeof(int) #define SN_READ 0 #define SN_WRITE 1 #define SN_LOCK 2 int Semid = 0; void reader(int shmid); void writer(int shmid); int masterinit(void); char *standardinit(int shmid,int *semid); void delete(void); void sigdelete(int signum); void locksem(int semid,int semnum); void unlocksem(int semid,int semnum); void waitzero(int semid,int semnum); void write(int shmid,int semid,char *buffer); int mysemget(key_t key,int nsems,int semflg); int mysemctl(int shmid,int semnum,int cmd,union semun arg); int mysemop(int semid,struct sembuf *sops,unsigned nsops); int myshmget(key_t key,int size,int shmflg); void *myshmat(int shmid,const void *shmaddr,int shmflg); int myshmctl(int shmid,int cmd,struct shmid_ds *buf); int main(int argc,char *argv) char selection3; int shmid; /* 没有参数,则为 master */ if(argc 2) shmid = masterinit(); else shmid = atoi(argv1); printf( do you want a writer(1) or reader(2) ?); fgets(selection,sizeof(selection),stdin); switch(selection0) case 1:writer(shmid); break; case 2:reader(shmid);break; default:printf( invalid choice, quit n); return 0; void reader(int shmid) int semid; char *buffer; buffer = standardinit(shmid,&semid); printf(n reader begin to run, and the id of share memory is %d, semaphore id is %d n,shmid,semid); while(1) printf(n wait for writer to input information .); fflush(stdout); locksem(semid,SN_WRITE); printf(finish n); printf( wait for locking semaphore SN_LOCK .); fflush(stdout); locksem(semid,SN_LOCK); printf(finish n); printf(received information: %s n,buffer); unlocksem(semid,SN_LOCK); unlocksem(semid,SN_READ); void writer(int shmid) int semid; char *buffer; buffer = standardinit(shmid,&semid); printf(writer begin to run,the id of share memory is %d, semaphore id is %dn,shmid,semid); while(1) char input3; printf(n menu n 1.send a message n); printf( 2.quit n); printf(input your choice(1-2):); fgets(input,sizeof(input),stdin); switch(input0) case 1:write(shmid,semid,buffer);break; case 2:exit(0);break; char *standardinit(int shmid,int *semid) void *shmdata; char *buffer; shmdata = myshmat(shmid,0,0); *semid = *(int *)shmdata; buffer = shmdata + sizeof(int); return buffer; int masterinit(void) union semun sunion; int semid,shmid; void *shmdata; /* 首先:我们要创建信号量 */ semid = mysemget(IPC_PRIVATE,3,SHM_R|SHM_W); Semid = semid; /* 当进程离开时,删除信号量 */ atexit(&delete); signal(SIGINT,&sigdelete); /* 信号量 SN_READ 初始化为 1(锁定),SN_WRITE 初始化为 0(未锁定)*/ /* 信号量 SN_LOCK 初始化为 1(锁定)*/ sunion.val = 1; mysemctl(semid,SN_READ,SETVAL,sunion); mysemctl(semid,SN_LOCK,SETVAL,sunion); sunion.val = 0; mysemctl(semid,SN_WRITE,SETVAL,sunion); /* 现在创建一块共享内存 */ shmid = myshmget(IPC_PRIVATE,SHMDATASIZE,IPC_CREAT|SHM_R|SHM_W); /* 将该共享内存映射进进程的虚存空间 */ shmdata = myshmat(shmid,0,0); /* 将该共享内存标志为已销毁的,这样在使用完毕后,将被自动销毁*/ myshmctl(shmid,IPC_RMID,NULL); /* 将信号量的标识符写入共享内存,以通知其它的进程 */ *(int *)shmdata = semid; printf(* begin to run, and semaphore id is %d n,shmid); return shmid; void delete(void) printf(n quit; delete the semaphore %d n,Semid); union semun senion; senion.val=0; if(mysemctl(Semid,0,IPC_RMID,senion) = -1) printf(Error releasing semaphore. n); void sigdelete(int signum) /* Calling exit will conveniently trigger the normal delete item. */ exit(0); void locksem(int semid,int semnum) struct sembuf sb; sb.sem_num = semnum; sb.sem_op = -1; sb.sem_flg = SEM_UNDO; mysemop(semid,&sb,1); void unlocksem(int semid,int semnum) struct sembuf sb; sb.sem_num = semnum; sb.sem_op = 1; sb.sem_flg = SEM_UNDO; mysemop(semid,&sb,1); void waitzero(int semid,int semnum) struct sembuf sb; sb.sem_num = semnum; sb.sem_op = 0; sb.sem_flg = 0; /* No modification so no need to undo */ mysemop(semid,&sb,1); void write(int shmid,int semid,char *buffer) printf(n wait for reader to read in information .); fflush(stdout); locksem(semid,SN_READ); printf(finish; wait for locking semaphore SN_LOCK.n); fflush(stdout); locksem(semid,SN_LOCK); printf(please input information:); fgets(buffer,BUFFERSIZE,stdin); unlocksem(semid,SN_LOCK); unlocksem(semid,SN_WRITE); int mysemget(key_t key,int nsems,int semflg) int retval; retval = semget(key,nsems,semflg); if(retval = -1) printf(semget key %d,nsems %d failed: %s ,key,nsems,strerror(errno); exit(255); return retval; int mysemctl(int semid,int semnum,int cmd,union semun arg) int retval; retval = semctl(semid,semnum,cmd,arg); if(retval = -1) printf(semctl semid %d,semnum %d,cmd %d failed: %s,semid,semnum,cmd,strerror(errno); exit(255); return retval; int mysemop(int semid,struct sembuf *sops,unsigned nsops) int retval; retval = semop(semid,sops,nsops); if(retval = -1) printf(semop semid %d (%d

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论