3)怎么安装vim编辑器,使用vim编制一段程序,使用系统调用fork()创建两个子进程,在此程序运行时,系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符a,两个子进程分别显示字符b和子符c。试观察、记录并分析屏幕上进程调度和并发执行的情况。若在程序中使用系统调用nice()来改变各进程的优先级,会出现什么现象? 4)提交源程序清单,并附加流程图与注释。 并回答以下问题: 1)系统调用fork()是怎样创建进程的? 2)当首次调用新创建的子进程时,其入口在哪里? 3)分析进程调度和进程并发执行的关系?
时间: 2024-03-02 07:54:30 浏览: 17
好的,我来回答您的问题。
1) 在大多数UNIX系统中,安装vim可以通过以下命令完成:
```
sudo apt-get install vim
```
2) 这是一个使用fork()系统调用创建父进程和两个子进程的程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int pid1, pid2;
pid1 = fork(); // 创建第一个子进程
if (pid1 == 0) { // 第一个子进程
printf("b\n");
exit(0);
} else {
pid2 = fork(); // 创建第二个子进程
if (pid2 == 0) { // 第二个子进程
printf("c\n");
exit(0);
} else { // 父进程
printf("a\n");
wait(NULL);
wait(NULL);
}
}
return 0;
}
```
3) 这个程序创建了一个父进程和两个子进程。由于fork()系统调用会复制父进程的所有内存和资源,因此父进程和子进程都有自己的独立空间。在程序运行时,这三个进程会同时活动。由于系统调度算法的不确定性,进程的调度和并发执行会因计算机系统的状态而异。
如果在程序中使用系统调用nice()来改变各进程的优先级,就会影响进程的调度。较低优先级的进程可能会被较高优先级的进程抢占资源,导致低优先级进程的执行时间变长,或者在高负载环境下可能会被完全忽略。
4) 这里是程序清单、流程图和注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int pid1, pid2;
pid1 = fork(); // 创建第一个子进程
if (pid1 == 0) { // 第一个子进程
printf("b\n"); // 显示字符b
exit(0);
} else {
pid2 = fork(); // 创建第二个子进程
if (pid2 == 0) { // 第二个子进程
printf("c\n"); // 显示字符c
exit(0);
} else { // 父进程
printf("a\n"); // 显示字符a
wait(NULL); // 等待第一个子进程结束
wait(NULL); // 等待第二个子进程结束
}
}
return 0;
}
```
流程图如下:
```
+--------+
| 父进程 |
+--------+
|
|(fork())
|
+--------+ +---------+
| 子进程1 |------>| 显示字符b |
+--------+ +---------+
|
|(fork())
|
+--------+ +---------+
| 子进程2 |------>| 显示字符c |
+--------+ +---------+
```
注释如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int pid1, pid2;
pid1 = fork(); // 创建第一个子进程
if (pid1 == 0) { // 如果是子进程1
printf("b\n"); // 显示字符b
exit(0); // 结束子进程1
} else {
pid2 = fork(); // 创建第二个子进程
if (pid2 == 0) { // 如果是子进程2
printf("c\n"); // 显示字符c
exit(0); // 结束子进程2
} else { // 如果是父进程
printf("a\n"); // 显示字符a
wait(NULL); // 等待第一个子进程结束
wait(NULL); // 等待第二个子进程结束
}
}
return 0;
}
```
1) 使用fork()系统调用创建进程时,操作系统会复制当前进程的所有内存和资源。父进程和子进程都有自己的独立空间和资源,但它们共享相同的代码段。
2) 当首次调用新创建的子进程时,它会从fork()返回的位置开始执行。
3) 进程调度和并发执行是操作系统的基本特性,由于计算机系统的状态不同,系统调度算法的不确定性,进程的调度和并发执行会因计算机系统的状态而异。