Linux下的进程解析(level 2)

目录

引言

pid解析

/proc

系统调用

fork :创建子进程

执行流分析

父子进程谁先运行


引言

在当今的信息技术时代,操作系统作为计算机系统的核心组件,承担着资源管理、任务调度等重要职责。Linux作为一种开源、高性能的操作系统,受到了广大开发者和企业的青睐。深入了解Linux下的进程机制,对于我们更好地掌握系统运行原理、优化系统性能具有重要意义。接下来,让我们进一步探讨Linux下的进程解析,揭开进程管理的神秘面纱。本文将着重介绍:pid与fork两个知识点,来深入解析进程。

pid解析

进程id(PID)
父进程id(PPID)
pid与ppid在一个OS中一定是不重复的,这是每个进程的“身份证”

/proc

这是根目录下的一个内存级的文件夹。关掉linux之后,这个文件夹就不存在了。这个文件夹内部存储着进程的各个信息。

进程一般指:加载到内存的一个程序称作进程,因此我们写这样一个代码来模拟进程的执行。

通过ls这个目录,发现内部存在大量的数字命名的文件夹

这个文件夹的命名就是用pid命名的。

这就是内部的内容(查看家目录外的目录需要sudo职权)

以pid命名的目录文件内部包含什么内容?

在Linux操作系统中,每个进程都有一个唯一的进程标识符(PID),并且系统会在/proc文件系统中为每个运行中的进程创建一个以PID命名的目录。这些目录包含了关于进程的详细信息,以下是一些常见的文件和它们的内容:

  1. cmdline - 包含了启动进程时使用的完整命令行字符串。

  2. cwd - 一个指向进程当前工作目录的符号链接。

  3. environ - 包含了进程的环境变量。

  4. exe - 一个指向进程的可执行文件的符号链接。

  5. fd - 包含了进程打开的文件描述符的目录。每个文件描述符都映射到一个实际的文件或设备。

  6. maps - 显示了进程的内存映射,包括内存区域、访问权限、偏移量、设备信息和文件路径(如果有的话)。

  7. mem - 包含了进程的内存内容。通常,只有具有特权的用户才能访问这个文件。

  8. mounts - 包含了进程的挂载点信息。

  9. net - 包含了进程的网络相关的统计信息,如TCP套接字等。

  10. stat - 包含了进程的状态信息,如PID、父进程PID、用户ID、组ID、开始时间、CPU使用时间等。

  11. statm - 包含了进程使用的内存状态信息,如虚拟内存大小、Resident Set Size(RSS)等。

  12. status - 包含了进程的详细信息,如名称、状态、父进程ID、用户ID、组ID等。

  13. task - 包含了属于该进程的所有线程(或任务)的子目录。

这些文件提供了对进程内部状态的深入洞察,可以用于调试、性能分析和其他系统管理任务。需要注意的是,/proc文件系统是一个虚拟文件系统,它并不占用实际的磁盘空间,而是由内核在运行时动态生成。

在这些内容中,我们着重看两个文件:cwd  exe

先将写的t1程序运行

ps axj 可以查看所有进程 

&&表示执行两个独立的指令(也可以;)

 现象分析:

1.为什么我们过滤t1进程,会出现两个进程信息呢?

这是因为grep本身就是一个程序,所以grep的进程信息也会出现。

2.这里的PID就是每个进程的身份信息,会出现在/proc文件中。我们可以打开它查看进程信息。

但是进程结束之后,将不会继续存在

我们将程序修改为死循环之后。

注:我们可以在底行模式查看手册   !man 3 sleep

再次运行程序,发现pid发生变化

查看这个pid

发现内部存在两个文件cwd(correct working directory)、exe(当前可执行程序的目录信息)

这些信息也解释了为什么我们touch一个文件,默认的路径是当前工作路径。

杀进程

kill -9 pid可以杀掉一个进程

系统调用

OS通过pcb来控制进程的运行,在linux下具体就是task_struct这个结构去控制的

