修改以上程序,利用信号量实现父子进程对临界资源的互斥访问。运行要求: 父进程进入临界区后显示3次prnt in , 然后显示prnt out出临界区; 子进程进入临界区后显示3次chld in, 然后显示chld out出临界区; 目的:理解进程调度
时间: 2024-11-27 17:22:37 浏览: 25
已知的代码片段是一个基础的父子进程互斥访问临界区的例子,它通过创建一个信号量资源并使用`semop`函数来实现互斥访问。为了满足修改后的运行要求,我们可以稍作调整:
1. 对于父进程部分,我们需要改变睡眠时间和计数器的更新方式,确保显示`prnt in`和`prnt out`各三次:
```c
...
else if (chld == 0) { // 子进程
for (j = 1; j <= 3; j++) {
sleep(1); // 子进程每次间隔1秒
semop(mutexid, &P, 1);
printf("chld in %d\n", j);
sleep(1);
printf("chld out %d\n", j);
semop(mutexid, &V, 1);
}
} else { // 父进程
i = 1;
while (i <= 3) {
sleep(1); // 父进程每次间隔1秒
semop(mutexid, &P, 1);
printf("prnt in %d\n", i++);
sleep(1);
printf("prnt out %d\n", i++);
semop(mutexid, &V, 1);
}
wait(NULL); // 父进程等待所有子进程结束后退出
semctl(mutexid, IPC_RMID, 0); // 删除信号量资源
exit(0);
}
```
2. 运行此程序时,注意观察终端输出,可以看到父进程和每个子进程轮流进入临界区并按照要求输出相应次数的字符串。
通过这个例子,我们可以学习到进程调度的概念,即操作系统如何分配CPU时间片来让各个进程依次执行,以及如何通过信号量这样的同步原语来保证并发环境下的数据一致性。同时,我们也可以看到父进程和子进程之间的协作是如何通过互斥访问实现的。
阅读全文