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

【Linux】进程的基本概念

目录

  • 概念
  • 描述进程-PCB
  • 如何查看进程
    • 通过系统目录进行查看
    • 通过ps指令进行查看
  • 通过系统调用获取进程的PID和PPID(进程标⽰符)
  • 通过系统调用创建子进程
    • 通过一段代码来介绍fork
      • 为什么要有子进程?
      • fork为什么给子进程返回0,给父进程返回子进程的PID
      • fork函数到底做了啥?
      • 一个函数是如何做到返回两次的?
      • 一个变量为什么会有不同的内容?
      • 通过fork来理解bash的命令行是如何来工作的?
  • end

概念

课本概念: 程序的一个执行实例,正在执行的程序等。(就是执行任务)
内核观点: 担当分配系统资源(CPU时间,内存)的实体。

  1. 我们写完代码后经过编译和链接后形成一个可执行文件,打开这个可执行文件就会加载到内存中交给CPU处理,CPU才能对其进行逐行的语句执行,而一旦将这个程序加载到内存后,我们就不应该将这个程序再叫做程序了,严格意义上将应该将其称之为进程。
    在这里插入图片描述

描述进程-PCB

  1. 系统当中可以同时存在大量进程,使用命令ps aux便可以显示系统当中存在的进程。
    在这里插入图片描述
  2. 而我们开机第一个运行的就是操作系统,运行操作系统就是一个进程。我们都知道操作系统是软件和硬件的管理者,那么进程也是操作系统来管理的。那么操作系统到底是如何来管理进程的呢?
  3. 这时我们就应该想到管理的六字真言:先描述,再组织t操作系统也是一样的,操作系统并不需要直接的和进程见面进行管理,而是对进程的属性进行描述,而操作系统只需要对这些描述的信息进行管理就行了。
  4. 那么描述进程属性是存放在哪里的呢。他是存放在一个叫做PCB的数据结构中,在Linux操作系统下,我们把他称为task_struct.
  5. 操作系统将每一个进程都进行描述,形成了一个个的进程控制块(PCB),并将这些PCB以双链表的形式组织起来。
    在这里插入图片描述
    把这些PCB用双链表组织起来,那么我们只需要遍历双链表就可以访问到所有的PCB,如果我们要删除某个进程的信息,就是删除双链表对应的节点,所以对进程的管理实际上就是数据结构的增删查改。

如何查看进程

通过系统目录进行查看

  • 在根目录下有一个叫做proc的文件,这里面就是我们Linux下的所有进程
    在这里插入图片描述
  • 这些进程的名字有的名字是一个数字,这些数字其实就是进程的PID(可以理解为身份证)
  • 如果我们想要查看进程的信息,就可以用ls指令来显示这些文件,这就是进程的信息
    在这里插入图片描述

通过ps指令进行查看

  • 单独使用ps命令,会显示所有进程信息。
    在这里插入图片描述
  • ps命令与grep命令搭配使用,即可只显示某一进程的信息。
ps aux | head -1 && ps aux | grep proc
  • 解释一下这个命令,ps aux拿到所有进程信息, |是管道,意思是把ps aux拿到的数据的输出作为 head -1 的输入,head -1 表示只取输入内容的第一行,也就是进程信息列表的表头 ,比如 F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 。交给下个指令
  • && :是逻辑与操作符,表示只有当左边的指令执行成功的时候才执行右边的指令
  • ps aux | grep proc, 当ps aux执行成功列出了所有的进程信息后把他的输出(所有的进程信息)作为给grep指令的输入,grep去查找这些进程信息中,proc名字的进程
    在这里插入图片描述

通过系统调用获取进程的PID和PPID(进程标⽰符)

  • 通过使用系统调用函数,getpid(自己的身份)和getppid(父进程的身份)即可分别获取进程的PID和PPID。
    我们可以通过一段代码来进行测试。
    在这里插入图片描述
  • 当运行该代码生成的可执行程序后,便可循环打印该进程的PID和PPID。
    在这里插入图片描述

通过系统调用创建子进程

通过一段代码来介绍fork

在这里插入图片描述
在这里插入图片描述

  • 这个时候你会发现,if和else if居然在同时运行

    这是为啥呢?在我们写过的程序中,怎么可能同时满足if又满足else if, 接下来我们就要对于这个现象进行剖析

为什么要有子进程?

之所有要有子进程,其实就是父进程想让子进程去绑他做一些事情,也就是说在父进程做事情的同时,子进程也可以同时做事情,父进程和子进程分别去做不同的事情。 那我们说完成一个任务总有知道是谁完成的吧,所以子进程和父进程都要有一个返回值。用来区分这个进程是子进程还是父进程。

  • 解决方法就是fork要有两个返回值!!——>所以返回不同的值的意义是为了区分不同的执行流,让父进程和子进程分别执行不同的代码块!!

