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 进程调度
多个进程任务需要同时运行。常见进程调度算法:
- 先来先执行,后来后执行。
- 高优先级调度算法。
- 时间片轮转调度算法(宏观并行,微观串行)。
- 多级队列反馈调度算法。
- 负载均衡调度算法。
时间片:CPU 在进程任务中执行的一小段时间称为时间片。
3.4 进程状态
- 就绪态(R):没有被 CPU 轮转到的正在执行的任务。
- 运行态(R):正在被 CPU 执行的任务。
- 可唤醒等待态(S):由于缺少资源让程序暂时挂起的状态,等待过程中可以被唤醒。
- 不可唤醒等待态(D):等待过程中不会被唤醒称为不可唤醒等待态。
- 停止态(T):由于系统需要让进程任务暂停,则将进程设置为停止态。
- 僵尸态(Z):进程代码执行结束,空间没有被回收。
- 结束态(X):代码执行结束,空间被回收的时刻。
4. 进程相关的函数接口
4.1 fork
pid_t fork(void); 功能:创建一个子进程空间 参数:缺省 返回值:成功父进程中返回子进程的 PID,子进程中返回 0,失败返回 -14.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 号,失败返回 -1WNOHANG设置非阻塞,如果子进程没有结束返回 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