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

【进程 】

【进程】

  • 目录
      • 1. ELF格式程序与进程
      • 2. 进程的组织方式
      • 3. 进程的复刻(fork)
      • 4. 进程的状态

目录

1. ELF格式程序与进程

在Linux系统里,程序文件普遍采用ELF(Executable and Linkable Format)格式。这种格式的程序文件存储在硬盘上,处于静态。当程序被执行时,它会被载入内存,开启动态运行的进程之旅。具体来说,程序载入内存,就是把数据段、代码段等运行必不可少的资源复制到内存中。同时,系统会为这个正在运行的进程分配栈、堆等内存空间,让它从静态的程序转化为一个有生命力的、动态的实体。简单来讲,程序是静态存储在硬盘上的文件,进程则是程序在内存中运行的活动实例。
在这里插入图片描述

2. 进程的组织方式

在Linux操作系统中,除了系统启动时的初始进程,其余所有进程都源自一个父进程的复刻(fork)。这就如同人类家族繁衍,每个个体都由父母孕育而来。在整个Linux系统里,所有进程都起源于同一个初始进程,它们之间构成一棵倒置的进程树。通过pstree命令,我们能清晰地查看这些进程间的关系。例如:

shaseng@ubuntu:~$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]├─VGAuthService├─accounts-daemon───2*[{accounts-daemon}]├─acpid├─avahi-daemon───avahi-daemon├─bluetoothd├─boltd───2*[{boltd}]├─colord───2*[{colord}]├─cron├─cups-browsed───2*[{cups-browsed}]├─cupsd├─2*[dbus-daemon]├─fcitx├─fcitx-dbus-watc├─firefox─┬─Privileged Cont───18*[{Privileged Cont}]│         ├─Web Content───15*[{Web Content}]│         ├─Web Content───14*[{Web Content}]│         ├─WebExtensions───16*[{WebExtensions}]│         └─58*[{firefox}]├─fwupd───4*[{fwupd}]├─gdm3─┬─gdm-session-wor─┬─gdm-x-session─┬─Xorg───{Xorg}│      │                 │               ├─gnome-session-b│      │                 │               └─2*[{gdm-x-session}]│      │                 └─2*[{gdm-session-wor}]│      └─2*[{gdm3}]├─gnome-keyring-d───3*[{gnome-keyring-d}]├─gsd-printer───2*[{gsd-printer}]├─ibus-x11───2*[{ibus-x11}]├─irqbalance───{irqbalance}├─2*[kerneloops]├─mosquitto├─networkd-dispat───{networkd-dispat}├─packagekitd───2*[{packagekitd}]├─polkitd───2*[{polkitd}]├─pulseaudio───2*[{pulseaudio}]├─python3───2*[{python3}]├─rsyslogd───3*[{rsyslogd}]├─rtkit-daemon───2*[{rtkit-daemon}]├─snapd───14*[{snapd}]├─sogoupinyinServ───4*[{sogoupinyinServ}]├─sogoupinyinServ───8*[{sogoupinyinServ}]├─sshd├─systemd─┬─(sd-pam)│         ├─at-spi-bus-laun─┬─dbus-daemon│         │                 └─3*[{at-spi-bus-laun}]│         ├─at-spi2-registr───2*[{at-spi2-registr}]│         ├─dbus-daemon│         ├─dconf-service───2*[{dconf-service}]│         ├─evolution-addre─┬─evolution-addre───5*[{evolution-addre}]│         │                 └─4*[{evolution-addre}]│         ├─evolution-calen─┬─evolution-calen───8*[{evolution-calen}]│         │                 └─4*[{evolution-calen}]│         ├─evolution-sourc───3*[{evolution-sourc}]│         ├─gnome-shell-cal───5*[{gnome-shell-cal}]│         ├─gnome-terminal-─┬─bash───pstree│         │                 └─3*[{gnome-terminal-}]│         ├─goa-daemon───3*[{goa-daemon}]│         ├─goa-identity-se───3*[{goa-identity-se}]│         ├─gvfs-afc-volume───3*[{gvfs-afc-volume}]│         ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]│         ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]│         ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]│         ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]│         ├─gvfsd─┬─gvfsd-http───2*[{gvfsd-http}]│         │       ├─gvfsd-trash───2*[{gvfsd-trash}]│         │       └─2*[{gvfsd}]│         ├─gvfsd-fuse───5*[{gvfsd-fuse}]│         └─ibus-portal───2*[{ibus-portal}]├─systemd-journal├─systemd-logind├─systemd-resolve├─systemd-timesyn───{systemd-timesyn}├─systemd-udevd├─udisksd───4*[{udisksd}]├─upowerd───2*[{upowerd}]├─vmhgfs-fuse───3*[{vmhgfs-fuse}]├─vmtoolsd├─vmtoolsd───{vmtoolsd}├─vmware-vmblock-───2*[{vmware-vmblock-}]├─whoopsie───2*[{whoopsie}]└─wpa_supplicant

