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

文章目录

  • 一、线程概念
    • 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.rhkb.cn/news/423880.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROADM(可重构光分插复用器)-介绍

1. 引用 https://zhuanlan.zhihu.com/p/163369296 https://zhuanlan.zhihu.com/p/521352954 https://zhuanlan.zhihu.com/p/91103069 https://zhuanlan.zhihu.com/p/50610236 术语: 英文缩写描述灰光模块彩光模块CWDM:Coarse Wave-Length Division …

WireShark分析localhost包

文章目录 需要npcap。 java 需要配置Npcap,如果没有需要卸载重新安装 Npcap 是专为 Windows 开发的一款网络抓包 SDK,该 SDK 提供了被应用程序调用的库文件和系统驱动程序。通过 Npcap,我们可以得到原始(raw)网络数据&…

Java手写RPC框架-01-开篇

项目背景 随着业务不断升级,系统规模不断扩大, 单体架构会产生越来越多的问题,需要引入微服务将原先架构解耦为一个个模块。每个服务模块放在不同的服务器上,能够保证系统在高并发环境下的正常运转。 各个服务模块之间如何相互调…

OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ OpenHarmony(鸿蒙南向开发)——轻量和小型系统三方库移植指南…

【getshell】phpmyadmin后台getshell(4.8.5)

🏘️个人主页: 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 【getshell】phpmyadmin后台getshell(4.8.5) 一、进入sql命令输入界面二、上传代码三、getshell 一、进入…

Kubernetes (k8s)v1.27.1版本安装步骤

这 一、k8s 安装步骤1.1 安装docker及containerd容器1.2、设置每台服务器的参数1.3、安装kubelet、kubeadm、kubectl1.4、修改 kubelet 的 cgroup 和 docker 的 cgroup-driver 保持一致1.5、使用containerd 默认容器的配置1.6、使用kubeadm进行初始化1.7、初始化成功1.8、集群部…

海外云手机有哪些推荐?

随着云手机的发展,越来越多的企业和个人开始使用云手机来满足他们的海外业务需求。用户可以通过云手机实现方便、快捷的海外访问,一般用来进行tiktok运营、亚马逊电商运营、海外社媒运营等操作。海外云手机平台有很多,以下是一些比较好的云手…

✨机器学习笔记(四)—— 逻辑回归、决策边界、过拟合、正则化

Course1-Week3: https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week3机器学习笔记(四) 1️⃣逻辑回归(logistic regression)…

Java的衍生生态有哪些?恐怖如斯的JAVA

Java的衍生生态极其丰富,涵盖了多个层面和领域。以下是Java衍生生态的一些主要方面: 1. 开源工具 开发工具:如Eclipse,这是一款非常优秀的Java IDE工具,支持Java以及其他语言的代码编写。Spring官方还基于Eclipse开发…

Excel单元格操作:读写单元格数据、格式设置与条件格式详解

目录 一、Excel单元格的基本操作 1.1 单元格的选取与编辑 案例一:基本数据录入 1.2 单元格的读取与写入 案例二:使用公式计算销售额 二、单元格格式设置 2.1 字体与颜色设置 案例三:设置标题格式 2.2 数字格式设置 案例四&#xff…

树形弹窗选择框/vue2/Element/弹框选择

前言 此类选择器根据vueelementUI实现,使用vue3的可以根据此案例稍作改动即可实现,主要功能有弹出选择、搜索过滤、搜索结果高亮等,此选择器只支持单选,如需多选可在此基础进行改造。 效果图 代码实现 使用时,props-…

【C++ Primer Plus习题】15.1

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "tv.h" us…

openstack之cinder介绍

概念 cinder 为虚拟机提供管理块存储服务。支持的文件系统&#xff1a;lvm、iscsi、nfs、san、RBD 组件构成及功能介绍 cinder api&#xff1a;在控制节点运行&#xff0c;管理服务的接口&#xff0c;被命令行、其他组件调用&#xff1b; cinder scheduler&#xff1a;类似n…

VMware Fusion Pro 13 Mac版虚拟机 安装Win11系统教程

Mac分享吧 文章目录 Win11安装完成&#xff0c;软件打开效果一、VMware安装Windows11虚拟机1️⃣&#xff1a;准备镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;虚拟机设置4️⃣&#xff1a;安装虚拟机5️⃣&#xff1a;解决连不上网问题 安装完成&#xff01;&#xff0…

怎么使用ai 免费生成ppt?这4个工具可以帮忙

随之AI工具的流行&#xff0c;网络上也涌现了一批 AIPPT 工具&#xff0c;可以在办公上帮助我们节省很多制作PPT的时间。通常它们的操作也比较简单&#xff0c;所以适合很多人使用。为了可以帮助大家提高办公效率&#xff0c;我在这里跟大家分享4款可以免费使用的AIPPT制作工具…

文件误删危机应对:数据恢复全解析

文件误删&#xff1a;数字化时代的隐形挑战 在数字化的浪潮中&#xff0c;文件已成为我们工作、学习和生活中不可或缺的一部分。它们记录着我们的思想、成果与回忆&#xff0c;是连接现实与虚拟世界的桥梁。然而&#xff0c;这份便捷与高效背后&#xff0c;却隐藏着文件误删这…

OpenCV结构分析与形状描述符(14)拟合直线函数fitLine()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 拟合一条直线到2D或3D点集。 fitLine 函数通过最小化 ∑ i ρ ( r i ) \sum_i \rho(r_i) ∑i​ρ(ri​)来拟合一条直线到2D或3D点集&#xff0c…

crossover激活码免费 crossover24破解版免费下载安装教程

CrossOver 可以在 Mac 上运行成千上万的 Windows 程序。从办公软件、实用工具、游戏到设计软件&#xff0c;您只需在 Mac 的 dock 轻按一下便可运行。您可以 Windows 程序和 Mac 程序之间随意切换&#xff0c;而这一切无需重启、无需虚拟机&#xff0c;也无需购买 Windows 授权…

音视频入门基础:AAC专题(1)——AAC官方文档下载

一、AAC简介 高级音频编码&#xff08;英语&#xff1a;Advanced Audio Coding&#xff0c;AAC&#xff09;是有损音频压缩的专利数字音频编码标准&#xff0c;由Fraunhofer IIS、杜比实验室、贝尔实验室、Sony、Nokia等公司共同开发。出现于1997年&#xff0c;为一种基于MPEG…

GNSS CTS GNSS Start and Location Flow of Android15

目录 1. 本文概述2.CTS 测试3.Gnss Flow3.1 Gnss Start Flow3.2 Gnss Location Output Flow 1. 本文概述 本来是为了做Android 14 Gnss CTS 的相关环境的搭建和测试&#xff0c;然后在测试中遇到了一些问题&#xff0c;去寻找CTS源码(/cts/tests/tests/location/src/android/l…