试验4进程同步-生产者消费者试验.docx

上传人:罗晋 文档编号:11804615 上传时间:2021-09-15 格式:DOCX 页数:6 大小:72.78KB
返回 下载 相关 举报
试验4进程同步-生产者消费者试验.docx_第1页
第1页 / 共6页
试验4进程同步-生产者消费者试验.docx_第2页
第2页 / 共6页
试验4进程同步-生产者消费者试验.docx_第3页
第3页 / 共6页
试验4进程同步-生产者消费者试验.docx_第4页
第4页 / 共6页
试验4进程同步-生产者消费者试验.docx_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《试验4进程同步-生产者消费者试验.docx》由会员分享,可在线阅读,更多相关《试验4进程同步-生产者消费者试验.docx(6页珍藏版)》请在三一文库上搜索。

1、实验四生产者消费者实验:用信号量实现PV操作实验目的I、熟悉PV操作的实现原理。2、了解进程间通信机制。熟悉信号量机制。使用信号量机制模拟实现PV操作,从而控制 多个 进程对共享资源的使用。实马佥内容1、使用信号量机制来模拟实现PV操作。2、编写个简单的程序,使用该PV模拟操作控制多进程对共享资源的使用。实验基础一、信号量基础1、进程间通信机制进程间通信机制包括共享内存(shared memory)、信号量(semaphores)和消息队列(Message Queue)等-系列进程通信方式。SystemVIPC的进程间通信机制个显著特点是:在内核中它的 具体实例是以对象的形式出现的被称之为IP

2、C对象。每个IPC对象在系统内核中都有一个 惟一的标识符,通过标识符内核可以正确地引用指定的IPC对象。要注意的是,标识符的惟性只在每类的IPC对象内成立。例如,个消息队列和个信号量的标识符可能相同,但是 绝对不允许两个消息队列使用相同的标识符。IPC对象在程序中通过关键字(key)来访问内核中的标识符。与IPC对象标识符相同,关键字也是 惟的。而且,如果要访问同一个IPC对象,客户和服务器就必须使用同一个关键字。因此, 建立IPC对象时要解决的首要的个问题,就是如何构造新的关键字使之不与已有的关键字发 生冲突,并能保证客户和服务器使用相同的关键字。2、信号量信号量是个计数器,用来控制多个进程

3、对共享资源的使用。进程为了获得共享资源,需要 执行下列操作:(1)测试控制该资源的信号量。(2)若此信号量的值为正,则进程可以使用该资源。进程将信号量值减1,表示它使用了 个资 源单位。(3)若此信号量的值为0,则进程进入睡眠状态,直至信号量值大于0。若进程被唤醒后,它返 回至(第步)。O如果有进程正在睡1当进程不再使用由个信息量控制的共享资源时,该信号量值增 眠等待此信号量,则唤醒它们。为了正确地实现信息量,信号量值的测试及减1操作应当是原广操作。为此,信号量通常是在内 核中实现的。常用的信号量形式被称之为双态信号量(bmaryseniaphore)。它控制单个资源,其初 始值为1。但是,般

