Linux学习笔记:进程

最近在学Linux多任务,核心就两种实现方式:多进程和多线程。先把进程这块理清楚。

一、进程是什么

进程就是正在执行的程序,要吃内存和CPU。跟程序的区别挺关键的:

  • 程序存在硬盘上,是静态的指令集合;进程存在内存里,运行时要CPU参与

  • 进程有生命周期,从启动到消亡,是动态的

  • 一个程序跑起来可以产生多个进程,一个进程里也能执行多个程序

启动一个进程很简单, ./a.out 就行。创建时操作系统会给它分配0-4G的虚拟内存空间,进程是系统资源分配的最小单位。

二、进程调度

CPU调度进程是宏观并行、微观串行,这叫并发。真正的并行是多个任务同时执行,那得多核CPU才行。

常见的调度算法有四种:时间片轮询、先来先服务、高优先级优先、短作业优先。

三、Linux进程的七种状态

这块面试经常问,列一下:

状态 标识 说明

运行态 R 正在被CPU调度执行

就绪态 R 万事俱备只缺CPU

可唤醒等待态 S 睡眠态,阻塞等资源

不可唤醒等待态 D 不希望被调度打断的任务

暂停态 T 被暂停执行

僵尸态 Z 进程结束了但资源没回收

结束态 X 进程结束,资源已回收

四、进程相关命令

平时排查问题常用的几个:

  • ps -aux :查看所有进程的PID、状态、CPU和内存占用,配合 grep 过滤很方便

  • ps -ef :能看到PPID(父进程ID)

  • top :动态查看进程状态和资源占用

  • pstree :看进程间的创建关系,像族谱一样

  • kill -9 PID :强制结束进程, kill -l 可以查看所有信号

  • fg :把后台进程调到前台, jobs 查看后台进程编号

五、进程创建:fork()

这是重点。 fork() 创建子进程,操作系统会把父进程0-3G的用户空间完整拷贝一份给子进程,内核空间只拷贝PCB块。PID、PPID、程序执行位置这些不拷贝。

要注意:

  • 所有进程共用3G-4G的内核空间

  • 但各自0-3G的用户空间互相独立,不能直接通信

  • 进程间通信得靠内核空间,也就是IPC机制

函数原型:

#include <unistd.h>

pid_t fork(void);

返回值有点绕,需要区分:

  • 父进程里返回子进程的PID(大于0)

  • 子进程里返回0

  • 失败返回-1

配合 getpid() 拿自己的PID, getppid() 拿父进程的PID。

写个最简单的例子:

#include <stdio.h>

#include <unistd.h>

int main()

{

pid_t pid = fork();

if (pid < 0) {

perror("fork failed");

return -1;

} else if (pid == 0) {

printf("子进程: PID=%d, 父进程PID=%d\n", getpid(), getppid());

} else {

printf("父进程: PID=%d, 子进程PID=%d\n", getpid(), pid);

}

return 0;

}

六、进程退出

退出方式有四种:执行完自然退出、main函数return、调用 exit() 、被信号干掉(比如kill -9)。

#include <stdlib.h>

void exit(int status);

status为0表示正常退出,非0表示异常退出。另外还有 _exit() 和 _Exit() ,区别在于exit会刷新缓冲区、做清理工作,而_exit直接进入内核。

七、僵尸进程和孤儿进程

这俩概念容易搞混:

  • 僵尸进程:进程已经退出了,但父进程没回收它的资源。状态是Z。避免方法:父进程用 wait() 或 waitpid() 回收,或者让它变成孤儿进程由系统回收。

  • 孤儿进程:父进程先结束了,子进程就成了孤儿,会被系统进程收养,结束后由系统回收。守护进程就是典型的孤儿进程。

相关推荐
学长毕设6 分钟前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
readhere21 分钟前
从ZYNQ7000开发板,学会启动嵌入式Linux系统——入门学习:EBAZ4205篇目录
linux·启动·嵌入式linux·zynq7000·ebaz4205
罗西的思考1 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水1 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
打工仔折腾 AI2 小时前
在 Ubuntu ARM64 部署 Q1 V3.0 MuJoCo 模型:加载、单步推理与执行器响应解析
linux·运维·人工智能·python·深度学习·ubuntu·性能优化
‎ദ്ദിᵔ.˛.ᵔ₎2 小时前
关于Linux 线程局部存储的认识
linux·运维
下一站春风里3 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
DRobot3 小时前
【机械制图与CAD实战(二十五)】螺纹的表示方法
算法·机械制图
用户老李3 小时前
卡尔曼滤波自学教程 10:无迹卡尔曼滤波(UKF)
算法
小小de风呀4 小时前
de风——【从零开始学习Linux】(九):进程基础 —— 从冯诺依曼体系到 fork 创建进程
linux·学习