使用vim编制一段程序,使用系统调用fork()创建两个子进程,在此程序运行时,系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符a,两个子进程分别显示字符b和子符c。试观察、记录并分析屏幕上进程调度和并发执行的情况。若在程序中使用系统调用nice()来改变各进程的优先级,会出现什么现象?并回答以下问题: 1) 系统调用fork()是怎样创建进程的? 2)当首次调用新创建的子进程时,其入口在哪里? 3)分析进程调度和进程并发执行的关系?
时间: 2024-03-26 07:34:06 浏览: 60
win10 下安装ubuntu子系统 运行多进程/线程 C 语言程序
好的,我会为您解答这些问题。
以下是您需要编写的程序:
```c
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid1, pid2;
pid1 = fork(); // 创建子进程1
if (pid1 < 0)
{
fprintf(stderr, "Fork Failed");
return 1;
}
else if (pid1 == 0)
{
printf("child1: b\n");
}
else
{
pid2 = fork(); // 创建子进程2
if (pid2 < 0)
{
fprintf(stderr, "Fork Failed");
return 1;
}
else if (pid2 == 0)
{
printf("child2: c\n");
}
else
{
printf("parent: a\n");
}
}
return 0;
}
```
在上面的程序中,我们使用了fork()系统调用来创建两个子进程。子进程1会输出字符b,子进程2会输出字符c,父进程会输出字符a。
回答您的问题:
1)系统调用fork()会创建一个新的进程,这个新进程是原进程的一个完全副本。新进程会获得一个新的进程ID(PID),而原进程和新进程都会接着执行fork()调用之后的代码。
2)当首次调用新创建的子进程时,其入口在父进程fork()调用之后的代码处。子进程会从fork()返回0,而父进程会从fork()返回新进程的PID。
3)在程序运行时,系统中会有一个父进程和两个子进程同时活动。由于操作系统的进程调度机制,这些进程之间会并发执行,输出的字符顺序可能是随机的。因此,您需要多次运行程序来观察进程的调度和并发执行情况。
如果在程序中使用系统调用nice()来改变各进程的优先级,会出现如下现象:在执行nice()调用后,操作系统会根据进程的优先级来进行进程调度。优先级越高的进程会更频繁地获得CPU时间片,因此会更快地执行完毕。因此,如果我们将父进程的优先级提高,那么输出字符a的速度会更快,而子进程的输出速度则会变慢。反之,如果将子进程的优先级提高,那么输出字符b和字符c的速度会更快,而父进程的输出速度则会变慢。
阅读全文