fork执行时对pcb做了哪些操作
时间: 2023-11-23 19:02:45 浏览: 39
在操作系统中,fork()函数用于创建一个新的进程,并且在执行fork()函数时,对进程控制块(PCB)会做以下操作:
1. 复制父进程的PCB:在执行fork()函数时,操作系统会复制父进程的PCB,包括进程的状态、程序计数器、内存分配、文件描述符等信息,这样就创建了一个新的子进程,子进程和父进程共享一些属性,但是它们拥有各自独立的内存空间和资源。
2. 设置子进程的状态:创建子进程后,操作系统会设置子进程的状态为就绪态,并将其加入就绪队列中,等待被调度执行。
3. 设置子进程的进程号:操作系统会为子进程分配一个新的进程号,以便于标识和管理子进程。
4. 更新父进程的状态:在fork()函数执行完毕后,父进程和子进程会继续执行fork()函数后面的代码,此时父进程的返回值是子进程的进程号,而子进程的返回值是0,通过这个返回值的不同,父子进程可以在之后的代码中执行不同的操作。
总之,fork()函数在执行时会对PCB做复制和设置状态等操作,以创建一个新的子进程,并且让父子进程继续执行各自的代码逻辑。
相关问题
结合fork的执行流,分析getpid()的执行流
当程序运行到fork()函数时,操作系统会复制当前进程的代码和数据,并创建一个新的进程。新进程与原进程共享文件描述符和虚拟内存空间,但是拥有自己的PID和PCB。
在父进程中,fork()函数返回新进程的PID。因此,当父进程调用getpid()函数时,会返回当前进程的PID。
在子进程中,fork()函数返回值为0。因此,当子进程调用getpid()函数时,会返回子进程的PID。
因此,getpid()函数在父进程和子进程中的执行流是不同的,但都是返回当前进程的PID。
Linux fork原理
在 Linux 中,进程的创建是通过 fork() 系统调用实现的。fork() 调用会创建一个新的进程,称为子进程,该子进程是原始进程(称为父进程)的副本,所以两个进程的代码、数据和堆栈是完全相同的。fork() 调用会返回两次,一次在父进程中,另一次在子进程中。在父进程中,fork() 返回子进程的 PID,而在子进程中,fork() 返回 0。
fork() 调用的原理如下:
1. 在调用 fork() 之前,操作系统会为父进程创建一个 PCB(进程控制块),其中包含了父进程的代码、数据和堆栈等信息。
2. 当调用 fork() 时,操作系统会为子进程创建一个新的 PCB,其中包含了父进程 PCB 的副本,包括代码、数据和堆栈等信息。
3. 子进程会复制父进程的所有资源,包括打开的文件、环境变量和内存映射等。
4. 子进程会将自己的 PID 设置为 0,并将其父进程的 PID 设置为父进程的 PID。
5. 父进程和子进程都会从 fork() 调用中返回,但是在不同的进程上下文中。父进程的返回值是子进程的 PID,而子进程的返回值是 0。
6. 父进程和子进程都可以通过 PID 来区分自己和对方,并在进程上下文中执行自己的代码。
总之,fork() 调用是 Linux 中进程创建的基本方式,它通过复制现有进程来创建新的进程,使得子进程和父进程在代码、数据和堆栈等方面的状态是一模一样的。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)