深入理解Linux进程管理机制

news2024/12/13 3:59:08

个人主页:chian-ocean

文章专栏-Linux

前言

进程是现代操作系统中一个不可或缺的概念,其主要目的在于管理资源、实现并发、提高系统效率,并确保系统的稳定性和安全性。

在这里插入图片描述

进程的定义

进程(Process) 是计算机操作系统中的一个基本概念,指的是一个正在运行的程序的实例。它是程序在计算机中执行的动态表现,不仅包含程序的代码(即可执行指令),还包括程序在运行时所需的各种资源,如内存、文件句柄、CPU时间等。

  1. 在理解操作系统的时候,OS是一个进行软硬件管理的软件。
  2. 进程通俗的理解就是一个被加载到内存的程序(进程也叫任务

OS如何管理进程

在理解操作系统的时候提出来 ,OS进行管理是 先描述后组织

  • 任何一个进程在被加载在内存的时候形成一个一个进程,这时候操作OS进行描述的过程。

PCB

PCB的理解

学校在对一个人管理学生的时候需要记录一个人的基本信息(是所有学生所共有的特征)有,姓名、身高、体重、身份证等等。OS引入了PCB(Process Ctrl Block)进程控制块:进程属性的集合(也就是描述的过程)

  • 进程控制块(Process Control Block, PCB)是操作系统中用于描述和控制一个进程的最重要的数据结构。
  • 可以把PCB理解为一个进程的“身份证”,它包含了操作系统对每个进程管理和调度所需要的所有信息。
  • 当一个程序被创建并执行时,操作系统就为它创建一个PCB,用来追踪和管理它的状态。

PCB的内容

PCB的本质就是结构体(struct),里面储存了各种各样的信息,例如:

  • 进程标识信息:进程ID(PID),父进程ID(PPID),用于唯一标识进程和维护进程关系。
  • 进程状态:描述当前进程的状态,如就绪、运行、阻塞等。
  • CPU寄存器和程序计数器:保存当前的CPU状态,以便进行上下文切换。
  • 内存管理信息:如页表、段表,用于描述进程的内存空间。
  • 调度信息:包括进程优先级、时间片等,用于进程调度。
  • 资源信息:记录进程打开的文件描述符和使用的I/O设备。

通俗的讲:进程控制块(PCB,Process Control Block)本质上是一个数据结构,它是操作系统用来描述、管理和控制一个进程的所有关键信息的集合

形象的表述为

# 进程 = PCB(内核操作系统数据结构) + 自己数据代码

通过复杂的数据结构相互联系,形成有序的属性集合的连接(组织的过程

Linux系统下进程的管理

上述说OS是通过PCB进行进程的管理,在Linux下的PCB是tast_struct(tast_struct是PCB的一种),Linux下管理为2点

  1. Linux系统下通过task_struct进行属性的描述。
  2. Linux系统下本质是通过双链表进行连接,进而达到OS对进程的管理

查看正在跑的进程:

在这里插入图片描述

特别说明:

  • CWD(Current Working Directory),即当前工作目录
  • exe是你正在执行的文件

CWD的作用

  • 文件路径解析:在操作文件时,如果给定的路径是相对路径,那么相对路径就是基于当前工作目录进行解析的。例如,如果当前工作目录是/home/user,而你输入命令cat example.txt,系统会寻找/home/user/example.txt这个文件。

查看标识符

# 输入:
ps ajx | head -1 ; ps ajx | grep 18549

在这里插入图片描述

看向第二行:

  • **PID(Process Identifier,进程标识符)**是操作系统分配给每个正在运行的进程的一个唯一标识符,用于区分不同的进程。

  • PPID(Parent Process Identifier) 是操作系统中用于标识一个进程的父进程的标识符。每个进程都有一个PID(Process ID),此外也有一个PPID,它用来表示该进程是由哪个进程创建的。

# 我们过滤信息,为什么会出现这一行
17986 18592 18591 17986 pts/1    18591 S+    1000   0:00 grep --color=auto 18549

# 我们在过滤信息的通过`grep`, 这个也是个进程,所以在查看进程时过滤信息时候,grep也存在。

通过系统调用可以调用到获得PID和PPID

  1 #include<iostream>
  2 #include <unistd.h>
  3 #include<sys/types.h>
  4 using namespace std;
  5 
  6 int main()
  7 {
  8     while(true)
  9     {
 10         cout << "进程id:"<< getpid() <<endl;  // 调用PID
 11         cout << "进程pid:"<< getppid() <<endl; // 调用PPID
 12         sleep(3);
 13     }
 14     return 0;
 15 }

执行结果:

在这里插入图片描述

ps ajx | head -1 ; ps ajx | grep 19038

在这里插入图片描述

  • bash的PID是process的PPID
  • bashprocess的父进程,二者构成父子进程

通过系统调用创建进程

fork()介绍

fork() 是操作系统中的一个关键系统调用,用于在运行的进程中创建一个新的进程。它最常用于Unix和Linux操作系统中,通过调用fork(),一个现有的进程可以复制出一个新进程。被创建的新进程被称为子进程(Child Process),而调用fork()的原始进程被称为父进程(Parent Process)

fork() 的返回值

在这里插入图片描述

fork() 系统调用的返回值非常重要,因为它可以帮助进程分辨自己是父进程还是子进程

  • 父进程中返回子进程的 PID:在父进程中,fork() 的返回值是子进程的 PID(一个正整数),这意味着父进程可以知道新创建的子进程的进程标识符。
  • 子进程中返回 0:在子进程中,fork() 的返回值为0,这意味着子进程可以识别自己是由fork()产生的副本。
  • 错误返回值 -1:如果fork()调用失败,例如系统资源不足时,它会返回 -1,表示进程创建失败。此时,通常需要进行错误处理。
# 执行代码

#include<iostream>
  2 #include <unistd.h>
  3 #include<sys/types.h>
  4 using namespace std;
  5 
  6 
  7 int main()
  8 {
  9     pid_t id = fork();
 10 
 11     if(id == 0)
 12     {
 13         while(true)
 14         {
 15             cout<<"子进程:"<< id << endl;
 16             sleep(5);
 17         }
 18     }
 19     else if(id > 0)
 20     {
 21         while(true)
 22         {
 23             cout<<"父进程:"<< id << endl;
 24             sleep(5);                                                         
 35 	return 0;
 36 }

查看进程:

# 执行 每3秒刷新一下进程
while : ; do ps axj | head -1 && ps axj | grep process | grep -v grep ; sleep 3 ;done

在这里插入图片描述

    • 两个process 上面进程 PID 23296 下面进程的PPID是 23296
  • 父子进程和的PID是 21346

fork() 被调用时,操作系统会:

  • 操作系统创建一个新进程(子进程),并复制父进程的地址空间。此时父子进程的地址空间是独立的,但内容完全相同。

  • 虽然父子进程的地址空间是复制的,但现代操作系统通常使用**写时复制(Copy-on-Write)**优化。即只有在进程修改数据时,才真正复制内存。

  • 两个独立的进程在同时独立运行实现了返回值的不同,这就是为什么出现两个返回值。

如何实现区分

  • 操作系统在内核中维护进程表。当 fork() 被调用时,系统为子进程分配一个新的进程表项(即子进程的 PID)。

  • 根据系统调用的上下文,内核可以清楚地知道当前执行的是父进程还是子进程,并返回相应的值。

  • 上述代码在fork返回值的不同进程之间,数据发生了写时复制通过调用系统上下文对返回值进行确定。

什么出现两个返回值。

如何实现区分

  • 操作系统在内核中维护进程表。当 fork() 被调用时,系统为子进程分配一个新的进程表项(即子进程的 PID)。

  • 根据系统调用的上下文,内核可以清楚地知道当前执行的是父进程还是子进程,并返回相应的值。

  • 上述代码在fork返回值的不同进程之间,数据发生了写时复制通过调用系统上下文对返回值进行确定。

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

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

相关文章

R 语言科研绘图第 4 期 --- 折线图-置信区间

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…

软考高级架构-9.4.4-双机热备技术 与 服务器集群技术

一、双机热备 1、特点&#xff1a; 软硬件结合&#xff1a;系统由两台服务器&#xff08;主机和备机&#xff09;、一个共享存储&#xff08;通常为磁盘阵列柜&#xff09;、以及双机热备软件&#xff08;提供心跳检测、故障转移和资源管理功能的核心软件&#xff09;组成。 …

专题二十五_动态规划_两个数组的 dp (含字符串数组)_算法专题详细总结

目录 动态规划_两个数组的 dp &#xff08;含字符串数组&#xff09; 1. 最⻓公共⼦序列&#xff08;medium&#xff09; 解析&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a;​编辑 4. 填表顺序&#xff1a;​编辑 5. 返回值…

12,攻防世界simple_php

simple_php 题目来源:Cyberpeace-n3k0 题目描述: 小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。 进入靶场 这段PHP代码是一个简单的web应用示例&#xff0c;让我们逐步分析这段代码&#xff1a; show_source(__FILE__);&#xff1a;这行代码会显示当前文件的…

NIO - selector简单介绍

一 前言 selector作为NIO当中三大组件之一&#xff0c;是处理NIO非阻塞模式下的核心组件&#xff0c;它允许一个单个线程管理多个通道。 NIO下的阻塞模式 因为对于阻塞模式下的NIO模式&#xff0c;存在很大的问题&#xff0c;即使在单线程下&#xff0c;对应的服务端也会一直进…

二、部署docker

二、安装与部署 2.1 安装环境概述 Docker划分为CE和EE&#xff0c;CE为社区版&#xff08;免费&#xff0c;支持周期三个月&#xff09;&#xff0c;EE为企业版&#xff08;强调安全&#xff0c;付费使用&#xff09;。 Docker CE每月发布一个Edge版本&#xff08;17.03&…

Camp4-L2:LMDeploy 量化部署进阶实践

书生浦语大模型实战营第四期&#xff1a;LMDeploy 量化部署进阶实践 教程链接&#xff1a;https://github.com/InternLM/Tutorial/tree/camp4/docs/L2/LMDeploy视频链接&#xff1a;https://www.bilibili.com/video/BV18aUHY3EEG/?vd_sourceb96c7e6e6d1a48e73edafa36a36f1697…

Qt之第三方库QCustomPlot使用(二)

Qt开发 系列文章 - qcustomplot&#xff08;二&#xff09; 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类‌ 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…

LearnOpenGL学习(模型加载 -- Assimp,网格,模型)

完整代码见&#xff1a;zaizai77/Cherno-OpenGL: OpenGL 小白学习之路 Assimp 3D建模工具如Blender、3DS Max在导出模型文件时&#xff0c;会自动生成所有的顶点坐标、顶点法线和纹理坐标。 .obj 格式只包含了模型数据和材质信息&#xff08;颜色、贴图等&#xff09; Assi…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前&#xff0c;作者用 Qt 仿照前端 UI 设计了一个 ministack&#xff08;https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h&#xff09; 控件&#xff0c;这个控件可以折叠。部分用户体验后&#…

【Linux】文件管理必备知识和基本指令

【Linux】文件管理必备知识和基本指令 什么是操作系统什么是文件什么是路径01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令&#xff08;重要&#xff09;&#xff1a;06.rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a;rmdir指令rm指令 0…

R155 VTA 认证对汽车入侵检测系统(IDS)合规要求

续接上集“浅谈汽车网络安全车辆型式认证&#xff08;VTA&#xff09;的现状和未来发展”&#xff0c;有许多读者小伙伴有联系笔者来确认相关的R155 VTA网络安全审核要求&#xff0c;基于此&#xff0c;笔者将针对 R155 VTA 每一条网络安全审核细则来具体展开。 今天就先从汽车…

【PHP项目实战】活动报名系统

目录 项目介绍 开发语言 后端 前端 项目截图&#xff08;部分&#xff09; 首页 列表 详情 个人中心 后台管理 项目演示 项目介绍 本项目是一款基于手机浏览器的活动报名系统。它提供了一个方便快捷的活动报名解决方案&#xff0c;无需下载和安装任何APP&#xff0c…

【数据分享】1901-2023年我国省市县三级逐年最低气温数据(Shp/Excel格式)

之前我们分享过1901-2023年1km分辨率逐月最低气温栅格数据和Excel和Shp格式的省市县三级逐月最低气温数据&#xff0c;原始的逐月最低气温栅格数据来源于彭守璋学者在国家青藏高原科学数据中心平台上分享的数据&#xff01;基于逐月栅格数据我们采用求年平均值的方法得到逐年最…

使用伪装IP地址和MAC地址进行Nmap扫描

使用伪装IP地址和MAC地址进行Nmap扫描 在某些网络设置中&#xff0c;攻击者可以使用伪装的IP地址甚至伪装的MAC地址进行系统扫描。这种扫描方式只有在可以保证捕获响应的情况下才有意义。如果从某个随机的网络尝试使用伪装的IP地址进行扫描&#xff0c;很可能无法接收到任何响…

【趣题分享】赤壁之战每日演兵(原诸葛亮列传兵法题)求解算法

文章目录 序言1 求解算法代码&#xff08;python&#xff09;2 思路细节2.1 定义拼图与阵型2.2 穷举复杂度2.3 使用缓存进行改进&#xff08;&#xff09;2.3.1 LRU缓存2.3.2 将2.2的solve函数改写为可缓存装饰的 2.4 使用剪枝进行改进&#xff08;&#xff09;2.5 使用更好的状…

Java项目实战II基于微信小程序的私家车位共享系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加速&…