4、而言,信号量的初值可以是任正值,该值说明有多少个共享资源单位可 供共享应用。二、相关命令(1)ipcs命令在终端上显示系统内核中IPC对象状况.命 令功 能只显示共享内存mipcs -只显示消息队列q - ipcs 只显示信号量sipcs -IPC) ipcrm命令强制系统删除己经存在的对象。(2ipcmimsg | sem | slim 其命令格式为::共:信号量:shm 参数指定要删除的IPC对象类型,其含义是msg:消息队 列:sem是要删除对象的标识符,这个标识符可以用享内存。IPCIDipcs命令去获得。三、相关系统调用(1) ftok函数:生成关键字。include include

5、 key_t ftok(char *pathname, char proj);函数调用成功时返回新的IPC关键字值,失败时则返回-1.常用下面的代码。key_t mykey;mykey=ftok(.,1 a);其中,ftok函数混合当前目录文件?和字符a来产生关键字mykey。只需设:定server和client 从同个目录运行,就可以保证它们产生的关键字是惟的。获得了关键字以后,就可以通过它 来建立或引用具体的工PC对象了。以下信号量相关的操作函数有相同的头文件:Sincldue include include (2) semget函数:建立新的信号量对象或获取已有对象的标识符。 int s

6、emget(key_t key,int nsems, int semflg);参数nsems是信号量对象所特有的,指定了新生成的信号量对象中信号量的数目。如果函数执 行的是打开而不是创建操作,则这个参数被忽略。flag是用户设置的标志,如IPC_CREAT。IPJCREAT表示若系统中尚无指名的共享存储区,则由核心建立个信号量;若系统中已有信号 量,便忽略IPJCREAT。八进制数操作允许权 附:用户可读00400用户可写00200小组可读00040小组可写00020其它可读00004其它可写00002控制命令值IPC.CREAT0001000例:semid=semget (ke)s nsem

7、s, (IPC_CREAT 0400)创建个关键字为 key 的信号量.函数调用成功时返回信号量标识符,失败时则返回-10(3)semop函数:改变信号量对象中各个信号量的状态。它的声明格式为:int semop(int seniid,stnict sembuf *sops,unsigned nsops);参数semid是要操作的信号量对象的标识符,sops是sembuf的数组,它定义/ semop函数将 进行操作的个数。semop数组的长度,即sops保存了 nsops函数要进行的操作序列,。,失败 时则返回-1该函数调用成功时返回Osemop函数用来定义对信号量对象的基本操作。数据结构 s

8、embuf: 被 struct sembuf(/* semaphore index in array */ imsigned short sem_mim;/* semaphore operation */ short sem_op;/* operation flags */short sem_flg:)定义了进行的成员sem_op成员sem_num为接受操作的信号量在信号量数组中的序号。,)sem_flg是控制操作行为的标志。操作(正、负和零是正值,就在指定的信号量中加上相 应的值。这对应着释放信号量所监控如果sem_op的资源操作。是负值,就从指定的信号量中减去相应的值。这对应着获取信号量数

9、值的如果 sem_op标志,那么,当现有的信号量数值小AIT中指定资源操作。如果没有在sem_flgIPC_NOW 函数的进程就会被阻塞直到),调用semop现有资源少于需要的资源时于sem_op的绝对值(信号 量的数值大于sem_op的绝对值有足够资源其实是零值:调用sem_opsemopO函数的进程会被阻塞直到对应的信号量值为如果利用这种操作可以动态监控资源的使用并调整资质是等待信号量所监控的资源全部被使用。源 的分配,避免不必要的等待。(4) semctl函数:直接对信号景对象进行控制。int semctl(mt semid,int senmum.int cmd.union semun

10、arg);seminun:信号量在集合中的序号,二者唯确定一个信号量。:对象的标识符,senud, IPC_RNIIDcmd参数提供了操作所需要的一些信息。参数arg指定了函数进行的具体操作:成员 的值来设定对象内某个信号量val参数中arg.用ALSETV从内存中删除信号量对象; 的值:GETVAL,返回信号量的计数值。实验指导1、使用信号量机制来模拟实现PV操作2、修改实验三中的参考程序,使用该PV模拟操作分别替换其中的加锁解锁操作,控制多进程 对共享资源的互斥访问。参考程序/* sem-pv. h */?includesys/types. hinclude include include

11、 include typedef union semun( int val;struct semid.ds *buf;unsigned short *array;semun;初始化信号量int sem_init(int key)int semid;semun arg;if (semid=semget (key, 1, 0660 IPC.CREAT IPC.EXCL)0) 个信号量的 1 创建包含 信号量 对象perror(sem_init:semget error);exit(l);arg. val=l;if(semctl(semid, 0, SETVAL, arg)0)perror(sem_

12、init:semctl error);exit ;;return semid;信号量的p操作int sem_p(int semid)(struct sembuf pbuf;pbuf. sem_num=0;pbuf. sem_op=-l;pbuf. s em_f1g=SEM.UNDO;if (semop (semid, &pbuf, 1)=-1)perror(sem_p:semop error);exit (3);return 0;信号量的V操作int sem_v(int semid)(struct sembuf vbuf;vbuf. sem_num=0;vbuf. sem_op=l;vbuf.

13、 sem_flg=SEM_UNDO;if (semop (semid, &vbuf, 1)=-1)perror(sem_v:semop error);exit (3);return 0;删除信号量void sem_rmv(int semid)(if(semctl(semid, 0, IPC.RMID)-l)perror(sem-rmv:semct1 error);exit (2);)J* test, c */*/include include include ?include ?include include sem_pv.hint main(void)(key_t key;int pid,

14、fd, semid, n;char str80;key=ftok(,5);semid=sem_init(key);fd=open( est. txt, 0_RDWR O.CREAT O.TRUNC, 0644); while(pid=fork()=-l);if(pid=0)sleep(l);sem_p (semid);lseek(fd, SEEK_SET, 0);read(fd, str, sizeof (str);sem_v (semid);printf(child:read str from test file:%sn, str); exit(0);)elsesem_p (semid);printf(parent:please enter a str for test file(strlen80):n);gets (str);n=strlen(str);lseek(fd, SEEK.SET, 0);write (fd, str, n);sem_v(semid);wait (0);close(fd);sem_rmv(semid);exit(0);思考题1、参考程序中的sem_pO、sem_v()是原子操作吗?这种模拟能达到预期效果吗?它们与实验有 何异同? unlock。与lockQ三中的.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1