ps可以遍历这个链表。我们都知道linux内核禁止访问,只能通过系统调用去访问对应的信息,因此访问pid与ppid这些信息只能通过接口去访问。

getpid 、 getppid(ppid:parent 父进程的pid)

父进程编号(ppid)不变:

bash本身是一个进程,负责解释命令行中的内容

命令行中的所有指令都是bash的子进程

bash只负责命令行的解释。进程出问题都只会影响bash的子进程

因此父进程ppid一直不变

linux下开发的c/cpp,如果调用了linux的系统调用接口,那么windows下不能直接运行

fork :创建子进程

返回值:给子进程返回0,给父进程返回子进程的pid

/return val调出返回值

代码:

现象:

发现程序并没有进入死循环,而是不断重复两个死循环的内容,这是为什么呢?

父进程的ppid就是bash(可见bash内部一定有fork机制)

子进程的ppid就是父进程

执行流分析

fork:分叉,将代码一分为二

它会产生两个进程,一个进程去执行第一个循环,另一个进程去执行第二个循环。两个进程分开跑。

问题:

1.为什么fork要给子进程返回0,给父进程返回子进程的pid?

2.一个函数如何做到返回两次的,如何理解?

3.一个变量为什么有不同的内容,本质是什么?

解析:

返回不同的返回值,是为区分不同的执行流、执行不同的代码块。一般而言,fork语句之后的代码共享

进程 = 内核数据结构 + data  + 代码

这个pcb可以指向data + 代码

那子进程该执行怎么样的代码呢?

已知,子进程与父进程的代码在fork之后是共享的

为什么需要创建子进程呢?毫无疑问,对于不同的进程,我们存在不同的需求,因此得想办法让父子进程执行不同的代码块。这使得fork让父子存在不同的返回值。

如何做到的?

已知,进程具有独立性,父子进程并不会相互影响。

理解:QQ崩了不影响微信的使用!

进程的几大性质:

  1. 动态性:进程的动态性表现在进程的创建、执行和消亡是随时间变化的。进程的状态可以在运行、就绪、阻塞等状态之间转换。

  2. 并发性:多个进程可以在同一时间段内同时执行,这体现了操作系统的并发性。并发性是提高计算机系统资源利用率的关键特性。

  3. 异步性:每个进程按照自己的节奏独立运行,不受其他进程执行速度的影响。进程的异步性要求操作系统提供同步机制来协调进程间的操作。

  4. 结构性:进程通常由代码段、数据段、堆栈段等组成,这些段构成了进程的内存映像,体现了进程的结构性。

  5. 独立性:每个进程都有自己的地址空间、执行状态和系统资源,如文件描述符、信号处理等,进程之间不相互干扰。

  6. 交互性:进程之间可以通过进程间通信(IPC)机制进行数据交换和同步操作,如管道、消息队列、共享内存、信号量等。

  7. 可控性:操作系统可以控制进程的执行,包括启动、暂停、恢复和终止进程。进程调度器负责分配CPU时间给各个进程。

  8. 可见性:进程的创建、状态变化和资源使用情况可以通过系统提供的工具(如ps、top等)被用户或系统管理员观察到。

fork是一个函数,在函数的内部完成了创建子进程的工作。得到了子进程的PCB,父子进程都具有独立的PCB,因此互不影响。

可见,在return语句之前,函数就完成了子进程的创建。而子进程创建好了之后,后面的代码父子进程共享,也就是说return是父子进程共享的。

因此父进程可以得到自己的return,子进程也可以得到自己的return。

为什么返回值不同呢?---- 问题三:一个变量存在不同的内容

这是因为进程的写时拷贝!

内存划分:(内存中的代码和数据的辨析)

内存主要有四部分构成:

栈、堆、代码段(常量区)、数据段(静态区)

栈(Stack):用于存储临时变量、函数参数、返回地址等。这些数据通常是局部于函数调用的。

堆(Heap):用于动态分配内存,通常用于存储全局变量和动态分配的数据结构。

