linux进程与服务
进程基本概念
1.进程:进程是程序的基本组成单位
2.应用程序:应用程序是以进程作为基本单位进行
3.服务:其是一种特殊的应用程序
4.程序和进程的区别:程序的静态的,进程是程序运行的动态过程,相同的程序在不同的数据下进程就是不同的(比如游戏不同账号的内容不同,就是进程不同),进程还具有并发性和交往性,但程序是封闭的
5.进程和线程的区别:进程可以有多个线程,一个线程只能被一个进程拥有,线程不可单独执行,但每一个线程都有程序的入口,只有组成进程才能被执行
一、进程的组成
进程数据块
作用:操作系统管理进程的“灵魂”数据结构。存储进程的许哦有状态信息,是进程存在的唯一标志
1.基本标识:
进程ID(PID):唯一标识符,用于区分系统中所有进程
父进程ID(PPID):记录创建当前进程的父进程ID,形成树结构
2.运行状态:
记录进程当前状态(运行、就绪、阻塞)及状态转换所需条件(比如等待I/O完成)
3.资源信息:
CPU相关:当前CPU寄存器值,(程序寄存器PC、通用寄存器值等,用于中断后恢复执行)
内存管理:进程虚拟地址空间范围、页表指针(关联物理内存映射)
- 文件描述符表:记录进程打开的文件、网络连接等资源句柄。
4.调度信息
- 进程优先级、调度算法所需参数(如时间片剩余值)。
5.进程间通信(IPC)
- 记录进程参与的共享内存、消息队列、信号量等 IPC 资源信息。
二、程序段(Text Segment)本质:进程执行的二进制代码(可执行文件的机器指令集合)
特点:
- 只读性:通常为只读,防止程序运行中被意外修改(保证代码执行的稳定性)。
- 可共享:多个进程可共享同一程序段(如多个终端同时运行同一个文本编辑器),节省内存空间。
- 与地址空间关联:加载到进程虚拟地址空间的只读区域,通过 CPU 的指令指针(PC)按顺序执行。
三、数据段(Data Segment)作用:存储进程运行时的静态数据,即生命周期内持续存在的数据。
分类及内容:
- 初始化数据段(Initialized Data Segment)
- 已初始化的全局变量:如int global_var = 10;,在程序加载时由操作系统分配固定内存并赋值。
- 静态变量:函数内声明的static变量(如static int count = 0;),生命周期与进程一致。
- 未初始化数据段(BSS Segment)
- 未初始化的全局 / 静态变量:如int uninitialized_var;,程序加载时由系统自动初始化为 0 或空指针。与程序段的区别:数据段可读写,且不同进程实例(如同一程序的多个运行副本)拥有独立的数据段,互不干扰。
四、堆栈段(Stack and Heap Segment)
1. 栈(Stack)功能:管理进程运行时的局部数据,遵循 ** 后进先出(LIFO)** 原则。
存储内容:
- 函数调用信息:
- 局部变量(非静态):如函数内声明的int a = 5;。
- 函数参数:传递给被调用函数的输入值。
- 返回地址:记录函数调用结束后应返回的下一条指令位置。
- 栈帧(Stack Frame):每个函数调用对应一个栈帧,包含上述信息,函数执行结束后栈帧自动销毁(内存释放由系统自动管理)。特点:
- 自动管理:内存分配和释放由编译器和操作系统自动完成,无需程序员干预。
- 大小固定:通常有固定上限(如 Linux 默认栈大小约 8MB),递归过深易引发 “栈溢出” 错误。
2. 堆(Heap)功能:
动态分配内存的区域,用于程序运行时申请不确定大小的内存块(如通过
malloc/
new创建对象)。
特点:
- 手动管理:程序员需显式申请(malloc/new)和释放(free/delete)内存,若未释放会导致内存泄漏。
- 空间灵活:理论上可扩展至进程虚拟地址空间的上限(受限于系统内存和进程权限)。
- 非连续分配:内存块在堆中不要求连续,通过链表或索引结构管理空闲块。
五、进程组成的逻辑关系
进程创建
进程由父进程创建,创建子进程的函数有很多,fork、exec、clone等,fork最常见
由父进程执行fork函数,新建的进程为子进程,PID为进程ID,PPID为父进程ID
0号进程
0号进程是linux系统首先启动的进程,由于其task_struct的comm字段为swapper,所以也称为swapper进程。当系统所有进程起来时,0号进程就蜕化为idle进程 ,当cpu无进程可执行就会执行idle,所以查看cpu进程时,idle%作为CPU空闲状态占比
1号进程
又称为init进程,Systemd是使用最多的init进程,它作为1号进程在操作系统中管理用户的进程,垃圾回收等动作
2号进程
由0号进程创建,是所有内核进程的父进程
Daemon后台运行进程也称为守护进程,守护进程就是父进程创建完子进程后,在子进程未退出前就直接退出,子进程成为孤儿进程,被init进程接管
linux系统启动过程
1.打开电源
2.从非易失性内存加载,执行加电自检(post),检测硬件基础啊状态
3.检测设备:识别硬盘、主板等硬件、为启动做准备
4.选择启动设备:从硬盘、光驱等选择
5.读取/etc/grup2.cfg文件,加载内核与依赖库,引导系统
6.启动systemd,用户首个进程,负责初始化和服务管理
7.通过default.target、multi-user.target (多用户模式),定义启动状态和服务集合
8.执行/systemd-logind(用户登陆管理)、etc/profile(系统环境配置)、~/.bashrc(用户Shell配置)等脚本
9.启动完成,可以登录
进程状态机
进程一般有三个状态运行、就绪、阻塞
1.运行态:进程具有运行条件,且正在使用CPU
2.就绪态:进程具有运行条件,等待系统分配cpu就可运行
3.阻塞态:进程缺乏某种运行条件,就算有空闲的CPU,进程也不能运行(cpu资源已释放)
注意:三种状态中,运行态和就绪态可以相互转换,运行态和阻塞态、阻塞态和就绪态只能单向转换。
R:正在运行或者正在就绪队列
S:可中断阻塞状态,除等待资源到位还可以被其他进行的信号唤醒
D:不可中断阻塞状态,只能被等待的资源唤醒,一般由于进程依赖I/O读写事件,但其发生异常(一般为硬盘),所以此时应该检测你的硬盘状态
Z:僵尸状态,进程结束但未消亡的一种状态,占用进程表项和pid,不占用cpu资源
T:进程已被停止,通常是由于用户或其他进程发出的信号,可通过另一信号返回运行态
T:正在调试的进程也显示为T暂停
N:低优先级进程
+:前台进程组进程
l:多线程进程
s:会话进程首进程 包含子进程
僵尸进程
进程调用exit函数后结束进程,但未真正销毁,形成一个僵尸进程的数据结构。其不占用cpu资源,但占用进程表项和pid,不可被执行,调度
查看僵尸进程
ps aux | grep python
显示Z的进程即为僵尸进程
top
其输出的第二行的最后一个zombie即为僵尸进程数
僵尸进程危害
占用进程表项、pid
由于linux系统中pid有限,当僵尸进程太多则会是系统无法产生新的进程由于pid被耗尽(类似于前面我们提到的inode编号,系统提示没有空间创建文件时,可能时block用尽,及磁盘空间用尽,还有一种可能就时inode编号耗尽)
处理僵尸进程
1.杀死父进程,让父进程带走僵尸进程
2.若父进程无法带走,就用kill -HUP 将其挂起。使其不在占用资源
孤儿进程
指父进程结束子进程还在进行,其子进程就被称为孤儿进程,但其会被init进程接管,调用wait()或者waidpid()回收孤儿进程,所以孤儿进程并不是一个问题
进程信息查看和管理
ps 列出当前的进程以及详细信息
用户识别符(uid)
进程识别符(pid)
cpu已经运行时间
进程在各个位置内存的分配
进程的位置
当前进程状态
常用参数
petree查询进程树
可将所有进程以树状图输出
pidof查询pid
pidof 进程名
可输出相关进程的pid
pgrep查询pid
pgrep 进程名
逐行输出pid
losf查看打开的套接字
losf访问核心文件所以只有root用户运行才能实现其完整功能
top进程实时信息监控
top
常用参数
-d 秒数 指定几秒更新
-n 次数 指定更新几次结束
-b 使用批处理模式,将命令重定向到文件中
-p 指定pid 只看某个进程的信息
-s 在安全模式下执行,避免在交互模式中出现错误
-u 指定uid 只监听某用户的进程
?/h 提供帮助
P: 以cpu使用率排序
M:以内存使用率排序
N:以PID排序
T:以cpu累计运行时间排序,time+
k:用于给进程信号,一般用于杀死进程 k pid (-9/15) 终止进程
r:按照PID给某个进程重新设置优先级
q:退出top
下面是top输出相关信息详解
free查看内存使用
vmstat 查询内存磁盘cpu
vmstat 2 5 (每2秒刷新一次,5次后退出)
常用参数
-s (显示内存)
-d (查看磁盘)
ps进程内存占用查询
ps auxk -%mem (根据MEM的使用率进行倒序排序)
vsz:虚拟内存,包括代码、数据、共享库等,所以通常比进程正在使用的物理内存大的多
RSS:较为精确的进程内存使用,仅计算RAM(随机存储器)中的内存
fg与bg
fg将后台工作恢复到前台运行
fg %工作号
bg让后台暂停的进程继续运作
bg %工作号
(注意工作号不是pid)
systemd
linux系统中,内核初始化后首先执行init(sysvinit、uostart、systemd),所有进程都由init直接或间接进行创建并运行,init以守护进程的身份存在,负责组织与运行相关初始化相关工作,让系统进入定义好的运行模式
systemd是进程服务总称,其控制管理系统的资源,systemd-login负责用户登录的信息创建、删除、修改等等
进程调度
解决问题
1.调度时机 进程正常终止、新进程创建、进程由运行变阻塞、由运行变就绪态
2.调度过程 加载新地址空间、切换内核栈和硬件上下文
3.调度算法
进程优先级
数字越小优先级越高
0-99 :实时优先级,内核调整
100-139:静态优先级、用户可控制
优先级越高,获得cpu运行机会更多、运行时间更多
系统进程停止命令
kill all(指定名称杀死进程)
yum install psmisc -y
killall -参数 进程名
pkill与kill 基本相同,用进程名杀死进程
不加参数则杀死所有有关进程名的进程