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

线程 - 线程的由来、进程和线程的关系、进程创建_等待_退出详解

文章目录

  • 一、线程概念
    • 1. 线程的出现
    • 2. linux 对线程的设计
    • 3. 线程
  • 二、进程和线程
    • 1. 进程和线程的关系
    • 2. 进程的调度
    • 3. 轻量级进程
  • 三、pthread库
    • 1. pthread 库的作用
    • 2. 手动链接 pthread库
  • 四、创建线程
    • 1. pthread_create()
    • 2. 函数的使用
    • 3. 线程和函数
  • 五、线程等待
    • 1. 新线程的运行和结束
    • 2. 等待新线程
  • 六、线程退出
    • 1. 线程运行完毕,自动退出
      • ① 出异常,进程直接退出
      • ② pthread_join() 不考虑线程异常情况
    • 2. 代码退出线程
      • ① exit () 终止进程
      • ② pthread_exit ()
      • ③ pthread_cancel ()

一、线程概念

1. 线程的出现

  • 线程?
    先来简单了解一下:
    在这里插入图片描述
    在这里插入图片描述
    这里只是意会一下,不是说进程就只有一个 PCB + 进程地址空间而已(进程 = 内核数据结构 + 可执行程序),这样画是比较简单示意。

  • 创建进程:
    进程创建的时空成本是较高的,有各种数据结构的创建,数据的加载。
    如地址空间就是父子进程各有一个:
    在这里插入图片描述
    文件系统也是需要各有一个的:
    在这里插入图片描述
    关于这一点,进程地址空间 和文件系统 这两个文章中都可见端倪,上面两个图都是从这两个文中拿来的(文章都很短,如果有兴趣可以翻翻)。

  • 创建线程:
    地址空间和地址空间上的虚拟地址,本质是一种“资源”,是资源就可以共享。
    将代码分成几份,并创建对应个数的 PCB ,分别执行不同的代码区,就可以将串行执行变成了并发执行了。

我们的代码在进程中,全都是串行调用的,创建进程,是为了多执行流并发执行,所以创建进程和创建线程都可以,但是显然创建一个线程的成本要低得多啊!

2. linux 对线程的设计

操作系统(OS)要对线程进行管理——先描述,再组织。
下面我们来看,描述线程的结构体:

  • 描述线程的结构体中要有各种信息,如对应的进程,线程标识符,线程优先级,上下文状态等,大概就如下:
    在这里插入图片描述

  • 我们觉得这样还是复杂,而且我们发现,线程中的很多信息是和进程的重合的,所以Linux 的设计者认为,进程和线程都是执行流,有很高的相似性,没必要单独设计数据结构和算法,可以直接复用代码,使用进程来模拟线程。如下:
    在这里插入图片描述
    复用的话,维护成本较低;如果单独设计,就要单独设计数据结构、匹配的算法,代码会比较复杂。

  • Linux 的线程模块是复用的进程的,而也有单独设计线程模块的系统,这个系统叫 Windows

3. 线程

所以,我们可以了解到线程:

  • 线程是进程内部的一个执行分支,线程在进程的地址空间内运行。
  • 线程是 CPU 调度的基本单位。CPU 调度是让 PCB 排队的,现在线程就是复用的进程的 PCB, 所以CPU是可以调度一个个线程的。

二、进程和线程

1. 进程和线程的关系

进程是承担分配系统资源的基本实体,而线程是进程内的一个执行分支。所以线程算是包含在进程中的。
在这里插入图片描述

2. 进程的调度

CPU 不关心你是进程还是线程,按正常的调度算法执行就行了(当然有些属于线程、进程的细节会区别处理)。
在这里插入图片描述

3. 轻量级进程

从上面,我们可以看到,CPU 调度的执行流要么就是进程,要不就是线程。

  • 对于Linux来说,所有的调度执行流都叫做轻量级进程,不区分进程和线程了。在 Linux中,线程是用进程模拟的,在 CPU 看来,看到的 PCB 都比传统的进程更轻量化,所以叫“轻量级进程”。
  • 对于操作系统,进程内部只有一个执行流,那这个执行流就叫进程:

http://www.mrgr.cn/news/26913.html

相关文章:

  • Docker零基础入门
  • 爆品只是日百商家的表面“风光”
  • 最新热点!结合创新!小样本学习+CLIP:超好上手的思路,爽发顶会顶刊
  • react-intl——react国际化使用方案
  • 冯·诺依曼体系结构简介:计算机历史的奠基石
  • 软件安装攻略:EmEditor编辑器下载安装与使用
  • KTM580030bit 绝对角度细分器支持最多 4096 对极与一键非线性自校准集成双 16bit 2M SAR ADC
  • 保证RTOS线程安全的常规操作
  • Mybatis通用接口-基于Provider
  • 模型部署基础
  • 2023年09月中国电子学会青少年软件编程(Python)等级考试试卷(一级)答案 + 解析
  • VPP配置网卡多队列no bufs问题
  • Humanize AI 简介
  • vue2基础系列教程之v-model及面试高频问题
  • Brave编译指南2024 Windows篇:构建并启动Brave项目(七)
  • Flutter iOS混淆打包
  • CAESES许可证转移方法
  • Linux下read函数详解
  • 【SpringBoot】调度和执行定时任务--Quartz(超详细)
  • kafka 之 本地部署单机版