当前位置:首页 > 技术学院 > 技术前线
[导读]线程是操作操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位,一个进程内可以包含多个线程,是资源调度的最小单位。

操作系统「进程」是学计算机都要接触的基本概念,抛开那些纯理论的操作系统底层实现,在Linux下做软件开发这么多年,每次程序运行出现问题,都要一步一步分析进程各种状态,去排查问题出在哪里,这次lemon带你在Linux环境下实操,一步步探究揭开「Linux进程」的那些秘密。

何为进程

首先我们说下「程序」的概念,程序是一些保存在磁盘上的指令的有序集合,是静态的。进程是程序执行的过程,包括了动态创建、调度和消亡的整个过程,它是程序资源管理的最小单位。

线程是操作操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位,一个进程内可以包含多个线程,是资源调度的最小单位。[引用维基百科]

一:理论知识

1:在了解linux进程之前,我们先来了解了解shell脚本在执行命令的过程,

shell也是一个程序,它与其他程

序最大的不同是:它的目的是执行其他程序,而不是从事计算,绘图,存储等等具体事务。分析一下shell的工作原理有助于破除shell的神秘感,更好的

掌握shell命令。以ls -l *.c 为例

1、shell不断询问是否有键盘输入,用户以enter结束键盘输入后,shell程序以空格为分隔符,得到"ls","-l","*.c",三个字符串。

2、

shell发现第三个字符串包含"*"通配符,就会在当前路径(或指定路径)下搜索满足这个通配符的文件。有bar.c和foo.c两个文件,然后展开成

{"ls","-l","bar.c","foo.c"}四个字符串,并保存在argv这个二维字符数组中,并赋值argc为4。

3、

shell然后搜索PATH这个全局变量保存的路径,寻找一个叫"ls"的命令。如果存在,则fork()一个子进程,调用exec()加载运行ls命

令。ls的main(int argc, string ** argv)函数的参数就是从shell那里得来的。若不存在就会提示用户"command

not found"。

4、ls程序执行后,会分析argc和argv,"-l"表示这是一个选项开关,表明用户想得到文件的详细信息,并把这个开关量保存,以便最后输出的时候选择信息的格式。

5、ls执行完既定的步骤后,退出并返回退出码,若成功则返回0,否则根据错误的不同返回不同的非零数字。

6、shell在得到成功退出码后,继续等待用户输入

如上:命令在执行过程中,

命令-->二进制文件--->运行---->作相应的加载--->得出结论 在此过程中,所记录的东西会产生进程;

2.进程:系统没有干完的活 即cpu未完成的工作,正在运行的程序 类型:程序进程/服务进程(eg:apache)常驻在内存中 一个程序运行时至少产生一个进程

在内核看来,进程是一个个实体,内核必须在它们之间共享各种计算机资源。对于像内存这样的受限资源来说,内核一开始会为进程分配一定数量的资源,并在进程的生命周期内,统筹该进程和整个系统对资源的需求,对这一分配进行调整。程序终止时,内核会释放所有此类资源,供其他进程重新使用。其他资源(如

CPU、网络带宽等)等属于可再生资源,但必须在所有进程间平等共享。

3.进程管理的作用:

判断服务器的健康状态

查看系统中的所有进程

杀死进程

4:进程的内存布局

逻辑上将一个进程划分为以下几个部分(也称为段)

文本 :程序的指令。

数据 :程序使用的静态变量。

堆 :程序可从该区域动态分配额外内存。

栈 :随机数调用、返回而增减的一片内存,用于为局部变量和函数调用链接信息分配存储空间。

5:创建进程和执行程序

进程可使用系统调用fork()来创建一个新进程。调用fork()的进程被称为父进程,新创建的进程则被称为子进程。内核通过对父进程的复制来创

建子进程。子进程从父进程处继承数据段、栈段以及堆段的副本后,可以修改这些内容,不会影响父进程的“原版”内容。(在内存中被标记为只读的程序文本段则

由父、子进程共享)

然后,子进程要么去执行与父进程共享代码中的另一组不同函数,或者,更为常见的情况是使用系统调用execve()去加载并执行一个全新程序。execve()会销毁现有的文本段、数据段、栈段及堆段,并根据新程序的代码,创建新段来替换它们。

6:进程ID和父进程ID

每一进程都有一个唯一的整数型进程标识符(PID).此外,每一进程还具有一个父进程标识符(PPID)属性,用以标识请求内核创建自己的进程。

7:进程终止和终止状态

可使用以下两种方式之一来终止一个进程:其一,进程可使用_exit(

)系统调用(或相关的exit()库函数),请求退出;其二,向进程传递信号,将其"杀死”。无论以何种方式退出,进程都会生成“终止状态”,一个非负小

整数,可供父进程的wait()系统调用检测。在调用_exit()的情况下,进程会指明自己的终止状态。若由信号来“杀死”进程,则会根据导致进程“死

亡”的信号类型来设置进程的终止状态。(有时会将传递进_exit()的参数称为进程的“退出状态”,以示与终止状态有所不同,后者要第指传递给

_exit()的参数值,要么表示“杀死”进程的信号。)

根据 惯例,终止状态为0表示进程“功成身退”,非0则表示有错误发生。大多数shell会将前一执行程序的终止状态保存于shell变量$?中。

二:进程的状态

1:system Monitor(命令打开:)中状态:status:1:sleeping(要使用时可以被唤醒)

