【Linux】创建子进程
进程概念-创建子进程
- 程序计数器&上下文信息
- 创建子进程
程序计数器&上下文信息
我们知道,当计算机在运行程序的时候实际上是在执行汇编指令
但是存在一个问题,一台计算机中有许多个进程,而CPU只有几个,那么就意味着,某一个时间段中,对于CPU来说,一定有进程正在占用CPU资源,而有些进程没有占用CPU资源,当某个进程占用CPU运算一段时间后,就会被切出CPU,那么下次这个进程拿到CPU资源的时候,程序如何知道需要运行到哪行汇编指令呢?运算的中间结果又是如何保存下来的呢?
其实在PCB中存在程序计数器和上下文信息:
程序计数器:保存进程下一次运行时的汇编指令
上下文信息:保存进程上一次运算时,寄存器当中的值
这样就很好的解决了上述进行进程切换时遇到无法保存程序运行位置和中间结果的问题。
创建子进程
我们是使用fork()
这个函数进行创建的,fork函数可以让当前正在运行的进程,创建出一个子进程。
特殊的是,fork不需要传递参数,而调用一次fork会返回两个返回值(父进程返回一次,子进程返回一次)
当创建成功后,就如上述所说,返回两个返回值
返回值为0的返回给子进程,返回值>0的返回给父进程
当创建失败会返回-1
思考:下面的代码会打印几次呢?
从结果来看,打印了两次
其实是因为,fork创建了一个子进程,这个子进程会拷贝一份和父进程相同的PCB,其中代码也是相同的,那么就会从fork代码的下一行执行,子进程打印一次,父进程也会打印一次。
在拷贝父进程的PCB时,会重新给子进程分配PID,并且父子进程的代码是共享的,但是由于各自有各自的进程虚拟地址空间,因此数据是独立的。
子进程是由父进程创建的,那么父进程又是由谁创建的呢?
实际上,在命令行中启动的进程,它的父进程就是bash
我们创建的进程是由bash进程创建的,那么意味着和bash有着相同的代码,按照常理来说我们创建的进程会执行bash的代码,但是为什么没有呢?
由于发生了进程程序替换,这个后面详细描述,并且每一个打开的bash窗口都是一个进程,每个bash进程都是独立的