news 2026/8/27 20:52:01

进程与线程:从概念到实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进程与线程:从概念到实践

1. 进程概念

程序:存放在外存中的一段代码的集合。

进程:是程序动态执行的过程,包括创建、调度、消亡。

2. 进程命令

  • top:根据 CPU 占用率查看进程信息。
  • PID:唯一区分进程的 ID 号。
  • PPID:父进程的 ID 号。
  • ps -ef:查看进程信息。
  • pstree:查看进程关系。
  • ps -aux:查看进程运行状态。
  • kill:杀死进程。

任务后台执行:./a.out &

查看后台执行的任务:jobs

将后台任务放到前台执行:fg 编号

查看终端下的前后台任务:ps

修改进程优先级:nice -n 优先级 进程任务renice -n 优先级 进程PID

3. 进程的创建

3.1 进程空间划分

32 位操作系统下,进程占 0 - 4G 虚拟内存空间,可以划分为文本段、数据段及系统数据段。

  • 文本段:指令。
  • 数据段:字符串常量、未初始化全局变量/静态变量、初始化的全局变量/静态变量。
  • 系统数据段:堆区、栈区。

3.2 特性

  • 进程空间是独立的,每个进程独享进程空间。
  • 所有进程共享 0-4G 虚拟内存空间。
  • 分时复用。

3.3 进程调度

多个进程任务需要同时运行。常见进程调度算法:

  1. 先来先执行,后来后执行。
  2. 高优先级调度算法。
  3. 时间片轮转调度算法(宏观并行,微观串行)。
  4. 多级队列反馈调度算法。
  5. 负载均衡调度算法。

时间片:CPU 在进程任务中执行的一小段时间称为时间片。

3.4 进程状态

  • 就绪态(R):没有被 CPU 轮转到的正在执行的任务。
  • 运行态(R):正在被 CPU 执行的任务。
  • 可唤醒等待态(S):由于缺少资源让程序暂时挂起的状态,等待过程中可以被唤醒。
  • 不可唤醒等待态(D):等待过程中不会被唤醒称为不可唤醒等待态。
  • 停止态(T):由于系统需要让进程任务暂停,则将进程设置为停止态。
  • 僵尸态(Z):进程代码执行结束,空间没有被回收。
  • 结束态(X):代码执行结束,空间被回收的时刻。

4. 进程相关的函数接口

4.1 fork

pid_t fork(void); 功能:创建一个子进程空间 参数:缺省 返回值:成功父进程中返回子进程的 PID,子进程中返回 0,失败返回 -1

4.2 getpid

pid_t getpid(void); 功能:返回调用进程的进程 ID 号

4.3 exit

void exit(int status); 功能:进程结束

主函数中调用 exit 与调用 return 效果相同;函数体内调用 return,函数结束,调用 exit 让进程结束。

4.4 练习

创建一个进程的两个子进程,子进程中打印自己的 PID 和父进程的 PID,父进程中打印自己的 PID 和 2 个子进程的 PID。

5. 进程的消亡

5.1 僵尸进程产生原因

进程代码执行结束,空间没有被回收,就会成为僵尸进程。

5.2 如何避免产生僵尸进程

  • 让父进程先结束,子进程成为孤儿进程,被 init 进程收养,子进程结束,init 进程回收子进程空间,避免产生僵尸进程。
  • 子进程结束,父进程回收子进程空间,就能避免子进程成为僵尸进程。

6. 进程回收函数接口

pid_t wait(int *wstatus); 功能:回收子进程空间 参数:wstatus:存子进程结束状态空间的首地址 返回值:成功返回回收到的子进程的 PID,失败返回 -1

相关宏:

  • WIFEXITED(wstatus):检测子进程是否正常退出。
  • WEXITSTATUS(wstatus):获得子进程退出时的值。
  • WIFSIGNALED(wstatus):检测子进程是否被信号杀死。
  • WTERMSIG(wstatus):获得杀死信号的编号。

wait 回收子进程空间,避免子进程成为僵尸进程;wait 具有阻塞功能,能够实现多任务同步。