2:running

3:stop(不可以自动唤醒 可以手动唤醒,cpu可以将此处所使用的信息传递给进程)

2.状态切换:系统回收cpu上缓存信息资源/使用某些程序

3.系统资源:硬盘 cpu 内存

cpu一级缓存(直接可以用)

二级缓存

内存(需要去取)如果内存中资源被回收,则进程关闭

4:ps 默认查看所处shell处产生的进程

三:进程所涉及的一些命令

####1.ps命令####ps

a ##关于当前环境的所有进程

x ##与当前环境无关的所有进程

f ##显示进程从属关系

e ##显示进程调用环境工具的详细信息

l ##长列表显示进程的详细信息

u ##显示进程的用户信息

加-和不加-的区别:

ps aux #查看系统中所有进程,使用BSD操作系统格式

ps -le # 查看系统中所有进程 ,使用linux操作格式

ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

user:该进程由哪个用户产生

pid:进程的id号

%cpu:该进程占用cpu资源的百分比

%mem:该进程占有物理内存百分比

VSZ:该进程占用虚拟内存的大小

RSS:该进程占用实际内存的大小

tty:该进程在哪个终端进行tty1-tty7代表本地控制台,pts/0-255代表虚拟终端

状态:

R:运行

S:睡眠

T:停止状态

s:包含子进程

+:位于后台

ps ax -o %cpu,%mem,user,group,comm,nice,pid ##指定显示进程的某些信息

%cpu ##显示进程cpu负载

%mem ##显示进程内存负载

user ##进程用户

group ##进程组

comm ##进程名称

nice ##进程优先级

pid ##进程的id

ps ax -o %cpu,comm --sort ##按照进程信息排序

+ ##正序

- ##倒序

%cpu ##cpu负载排序

%mem ##内存负载

####2.环境中进程的前后台调用####

jobs ##查看被打入环境后台的进程

ctrl+z ##把占用终端的进程打入后台

fg ##把后台进程调回前台

bg ##把后台暂停的进程运行

comm & ##让命令直接在后台运行

###7.top命令####

top ##监控系统负载工具

top 和 ps 区别

##ps看到的是命令执行瞬间的进程信息,top可以持续的监视

##ps只是查看进程,而top还可以监控系统性能,如平均负载,cpu,内存

##top可以直接操作进程,如改变优先级(命令r)和关闭进程(命令k)

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

CPU亲和度通过限制进程或线程可以运行的CPU核心集合,使得它们只能在指定的CPU核心上执行。这可以减少CPU缓存的失效次数,提高缓存命中率,从而提升系统性能。

关键字: Linux 嵌入式

一个线程只能属于一个进程,而一个进程可以有多个线程,线程是进程的一部分,就像工人是工厂的一部分。资源是分配给进程的,同一进程的所有线程共享该进程的全部资源,就像工厂里的工人共享工厂的设备和场地。处理机(CPU)则是分给线...

关键字: 进程 线程

DXC内部新成立的Boomi卓越中心(COE),将成为跨行业客户的创新枢纽 DXC与Boomi携手助力客户整合AI智能体,为规模化应用代理式AI做好准备 弗吉尼亚州阿什伯恩2025年8月19日 /美通社/ --名列财...

关键字: 进程 AI BSP 自动化

在Linux系统性能优化中,内存管理与网络连接处理是两大核心领域。vm.swappiness与net.core.somaxconn作为关键内核参数,直接影响系统在高负载场景下的稳定性与响应速度。本文通过实战案例解析这两个...

关键字: Linux 内存管理

对于LLM,我使用b谷歌Gemini的免费层,所以唯一的成本是n8n托管。在使用了n8n Cloud的免费积分后,我决定将其托管在Railway上(5美元/月)。然而,由于n8n是开源的,您可以在自己的服务器上托管它,而...

关键字: 人工智能 n8n Linux

在Linux系统管理中,权限控制是安全运维的核心。本文通过解析/etc/sudoers文件配置与组策略的深度应用,结合某金融企业生产环境案例(成功拦截98.7%的非法提权尝试),揭示精细化权限管理的关键技术点,包括命令别...

关键字: Linux 用户权限 sudoers文件

Linux内核中的信号量(Semaphore)是一种用于资源管理的同步原语,它允许多个进程或线程对共享资源进行访问控制。信号量的主要作用是限制对共享资源的并发访问数量,从而防止系统过载和数据不一致的问题。

关键字: Linux 嵌入式

在云计算与容器化技术蓬勃发展的今天,Linux网络命名空间(Network Namespace)已成为构建轻量级虚拟网络的核心组件。某头部互联网企业通过命名空间技术将测试环境资源消耗降低75%,故障隔离效率提升90%。本...

关键字: Linux 云计算

在Linux内核4.18+和主流发行版(RHEL 8/Ubuntu 20.04+)全面转向nftables的背景下,某电商平台通过迁移将防火墙规则处理效率提升40%,延迟降低65%。本文基于真实生产环境案例,详解从ipt...

关键字: nftables Linux

在Linux设备驱动开发中,等待队列(Wait Queue)是实现进程睡眠与唤醒的核心机制,它允许进程在资源不可用时主动放弃CPU,进入可中断睡眠状态,待资源就绪后再被唤醒。本文通过C语言模型解析等待队列的实现原理,结合...

关键字: 驱动开发 C语言 Linux
关闭