当前位置: 首页 > article >正文

【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进程都是独立的


http://www.kler.cn/a/7702.html

相关文章:

  • 【Qt】报错error: undefined reference to `vtable for的最简单解决
  • arkUI:水果选择与管理:基于 ArkUI 的长按编辑功能实现
  • 学习日记_20241115_聚类方法(层次聚类)
  • 【视觉SLAM】1-概述
  • Flink中自定义Source和Sink的使用
  • Vulnhub靶场案例渗透[8]- HackableII
  • 有哪些特别小众而有趣的编程语言呢?
  • 项目管理方法不是最重要的,成功完成项目真正需要什么?
  • MySQL逻辑架构
  • 2023年第十四届蓝桥杯将至,来看看第十二届蓝桥杯javaB组题目如何
  • UNIX环境高级编程——标准I/O库
  • Linux必会100个命令(五十八)dnf命令
  • ToBeWritten之PWN入门介绍/环境搭建
  • 【数据库管理】①② Oracle逻辑存储架构(上)
  • 【JavaWeb】5—Servlet
  • 15 标准模板库STL之容器1
  • 美摄汽车数据匿名化方案:精准、高效、低耗
  • (5)(5.10) 室内飞行指南
  • 让县自明本志令~一个真实曹操的内心世界
  • 判断一个字符串是否是回文
  • ​openEuler 23.03 正式发布,聚集社区创新力量,增强基础技术能力,协同全场景创新
  • SMT丨工艺特点及详细生产工艺流程
  • 【云原生】k8s Service 实现服务发现和负载均衡
  • 基于vue3.x与 three.js模拟地球内部结构
  • NLP / LLMs中的Temperature 是什么?
  • 思维导图软件哪个好?安利八款好用的思维导图软件