3)安装vim编辑器,使用vim编制一段程序,使用系统调用fork()创建两个子进程,在此程序运行时,系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符a,两个子进程分别显示字符b和子符c。试观察、记录并分析屏幕上进程调度和并发执行的情况。若在程序中使用系统调用nice()来改变各进程的优先级,会出现什么现象? 4)提交源程序清单,并附加流程图与注释。 并回答以下问题: 1)系统调用fork()是怎样创建进程的? 2)当首次调用新创建的子进程时,其入口在哪里? 3)分析进程调度和进程并发执行的关系?
时间: 2024-03-23 18:39:23 浏览: 71
OperatingSystemExperiments:2020-2021第二学期操作系统实验
好的,我了解了你的问题。我会根据你的要求回答你的问题。
首先,我需要确认一下你的操作系统是什么,以便我更好地回答你的问题。
如果你的操作系统是Linux,那么可以按照以下步骤来完成第3个问题:
1. 安装vim编辑器:在终端中输入命令 sudo apt-get install vim 进行安装。
2. 使用vim编写程序:在终端中输入命令 vim test.c 创建一个名为test.c的文件,并输入以下程序代码:
```
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid1, pid2;
pid1 = fork();
if(pid1 < 0){
printf("fork error!\n");
return 1;
}else if(pid1 == 0){
printf("b\n");
}else{
pid2 = fork();
if(pid2 < 0){
printf("fork error!\n");
return 1;
}else if(pid2 == 0){
printf("c\n");
}else{
printf("a\n");
}
}
return 0;
}
```
3. 编译运行程序:在终端中输入命令 gcc test.c -o test 编译程序,然后输入命令 ./test 运行程序。
4. 观察、记录并分析屏幕上进程调度和并发执行的情况:你会看到屏幕上输出了字符a、b、c,它们的顺序可能不同,这是因为进程的调度是由操作系统自动完成的。父进程和两个子进程是并发执行的,每个进程都在屏幕上输出一个字符。
5. 使用系统调用nice()来改变各进程的优先级:在程序中加入以下代码:
```
if(pid1 == 0){
nice(10);
printf("b\n");
}else if(pid2 == 0){
nice(20);
printf("c\n");
}else{
printf("a\n");
}
```
这段代码将子进程的优先级分别设置为10和20。运行程序后,你会发现字符c的输出可能会比字符b的输出少,这是因为操作系统根据进程的优先级来进行调度。
回答你的问题:
1. 系统调用fork()是通过复制父进程来创建一个新的子进程的。在创建子进程时,操作系统会为子进程分配新的进程ID,并将父进程的内存空间复制到子进程中,包括代码、数据和堆栈等。
2. 当首次调用新创建的子进程时,其入口是从main函数的返回值开始执行的。
3. 进程调度是操作系统决定的,它会根据各个进程的优先级和状态来进行调度,从而实现进程的并发执行。进程并发执行是指多个进程在同一段时间内执行,它们之间不存在先后顺序,操作系统会根据进程的状态和优先级来进行调度。
阅读全文