fork为什么给子进程返回0,给父进程返回子进程的PID

因为在Linux系统中父进程和子进程的关系是1:n的,也就是说父进程可以有1个或多个子进程,但是子进程的父进程只能有1个。父进程如果有多个子进程,那么这个父进程就要通过这些子进程的pid来区分不同的子进程进行管理。而如果是子进程为啥返回0,因为子进程不需要父进程的pid,他可以通过getpid这个函数来获得。

fork函数到底做了啥?

  • 因为fork函数会创建一个进程,而进程=(内核数据结果)+代码和数据,所以首先:
    1. 创建一个task_struct结构体
    2. 吧进程的属性填写到task_struct里面
    3. 让子进程和父进程指向同样的代码,因为子进程继承了父进程的大多数属性。(跟子进程拷贝父进程的PCB有一定的关系,就是继承了pcb里面的属性,还有进程的地址空间,页表这些), 所以这里fork创建子进程后的代码是父进程和子进程共享的,那么return就会return两次,父进程return1次,子进程return1次。
    4. 这个时候补充一个知识:因为进程之间具有独立性,也就是说进程之间不能互相影响(比如说我关掉了洛谷这个进程并不影响我在爱奇艺上看电视),所以上面fork函数返回两次给id这个变量就会导致子进程修改一次,父进程修改一次。
    5. 这个时候就发生了写时拷贝

任何平台,进程都是具有独立性的,在子进程和进程共享代码的时候,因为代码是只读的,这是没有问题的。但是数据就不一样了,数据可以修改。那这个时候数据也是共享的,他们其中的一个改了数据就不行了。所以说,我们的子进程/父进程如果想要修改数据,就要想办法把修改的数据拷贝一份出来,让其指向新拷贝出来的那一块数据。这样才能做到进程之间互相不影响

一个函数是如何做到返回两次的?

  • 父子的代码是共享的,所以return ret也是属于代码,因此父子进程各返回了一次!
    在这里插入图片描述

一个变量为什么会有不同的内容?

  • 这就是因为子进程修改了数据导致触发了写时拷贝,导致一个变量会有两个值。但是有人说不对呀,变量地址不都是一样的吗?一个物理地址,怎么会有两个值?这就要等我后面说虚拟地址空间的时候来解释了
  • 但是要注意的是,子进程被创建好之后,究竟是先运行子进程还是先运行父进程,其实是由调度器(因为CPU只有一个,所以他的作用就是在当前进程中选一个合适的放到CPU中,进程之间会竞争CPU资源,所以调度器会遵循着自己的一套原则来保证进程之间的公平性)这个后面我会在进程优先级讲解

通过fork来理解bash的命令行是如何来工作的?

  • bash这个进程主要是用于做命令行解析的工作,bash创建一个子进程来替他执行指令操作,因为进程的独立性就是子进程失败了也不会影响bash这个进程。这样就达到了让bash这个进程专注于命令行解释的工作。
  • 什么事命令行解释?

在这里插入图片描述

end

感谢你的阅读,如果对你有帮助的话,给博主点一个赞吧。

相关文章:

【Linux】进程的基本概念

目录 概念描述进程-PCB如何查看进程通过系统目录进行查看通过ps指令进行查看 通过系统调用获取进程的PID和PPID(进程标⽰符)通过系统调用创建子进程通过一段代码来介绍fork为什么要有子进程?fork为什么给子进程返回0,给父进程返回子进程的PIDfork函数到底…...

设备驱动与文件系统:05 文件使用磁盘的实现

从文件使用磁盘的实现逻辑分享 我们现在讲第30讲,内容是文件使用磁盘的具体实现,也就是相关代码是如何编写的。上一节我们探讨了如何从字符流位置算出盘块号,这是文件操作磁盘的核心。而这节课,我们将深入研究实现这一核心功能的…...

AI数据分析在体育中的应用:技术与实践

在现代体育竞技领域,"数据驱动"已不再是一个遥远的概念。尤其随着人工智能(AI)和大数据分析的不断成熟,从职业俱乐部到赛事直播平台,从运动员训练到球迷观赛体验,AI正以前所未有的方式渗透并改变…...

zabbix 6 监控 docker 容器

zabbix 6 监控 docker 容器 1.安装zabbix_agent2 curl -s http://10.26.211.56:8080/centos7-agent2-install.sh | bash2.在zabbix server 端测试 zabbix_get -s 10.26.219.180 -k docker.infoZBX_NOTSUPPORTED: Cannot fetch data: Get "http://1.28/info": dial…...

