一、进程
进程是正在运行中的程序,或者说是一次程序的执行过程。
程序是死的,进程是活的,程序是存储在硬盘上的,进程是运行在内存中的,一个程序可以对应多个进程。
程序加载到内存中就成为了进程。
二、进程的组成部分:
- 代码段:即程序的可执行代码部分。
- 数据段:包括全局变量、静态变量。
- 堆:用于动态分配内存。
- 栈:用于存储局部变量、函数调用时的参数和返回地址等。
- 进程控制块(Process Control Block, PCB):每个进程在操作系统中都有一个PCB,它记录了进程的各种信息,如进程ID、状态、寄存器状态、调度信息、内存管理信息、文件描述符等。
进程状态:
- 创建:进程正在被创建。
- 就绪:进程已经准备好,可以运行,但由于CPU资源未分配,暂时未运行。
- 运行:进程正在执行代码。
- 阻塞:进程在等待某种事件(如I/O操作完成),暂时不能运行。
- 终止:进程执行完毕或被强制终止,进入终止状态,等待操作系统回收资源。
Linux系统下对进程状态进行了更细的划分:
僵尸进程与孤儿进程:
- 僵尸进程:当一个子进程终止后,父进程未能及时获取子进程的退出状态,此时子进程会变为僵尸进程。僵尸进程虽然已经终止,但其进程控制块仍然存在,占用系统资源。
- 孤儿进程:如果父进程先于子进程终止,子进程会变为孤儿进程。孤儿进程通常会被系统的
init(32位系统),systemd(64位系统)
进程接管,以防止成为僵尸进程。
三、Linux中进程的7种状态:
1. 运行状态(Running or Runnable, R)
- 描述:进程正在运行或者在运行队列中等待运行。
- 详情:当进程获得了CPU时间片,它处于“运行”状态。当它在等待CPU时间片(在运行队列中),但尚未实际执行时,它也属于这个状态。
2. 可中断睡眠状态(Interruptible Sleep, S)
- 描述:进程正在等待某个事件(如I/O操作完成),并且可以被信号中断唤醒。
- 详情:这通常是进程在等待I/O操作完成时的状态。进程可以通过信号(例如,
SIGINT
、SIGKILL
等)被唤醒,并从睡眠状态转为就绪状态。
3. 不可中断睡眠状态(Uninterruptible Sleep, D)
- 描述:进程正在等待一个无法中断的系统调用,如等待磁盘I/O操作完成。
- 详情:在这个状态下,进程无法被信号打断,除非操作完成。通常用于等待一些关键性的系统资源,如磁盘操作。这种状态通常与设备驱动程序相关。
4. 僵尸状态(Zombie, Z)
- 描述:进程已经终止,但它的父进程尚未读取其退出状态,因而进程的控制块仍然保留在系统中。
- 详情:僵尸进程占用系统的少量资源(如进程号),但不执行任何任务。它们最终会被系统回收,或者由父进程调用
wait()
系统调用来清理。
5. 停止状态(Stopped, T)
- 描述:进程被停止运行,通常是因为收到了信号(如
SIGSTOP
或SIGTSTP
)。 - 详情:停止状态的进程可以通过继续信号(如
SIGCONT
)重新恢复运行。调试工具(如gdb
)通常会使用这种状态来暂停进程。
6. 跟踪停止状态(Traced or Stopped, t)
- 描述:进程正在被调试器(如
gdb
)跟踪,此时进程处于停止状态。 - 详情:这是停止状态的一种特殊情况,表示进程被另一个进程(通常是调试器)控制并停止执行。
7. 任务退出状态(Task Dead, X)
- 描述:进程即将退出或已经退出,但仍未完全被移除。
- 详情:这个状态非常罕见,通常不会在
ps
或top
中看到。它表示进程正在退出,但还未完全清理干净。
操作系统可以同时运行多个进程,即多任务。
内核的功能是完成进程调度
操作系统实际上是宏观并行,微观串行的
四、查询进程相关命令:
1.使用 ps aux | grep 进程名
- 功能:查看指定进程名的相关信息。
ps aux
列出所有进程,grep 进程名
用于筛选出符合条件的进程
2.使用 top
- 功能:
top
命令实时显示系统中各进程的资源使用情况,按CPU占用率排序,默认每隔几秒钟刷新一次。
3.kill
- 功能:发送信号给指定PID的进程,默认信号是
SIGTERM
(15),用于请求进程终止 kill -9 <PID>
:发送SIGKILL
信号(9),强制终止进程。kill -1
:查看信号列表及其编号。killall
可以向指定名称的所有进程发送信号
五、进程编程:
1. fork()
- 功能:用于创建一个新进程,称为子进程。新进程是当前进程的副本,继承了父进程的大部分环境。
- 返回值:
- 在父进程中,
fork()
返回子进程的PID。 - 在子进程中,
fork()
返回0。 - 如果创建失败,
fork()
返回-1。
- 在父进程中,