代码编织梦想

目录

进程的基本概念

进程控制块-PCB

学前补充

预备知识

创建(子)进程

创建(子)进程的原因

理解fork有两个返回值


进程的基本概念

基本概念:程序的一个执行实例,正在执行的程序等

内核层面:担当分配系统资源(CPU时间、内存)的实体

操作系统如何管理进程:

先描述:

  1. 操作系统将一个磁盘中的可执行程序加载到内存中时,内存中只有可执行程序的代码和数据,如果这一部分也算进程的话,该进程什么时候开始被调度的?被调度了多少时间了?......这些信息是“代码 + 数据”部分不包含的,所以加载到内存的可执行程序的代码和数据不是进程,它们只是构成进程的代码段和数据段,是进程的一部分
  2. 操作系统为了管理进程,会将代码段和数据段中的属性以及进程所需的其它属性(当前状态,加载时间...)都进行描述,并将所有描述放入一个叫PCB的结构体中(PCB中还有一个用于访问内存中该进程数据段和代码段的内存指针,以及存放下一个PCB地址的next指针)
  3. 一个进程对应一个PCB,每当加载一个进程时系统就会生成一个对应的PCB
  4. 简单定义:进程 = PCB + 自己的代码段和数据段

后组织:

  1. 将所有PCB连接成一个链表
  2. 此时,操作系统对进程的管理就变成了链表的增删改查

进程控制块-PCB

基本概念:process control block,是进程的所有属性的集合,是对所有操作系统中进程控制块的统称,是一个内核中的数据结构,在不同操作系统中进程控制块会有不同的具体名称(Linux操作系统内核中又叫任务结构体“Task Struct”)

为什么要有PCB:操作系统要对进程进程管理

  • 磁盘中的可执行程序的代码段和数据段被加载到内存中
  • 操作系统会生成该可执行程序对应进程的属性集合-进程控制块
  • 所有进程控制块会连接成一个数据结构(队列等)
  • CPU对进程进程调度时,会去队列中选取进程调度

结论:所谓的进程在操作系统排队不是代码和数据排队,实际上是进程控制块在排队

问题:进程是如何动态运行的?

答:进程控制块通常会被放置在不同的队列中,操作系统可以根据进程的状态和优先级动态调度这些队列中的进程,从而实现了进程的动态运行和资源管理(同一个进程控制块(PCB)可以被放置在多个不同的队列中)

学前补充

  1. ./可执行二进制文件的本质是让系统创建进程并运行
  2. 在本质上,我们自己所写的代码形成的可执行文件 == 系统命令 == 可执行文件
  3. linux中运行的大多数指令,本质都是运行进程
  4. ps指令用于查看所有的当前进程

预备知识

task_struct中的属性:

  1. 标识符:每个进程对应一个特殊的标识符
  2. 状态:任务状态,退出代码,退出信号等
  3. 优先级:相对于其它进程的优先级
  4. 程序计数器:程序中即将被执行的下一条指令的地址
  5. 内存指针:包括程序代码和进程相关数据的指针,还有和其它进程共享的内存空的指针
  6. 上下文数据:进程执行时处理器的寄存器中的数据
  7. I / O状态信息:包括显示的I/O请求,分配给进程I/O设备和被进程使用的文件列表
  8. 记账信息:可能包括处理器时间综合,使用的时钟数总和,时间限制,记账号等
  9. 其它信息

1、显示当前所有进程的详细信息指令:ps axj

2、显示指定进程的详细信息指令:ps axj | grep 指定进程名的关键字

有两行的原因是,grep也是一个进程,它用来过滤出叫myprocess的内容

3、查看获取的首行信息:ps axj | hear -1

4、同时执行多个指令:指令1 && 指令2 && ...

5、查看获取的首行信息与指定的进程信息指令:ps axj | head -1 && ps axj | grep 指定关键字

6、 每一个进程都有属于自己的标识符PID,PID互不相同(task_struct中的无符号整型变量)

7、PID位于操作系统的内核数据结构中,用户不能直接访问操作系统内内核数据结构中的PID:

8、在不使用ps指令的前提下,用户想要获取自己所写的可执行程序的PID,需要使用操作系统提供的系统调用接口getpid():

  1. 接口原型:pid_t getpid(void)
  2. 包含头文件:<unistd.h>
  3. 功能:返回子进程的PID
  4. pid_t类型是对unsigned int 类型的封装

get ppid指令是用于获取当前进程的父进程的PID,一个子进程是由父进程创建的

每次启动子进程时,子进程的pid都不一样,但是父进程的ppid都一样

父进程就是命令行解释器bash

9、ctrl + c本质是就是杀死进程的指令,还有其它杀死进程的指令:kill -9 进程的PID

创建(子)进程

基本概念:新建进程即在操作系统的内核数据结构中新增一个进程控制块,而用户不能直接对操作系统的内核数据结构进行增删改查,所以需要用到操作系统提供的系统调用接口

系统调用接口原型:pid_t fork(void)

包含头文件:<unistd.h>

功能:创建子进程

监控脚本指令:while :; do ps axj | head -1 && ps axj | grep myprocess |  grep -v grep; sleep 1; done

代码预期效果:先打印一行,等待三秒后打印两行hello world,等待五秒后程序结束

