linux的进程基础

Linux进程管理1 - 进程基础 进程调度基础 阅读详情

计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令(instruction)。所谓的程序(program),就是这样一系列指令的所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时候被存储为可执行的文件。这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭菜。

那么,程序和进程(process)的区别又是什么呢?

进程是程序的一个具体实现。只有食谱没什么用,我们总要按照食谱的指点真正一步步实行,才能做出菜肴。进程是执行程序的过程,类似于按照食谱,真正去做菜的过程。同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口。

操作系统的一个重要功能就是为进程提供方便,比如说为进程分配内存空间,管理进程的相关信息等等,就好像是为我们准备好了一个精美的厨房。

 

看一眼进程

首先,我们可以使用$ps命令来查询正在运行的进程,比如$ps -eo pid,comm,cmd,下图为执行结果:

(-e表示列出全部进程,-o pid,comm,cmd表示我们需要PID,COMMAND,CMD信息)

 

每一行代表了一个进程。每一行又分为三列。第一列PID(process IDentity)是一个整数,每一个进程都有一个唯一的PID来代表自己的身份,进程也可以根据PID来识别其他的进程。第二列COMMAND是这个进程的简称。第三列CMD是进程所对应的程序以及运行时所带的参数。

(第三列有一些由中括号[]括起来的。它们是内核的一部分功能,被打扮成进程的样子以方便操作系统管理。我们不必考虑它们。)

 

我们看第一行,PID为1,名字为init。这个进程是执行/bin/init这一文件(程序)生成的。当Linux启动的时候,init是系统创建的第一个进程,这一进程会一直存在,直到我们关闭计算机。这一进程有特殊的重要性,我们会不断提到它。

 

如何创建一个进程

实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux内核并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。进程存活于内存中。每个进程都在内存中分配有属于自己的一片空间 (address space)。当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。

老进程成为新进程的父进程(parent process),而相应的,新进程就是老的进程的子进程(child process)。一个进程除了有一个PID之外,还会有一个PPID(parent PID)来存储的父进程PID。如果我们循着PPID不断向上追溯的话,总会发现其源头是init进程。所以说,所有的进程也构成一个以init为根的树状结构。

如下,我们查询当前shell下的进程:

 

root@vamei:~# ps -o pid,ppid,cmd
  PID  PPID CMD
16935  3101 sudo -i
16939 16935 -bash
23774 16939 ps -o pid,ppid,cmd

我们可以看到,第二个进程bash是第一个进程sudo的子进程,而第三个进程ps是第二个进程的子进程。

 

还可以用$pstree命令来显示整个进程树:

复制代码
init─┬─NetworkManager─┬─dhclient
     │                └─2*[{NetworkManager}]
     ├─accounts-daemon───{accounts-daemon}
     ├─acpid
     ├─apache2─┬─apache2
     │         └─2*[apache2───26*[{apache2}]]
     ├─at-spi-bus-laun───2*[{at-spi-bus-laun}]
     ├─atd
     ├─avahi-daemon───avahi-daemon
     ├─bluetoothd
     ├─colord───2*[{colord}]
     ├─console-kit-dae───64*[{console-kit-dae}]
     ├─cron
     ├─cupsd───2*[dbus]
     ├─2*[dbus-daemon]
     ├─dbus-launch
     ├─dconf-service───2*[{dconf-service}]
     ├─dropbox───15*[{dropbox}]
     ├─firefox───27*[{firefox}]
     ├─gconfd-2
     ├─geoclue-master
     ├─6*[getty]
     ├─gnome-keyring-d───7*[{gnome-keyring-d}]
     ├─gnome-terminal─┬─bash
     │                ├─bash───pstree
     │                ├─gnome-pty-helpe
     │                ├─sh───R───{R}
     │                └─3*[{gnome-terminal}]
复制代码

 

fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。实际上,子进程总可以查询自己的PPID来知道自己的父进程是谁,这样,一对父进程和子进程就可以随时查询对方。

通常在调用fork函数之后,程序会设计一个if选择结构。当PID等于0时,说明该进程为子进程,那么让它执行某些指令,比如说使用exec库函数(library function)读取另一个程序文件,并在当前的进程空间执行 (这实际上是我们使用fork的一大目的: 为某一程序创建进程);而当PID为一个正整数时,说明为父进程,则执行另外一些指令。由此,就可以在子进程建立之后,让它执行与父进程不同的功能。

 

子进程的终结(termination)

