进程空间回收策略

1.对于一直处于运行状态,不会结束的进程不需要回收 2.进程在执行有结束的情况时回收

进程资源空间回收

wait

pid_t wait(int *wstatus);

功能:阻塞等待回收僵尸态进程

参数: wstatus:保存回收的子进程的退出状态 ,大多数时候传NULL

返回值: 成功:返回回收到的子进程的ID 失败:-1

WIFEXITED(wstatus) 判断是不是正常结束 WEXITSTATUS(wstatus) 使用这个宏去拿exit结束状态 WIFSIGNALED(wstatus) 判断是不是收到了信号而终止的 WTERMSIG(wstatus)如果是信号终止的,那么是几号信号。

waitpid

pid_t waitpid(pid_t pid, int *status, int options);

功能:回收指定进程的资源 和wait功能相似,比wait更灵活

参数: pid:

  • <-1:回收指定进程组内的任意子进程 (-100,等待GID=100的进程组中的任意子进程)
  • -1:回收任意子进程,组内外
  • 0:回收和当前调用waitpid一个组的所有子进程,组内
  • > 0:回收指定ID的子进程

status:子进程退出时候的状态,如果不关注退出状态用NULL;

options 选项:

  • 0:表示回收过程会阻塞等待
  • WNOHANG:表示非阻塞模式回收资源。

返回值: 成功 返回接收资源的子进程pid 失败 -1 设定为非阻塞且没有回收到子进程返回0

waitpid(0,&status,0) //默认阻塞 ==wait(&status);
waitpid(0,&status,WNOHANG); // 非阻塞方式

注意:使用waitpid以非阻塞方式回收时,要搭配轮询方式实现。

exec函数族

功能:在一个进程中执行另外一个文件

int execl(const char *path, const char *arg, ... /* (char *) NULL */);

功能:可以执行任意可执行文件 参数: path:要执行的文件的路径和名称 arg:执行该文件需要的参数

int execlp(const char *file, const char *arg, ... /* (char *) NULL */);

功能:执行环境变量保存的系统路径下的可执行文件 参数: file:需要执行的文件的名称 arg:执行该文件需要的参数

int execle(const char *path, const char *arg, ... /*, (char *) NULL, char * const envp[] */);

int execv(const char *path, char *const argv[]);

功能:可以执行任意可执行文件 参数: path:要执行的文件的路径和名称 argv:执行该文件需要的参数存放的指针数组

int execvp(const char *file, char *const argv[]);
int execvpe(const char *file, char *const argv[], char *const envp[]);
  • l : list‑‑‑‑‑‑》列表 "ls", "-l"
  • v : vector‑‑‑‑‑>容器(数组)
  • p :path ‑‑‑‑‑》路径 exec会自动从PATH环境变量所保存的路径下去寻找
  • e :env ‑‑‑‑‑》环境变量
int system(const char *command);

注:system有新进程产生

exec原理:当执行exec时,系统将要执行的文件和进程中文本区的指令数据进行替换

  • env : 查看系统中的环境变量
  • whereis 二进制/库 查看二进制、库对应的位置

线程

1.什么是线程

线程是一个轻量级的进程,用来实现多任务并发。 线程是操作系统任务调度的最小单位。(进程是操作系统资源分配的最小单位) 线程由某个进程创建。

2.线程的创建

线程由所在进程创建,创建时,进程为其分配独立的栈区空间(默认8M)。 同一个进程中的线程,共用所在进程的堆区、数据区、文本区。

3.线程的调度

宏观并行 微观串行

4.线程消亡

线程退出 回收线程的资源空间

5.进程和线程的区别

进程线程
正在执行的程序轻量级的进程
操作系统资源分配的最小单位操作系统任务调度的最小单位
资源空间消耗大(0~4G虚拟内存空间)资源空间消耗小(栈区独立,其他区域共享)
进程效率低(创建、任务切换)线程效率高(创建、任务切换)
进程安全性高(进程空间独立)线程安全性低
进程间通信较复杂,需要用到IPC机制线程间通信简单
在相同资源平台下,多进程的并发量小于多线程

6.线程相关接口

pthread_create();

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);

功能:创建并启动一个线程

参数: thread :保存线程ID的变量地址 attr :设置线程属性;NULL :按照默认属性创建 start_routine :函数指针,线程启动后要执行的任务的函数地址(线程任务函数) arg :传递给线程任务函数的参数

返回值: 成功:0 失败:非0

注意:

  1. 编译和链接时要加‑lpthread, 表示链接线程库。
  2. 线程执行时,线程所在的进程不能先退出。

其他接口:

pthread_exit();

pthread_self();

pthread_join()

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