进程与程序的区别
程序:代码+数据。是存储在硬盘中代码和数据的集合,是静态的。
进程:pcb + 进程实体(text|data|bss|堆栈)。是程序执行的过程,包括进程的创建、调度和消亡,是动态的。进程会分配内存资源(如栈、堆、静态区等)和CPU资源,具有程序状态的变化,可以并发执行,并且进程之间会竞争计算机的资源。一个程序可以运行多次,变成多个进程。
进程的作用
进程的主要作用是实现并发,提高系统的效率。例如,在服务器程序中,通过创建多个进程可以同时处理多个客户端的请求,提高服务器的响应能力。
进程的一生
- 创建进程:通过
fork
函数可以从当前进程中克隆一个新进程,子进程是父进程的完全拷贝,但具有不同的pid。 - 执行任务:
- 子进程可以执行与父进程相同的任务,也可以执行自己的任务。
- 子进程的执行过程是从
fork
函数之后开始。 - 进程结束:
孤儿进程:没有父亲的进程。
僵尸进程:有父亲,但自己先挂了,且父亲没有收尸的进程。
进程的状态
基本操作系统中的状态:就绪→执行态→阻塞(等待,睡眠)。
Linux下的进程状态
process:
D | uninterruptible sleep (usually IO) |
R | running or runnable (on run queue) |
S | interruptible sleep (waiting for an event to complete) |
T | stopped by job control signal |
t | stopped by debugger during the tracing |
W | paging (not valid since the 2.6.xx kernel) |
X | dead (should never be seen) |
Z | defunct ("zombie") process, terminated but not reaped by its parent |
For BSD formats and when the stat keyword is used, additional characters may be displayed:
< | high-priority (not nice to other users) |
N | low-priority (nice to other users) |
L | has pages locked into memory (for real-time and custom IO) |
s | is a session leader |
l | is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) |
+ | is in the foreground process group |
进程的调度
内核的主要功能之一就是完成进程调度,实现宏观并行和微观串行。
查询进程相关命令
ps aux | grep 进程名
:查看进程相关信息,包括进程的状态(如就绪态、运行态、睡眠态、停止态、僵尸态等)。
top
:根据CPU占用率查看进程相关信息。
kill
和killall
:发送信号来控制进程,如kill pid
发送信号给指定pid的进程,默认接收者会关闭;kill -9 进程pidD号
发送强制关闭信号;killall -9 进程名
发送信号给指定进程名的所有进程。
进程相关函数
函数 | 功能 |
getpid | 获取当前进程的pid |
getppid | 获取当前进程的父进程的pid |
fork | 以当前进程为父进程,创建子进程 |
fork
函数:
- 功能:通过该函数可以从当前进程中克隆一个同名新进程,子进程是父进程的完全拷贝。
- 返回值:在父进程中,成功返回值是子进程的PID号(大于0),失败返回 - 1;在子进程中,成功返回值是0,失败返回无。
getpid
函数:
- 功能:获得调用该函数进程的PID。
- 参数:缺省。
- 返回值:进程的PID。
getppid
函数:
- 功能:获得调用该函数进程的父进程PID号。
- 参数:缺省。
- 返回值:返回父进程ID号。
进程与文件的关系
如果打开文件的操作在fork
之前,则子进程会继承父进程已打开的文件的相关信息(文件表项),此时父子进程共享(文件表项),实现对同一个文件的操作;如果fork
之后各自打开,则父子进程各自拥有各自的文件描述符及对应的文件表项,各自独立操作该文件,可能存在文件内容被覆盖的情况。