当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数)。在这个信息里,会解释该进程为什么退出。父进程在得知子进程终结时,有责任对该子进程使用wait系统调用。这个wait函数能从内核中取出子进程的退出信息,并清空该信息在内核中所占据的空间。但是,如果父进程早于子进程终结,子进程就会成为一个孤儿(orphand)进程。孤儿进程会被过继给init进程,init进程也就成了该进程的父进程。init进程负责该子进程终结时调用wait函数。

当然,一个糟糕的程序也完全可能造成子进程的退出信息滞留在内核中的状况(父进程不对子进程调用wait函数),这样的情况下,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。

 

进程与线程(thread)

尽管在UNIX中,进程与线程是有联系但不同的两个东西,但在Linux中,线程只是一种特殊的进程。多个线程之间可以共享内存空间和IO接口。所以,进程是Linux程序的唯一的实现方式。

 

总结

程序,进程,PID,内存空间

子进程,父进程,PPID,fork, wait

 

欢迎阅读“骑着企鹅采树莓”系列文章

2025趋势:经济学研究中AI多智能体系统的6大架构方向(AI应用架构师必藏) 多智能体系统(MAS)由多个相互作用的智能体组成,每个智能体具备自主决策能力、感知环境的能力和与其他智能体通信的能力。微观行为的精细化建模:智能体可被赋予异质的偏好函数、信息集和决策规则,模拟真实市场的多样性动态交互的涌现性分析:通过智能体间的局部互动(如交易、合作、竞争),观察宏观经济现象的涌现过程反事实政策实验:在虚拟环境中安全测试极端政策(如负利率、全民基本收入)的连锁反应实时自适应调整:智能体可通过机器学习持续优化策略,模拟经济系统的演化特性。 阅读详情

相关推荐

从零搭建 AI 运维 Agent:告警自动诊断 + 修复的完整技术方案

适合读者:管理 5-50 台服务器的运维/SRE 工程师、技术负责人 技术栈:FastAPI + React + PostgreSQL + Redis + DeepSeek 关键词:AI运维、AIOps、自动化运维、智能告警、告警修复、Runbook自动化、DevOps、SRE、DeepSeek运维

weixin_38359457的博客 1640

Linux进程基础

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令 (instruction)。所谓的程序(program),就是这样一系列指令的所构成的集合。通过程序,我们可以让计算机完成复杂的操作。程序大多数时...

weixin_33750452的博客 213

别再手动量了!用Python+Open3D给BIM模型做‘CT扫描’,自动揪出施工误差(附完整代码)

本文介绍如何利用Python和Open3D技术实现BIM模型的毫米级施工误差自动检测。通过点云预处理、模型配准和偏差分析,系统能自动生成三维差异热力图和验收报告,显著提升施工质量检测效率。特别适合混凝土结构错位和钢结构安装偏差等常见问题的智能分析。

weixin_29284657的博客 243

一文搞懂linux进程

1.进程的概念: 程序运行起来就是进程,系统会给进程分配cpu,内存,所属用户和权限.... 2.进程的分类 #pstree命令查看进程数,第一列是主进程(systemd)只有一个,第二列是父进程,第三列是子进程,第四列是子子进程,一般进程也就到 第四列 [root@node-10 ~]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─...

rqaz123的博客 7599

使用JAVA 的 POI 库 将DOC文件转为DOCX文件

java使用POI库,将doc文件转为docx文件

qq_45808266的博客 5708

【深度学习新浪潮】李飞飞团队VAGEN框架深度解析:让VLM智能体学会“三思而后行“

VAGEN框架的真正价值,不仅在于性能指标的突破,更在于重新定义了VLM智能体的发展方向——人工智能的进步不应只追求"做得对",更要实现"想得清"。李飞飞团队通过强制显式思考、动态表示适配和精细化奖励三大创新,让智能体第一次具备了可解释的世界建模能力。正如人类通过"观察-预测-行动"认识世界,VAGEN为AI注入的这种思考范式,或许正是通往通用人工智能的关键一步。对于开发者而言,开源的VAGEN框架不仅提供了强大的工具,更揭示了一个重要理念:让AI学会思考,比让它学会执行更重要。

专注:太空算力、AI infra、异构调度、大模型成本工程 281

【怀旧编程技术】Merlin汇编器 - 6502交叉汇编环境手册

Merlin 32是一个在Windows、Linux和Mac OS X下运行的多通道交叉汇编程序,针对6502系列中的8位处理器(如6502和65c02)和16位65c816处理器。与Glen Bredon的Merlin 16+语法兼容,包括对宏、预处理器、逻辑表达式、条件运算、变量、循环、LABLE的支持等。

XinclairQAQ的博客 2246

在 SAP S/4HANA 分析模型中添加 Measures,Calculated、Restricted、Currency Conversion 与 Unit Conversion 的建模思路