结论1:fork后,父子代码共享

        创建一个进程的本质就是系统中多了一个进程,多了一个进程(进程 = PCB + 数据和代码)就意味着内核数据结构中多了一个进程控制块,内存中多了该进程对应的数据段和代码段,父进程的数据段和代码段可能是从磁盘中获取的,但是子进程的代码段和数据段是从哪里来的?默认情况子进程继承父进程的代码段和数据段(这就是为什么fork之后父子进程的代码才是共享的)但是因为进程具有独立性,所以从原则上讲父子进程的数据段是要分开的,而代码段由于具有只读性质,所以是可以共享的(数据段的独立是通过写时拷贝技术实现的)

创建(子)进程的原因

目的:令子进程和父进程执行不一样的代码

做法:利用fork接口的返回值

  • 返回值 = -1:创建子进程失败
  • 返回值 = 0:运行子进程代码
  • 返回值 > 0:运行父进程代码

注意事项:

1、fork接口会返回两次返回值 

2、两次返回值的id,一个是子进程的id,一个是父进程的id,父进程的id是子进程的pid

验证:

  1. fork后父子进程实际上还是共享一段代码,只不过这里通过if...else语句让二者执行不同内容
  2. 之前if和else的内容不能同时进行,是单进程,这里二者可以同时进行,是多进程

理解fork有两个返回值

问题:不考虑特殊情况,当一个函数执行到return时,函数的核心工作是否以及完成?

答:是,因此在调用fork()函数后,父进程和子进程的创建是在fork()函数返回之前完成的,此后的代码会被父子共享包括return id,因此返回两次id,一个是父进程的id,一个是子进程是否创建成功的id

~over~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_73975164/article/details/137376221

Linux进程编程实践1——进程的基本概念、fork创建进程-爱代码爱编程

Linux进程编程实践——进程概念、进程描述、fork创建进程 一、进程的基本概念1.1 程序 VS 进程<1> 什么是程序?<2> 什么是进程?<3> 进程和程序的区别1.2 进程数据结构(描述进程)<1> 操作系统的进程描述——PCB<2> Linux下的进程描述——task_stru

进程的概念以及进程的创建_绝代风华i的博客-爱代码爱编程

文章目录 1. 进程的基本概念1.1 基本概念1.2 进程与程序的主要区别:1.3 并发与并行的区别1.4 描述进程—–PCB1.5 task_ struct内容分类 2. 进程的特征3. 进程的状态和转换3.1

进程基本概念_进程号-爱代码爱编程

一.什么是进程,什么是程序 进程:程序运行的实例,是动态运行的 程序:源代码编译过后的可执行文件,一直存在,这个文件是静态的 二.操作系统如何管理进程 操作系统进程的管理分为描述(PCB)和组织(链表) 描述 操作

进程的基本概念_进程是什么-爱代码爱编程

文章目录 进程的基本概念进程的定义和相关概念:进程的特征:进程的三种基本状态挂起操作进程控制块PCB 进程的基本概念 进程的定义和相关概念: 进程是程序的一次执行进程是一个程序及其数据在

进程创建的基本过程-爱代码爱编程

1.操作系统 操作系统是一组做计算机资源管理的软件的统称。目前常见的操作系统有:Windows系列,Unix系列,Linux系列,OSX系列,Android系列,IOS系类等。 1.1操作系统的定位 操作系统有两个基本的功能: 防止硬件资源被空的应用滥用; 向应用程序提供

linux部署安装-爱代码爱编程

Linux部署安装 Linux中有两种软件安装包 一、源码包 软件的源代码是软件的原始数据,但是源代码不能直接在计算机中直接运行安装。 需要通过编译将源代码转换为计算机可以识别的机器语言,之后才可以进行安装。 源码包安

linux ft260驱动内核学习笔记-爱代码爱编程

目录 1. 安装ft260驱动 2. 编译ft260源码 3. 通过sysfs配置ft260设备 3.1 多功能GPIO配置 3.2 控制GPIO 3.3 配置i2c总线频率 4. UART 5. 使用i2c-tools交互I2C设备 5.1 安装i2c-tools 5.2 探测I2C设备 5.3 读取所有寄存器数据 5.4 读取和

linux知识点笔记-爱代码爱编程

2. Linux介绍 Linux 主要的发行版(release): Ubuntu(乌班图)、 RedHat(红帽)、 CentOS、 Debain[蝶变]、 Fedora、 SuSE、 OpenSUSE [示意图] L

linux中重定向正则输出-爱代码爱编程

接着我们上篇所学的内容了解一个桥接模式 第一步:首先新建一个网卡 网络连接选择桥接模式 第二步:打开物理机的网络连接,选择一下连接那个  第三部:找到我们的虚拟网络 更新设置一下 然后在这里选择我们要连接的外部网络 如果网卡失败: (1)检测配置文件是否正确 (2)检测虚拟编辑器有没有选对(网卡类型) (3)可能是自动分配不

linux进程基础概念&子进程的创建-爱代码爱编程

        有着上一节我们对操作系统和冯诺依曼体系结构的理解,本篇我们便可以开始对 Linux 中的进程开始讲解。在本篇中对进程的基本概念进行了简单的介绍,然后通过对描述进程的 PCB,与 Linux 中的 task_struct 的详细讲解,使得对进程的概念有了一个更加详细的理解。然后接着又介绍了 task_struct 中的内部属性 pid

【linux进程】查看进程&&fork创建进程_查询 linux进程文件-爱代码爱编程

目录 前言  1. 查看进程  2. 通过系统调用创建进程-fork初识 总结 前言          你有没有想过在使用Linux操作系统时,后台运行的程序是如何管理的?在Linux中,进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程,并且讨论如何使用fork创建新的进程。通过了解这些内容,你将更好地理解Linux系统中的进