操作系统实验报告(进程间的共享存贮区和信号量通信)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
case -1:
perror("fork()");
exit(0);
case 0:
do_child_loop(sem_set_id,FILE_NAME);
exit(0);
default:break;
}
}
for(i = 0;i<10;i++){
int child_status;
wait(&child_status);
}
printf("main is done");
fflush(stdout);
return 0;
}
运行结果:
二、共享主存段机制
共享主存段为进程提供了直接通过主存进行通信的有效手段,不像消息缓存机制那样需要系统提供缓存,也不像pipe机制那样需要事先建立一个特殊文件,而是有通信双方直接访问某些共享虚拟存储器空间。在系统V中,系统管理一组共享主存段控制块。通信进程在使用共享主存段以前,首先提出申请,系统为止分配存储空间并返回共享主存段标识号。一个共享段建立后,进程把它被附加到自己的虚拟存储空间中。一个进程可以附加多个共享主存段。一个主存段一旦被附加到进程的虚拟机空间后,对它的访问以其他虚拟机的访问完全相同。但为了保证共享主存段数据完整性,通信的进程之间要互斥的进行访问。当通信进程不再需要该共享主存段时,可使用命令将其与进程分离,从而使其进程的虚空间删除。
为了理解进程通过共享主存段的通信过程,下面举例,一个是进程向共享段写信息的例子:一个是进行从共享段读信息的例子。代码如下:
四、实验过程与分析
一、信号量机制
在第一个例子的程序中创建了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并初始化为1
DECLARE_MUTEX_LOCKED(name) : 定义信号量name并初始化为0
还可以用下面的函数初始化:
void init_MUTEX(struct semaphore *sem); //初始化信号量的值为1
void init_MUTEX_LOCKED(struct semaphore *sem); //初始化信号量的值为0 (3)信号量的原子操作:
p操作:
* void down(struct semaphore *sem); //用来获取信号量,如果信号量值大于或等于0,获取
信号量,否则进入睡眠状态,睡眠状态不可唤醒
* void down_interruptible(struct semephore *sem); //用来获取信号量,如果