正则持续学习呀

源匹配为 (.*): (.*)$ 替换匹配为 "$1": "$2", 可将headers改为字典 参考 【爬虫军火库】如何优雅地复制请求头 - 知乎...

【Go语言基础【19】】接口:灵活实现多态的核心机制

文章目录 零、概述一、接口基础1、接口的基本概念a. 接口定义b. 类型实现接口(无需显式声明)c. 接口变量(体现了多态) 2、实现接口的方式3、接口组合4、接口的底层结构 二、空接口与类型断言1. 空接口(interface{}&…...

MySql读写分离部署(一主一从,双主双从,Mycat)

参考资料: 参考视频 参考博客 视频参考资料及安装包: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取码: aag3 Mysql主从复制部署指南(一主一从) NotePad++编辑Linux服务器文档 Mysql高版本(8.0及以后)Linux安装 Mysql分库分表(基于Mycat)的基本部署 …...

Go基本语法——go语言中的四种变量定义方法

前言 在go语言中,定义一个变量有四种方式,本文单从语法的层面来介绍这几种方式 单变量定义方法 1.var 变量名 类型,不进行初始化 例如,定义一个变量a后为其赋值,并且打印其值,运行结果如下 //1.不进行…...

27.【新型数据架构】-数据共享架构

27.【新型数据架构】-数据共享架构:降低数据获取成本,实时数据访问,保持数据新鲜度,促进数据经济发展,打破数据孤岛,标准化数据交换,增强数据安全性,完整审计追踪,合规性保障 一、数据共享架构的本质:打破壁垒的“数字立交桥” 传统企业或组织间的数据往往呈现“烟囱…...

virtualbox 如何虚拟机ip固定

1、在网络管理里新建 2、配置网络 3、 进入linux系统,查看 查看 网卡是enp0s8, ifconfig 4、进入网卡配置文件 cd /etc/sysconfig/network-scripts如果没有enp0s8 ,则使用mv ifcfg-enp0s3 ifcfg-enp0s8命令 配置项如下 TYPEEthernet PROXY_METHODn…...

RKNN3588上部署 RTDETRV2

RT-DETR V2 是由百度研究团队在 2024年 提出的,是其广受好评的实时目标检测模型 RT-DETR 的重大升级版本。它继承了第一代 RT-DETR 利用 Transformer 架构实现端到端目标检测 和 卓越实时性能 的核心优势,并针对模型精度、训练效率和部署灵活性进行了全方…...

Python----循环神经网络(BiLSTM:双向长短时记忆网络)

一、LSTM 与 BiLSTM对比 1.1、LSTM LSTM(长短期记忆网络) 是一种改进的循环神经网络(RNN),专门解决传统RNN难以学习长期依赖的问题。它通过遗忘门、输入门和输出门来控制信息的流动,保留重要信息并丢弃无关…...

Elasticsearch 常用操作命令整合 (cURL 版本)

Elasticsearch 常用操作命令整合 (cURL 版本) 集群管理 查看集群健康状态 curl -X GET "localhost:9200/_cluster/health?pretty"查看节点信息 curl -X GET "localhost:9200/_cat/nodes?v"查看集群统计信息 curl -X GET "localhost:9200/_clus…...

Redis持久化策略:RDB与AOF详解

目录 1. RDB持久化工作原理触发机制优点缺点配置示例 2. AOF持久化工作原理同步策略重写机制优点缺点配置示例 3. RDB与AOF比较4. 混合持久化(Redis 4.0)5. 选择建议 Redis提供了两种主要的持久化机制来保证数据安全:RDB(Redis Database)和AOF(Append Only File)。本…...

Linux系统编程-DAY10(TCP操作)

一、网络模型 1、服务器/客户端模型 (1)C/S:client server (2)B/S:browser server (3)P2P:peer to peer 2、C/S与B/S区别 (1)客户端不同&#…...

基于eclipse进行Birt报表开发

Birt报表开发最终实现效果: 简洁版的Birt报表开发实现效果,仅供参考! 可动态获取采购单ID,来打印出报表! 下面开始Birt报表开发教程: 首先:汉化的eclipse及Birt值得拥有:至少感觉上…...

GPU虚拟化

引言 现有如下环境(注意相关配置:只有一个k8s节点,且该节点上只有一张GPU卡): // k8s版本 $ kubectl version Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.7&…...

LabVIEW工业级多任务实时测控系统

采用LabVIEW构建了一套适用于工业自动化领域的多任务实时测控系统。系统采用分布式架构,集成高精度数据采集、实时控制、网络通信及远程监控等功能,通过硬件与软件的深度协同,实现对工业现场多类型信号的精准测控,展现 LabVIEW 在…...

Python学习(7) ----- Python起源

🐍《Python 的诞生》:一段圣诞假期的奇妙冒险 📍时间:1989 年圣诞节 在荷兰阿姆斯特丹的一个寒冷冬夜,灯光昏黄、窗外飘着雪。一个程序员 Guido van Rossum 正窝在家里度假——没有会议、没有项目、没有 bug&#xf…...

Java中List的forEach用法详解

在 Java 中,List.forEach() 是 Java 8 引入的一种简洁的遍历集合元素的方法。它基于函数式编程思想,接受一个 Consumer 函数式接口作为参数,用于对集合中的每个元素执行操作。 基本语法 java 复制 下载 list.forEach(consumer); 使用示…...

LeetCode 1356.根据数字二进制下1的数目排序

题目&#xff1a; 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同&#xff0c;则必须将它们按照数值大小升序排列。 请你返回排序后的数组。 提示&#xff1a; 1 < arr.length < 5000…...

破解HTTP无状态:基于Java的Session与Cookie协同工作指南

HTTP协议自身是属于“无状态”协议 无状态是指&#xff1a;默认情况下&#xff0c;HTTP协议的客户端和服务器之间的这次通信&#xff0c;和下次通信之间没有直接的关系 但在实际开发中&#xff0c;我们很多时候是需要知道请求之间的关联关系的 上述图中的令牌&#xff0c;通常就…...

JS 事件流机制详解:冒泡、捕获与完整事件流

JS 事件流机制详解&#xff1a;冒泡、捕获与完整事件流 文章目录 JS 事件流机制详解&#xff1a;冒泡、捕获与完整事件流一、DOM 事件流基本概念二、事件捕获 (Event Capturing)特点代码示例 三、事件冒泡 (Event Bubbling)特点代码示例 四、完整事件流示例HTML 结构JavaScript…...

MYSQL too many connection问题排查和修复

1.连接数据库 mysql -u root -p 1.1 查看mysql路径 如果没有配置mysql的环境变量&#xff0c;可以直接找mysql的安装目录 打开任务管理器-》服务-》Mysql(根据版本不同后面带有数字&#xff0c;找运行的那个) 打开服务->mysql->属性-》可执行文件的路径&#xff0c;…...

SpringCloudAlibaba和SpringBoot版本问题

SpringCloudAlibaba和SpringBoot版本问题 直接参考官方给出的版本说明&#xff0c;具体地址&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E Spring Cloud Alibaba VersionSentinel VersionNacos VersionRocketMQ Ver…...

算法专题七:分治

快排 1.颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) class Solution {public void swap(int[] nums, int i, int j){int t = nums[i];nums[i] = nums[j];nums[j] = t;}public void sortColors(int[] nums) {int left=-1 ,i=0 ,right=nums.length;while(i<right){i…...

Vue中虚拟DOM的原理与作用

绪论 首先我们先了解&#xff0c;DOM&#xff08;Document Object Model&#xff0c;文档对象模型&#xff09; 是浏览器对 HTML/XML 文档的结构化表示&#xff0c;它将文档解析为一个由节点&#xff08;Node&#xff09;和对象组成的树形结构&#xff08;称为 DOM 树&#xf…...

前端十种排序算法解析

1. 冒泡排序 1.1 说明 冒泡排序为一种常用排序算法&#xff0c;执行过程为从数组的第一个位置开始&#xff0c;相邻的进行比较&#xff0c;将最大的数移动到数组的最后位置执行的时间复杂度与空间复杂度为 o(n^2) 1.2 执行过程 从数组的第一个位置开始&#xff0c;截止位置为 …...

使用 C/C++ 和 OpenCV 添加图片水印

使用 C/C 和 OpenCV 添加图片水印 &#x1f5bc;️ 在数字图像处理中&#xff0c;添加水印是一种常见的操作&#xff0c;可以用于版权保护、品牌宣传或信息标注。本文将介绍如何使用 C/C 和强大的计算机视觉库 OpenCV 来实现将自定义水印&#xff08;图片或文字&#xff09;添…...

Secs/Gem第十二讲(基于secs4net项目的ChatGpt介绍)

好&#xff0c;那我们进入最关键的一讲—— 第十二讲&#xff1a;完整事件通知流程全景图——CEID 触发到主机接收的全过程 关键词&#xff1a;CEID 事件上报、S6F11 报文、事件触发流程、数据驱动机制、Report Dispatch、主机解析流程 本讲目标 你将彻底理解&#xff1a; 设…...