从这个输出可以看出,最顶层的系统进程是systemd。它的诞生很特殊,在系统启动前,其身份信息就已存在于系统分区,系统启动时直接被复制到内存。而其他进程,都是systemd这个初始进程的直接或间接后代。

3. 进程的复刻(fork)

除了系统初始化进程,其他进程都是通过fork()函数复刻产生的。这个复刻过程类似细胞分裂。当一个进程复刻出一个子进程时,会将自身的大部分资源复制一份给子进程。

  • 父子进程创建之初相同的属性
    • 实际用户ID(UID)和组ID(GID),以及有效UID和GID。这些ID决定了进程对系统资源的访问权限,父子进程在创建时权限属性一致。
    • 所有环境变量。环境变量为进程提供运行时的配置信息,比如系统路径、语言设置等,子进程会继承父进程的环境变量。
    • 进程组ID和会话ID。进程组和会话ID用于进程间的管理和通信,父子进程同属一个进程组和会话。
    • 当前工作路径。工作路径决定了进程在文件系统中的操作位置,父子进程初始时工作路径相同。
    • 打开的文件。如果父进程打开了一些文件,子进程也会拥有相同的文件描述符,指向这些打开的文件。
    • 信号响应函数。信号是系统与进程通信的一种方式,父子进程对各种信号的响应方式在创建时是一样的。
    • 整个内存空间,包括栈、堆、数据段、代码段、标准IO的缓冲区等。虽然父子进程的内存空间在物理上是独立的,但内容在创建时完全一致。
  • 父子进程不同的属性
    • 进程号PID。每个进程都有唯一的PID,就像身份证号码,用于系统识别和管理进程,父子进程的PID必然不同。
    • 记录锁。如果父进程对某个文件加了记录锁,子进程不会继承这把锁,因为锁是针对特定进程的资源访问控制。
    • 挂起的信号。挂起的信号是等待进程响应的信号,子进程不会继承父进程那些“悬而未决”的信号。

4. 进程的状态

进程作为动态活动的实体,有着多种运行状态,从创建到回收经历不同阶段:

  • 所有进程(除系统初始进程systemd外)都有父进程。父进程通过调用fork()函数创建子进程,新创建的子进程拥有和父进程相同的执行代码、内存空间(虽然内容一样,但内存区域相互独立)等信息,此时子进程处于就绪态(TASK_RUNNING),表示它已经准备好运行,只要获得CPU资源就能执行。
  • 当进程退出时,不管是主动调用退出函数还是因错误等被动退出,都会进入僵尸态(EXIT_ZOMBIE)。在僵尸态下,进程无法运行,也不能被调度,但它所占据的系统资源尚未释放。僵尸态是进程结束的必经状态,在编程中无法避免,但要防止进程长时间处于僵尸态,因为这会浪费系统资源。
  • 僵尸态进程需要等待其父进程回收其资源后,才能转变为死亡态(EXIT_DEAD) ,死亡态的进程所有占据的系统资源可以被系统随时回收。

相关文章:

【进程 】

【进程】 目录1. ELF格式程序与进程2. 进程的组织方式3. 进程的复刻(fork)4. 进程的状态 目录 1. ELF格式程序与进程 在Linux系统里,程序文件普遍采用ELF(Executable and Linkable Format)格式。这种格式的程序文件存…...

深入HBase——数据结构与算法

引入 通过前面的文章,我们对HBase已经有了基本认识,下面我们从HBase最核心的算法和数据结构进一步深入HBase。 HBase的一个列簇(Column Family)本质上就是一棵LSM树(Log-Structured Merge-Tree)​。LSM树…...

Python爬虫实战:获取六图网漫画图

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 一、引言 Python 作为一种广泛应用于数据处理和网络爬虫领域的编程语言,拥有丰富的库和框架。其中,Scrapy 框架以其高效、灵活、可扩展等特点,成为构建爬虫程序的…...

HAProxy介绍与编译安装

目录 1、HAProxy介绍 2、HAProxy编译安装 Centos 基础环境 Ubuntu 基础环境 编译安装HAProxy 验证HAProxy版本 HAProxy启动脚本 配置文件 启动haproxy 验证haproxy状态 查看haproxy的状态页面 1、HAProxy介绍 HAProxy是法国开发者 威利塔罗(Willy Tarreau) 在2000年…...

全链路优化:如何让单点登录认证接口并发性能翻倍?

背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…...

在Spring Boot中如何使用Freemaker模板引擎

