在Linux操作系统中,进程管理是操作系统内核非常重要的部分,涉及到进程的创建、调度、同步、通信等多个方面。以下是Linux进程管理中最重要、最常用的知识点:
1. 进程的概念和状态
- 进程是程序执行的实例,在Linux中,每个进程都有一个唯一的PID(进程ID)。
- 进程状态:包括运行态、就绪态、阻塞态等,常见的进程状态有:
- R (Running):进程正在运行。
- S (Sleeping):进程在等待某些事件发生(比如I/O操作)。
- D (Uninterruptible Sleep):进程处于不可中断的睡眠状态,通常是等待硬件操作。
- Z (Zombie):进程已经终止,但父进程尚未读取其退出状态。
- T (Stopped):进程被暂停(可能由于信号或调试操作)。
关于这个知识点的详细笔记见 https://blog.csdn.net/wenhao_ir/article/details/145620196
2. 子进程的创建与终止
由于每个程序在运行时就是一个进程实例,相当于程序运行了就自动创建了进程,所以我们这里说的是子进程的创建。
- 创建子进程:通过
fork()
系统调用创建子进程,父进程通过返回值判断是父进程还是子进程。fork()
:创建一个新的进程,子进程是父进程的副本。exec()
:替换当前进程的映像,通常与fork()
一起使用。
- 进程终止:子进程通过
exit()
或_exit()
终止,父进程通过wait()
或waitpid()
等待子进程终止,并获取其退出状态。
关于这个知识点的详细笔记见 https://blog.csdn.net/wenhao_ir/article/details/145620932
3. 进程调度
- 调度算法:Linux使用多种调度算法来决定哪个进程获得CPU时间,例如:
- CFS (Completely Fair Scheduler):用于普通进程,公平分配CPU时间。
- 实时调度策略(SCHED_FIFO、SCHED_RR):用于实时进程,优先级较高。
- 时间片和调度队列:调度器会为每个进程分配时间片,调度队列保存待调度进程的状态,Linux支持优先级调度和时间片轮转调度。
关于进度调度的优先级的实际例子,见我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/146703923
4. 进程间通信 (IPC)
- 管道(Pipe):一种半双工通信方式,数据从一个进程流向另一个进程。
- 命名管道(FIFO):类似于管道,但可以跨不同进程和不同时间打开。
- 消息队列(Message Queues):用于不同进程之间的消息传递。
- 共享内存(Shared Memory):多个进程可以共享一块内存区域,最快的进程间通信方式。
- 信号量(Semaphore):用于进程间的同步,确保资源的互斥访问。
- 信号(Signal):用于进程之间的简单通信和控制,常用于中断和进程控制。
关于这个知识点的详细笔记见 https://blog.csdn.net/wenhao_ir/article/details/146723072
5. 进程同步与互斥
- 互斥(Mutex):保护共享资源,避免多个进程或线程同时访问。
- 信号量(Semaphore):可以实现计数信号量,控制并发访问,常用于进程同步。
- 条件变量(Condition Variables):允许进程等待某个条件成立后再执行。
关于这个知识点的详细笔记见:
https://blog.csdn.net/wenhao_ir/article/details/146723072 【搜索“信号量介绍”】
之前对驱动的学习用到了条件变量:
https://blog.csdn.net/wenhao_ir/article/details/145225508
6. 内存管理与进程地址空间
- 虚拟内存:每个进程都有独立的虚拟内存空间,操作系统通过页表管理虚拟内存与物理内存的映射。
- 堆栈(Stack/Heap):每个进程的堆栈和堆有特定的用途,堆栈用于存储局部变量,堆用于动态内存分配。
- 内存映射(Memory Mapping):通过
mmap()
系统调用将文件或设备映射到进程的地址空间中。
关于这个知识点的详细笔记见 https://blog.csdn.net/wenhao_ir/article/details/144489705
7. 进程优先级与nice值
- 优先级:进程的优先级决定了它在调度队列中的位置。Linux调度器会优先选择优先级较高的进程。
- nice值:一个进程的
nice
值是调整优先级的一个参数,范围从-20(最高优先级)到+19(最低优先级)。可以通过nice()
和renice()
命令进行调整。
关于这个知识点的详细笔记见 https://blog.csdn.net/wenhao_ir/article/details/146703923
8. 守护进程与子进程管理
- 守护进程(Daemon):通常是没有控制终端、后台运行的进程,负责系统级服务(如网络服务、定时任务等)。
- 孤儿进程与僵尸进程:当父进程终止后,子进程变为孤儿进程,通常会被
init
进程收养;当子进程终止后,如果父进程没有读取其退出状态,子进程变为僵尸进程。
关于守护进程的理解,可参考 https://blog.csdn.net/wenhao_ir/article/details/146177988
关于孤儿进程与僵尸进程,可参考 https://blog.csdn.net/wenhao_ir/article/details/145620932 【搜索“父进程等待子进程结束后自己再结束”】
9. 进程优先级与实时进程
- 实时进程:通过
SCHED_FIFO
或SCHED_RR
策略进行调度,具有较高的优先级。常用于需要严格时效性的应用。 - 非实时进程:通过普通调度策略(如CFS)进行调度。
10. 调试与监控进程
ps
命令:查看系统中的进程及其状态。top
命令:实时查看进程的CPU和内存使用情况。strace
命令:跟踪进程的系统调用和信号。gdb
调试器:用于调试进程,可以单步调试、查看栈信息等。
掌握这些进程管理的知识点,对于嵌入式开发,尤其是在涉及Linux系统开发时至关重要。了解这些基本概念能帮助你高效地进行调试、优化程序性能和保证系统稳定性。