本实验报告详细探讨了在操作系统课程中进行的进程创建实验。通过理论与实践相结合的方式,深入理解进程的概念、特性及其实现机制,并使用具体的编程案例加以说明。
操作系统 进程创建实验报告调用fork()创建子进程的原理如下:
在UNIX系统中,进程既是独立拥有资源的基本单位也是调度的基本单元。每个进程实体由程序区、数据区、栈区及共享存储区等构成,并且这些区域被划分为若干页以方便管理。每一个进程中都配置了一个唯一的进程控制块(PCB),用于管理和控制进程。
1. 进程表项:包括一些最常用的核心信息,如PID和UID;状态描述符;内存地址以及软中断信号、计时域等。
2. U区:保存了与每个进程相关的私有数据。U区内含指针指向用户区域的开始位置,并且包含诸如文件描述符表在内的相关信息。
3. 系统区表项:记录各个段在物理存储器中的地址信息,以便实现内存中不同区域之间的共享和保护机制。
4. 进程区表:为每个进程提供了一张表格用于管理其独立的逻辑分区。这张表格帮助操作系统将虚拟地址空间映射到实际内存位置。
UNIX系统中的一个运行程序被称为“进程映像”,它由三个主要部分组成:
1. 用户级上下文,主要是用户编写的代码。
2. 寄存器上下文,包含CPU状态寄存器的值等信息。
3. 系统级上下文,包括操作系统用于管理此特定进程的数据。
涉及的关键系统调用之一是fork()。它创建一个新的子进程,并将当前正在运行的程序复制到新进程中去执行。其返回情况如下:
- 0:表示函数在子进程中被调用。
- 大于零的整数:代表父进程中,该值等于刚创建出的新子进程ID。
- -1: 表示失败。
当fork()成功时,它会同时向父和新生成的子进程返回不同的结果。操作系统将为这个新的执行环境分配必要的资源,并设置适当的初始状态以确保它可以独立运行。这包括复制当前进程的所有文件描述符、目录项等信息给子进程并增加相应的引用计数。
总体而言,在成功调用fork()之后,父与子两个进程会同时并发地继续各自的程序流程,但它们的执行上下文都是从同一个起点开始的。