6.1 waitpid

pid_t waitpid(pid_t pid, int *wstatus, int options); 功能:回收指定子进程的空间 参数:pid:要回收的子进程的 PID wstatus:存放子进程结束状态空间的首地址 options:0 阻塞回收 WNOHANG 非阻塞回收 返回值:成功返回回收到的进程的 ID 号,失败返回 -1

WNOHANG设置非阻塞,如果子进程没有结束返回 0。

7. exec 函数族

exec 函数族的功能:利用进程空间执行另一段代码。

int execl(const char *path, const char *arg, ... /* (char *) NULL */); int execlp(const char *file, const char *arg, ... /* (char *) NULL */); int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */); int execv(const char *path, char *const argv[]); int execvp(const char *file, char *const argv[]); int execvpe(const char *file, char *const argv[], char *const envp[]);

参数说明:

  • path:路径名。
  • file:文件名。
  • l:参数以列表形式传递。
  • v:参数以指针数组形式传递。
  • p:在系统路径 PATH 下查找文件名。
  • e:执行另一段代码时更新进程的环境变量。

返回值:成功会执行另一份代码,失败返回 -1。

8. 环境变量

环境变量:进程在执行代码过程中临时存放信息的变量,称为环境变量。

extern char **environ;
int setenv(const char *name, const char *value, int overwrite); 功能:设置环境变量的值 参数:name:环境变量名称 value:设置的环境变量的值 overwrite:非 0 覆盖,0 不会覆盖 返回值:成功返回 0,失败返回 -1
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/27 20:50:52

生产代码库中LLM漂移的工程化防治方案

在生产代码库里跑 LLM,最大的麻烦往往不是模型“看不懂代码”,而是“跑着跑着就偏了”。同一个需求,早上的回答还严格遵循代码库现有风格,晚上再问一次,输出的实现方式就已经换了套路;让它基于某个模块做改…

作者头像 李华
网站建设 2026/8/27 20:49:59

【原创】基于微信小程序+AI大模型+uni-app的服装定制与裁剪预约小程序(设计与实现)

摘要:随着行业信息化建设持续推进,服装定制与裁剪平台相关业务对线上协同与数据沉淀的要求不断提高。传统线下或分散式办理方式存在流程繁琐、信息滞后、协作成本高、过程难追溯等弊端,难以适应便捷化、可管理的业务服务需求。同类课题亦多见…

作者头像 李华
网站建设 2026/8/27 20:46:33

【单片机课程设计/毕业设计】基于 STM32 的阈值可调式婴儿多指标监测与控制系统设计 基于 STM32 单片机的 MP3 语音安抚与婴儿环境监测装置(012205)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/8/27 20:44:53

FPGA数字频率计设计:Verilog实现与ModelSim仿真验证

1. 项目缘起:从“测不准”到“测得准”的FPGA实践 在FPGA开发的路上,测量一个未知数字信号的频率,听起来是个基础需求,但真动手做起来,坑可不少。你可能试过用单片机配合定时器和外部中断来数脉冲,精度受限…

作者头像 李华
网站建设 2026/8/27 20:44:26

3D高斯飞溅实战:从照片到可交互三维场景重建全流程

做三维场景重建的人这两年应该都听过高斯飞溅,也就是 3D Gaussian Splatting。它解决的问题很直接:给定一组从不同角度拍摄的照片,重建出一个能自由旋转视角、实时渲染的三维场景。比起传统点云重建和神经辐射场方案,高斯飞溅用一…

作者头像 李华
网站建设 2026/8/27 20:43:26

收藏 | AI时代前端开发者的破局之路:小白也能看懂的大模型应用指南

文章分析了当前前端开发的行业现状,指出低端前端因AI技术发展面临被替代的风险,而中高级复合型前端则需求旺盛。文章深入探讨了AI对前端开发的三层影响:懒人危机、强者工具、全新机遇。文章还根据不同阶段的前端开发者,提出了相应…

作者头像 李华