摘要: SAP S/4HANA分析查询建模中,度量(measure)的加工层级是关键难点,涉及聚合时机、币种/单位语义、过滤上下文等复杂因素。度量不仅是数字字段,还需处理计算口径(Calculated Measures)、上下文绑定(Restricted Measures)和单位转换等问题。Calculated Measures适合派生指标(如毛利率),需注意聚合前后计算差异;Restricted Measures通过固化过滤条件(如区分实际/计划金额)确保业务语义一致性。建模时应将业务逻辑下沉到分析模型层

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1024

Linux报 “illegal instruction” 异常的原因以及解决办法

当 Linux 上的程序收到 “Illegal instruction” 错误时,它表示正在尝试执行一种不支持的 CPU 指令,通常是由于使用了错误的 CPU 架构导致的。

“Struggle”的博客 1万+

YOLOv8模型压缩终极方案:LAMP剪枝实战,速度提升不掉点

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

LXY_LOVE36的博客 176

【中科院一区Top-源码复现】Day-ahead photovoltaic power forecastingwith multi-source temporal-featureconvoluti

【中科院一区Top-源码复现】Day-ahead photovoltaic power forecastingwith multi-source temporal-featureconvoluti

739

linux成为init子进程,Linux初始化进程(init)

初始化进程(init)“Uuno on numero yksi”(Slogan for a series of Finnish movies.)本章描述init进程,它是内核启动的第一个用户级进程。init有许多很重要的任务,比如象启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。本章解释了怎样配置init以及如何运用不同的运行级别。第一步init对于Linux系统的运行来说,ini...

weixin_31099291的博客 419

AUTOSAR进阶图解==>AUTOSAR_SWS_COM

AUTOSAR COM模块是AUTOSAR通信堆栈的核心组件,提供信号导向的通信服务。该模块位于通信服务层,连接RTE与PDU Router,主要功能包括信号封装/提取、传输模式管理、信号路由、超时监控和字节序转换等。COM模块架构分为应用层、通信服务层和通信抽象层,包含信号管理、I-PDU处理、传输模式管理等组件。其配置结构包括顶层容器、I-PDU组、I-PDU和信号等多层次配置对象,支持丰富的参数设置。模块采用严格的状态管理机制,包括模块状态和I-PDU组状态转换,确保通信可靠性。

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1245

【Linux】Linux 进程基础

在时间片轮转调度算法中,系统根据先来先服务的原则,将所有的就绪进程排成一个就绪队列,并且每隔一段时间产生一次中断,激活系统中的进程调度程序,完成一次处理机调度,把处理机分配给就绪队列队首进程,让其执行指令。从上述的结果可以看出,main函数的进程和fork创建的进程打印的结果是一样的,并且通过pid和ppid发现,fork的父进程就是main函数的进程,说明fork所创建出来的子进程和父进程在内存上映射。进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。

Antonio915的博客 1210

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Linux】进程基础

本文介绍了Linux进程的基础知识,包括进程的概念、虚拟内存、CPU权限转换、状态转换等核心内容。进程是程序的动态执行单位,操作系统通过虚拟内存机制为每个进程分配独立的用户空间和共享的内核空间。文章详细讲解了fork()和execl()等关键系统调用,以及多进程创建和程序加载的实现方式。同时,还阐述了CPU权限级别转换、上下文保存恢复机制等底层原理,帮助理解操作系统如何实现多任务调度和资源管理。这些基础知识对理解Linux系统编程具有重要意义。

2301_79594905的博客 2153

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux——进程基础

当一个进程需要键盘、网卡、磁盘等硬件资源时,操作系统会将该进程PCB链入到对应的设备队列中,等待硬件资源就绪,此时进程的PCB状态会变成阻塞,当硬件资源获取完毕就会将该进程的PCB继续链入到运行队列中,进程状态又会变成R运行状态。fork函数创建的子进程的其PCB里面的数据大多数都是拷贝的父进程的,即子进程是以父进程为模版,所以子进程所要执行的代码也是跟父进程指向同一块区域。一般在Linux中,普通进程都有它的父进程,因为该进程是被其父进程创建出来的,所以。进程所谓的状态,其实本质就是。

m0_74357404的博客 1076

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Linux 进程控制 基础IO

子进程只打印它自己的 “After”,因为它从 fork() 之后开始执行,不会执行 fork() 之前的 printf 语句。子进程 PID (例如 45110) 会被打印,然后父进程会等待5秒,打印 “this is test for wait”,最后打印子进程的退出码 (这里是 1,因为 257 & 0xFF = 1)。当父进程或子进程尝试写入共享数据时,内核会为写入方创建一个该数据页的副本,从而实现父子进程数据段的独立性。创建子进程后,子进程执行的是和父进程相同的程序(可能执行不同的代码分支)。