数据段(Data Segment):用于存储全局和静态变量,这些变量在程序启动时分配,并在程序运行期间持续存在。

代码段(Code Segment):包含程序的指令,通常是不变的。

当代码加载到内存中时,一般存储在代码段。而数据则是存储在其他三个区域

我们都知道,代码存储在代码段,是禁止修改的,那父子进程指向相同的代码但是却有不同的数据,这是因为数据不存储在代码段,数据是可以修改的。

共享代码并不影响独立性,因为代码是只读的,不允许修改。但是数据不一样!

因此子进程的pcb不能执行父进程的数据,而是得额外开辟自己的区域存储数据。

子进程有自己单独的数据。虽然代码是一样的。但是id这个变量接收的数据是不一样的。所以cpu在计算时,通过公共的代码,访问不同的数据

这也可以解释进程的独立性:数据上的割裂导致进程在执行时,不会相互影响。

但是!直接给子进程开辟一份数据所占用的内存往往是不必要的。因为可能子进程和父进程访问的数据内容一致。这时候将会访问同一块内存当中的数据。

因此,如果子进程不做数据的修改,可以与父进程访问相同的数据,但是一旦子进程发生数据的修改,那么就要做拦截。只有当子进程想修改数据时,做拦截

只有对父进程的数据做修改,才会额外开辟一块内容,给子进程存放数据。让子进程去修改这部分数据。

这种技术称作:子进程在数据层面的写时拷贝

因此上述代码在return写入时,这就是对数据做了修改。因此在内存给子进程额外开辟了空间,让父子进程得到不同的返回值。

这也是为什么bash作为父进程,子进程出错不影响bash的原因。(数据的独立性)

父子进程谁先运行

这不是人为决定的,而是由调度器决定的。

调度器:选择一个进程放在cpu去运行

调度器:只有一块cpu,各个进程对于cpu是竞争关系,调度器尽量一碗水端平(运行时间平衡、不偏不漏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第11篇:网络安全协议

目录 引言 11.1 安全套接字层(SSL)和传输层安全(TLS)协议 11.1.1 SSL/TLS 的工作原理 11.1.2 SSL/TLS 的应用场景 11.2 虚拟专用网(VPN)和 IP 安全协议(IPSec) 11.2.1 VPN 的工…

《深度学习》OpenCV EigenFaces算法 人脸识别

目录 一、EigenFaces算法 1、什么是EigenFaces算法 2、原理 3、实现步骤 1)数据预处理 2)特征提取 3)构建模型 4)识别 4、优缺点 1)优点 2)缺点 二、案例实现 1、完整代码 运行结果&#xff…

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中,存储过程是一种预先编写好的SQL代码集合,它被保存在数据库服务器上,可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句,如IF条件语句、WHILE循环等,使…

「从零开始的 Vue 3 系列」:第十一章——跨域问题解决方案全解析

前言 本系列将从零开始,系统性地介绍 Vue 3 的常用 API,逐步深入每个核心概念与功能模块。通过详尽的讲解与实战演示,帮助大家掌握 Vue 3 的基础与进阶知识,最终具备独立搭建完整 Vue 3 项目的能力。 第十一章:跨域问…

Win32图片库CxImage在vs2022下的编译和使用

一、编译CxImage库 1、下载CxImage_702库的源码:在下面的链接中下载cximage702_full.7z https://sourceforge.net/projects/cximage/files/7.02/ 2、解压到某一目录,vs2022打开CxImageFull_vc10.sln解决方案文件,提示升级点确定 3、先编译下面的这几…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有,个人中心,用户管理,中介管理,房屋信息管理&#xff…

[Linux] 逐层深入理解文件系统 (2)—— 文件重定向

标题:[Linux] 逐层深入理解文件系统 (2)—— 文件重定向 个人主页水墨不写bug (图片来源于网络) 目录 一、文件的读取和写入 二、文件重定向的本质 1.手动模拟重定向的过程——把标准输出重定向到redir.txt 2.重定向…

