自学Linux系统软件编程第四天
2025/2/25 15:29:08
来源:https://blog.csdn.net/An_Xinran/article/details/145783230
浏览:
次
关键词:自学Linux系统软件编程第四天
进程
- 概念 进程:就是程序执行的过程,包括创建、调度和消亡,是活的
程序:一段数据的集合,是死的
进程是操作系统资源分配的最小单元(文本段、数据段、系统数据段 - 常用命令 top
根据CPU占用率查看当前所有进程任务
PID:唯一识别进程的ID号 ( pid > 0 )
PPID:父进程的ID
按q退出top命令
ps -ef
ps -ef | grep a.out 组合命令,查看所有进程中与a.out相关联的内容
ps -aux
查看进程状态(就绪态、运行态 R、可唤醒等待态 S、不可唤醒等待态 D、停止态 T、僵
尸态 Z、结束态 X)
pstree
查看所有进程的关系
kill
kill -9 进程PID
killall -9 进程名
./a.out &
在后台执行a.out - 进程创建 在32位操作系统中,会为运行进程开辟0 - 4G虚拟内存空间
分为 文本段
存储代码和指令
数据段
全局变量、静态变量、字符串常量
在编译时分配空间,程序运行时,将a.out数据段加载到内存数据段中
程序结束回收数据段空间
未经初始化值为0值
系统数据段
栈区:操作系统管理区域、存放局部变量、执行到变量定义时分配空间,超过变量
作用域回收变量空间,未经初始化为随机值
堆区:程序员管理的区域,malloc申请、free释放
内核
操作系统核心区域,用户无法访问,负责内存管理、CPU管理、硬件设备管理、进
程管理、文件系统管理 
- 多个进程的存储
进程的空间是独立的
单核:一个CPU在同一时刻只能执行一个任务
宏观并行,微观串行
物理地址空间是独立的,虚拟地址空间共用同一份,所以多个进程并不是虚拟机地址空间相加 
- 进程调度
1. 宏观并行,微观串行
2. 进程状态:
R 就绪态:正在运行的任务(没有占用CPU)
R 运行态:正在运行的任务(占用CPU)
S 可唤醒等待态:进程挂起等在某个资源到达后继续向下执行
D 不可唤醒等待态:进程任务挂起直到等到某个信号继续向下执行
T 暂停态:进程任务挂起,直到CPU发送指令才能继续向下执行
Z 僵尸态:代码已经执行完毕,空间仍然存在
X 结束态:代码执行完毕,空间被回收
3. CPU调度任务规则(进程调度算法)
1. 一个任务执行完毕后,如何选择下一个执行的任务
2. 常见进程调度算法:
先来先执行,后来后执行
高优先级调度算法 时间片轮转调度算法
时间片:CPU在某个进程任务中执行的一段时间
多级队列反馈
负载均衡调度算法 4. 进程相关的函数接口 man 2 fork
pid_t fork(void);
功能:
创建一个子进程
参数:
缺省
返回值:
成功在父进程中返回创建的子进程的PID
在子进程中返回0
失败返回-1man 3 exit
void exit(int status);
功能:
刷新缓存区,并让进程结束
参数:
status:进程结束的状态
返回值:
缺省
man 2 _exit
void _exit(int status);
功能:
进程直接结束
参数:
status:进程结束的状态
返回值:
缺省
- 进程消亡
1. 僵尸进程:
1. 什么是僵尸进程?
进程执行结束,空间没有被回收,就会成为僵尸进程
2. 如何避免产生僵尸进程?
让父进程先结束,子进程会成为孤儿进程,被init进程收养,子进程结束时,init进程回收子进程空间
子进程结束,父进程回收子进程空间(wait或者waitpid回收子进程空间) - 进程回收函数接口
==========wait============
man 2 wait
pid_t wait(int *wstatus);
功能:
回收进程空间
参数:
wstatus:存放进程结束状态空间首地址
返回值:
成功返回回收到的子进程的PID
失败返回-1
WIFEXITED(wstatus)
子进程是否正常结束
WEXITSTATUS(wstatus)
子进程结束的状态
WIFSIGNALED(wstatus)
是否被信号杀死
WTERMSIG(wstatus)
获得杀死进程信号的编号
注意:
1.wait具有阻塞功能,子进程不结束,父进程会一直wait直到子进程结束,再回收子进程空
间
2.wait回收任意一个子进程空间
3.wait具有同步的功能
=========waitpid=============
man 2 waitpid
pid_t waitpid(pid_t pid, int *wstatus, int options);
功能:
回收某个指定的子进程空间
参数:
pid:要回收的进程空间的ID号
-1 回收任意一个子进程空间
wstatus:存放子进程结束状态空间首地址
options:
0 阻塞回收
WNOHANG 非阻塞回收
返回值:
成功返回回收到子进程的PID
失败返回-1
如果没有回收到子进程空间返回0
==========exec函数族==========
extern char **environ;
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[]);
功能:
利用该进程空间执行另一份代码
l:参数以列表形式传递
v:参数以指针数组形式传递
p:在系统环境变量path对应的路径下找文件
e:执行新代码时更新环境变量
注意:
fork+exec用来启动一个新的软件/系统应用