当前位置: 首页 > news >正文

进程线程的创建、退出、回收

1. 进程相关知识点

1.1 进程创建
  • fork()

    • 功能:创建一个子进程。

    • 返回值:

      • 父进程中返回子进程的 PID。

      • 子进程中返回 0。

      • 失败返回 -1。

    • 特点:子进程是父进程的副本,拥有独立的内存空间。

  • vfork()

    • 功能:创建一个子进程。

    • 返回值:

      • 父进程中返回子进程的 PID。

      • 子进程中返回 0。

      • 失败返回 -1。

    • 特点:子进程与父进程共享内存空间,直到子进程调用 exec()exit()

1.2 进程退出
  • exit()

    • 功能:刷新缓存区,并让进程结束。

    • 参数:status(进程结束状态)。

    • 返回值:无。

  • _exit()

    • 功能:直接终止进程,不刷新缓存区。

    • 参数:status(进程结束状态)。

    • 返回值:无。

1.3 进程回收
  • wait()

    • 功能:回收任意一个子进程的空间。

    • 参数:wstatus(存放子进程结束状态的指针)。

    • 返回值:

      • 成功返回回收到的子进程的 PID。

      • 失败返回 -1。

    • 特点:阻塞调用,直到子进程结束。

  • waitpid()

    • 功能:回收指定的子进程的空间。

    • 参数:

      • pid:要回收的子进程的 PID(-1 表示任意子进程)。

      • wstatus:存放子进程结束状态的指针。

      • options:回收选项(如 WNOHANG 表示非阻塞)。

    • 返回值:

      • 成功返回回收到的子进程的 PID。

      • 失败返回 -1。

      • 没有回收到子进程返回 0。

  • 状态检查宏

    • WIFEXITED(wstatus):检查子进程是否正常结束。

    • WEXITSTATUS(wstatus):获取子进程的退出状态。

    • WIFSIGNALED(wstatus):检查子进程是否被信号终止。

    • WTERMSIG(wstatus):获取终止子进程的信号编号。

1.4 进程执行新程序
  • exec 函数族

    • 功能:在当前进程空间中执行新的程序。

    • 常见函数:

      • execl():参数以列表形式传递。

      • execlp():在环境变量 $PATH 中查找文件。

      • execv():参数以指针数组形式传递。

      • execvp():在环境变量 $PATH 中查找文件。

      • execle()execvpe():支持自定义环境变量。

    • 特点:不创建新进程,直接替换当前进程的代码。


2. 线程相关知识点

2.1 线程创建
  • pthread_create()

    • 功能:在调用函数的进程中创建一个线程。

    • 参数:

      • thread:存放线程 ID 的指针。

      • attr:线程属性(可选)。

      • start_routine:线程函数的入口。

      • arg:传递给线程函数的参数。

    • 返回值:

      • 成功返回 0。

      • 失败返回错误码。

2.2 线程退出
  • pthread_exit()

    • 功能:线程退出。

    • 参数:retval(线程退出的值)。

    • 返回值:无。

2.3 线程回收
  • pthread_join()

    • 功能:回收线程空间。

    • 参数:

      • thread:要回收的线程的 ID。

      • retval:存放线程结束状态的指针。

    • 返回值:

      • 成功返回 0。

      • 失败返回错误码。

    • 特点:阻塞调用,直到线程结束。


3. 进程与线程的区别

3.1 进程
  • 定义:程序动态执行的过程,包括创建、调度和消亡。

  • 特点:

    • 是操作系统资源分配的最小单元。

    • 包括文本段、数据段、系统数据段等。

    • 进程切换需要映射到不同的物理地址空间,资源开销较大。

3.2 线程
  • 定义:线程是一个轻量级的进程。

  • 特点:

    • 是 CPU 任务调度的最小单元。

    • 线程位于进程空间内部,共享进程的文本段、数据段和堆区。

    • 线程切换在进程空间内部完成,资源开销较小。

3.3 区别
  • 执行效率

    • 多线程 > 多进程。

    • 线程切换在进程空间内部完成,资源开销小。

  • 通信实现

    • 多线程 > 多进程。

    • 线程共享进程空间,通信更方便。

  • 通信机制复杂程度

    • 多进程 > 多线程。

    • 线程操作全局变量可能引入资源竞争,需要加锁。

  • 安全性

    • 多进程 > 多线程。

    • 线程异常崩溃可能导致整个进程崩溃。


4. 僵尸进程

  • 定义:子进程已经结束,但父进程尚未读取子进程的状态信息时,子进程的状态信息仍然保留在系统中。

  • 产生原因:父进程没有及时调用 wait()waitpid() 回收子进程。

  • 避免方法

    • 父进程及时调用 wait()waitpid()

    • 使用信号处理函数(如 SIGCHLD)自动回收子进程。


5. 线程空间划分

  • 栈区:每个线程独立拥有栈空间(默认 8MB)。

  • 共享区:文本段、数据段、堆区与进程及进程内的其他线程共享。


6. 进程状态

  • 运行态:正在运行或等待运行。

  • 就绪态:准备好运行,但等待 CPU 调度。

  • 阻塞态:等待某些事件(如 I/O 操作)完成。

  • 终止态:进程结束,等待回收。


7. 进程调度算法

  • 常见算法

    • 先来先服务(FCFS)。

    • 短作业优先(SJF)。

    • 时间片轮转(RR)。

    • 优先级调度。

    • 多级反馈队列调度。


8. 常见命令

  • ps:显示当前系统中的进程信息。

  • top:实时显示系统中占用资源最多的进程。

  • kill:发送信号给进程(如终止进程)。

  • nice:设置进程的优先级。


9. 线程相关函数

  • pthread_create():创建线程。

  • pthread_exit():线程退出。

  • pthread_join():回收线程空间。

  • pthread_detach():分离线程,使其结束后自动释放资源。


10. 多进程 vs 多线程

  • 执行效率:多线程 > 多进程。

  • 通信实现:多线程 > 多进程。

  • 通信机制复杂程度:多进程 > 多线程。

  • 安全性:多进程 > 多线程。

相关文章:

  • 2025年02月21日Github流行趋势
  • Android级联选择器,下拉菜单
  • 33. 搜索旋转排序数组(LeetCode热题100)
  • 【智能客服】ChatGPT大模型话术优化落地方案
  • Repeated Sequence
  • 基于STM32单片机的智能蔬菜大棚温湿度监测系统设计
  • elabradio入门第八讲——帧同步技术
  • 伯克利 CS61A 课堂笔记 12 —— Syntax
  • Django-Vue 学习-VUE
  • 蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
  • 第8章:LangChain检索增强生成RAG--2.3Naive RAG
  • vue 手写分页
  • 【Excel】【VBA】根据内容调整打印区域
  • 高级SQL技术在Python项目中的应用:ORM与深度性能优化
  • 索引有哪些缺点以及具体有哪些索引类型
  • 《QT+PCL 第五章》点云特征-RIFT
  • 智慧城管大屏可视化决策系统
  • 【QT 网络编程】HTTP协议(二)
  • 【Gin】| 框架源码解析 :路由详解
  • jQuery UI 主题:设计、定制与优化指南
  • python 做网站/推广app拉人头赚钱
  • 做本地的分类信息网站/关键词优化难度分析
  • 小鼠标网站建设/中国十大seo
  • 小说网站开发源码/seo怎么收费seo
  • 解析域名/seo推广代运营
  • 怎么用node做动态网站/深圳seo推广外包