在 Spring Boot 中使用 FreeMarker 模板引擎可以帮助你创建动态的 Web 页面。以下是详细的步骤和示例代码,介绍如何在 Spring Boot 项目里集成和使用 FreeMarker。 1. 添加依赖 如果你使用的是 Maven 项目,需要在 pom.xml 文件中添加 FreeMarker 相关依赖。Spring Boot 提供…...

Elasticsearch7.1.1 配置密码和SSL证书

生成SSL证书 ./elasticsearch-certutil ca -out config/certs/elastic-certificates.p12 -pass 我这里没有设置ssl证书密码,如果需要设置密码,需要再配置给elasticsearch 在之前的步骤中,如果我们对elastic-certificates.p12 文件配置了密码…...

个人简历html网页模板,科技感炫酷html简历模板

炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。这样一款黑色个人简历html网页模板,科技感炫酷html简历模板,设计效果类似科技看板图,可帮您展示技能、任职经历、作品等,喜欢这种风格的小伙伴不要犹豫哦。该素材呈现了数据符号排版显示出人形的动画效…...

在LangFlow中集成OpenAI Compatible API类型的大语言模型

一、背景与核心价值 从Dify换到这个langflow真的时各种的不适应啊。 就比如这个OpenAI Compatible API,这不应该是基本操作嘛? 算了,服了,习惯了就好了。咱闲言少叙,正片开始: LangFlow作为LangChain的可视化开发工具,其最大优势在于无需编写代码即可构建复杂的大模型…...

Qt开发中有关内存管理方面常见的问题分析与解决方案

在Qt开发中,内存管理是一个既基础又关键的一部分知识。尽管Qt提供了自动化的父子对象管理机制,但在复杂的应用场景中(如多线程、动态UI、异步操作等),我们在开发过程中,仍可能遇到内存泄漏、野指针、重复释…...

【outOfMemoryError】排查思路与解决方案

前言 不好啦❗ 天塌了❗ 系统崩了❗ 快看啊,程序outOfMemoryError了🙈 我的心里活动:“哈哈哈😀哈哈哈😀终于给我碰上了,这个问题可很少发生啊,又积累一个问题。虽然我昨天发了版本&#xff0…...

Python蓝桥杯刷题-小数第n位详解

题目描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。 如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。 本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开…...

Ubuntu服务器 /data 盘需要手动挂载的解决方案

服务器 /data 盘需要手动挂载的解决方案 如果重启服务器后,发现 /data 盘 没有自动挂载,通常是因为: /etc/fstab 配置文件 没有正确设置 自动挂载。该磁盘 没有被正确识别,需要手动挂载。文件系统错误 导致挂载失败。 下面是解…...

无法打开包括文件: “crtdbg.h”: No such file or directory

目录 无效解决措施(重装WindowsSDK) 有效解决措施 创建环境变量 添加环境变量INCLUDE 添加环境变量LIB RC无法运行 问题现象描述 复制以下文件至Error路径 无效解决措施(重装WindowsSDK) 参考文献:94176676/227706449-a5222d7d-d8d2-4a19-addb-8f546e69786f…...

番茄工作法html实现

对比了deepseek-r1-online和本地部署的14b的版本,输出的输出的html页面。 在线满血版的功能比较强大,可以一次完成所有要求。14b版本的功能有一些欠缺,但是基本功能也是写了出来了。 input write a html named Pomodoro-clock which “hel…...

多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题

多源 BFS 是一种解决 边权为 1 的多源最短路问题 的高效算法。其核心思想是将所有源点视为一个“超级源点”,通过一次 BFS 遍历即可计算所有节点到最近源点的最短距离。以下从原理、实现和代码示例三个方面深入讲解: 目录 一、原理分析 1. 单源 BFS vs…...

使用IDEA提交SpringBoot项目到Gitee上

登录Gitee并新建仓库 创建本地仓库 提交本地代码到本地仓库 提交本地代码到远程仓库...

我们来学人工智能 -- DeepSeek客户端

DeepSeek客户端 题记使用后记系列文章 题记 我选择了 Cherry Studio是国内产品由CherryHQ团队开源是一个平台在这里,有豆包、kimi、通义千问的入口当然,最主要是作为大模型的UI正如标题,这里,作为DeepSeep的客户端 使用 下载本…...

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…...

JavaScript函数-函数的使用

在JavaScript编程中,函数不仅是组织代码的基本单元,也是实现复杂逻辑、提高代码复用性和可维护性的关键工具。无论你是刚开始学习JavaScript的新手,还是希望深入理解函数使用的开发者,本文都将为你提供全面的指导。 函数的基础知…...

华为云AI开发平台ModelArts

华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

CSS | transition 和 transform的用处和区别

省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

日常一水C

多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...