019_基于python+django食品销售数据分析系统2024_4032ydxt

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…

基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 医生界面…

这4款实用的工具简直就是硬盘数据丢失的救星。

硬盘数据丢失的情况有很多种,像误删除,格式化,病毒攻击,硬件故障等等。如果不是物理上的损坏,丢失的数据还是可以通过一些方法进行恢复的。这里就跟大家分享几款可以进行数据恢复的专业数据件,希望可以帮助…

Apache Seatunnel Zeta引擎-启动脚本分析

Apache SeaTunnel Zeta引擎的集群模式启动的第一步是执行bin/seatunnel-cluster.sh脚本,所以先来学习下这个脚本。 脚本执行流程分析 脚本简要注释 #!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license a…

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义:**将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 2.结构: 抽象化角色 :定义抽象类,并包含一个对实现化…

你的电脑能不能安装windows 11,用这个软件检测下就知道了

为了应对Windows 11的推出,一款名为WhyNotWin11的创新型诊断软件应运而生。这个强大的工具不仅仅是一个简单的兼容性检测器,它更像是一位细心的数字医生,全方位评估您的计算机是否准备好迎接微软最新操作系统的挑战。 WhyNotWin11的功能远超…

【动手学深度学习】8.3 语言模型(个人向笔记)

下面是语言模型的简介 1. 学习语言模型 使用计数来建模 N元语法:这里的元可以理解为我们之前的时间变量。对于 N 元语法,我们可以把所有长度为 N 的子序列存下来。其中 1 元语法用的很少。这里其实就是算概率的时候我们不往前看所有的概率,…

前端遮罩层的应用

最近微信小程序需要开发新手引导功能&#xff0c;发现需要在遮罩层中间抠一个洞出来&#xff0c;但是一直不知道该怎么去做&#xff0c;其实很简单&#xff0c;先展示源码&#xff1a; <template><div class"num01">hello<div class"mask"&…

ai字幕用什么软件制作?6款视频加字幕工具分享!

在视频制作和后期处理中&#xff0c;字幕的添加是一个重要的环节。随着AI技术的发展&#xff0c;越来越多的软件开始支持AI自动加字幕功能&#xff0c;使得字幕的制作变得更加简单和高效。本文将为大家介绍几款常用的AI字幕制作软件&#xff0c;并详细讲解如何使用AI自动加字幕…

【MySQL 保姆级教学】在Linux(CentoS 7)中安装MySQL(1)

目录 1. 卸载linux&#xff08;Centos7&#xff09; 中不要的环境2. 获取MySQL官方yum源2.1 获取yum源前先查看自己 linux&#xff08;Centos&#xff09;的版本2.2 获取官方yum源 3. 安装xftp和连接4. 开放连接端口5. 上传文件到Centos76. 安装MySQL6.1 顺利安装6.2 查询是否安…

从RNN讲起(RNN、LSTM、GRU、BiGRU)——序列数据处理网络

文章目录 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;1. 什么是RNN&#xff1f;2. 经典RNN的结构3. RNN的主要特点4. RNN存在问题——长期依赖&#xff08;Long-TermDependencies&#xff09;问题 LSTM&#xff08;Long Short-Term Memory&a…

某MDM主数据管理系统与微软Dynamic CRM系统(国内节点)集成案例

一、需求分析 需要完成的核心场景&#xff1a; 客户主数据&#xff1a;通过SAP PO集成中间件平台&#xff0c;某MDM主数据实时推送客户主数据信息至微软CRM系统&#xff0c;方便微软CRM系统进行客户方面的管理&#xff0c;并供微软CRM查询员工信息&#xff0c;修改员工&…

STM32—FLASH闪存

1.FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分&#xff0c;通过闪存存储器接口&#xff08;外设&#xff09;可以对程序存储器和选项字节进行擦除和编程 我们怎么操作这些存储器呢&#xff1f;这就需要用到这个闪存存储器接口了&#xff0c;闪…