linux进程同步互斥实验小结,操作系统进程同步互斥实验

《操作系统进程同步互斥实验》由会员分享,可在线阅读,更多相关《操作系统进程同步互斥实验(7页珍藏版)》请在人人文库网上搜索。

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

2、果可用,则资源数量减 1,进程进入临界区;否 则进程阻塞等待。退出区中资源数量加 1,唤醒阻塞等待该资源的进程。进入区和退出区都 是原子操作。 操作系统中,通常用信号量来实现进入区和退出区,即 P 操作和 V 操作。为了实现用户程序 中对某些资源的同步互斥访问,操作系统也提供了一些函数接口,功能类似于对特定临界区 的进入区和退出区功能。 二、相关的系统调用二、相关的系统调用 (1 1 1 1)lockf(files,function,size)lockf(files,function,size)lockf(files,function,size)lockf(files,function,siz。

3、e) :用作锁定文件的某些段或者整个文件。 函数原型: #include intlockf(int files,intfunction;long size) 其中:files 是文件描述符;参数 function 可以取以下值:F_LOCK:锁定一个区域。 F_ULOCK:解除锁定。参数 size 指明了从文件当前位置开始的一段连续锁定区域的长度, 当 size 为 0 时,锁定记录将由当前位置一直扩展到文件尾。 如果 lockf 的参数 function 取值为 F_LOCK,而指定文件的对应区域已被其他进程锁定, 那么 lockf 的调用进程将被阻塞直到该区域解锁。 通过使用 lockf 。

4、函数,可实现多进程对共享文件进行互斥访问。进程的实现中,必须使 得每个进程在使用文件前对文件加锁,使用文件后解锁。 (2 2)openopen:打开一个文件:打开一个文件 函数原型:#include #include #include intopen(char *path,int flags,mode_t mode); 其中:参数 path 是指向所要打开的文件的路径名指针。 参数 falgs 规定如何打开该文件,它必须包含以下值之一 :O_RDONLY,只读打开; O_WRONLY,只写打开 ;O_RDWR,读/写打开;O_CREAT,当文件不存在时创建文件,需参 数 mode;O_APPE。

5、ND,不论当前文件位置在何处,将文件指针移至文件尾,为 write 添加数据到 文件;O_TRUNC,当以可写的方式成功打开普通文件时,截断该文件的长度为 0。 参数 mode 规定对该文件的访问权限。 open 系统调用可以只使用前面介绍的这两个参数,省略第三个参数 mode。第三个参数 是在用 O_CREAT 创建文件时使用,指出新建文件的存取许可权。由这个参数指出的存取许 可权还要和 umask 进行运算后才得到新建文件的真正存取许可权。 该运算是由 umask 按位取 反, 再按位与上第三个参数给出的数取或(umask 系统调用根据 whence指定的位置将文件描述符 fildes 指。

6、向文件的文件指针偏移 offset 长度的字节数。Whence 的取值及其含义如下: SEEK_SET:从文件头开始计算偏移量,文件指针值就是 offset 的值。 SEEK_CUR:从文件指针的当前位置开始计算偏移量,文件指针值是当前指针的值加 上 offset 的值。 SEEK_END: 从文件末尾开始计算偏移量, 文件指针的值是文件长度加上 offset 的值, 一般可能使用负的偏移量,使得文件指针从后向前移动。 当 lseek 调用成功时,返回值为一个字节为单位从文件头开始计算文件偏移量的值。调 用失败时,返回值为-1。 文件指针又称文件读/写指针。文件刚打开时, 文件指针指向开头位置。

7、;文件读写都是从 文件指针处开始,并且在读写过程中同时移动文件指针。Lseek 函数就是用于设置文件指针 位置。 (6)close(6)close:关闭文件:关闭文件 函数原型:#include int close(int fd); 每打开一个文件,系统就给文件分配一个文件描述符,同时为打开文件描述符的引用计 数加。Linux 文件系统最多可以分配 255 个文件描述符。当调用 close()时,打开文件描述 符的引用计数值减,最后一次对 close()的调用将使应用计数值为零。 虽然当一个进程结束时,任何打开的文件将自动关闭,明显地关闭任何打开的文件是良 好的程序设计习惯。 实验指导实验指导。

8、实验指导实验指导 1、 (1)参照参考程序 1,编写程序。父进程和两个子进程分别连续向共享文件中写入 3 行字 符串。多次运行程序,观察共享文件内容。 (2)修改程序,去掉所有 lock/unlock 调用。多次运行程序,观察分析共享文件中,3 个 进程写入字符串的次序,解释原因。 2、 (1)参照参考程序 2,编写程序。父进程从外界获取字符串,并将其写入共享文件;子进 程从共享文件中获取字符串,并将其打印出来。 (2)修改程序,去掉所有 lock/unlock 调用。观察分析运行结果,解释原因。 (3)修改程序,不是去掉 lock/unlock 调用,而是去掉子进程中的”sleep(1);”。

9、 。观察分 析运行结果,解释原因。 参考程序参考程序参考程序参考程序 参考程序1 #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)=-1) fatal(unlockf(); return 0; in。

10、t main() int fd; int p1,p2,i; char str20; if(fd=open(locked_file.txt,O_RDWR|O_APPEND|O_CREAT,0666)0) fatal(open); write(fd,=n,10); while(p1=fork( )= -1);/*创建子进程p1*/ if (p1=0) lock(fd);/*加锁*/ for(i=0;i3;i+) sprintf(str,daughter %dn,i); write(fd,str,strlen(str); sleep(1); unlock(fd);/*解锁*/ else while(。

11、p2=fork( )=-1);/*创建子进程p2*/ if (p2=0) lock(fd);/*加锁*/ for(i=0;i3;i+) sprintf(str,son %dn,i); write(fd,str,strlen(str); sleep(1); unlock(fd);/*解锁*/ else lock(fd);/*加锁*/ for(i=0;i3;i+) sprintf(str,parent %dn,i); write(fd,str,strlen(str); sleep(1); unlock(fd);/*解锁*/ wait(NULL); wait(NULL); close(fd); 参考。

12、程序2 #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)=-1) fatal(unlockf(); return 0; int main( ) int pid,fd; char str80; fd=。

13、open(tmp.txt,O_RDWR|O_CREAT|O_TRUNC,0644); pid=fork(); switch(pid) case-1: fatal(fork fail!); case0: sleep(1); lock(fd); lseek(fd, SEEK_SET,0); read(fd,str,sizeof(str); unlock(fd); printf(son %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);”的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值