m0_70403090的博客 1228

Linux的进程替换以及基础IO

上一篇草率的讲完了进程地址空间的组成结构和之间的关系,那么我们接下来了解一下程序的替换。首先,在进程部分我们提过了,其实文件可以在运行时变成进程,而我们使用的Linux软件其实也是一个进程,所以进一步来说,我们在Linux里写的一切文件都是子进程,而进程的替换一般就发生在父子进程之间,我们先了解一下它的特性,首先如果使用了进程替换,那么它会在替换处直接取代原有代码,覆盖式的运行,所以并不会产生新的子进程,也不会减少进程。所以一旦替换成功,之后的代码都会被覆盖不会执行。

qq_51777557的博客 862

Linux系统编程——进程基础

进程是操作系统中运行程序的实例,是资源分配的基本单位,每个进程有唯一PID。进程可通过fork创建子进程,子进程继承父进程资源但拥有独立地址空间,采用写时复制技术。进程通信方式包括管道、信号、IPC和Socket。孤儿进程由init收养,僵尸进程需用wait回收。守护进程是后台运行的特殊进程,需脱离终端并执行特定任务,创建步骤包括fork、setsid、更改工作目录等。实验演示了进程创建、exec函数替换、进程状态查看及守护进程的实现方法。

2301_80366509的博客 1550

《Linux系统编程之进程基础》【进程入门】

🎉吃透进程入门核心,解锁 Linux 系统编程第一步,零基础也能轻松上手!💕

序属秋秋秋的博客 1880

Linux内核中的进程调度-进程调度基础

在深入探讨Linux内核的精妙世界中,进程调度无疑是最具挑战性也最为关键的一个环节。它作为操作系统核心功能的一部分,犹如交响乐团中的指挥家,精准而高效地协调着系统中各个进程的执行顺序和时间分配,确保整个系统的性能表现与资源利用达到最佳平衡。Linux内核的进程调度器不仅负责决定哪个进程将在CPU上运行,何时运行,还涉及到优先级管理、实时性保证、多处理器调度策略等诸多复杂问题。

qq_45652092的博客 1756

Linux系统中的进程基础

在Linux中,我们通常会涉及进程的创建、管理、优先级调整以及进程间的通信。本文将深入讲解Linux中的进程组成、管理、调度命令以及如何控制进程的优先级和状态。交互式进程是与用户直接交互的进程。这类进程需要快速响应用户的输入,通常具有较高的优先级,且执行时间较短。Linux允许将进程分为前台进程和后台进程,前台进程占用终端输入和输出,而后台进程则在后台运行。每个进程在操作系统中都有一个唯一的标识符—进程ID(PID)。在Linux中,进程的优先级控制其调度的顺序,使用。命令用于修改已经运行进程的优先级。

2301_80067496的博客 968

Linux编程基础:第6章Linux进程管理 课后习题

《Linux编程基础》黑马程序员/编著清华大学出版社 目录 一、填空题 二、判断题 三、单选题 四、简答题 1、简单说明程序和进程的区别。 2、分析程序,写出程序的执行结果。 五、编程题 1、编写程序,在程序中创建一个子进程,使父子进程分别打印不同的内容。 2、编写程序,在程序中创建一个子进程,使子进程通过exec更改代码段,执行cat命令。 一、填空题 1、进程的属性保存在一个被称为(进程控制块/PCB)的结构体中,这个结构体中包括(进程控制符/PID)、进程组、进程环境、进.

WHT869706733的博客 8402

LINUX-进程管理及基础管理

linux是一款免费且开源的操作系统,允许用户自由使用、修改和分发源码,Linux发行版基于相同内核,但集成不同的软件包和管理工具,有上百种不同的发行版如Red Hat系列CentOS,能兼容企业级功能Linux操作系统嵌入了TCP/IP协议栈,协议软件具有路由转发功能。路由转发依赖作为路由器的主机中安装多块网卡,当某一块网卡接收到数据包后,系统内核会根据数据包的目的IP地址,查询路由表,然后根据查询结果将数据包发送到另外一块网卡,最后通过此网卡把数据包发送出去。此主机的处理过程就是路由器完成的核心功能。

2403_87902721的博客 1247
上一篇: syslog.h和android的log系统冲突问题
下一篇: 不联网情况下解决 Unknown host 'services.gradle.org'.You may need to adjust the proxy settings in Gradle问题
class_brick
博客等级 码龄12年 223粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值