收藏 分享(赏)

实验3 进程的互斥.doc

上传人:精品资料 文档编号:10533372 上传时间:2019-11-26 格式:DOC 页数:7 大小:44KB
下载 相关 举报
实验3  进程的互斥.doc_第1页
第1页 / 共7页
实验3  进程的互斥.doc_第2页
第2页 / 共7页
实验3  进程的互斥.doc_第3页
第3页 / 共7页
实验3  进程的互斥.doc_第4页
第4页 / 共7页
实验3  进程的互斥.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、实验三 进程的同步互斥实验实验目的1、进一步认识并发执行的实质2、分析进程竞争资源的现象,学习解决进程同步互斥的方法 实验内容1、编写程序,使用相关函数实现父子进程对共享文件的同步互斥访问。2、修改程序,观察对临界资源访问的互斥控制的作用。实验基础一、临界资源的互斥访问为了实现多进程对临界资源的互斥访问,一个进程访问临界资源的典型程序段类似如下形式: .进入区 临界区; 退出区其余代码;其中,进入区中判断资源是否可用,如果可用,则资源数量减 1,进程进入临界区;否则进程阻塞等待。退出区中资源数量加 1,唤醒阻塞等待该资源的进程。进入区和退出区都是原子操作。操作系统中,通常用信号量来实现进入区和

2、退出区,即 P 操作和 V 操作。为了实现用户程序中对某些资源的同步互斥访问,操作系统也提供了一些函数接口,功能类似于对特定临界区的进入区和退出区功能。二、相关的系统调用(1)lockf(files,function,size) :用作锁定文件的某些段或者整个文件。函数原型:#include int lockf(int files,int function;long size)其中:files 是文件描述符;参数 function 可以取以下值:F_LOCK:锁定一个区域。F_ULOCK:解除锁定。参数 size 指明了从文件当前位置开始的一段连续锁定区域的长度,当 size 为 0 时,锁定

3、记录将由当前位置一直扩展到文件尾。如果 lockf 的参数 function 取值为 F_LOCK,而指定文件的对应区域已被其他进程锁定,那么 lockf 的调用进程将被阻塞直到该区域解锁。通过使用 lockf 函数,可实现多进程对共享文件进行互斥访问。进程的实现中,必须使得每个进程在使用文件前对文件加锁,使用文件后解锁。(2)open:打开一个文件 函数原型:#include #include #include int open(char *path,int flags,mode_t mode); 其中:参数 path 是指向所要打开的文件的路径名指针。参数 falgs 规定如何打开该文件,

4、它必须包含以下值之一 :O_RDONLY ,只读打开 ;O_WRONLY ,只写打开 ;O_RDWR,读/ 写打开;O_CREAT,当文件不存在时创建文件,需参数 mode;O_APPEND,不论当前文件位置在何处,将文件指针移至文件尾,为 write 添加数据到文件;O_TRUNC,当以可写的方式成功打开普通文件时,截断该文件的长度为 0。参数 mode 规定对该文件的访问权限。open 系统调用可以只使用前面介绍的这两个参数,省略第三个参数 mode。第三个参数是在用 O_CREAT 创建文件时使用,指出新建文件的存取许可权。由这个参数指出的存取许可权还要和 umask 进行运算后才得到新

5、建文件的真正存取许可权。该运算是由 umask按位取反,再按位与上第三个参数给出的数取或(umask系统调用根据 whence 指定的位置将文件描述符 fildes 指向文件的文件指针偏移offset 长度的字节数。Whence 的取值及其含义如下:SEEK_SET:从文件头开始计算偏移量,文件指针值就是 offset 的值。SEEK_CUR:从文件指针的当前位置开始计算偏移量,文件指针值是当前指针的值加上 offset 的值。SEEK_END:从文件末尾开始计算偏移量,文件指针的值是文件长度加上 offset 的值,一般可能使用负的偏移量,使得文件指针从后向前移动。当 lseek 调用成功时

6、,返回值为一个字节为单位从文件头开始计算文件偏移量的值。调用失败时,返回值为-1。文件指针又称文件读/写指针。文件刚打开时,文件指针指向开头位置;文件读写都是从文件指针处开始,并且在读写过程中同时移动文件指针。Lseek 函数就是用于设置文件指针位置。(6)close:关闭文件函数原型:#include int close(int fd); 每打开一个文件,系统就给文件分配一个文件描述符,同时为打开文件描述符的引用计数加。Linux 文件系统最多可以分配 255 个文件描述符。当调用 close()时,打开文件描述符的引用计数值减,最后一次对 close()的调用将使应用计数值为零。 虽然当一

7、个进程结束时,任何打开的文件将自动关闭,明显地关闭任何打开的文件是良好的程序设计习惯。实验指导1、 (1)参照参考程序 1,编写程序。父进程和两个子进程分别连续向共享文件中写入 3 行字符串。多次运行程序,观察共享文件内容。(2)修改程序,去掉所有 lock/unlock 调用。多次运行程序,观察分析共享文件中,3个进程写入字符串的次序,解释原因。2、 (1)参照参考程序 2,编写程序。父进程从外界获取字符串,并将其写入共享文件;子进程从共享文件中获取字符串,并将其打印出来。(2)修改程序,去掉所有 lock/unlock 调用。观察分析运行结果,解释原因。(3)修改程序,不是去掉 lock/

8、unlock 调用,而是去掉子进程中的”sleep(1);” 。观察分析运行结果,解释原因。参考程序参考程序1#include#include#include #include #include int fatal (const char* info)perror (info);exit (1);int lock(int fd)lseek(fd,0,SEEK_SET);if(lockf(fd,F_LOCK,0)=-1)fatal(“lockf()“);return 0;int unlock(int fd)lseek(fd,0,SEEK_SET);if(lockf(fd,F_ULOCK,0)=-

9、1)fatal(“unlockf()“);return 0;int main()int fd; int p1,p2,i;char str20;if(fd=open(“locked_file.txt“,O_RDWR|O_APPEND|O_CREAT,0666)#includeint fatal (const char* info)perror (info);exit (1);int lock(int fd)lseek(fd,0,SEEK_SET);if(lockf(fd,F_LOCK,0)=-1)fatal(“lockf()“);return 0;int unlock(int fd)lseek(

10、fd,0,SEEK_SET);if(lockf(fd,F_ULOCK,0)=-1)fatal(“unlockf()“);return 0;int main( ) int pid,fd; char str80;fd=open(“tmp.txt“,O_RDWR|O_CREAT|O_TRUNC,0644);pid=fork(); switch(pid) case -1: fatal(“fork fail!“);case 0: sleep(1);lock(fd);lseek(fd, SEEK_SET,0);read(fd,str,sizeof(str);unlock(fd);printf(“son %

11、d:read str from tmpfile:%sn“,getpid(),str);exit(0); default: lock(fd);printf(“parent %d :please enter a str for tmpfile(strlen80):n“,getpid();scanf(“%s“,str);lseek(fd, 0, SEEK_SET);write(fd,str,strlen(str);unlock(fd);wait(0);close(fd);exit(0);思考题1、函数 unlock 和 lock 的实现中,lseek 的作用?2、解释参考程序 1,2 中 lock/unlock 的作用?3、参考程序 2,子进程中的”sleep(1);”的作用?

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报