今天是学习嵌入式的第31天

今天我们来说说进程!

进程

程序:硬盘上的可执行文件,是一堆静态代码。

进程:程序跑起来之后的动态实例,有自己内存、PID,经历创建、运行、消亡。

进程常用命令

• top:看进程CPU占用;

• ps‑ef:查看系统全部进程;

• ps‑aux:看更详细进程状态;

• kill -9 PID:强制干掉某个进程;

• &放在命令末尾,程序丢后台跑;fg把后台任务切回前台。

进程虚拟内存空间

每个进程拿到一套独立0‑4G虚拟内存,内核通过MMU映射到真实物理内存。

分段:

  1. 文本段:存放你的代码指令;

  2. 数据段:存全局、静态变量;

  3. 栈区:存局部变量,函数调用栈,函数执行完自动回收;

  4. 堆区:程序员手动malloc/free申请释放的内存。

进程状态

  1. 就绪态R:准备好了,等着CPU调度分配时间片;

  2. 运行态R:CPU正在跑这个进程;

  3. 可唤醒等待态S:在等某个资源,资源来了可以被唤醒接着跑;

  4. 不可唤醒等待态D:卡在IO,不能被信号唤醒;

  5. 停止态T:进程被暂停;

  6. 僵尸态Z:进程代码已经跑完退出了,但是父进程没回收它资源,残留PCB占系统资源;

  7. 结束态X:资源全部回收干净。

fork()

系统调用,用来创建子进程。调用一次,会返回两次值:

  1. 在父进程里面:返回子进程的PID号;

  2. 在新生成的子进程里面:返回0;

  3. 创建失败返回‑1。

底层写时复制COW:刚fork完父子进程共享物理内存,只有某一方要修改数据的时候,内核才复制那一块内存给子进程,不会全盘复制内存节省开销。fork之后父子进程是完全独立两套空间,子进程改变量不会影响父进程。

getpid() / getppid()

getpid()拿到自己这个进程的PID;getppid()拿到自己父进程的PID。

exit()

直接结束当前整个进程。注意区分return:return只是从函数返回;只有main里面return才等价exit,别的函数里面return仅仅退出函数,不会结束整个程序。

wait()

父进程调用,阻塞等待任意一个子进程死掉。子进程结束之后,wait回收子进程的残留资源,避免僵尸进程。

参数可以传一个int变量地址,用来存子进程退出的状态信息。成功返回死掉的子进程PID,失败‑1。

重点:wait会卡住父进程不动,直到有子进程结束。

waitpid()

比wait更灵活,可以指定等待某一个特定PID的子进程,还可以设置非阻塞模式(选项传WNOHANG,不卡父进程,子进程没结束就直接返回0)。

exec函数族(execl execlp execv execvp等)

exec不会创建新进程!PID不变,把当前进程里面全部旧代码、内存全部清空,加载磁盘上另一个新程序,从新程序main开始跑。

一般搭配fork:fork出来子进程,子进程调用exec跑别的程序。终端shell执行ls、pwd命令底层就是这套逻辑。

记忆后缀:

• l:参数用逗号列表一个个写;

• v:参数放字符串数组传进去;

• p:会去PATH环境变量路径里面找程序,不用写完整路径;

• e:可以自己给新进程设置环境变量。

setenv

设置环境变量,环境变量是进程全局可以访问的键值对,子进程默认会继承父进程环境变量。

相关推荐
飞Link17 分钟前
什么是 PX4?一文了解 PX4 在空地协同中的作用
算法·无人机
whyutianict_vv19 分钟前
云计算 HCIE 认证体系解析:HCIA/HCIP/HCIE 三级科目与知识边界
linux·运维·云计算
一去不复返的通信er7 小时前
力扣-图论-岛屿数量
算法·leetcode·图论
0+1117 小时前
Linux --从 poll 到 epoll多路转接
linux·服务器·1024程序员节
行思理7 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
青瓦梦滋7 小时前
WebSocket协议
linux·服务器·网络·c++·websocket·网络协议·http
程序 代码狂人10 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
HDU-Dade10 小时前
【校招笔试真题】简要介绍 Self-Attention 的前沿算法
人工智能·算法
2601_9498477510 小时前
bcrypt.js 跨端三方库仓颉适配全流程
linux·运维·ubuntu
m0_6399069410 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端