linux线程详解:线程概念、线程调度、线程安全、线程模型

2023-05-16

1、线程与进程的区别

(1)线程是轻量级的进程,是程序执行流的最小单位;
(2)进程是资源分配的最小单位,线程是调度的最小单位;
(3)进程可以创建线程,线程不可以创建进程;
(4)一个进程由一个或者多个线程组成;
(5同进程的线程间可以自由通信;
(6)不同的进程间通信,必须用进程间的通信方法(比如:共享内存、管道等),效率比线程间通信低且麻烦;

2、线程的定义

图片:p42

(1)线程的组成:线程ID、当前指令指针(PC)、寄存器集合、堆栈;
(2)一个进程包含一个或者多个线程,其中进程的大部分资源(代码段、数据段、堆段、打开文件/信号等)都是线程间共享的,线程会保留一部分私有数据(寄存器、栈);

3、线程的访问权限

虽然同进程内的线程之间数据访问很自由,但是每个线程也拥有自己的私有存储空间,包括以下方面:
(1)栈空间;
(2)线程局部存储(Thread Local Storage, TLS):某些操作系统为线程单独提供的私有空间,通常只具有很有限的容量;
(3)寄存器(包括PC寄存器):寄存器是执行流的基本数据,因此为线程私有;

4、使用多线程的好处

(1)某个操作可能会陷入长时间等待,如果是单线程则进入睡眠,无法进行执行;如果是多线程,则可以让执行这个操作的线程睡眠,让CPU去执行其他任务的线程;
(2)某个操作会消耗大量的时间,如果只有一个线程,则线程会一直执行这个操作,导致程序和用户之间的交互中断;如果是多线程,则可以一个线程负责计算,另一个线程负责交互,两个线程交替在CPU上执行;
(3)现在的CPU基本都是多核的,本身就具备同时执行多个线程的能力,因此单线程是无法全面发挥计算机的性能;
(4)想较与多进程应用,多线程在数据共享方面的效率要高很多,编写代码也更方便;
补充:在嵌入式开发中,能用多线程解决就不用多进程;

5、线程的调度

5.1、线程的状态

在这里插入图片描述

状态含义
运行态线程正在CPU上运行
就绪态线程已经具有除CPU之外的所有资源,等待分配到CPU就可以运行
阻塞态线程等待某一个事件的发生或者等待得到某样资源(除CPU资源外),无法被执行

(1)上图展示的是线程最基本的三种状态(运行态、就绪态、等待态也叫阻塞态),实际的线程状态比这个要复杂(比如还有挂起态),这里不展开讲;
(2)运行态->就绪态:线程在CPU上运行,运行至时间片耗尽会被剥夺CPU的使用权,CPU会去执行其他的线程,而该线程进入就绪态,等待被CPU再次调度;
(3)运行态->阻塞态:线程在CPU上运行,在时间片耗尽之前因为缺少某样资源而无法继续执行从而阻塞,线程会变为阻塞态,CPU会去调用其他的线程;
(4)阻塞态->就绪态:导致线程阻塞的事件发生,线程具有了除CPU意外的所有资源,线程变为就绪态,等待被CPU调度;
(5)就绪态->运行态:线程具有了除CPU意外的所有资源,被CPU调度从而在CPU上运行,此时线程变为了运行态;
总结:线程在几种状态间的转换就叫做线程调度;

5.2、线程优先级

(1)在linux中线程分为0~99的100个优先级,数值越大优先级越高,linux中有专门的API设置线程的优先级;
(2)给线程设置优先级是为了提高响应速度,改善用户的使用体验;
(3)一般来说,跟用户交互的线程优先级要设置的高一些,后台运行的线程优先级设置的低一些;比如:你肯定不希望点一下鼠标要几秒才有反应,所以检测鼠标事件的线程优先级要设置的高一些;
(4)优先级高的线程会优先被CPU调度,但是需要注意不能产生饿死现象,理想的情况:高优先级的线程会先运行,低优先级的线程稍后运行,但不能让低优先级的线程被饿死;

5.3、线程的调度策略

(1)SCHED_OTHER:分时调度策略;
(2)SCHED_FIFO:实时调度策略,先到先服务。一旦占用cpu则一直运行,一直运行直到有更高优先级任务到达或自己放弃;
(3)SCHED_RR:实时调度策略,时间片轮转。当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平;

5.4、线程调度算法

(1)先来先服务:操作系统维护一个等待队列,需要CPU的线程就加入等待队列进行排队,操作系统按照先后顺序去调度线程。算法实现很简单,但是没有考虑线程执行的任务之间存在轻重缓急;
(2)最短作业优先:选择执行时间最短的作业最先执行;
(3)最短剩余时间优先:调度程序总是选择其剩余运行时间最短的那个进程运行,
(4)最高响应比优先算法:为每个线程计算出响应比,响应比高的优先被运行,为了解决饿死的线程,线程的响应比是动态变化的,总体趋势: 每个作业随着在后备池等待时间的增长其响应比也不断增长,而且,预计运行时间越短的作业响应比增长越快;
(5)轮转法:将CPU的运行划分成时间片,每个线程在CPU上运行直到时间片耗尽,时间片耗尽后就调度其他就绪态的线程在CPU上运行;
(6)最高优先级算法:调度每次将CPU分配给具有最高优先级的就绪线程;
(7)多级反馈队列算法:结合了前面的好几种算法,比前面介绍的调度算法都更优秀,比较复杂,这里不详细介绍;

5.5、可抢占线程和不可抢占线程

(1)抢占:线程在用尽时间片后被强制剥夺CPU的使用权,进入就绪态;
(2)不可抢占线程:除非线程主动放弃CPU使用权或者进入阻塞态时,CPU才会被让渡给其他线程,否则其他线程将无法运行;
(3)可抢占线程:时间片耗尽就让渡出CPU;
补充:现在基本都是可抢占的线程;

6、线程安全

6.1、引起线程安全问题的原因

(1)多个线程对共享资源进行操作时,由于线程之间感知不到其他线程对共享资源的操作,所以可能出现线程对共享资源的访问冲突;
(2)比如:很经典的例子,两个线程对同一个int型变量i各进行"++"操作一百次,最后发现i的值不是200;

6.2、线程同步的方法

在这里插入图片描述

(1)二元信号量:特殊情况的信号量,信号量的值是1,只有两种状态(占用与非占用),被锁住的资源同时只允许一个线程操作;
(2)多元信号量:信号量的值大于1,允许多个线程访问共享资源,通过P操作和V操作来进行线程间同步;
(3)互斥量:和二元信号量类似,资源仅同时运行一个线程访问,不同之处在于信号量可以被任意线程获取或释放,而互斥量只能谁获取谁释放;
(4)临界区:比互斥量更严格,只有创建临界区的进程才能获得锁,其他进程无法获取该锁。把获取临界区的锁称为进入临界区,把释放临界区的锁称为离开临界区;
(5)读写锁:适合频繁读取偶尔写入的情况,允许读状态时共享,写状态时独占;
(5)条件变量:线程可以等待某个条件变量,当条件变量不满足条件时,线程进入睡眠;线程也可以去唤醒条件变量,当条件变量满足条件时,等到条件变量的线程都会被唤醒;

6.3、可重入函数与不可重入函数

6.3.1、两者的区别

(1)函数重入:函数没有执行完成,由于外部因素或内部调用,又一次进入该函数执行;
(2)区别:可重入函数被多个线程同时调用不会出错,不可重入函数只允许同时被一个线程调用;
(3)可重入函数是线程并发执行的安全保障,在进行多线程编程时需要注意线程是否可重入;

6.3.2、可重入函数要满足的条件

(1)不使用任何(局部)静态或全局的非const变量;
(2)不返回任何(局部)静态或全局的非const变量的指针;
(3)仅依赖于调用方传入的参数;
(4)不依赖任何单个资源的锁;
(5)不调用任何不可重入的函数;

7、三种算法模型

内核线程和用户态线程

(1)我们调用内核的API创建的是用户态线程,不是内核态线程;
(2)内核线程负责管理和调度用户态的线程;
(3)用户态线程并不一定在操作系统里对应相等数量的内核线程;

7.1、一对一模型

在这里插入图片描述

优点:
(1)一个用户态线程对应一个内核态线程,使得用户态的线程具有了和内核线程一致的优点,用户线程直接实现真正的并发;
(2)一个用户态线程因为某些原因阻塞时,其他用户态线程执行不会收到影响;
缺点:
(1)操作系统限制了内核线程的数量,因此一对一模型会让用户的线程数量受到限制;
(2)操作系统的内核线程调度,上下文切换的开销较大,导致用户线程的执行效率下降;

7.2、多对一模型

在这里插入图片描述

优点:
(1)将多个用户态线程映射到一个内核线程上,用户态线程之间切换开销小,执行效率高;
(2)多对一模型使得用户态线程可以无限制的增加;
缺点:
(1)当一个用户态线程阻塞时,映射到同一个内核线程的用户态线程全部阻塞;

7.3、多对多模型

在这里插入图片描述

多对多模型结合了多对一和一对一模型的特点,克服了缺点保留了优点,将多个用户态线程映射到少数但不止一个内核线程上;
优点:
(1)一个用户态线程阻塞不会使得所有用户态线程阻塞,因为还有别的内核线程可以调度;
(2)多对多模型对用户态线程的数量也没有限制,在多处理器系统上,多对多模型的线程也能得到一定的性能提升,不过提升的幅度不如一对一模型高;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux线程详解:线程概念、线程调度、线程安全、线程模型 的相关文章

  • 操作系统死锁 四个必要条件

    操作系统死锁 四个必要条件 1 死锁 xff1a 如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件 xff0c 那么该组进程是死锁的 2 产生死锁的原因 xff1a xff08 1 xff09 竞争不可抢占性资源 x
  • C++智能指针总结(面试常问)

    C 43 43 智能指针总结 xff08 面试常问 xff09 1 智能指针的实现原理2 C 43 43 11四种智能指针总结2 1 auto ptr xff1a 2 2 unique ptr 2 3 share ptr 2 4 weak
  • C++可重入函数和不可重入函数

    C 43 43 可重入函数和不可重入函数 可重入函数是指能够被多个线程 同时 调用的函数 xff0c 并且能保证函数结果正确不必担心数据错误的函数 不可重入函数是指不能运行在多任务环境下 xff0c 除非能保证互斥的函数 由于使用了未受保护
  • STM32单片机中WIFI模块数据传输问题(float->u32->u8/u8->u32->float)

    STM32单片机中WIFI模块数据传输问题 xff08 float gt u32 gt u8 u8 gt u32 gt float xff09 最近在做毕业设计 xff0c 在做wifi数据传输与接收时 xff0c 涉及到了STM32单片机
  • Windows10忘记用户密码?怎么打开电脑?

    Windows10忘记用户密码 xff1f 怎么打开电脑 xff1f 首先在输入密码的登录界面连续敲5次shift按键进入cmd命令行 输入net user查看用户 现在是自己创建的用户忘记密码 xff08 我的是Sunrise用户 xff
  • java --向上转型和向下转型

    一 简述 Java 转型主要是用在继承和接口实现的场景 xff0c Java 转型可分为向上转型和向下转型 xff0c 区别如下 xff1a 向上转型 xff1a 通过子类对象实例化父类对象 xff0c 这属于自动转换 向下转型 xff1a
  • docker

    docker 背景 环境配置的难题 软件开发最大的麻烦事之一 就是环境配置 用户计算机的环境都不相同如果某些老旧的模块与当前环境不兼容 那就麻烦了环境配置如此麻烦 换一台机器 就要重来一次 旷日费时能不能从根本上解决问题 软件可以带环境安装
  • 6.2 能控性

    能控性和能观性是线性系统学习中非常重要的部分 xff0c 它们是研究控制问题和滤波问题所必需的 今儿先来说能控性 一 能控性是啥 xff1f 定义6 1 若对任意初始状态 x 0 61
  • 计算机网络精选20道题

    1 现有一个公司需要创建内部的网络 xff0c 该公司包括工程技术部 市场部 财务部和办公室4个部门 xff0c 每个部门约有20 xff5e 30台计算机 试问 xff1a xff08 1 xff09 若要将几个部门从网络上进行分开 如果
  • “四旋翼”无人机“X模式”飞行原理

    文章目录 摘要飞行器分类四旋翼 X模式 飞行原理四旋翼 十模式 飞行原理参考资料 摘要 简单的介绍了四旋翼无人机的两种模式的飞行原理 飞行器分类
  • PID控制器原理及模块化的源码

    文章目录 摘要PID原理概述比例环节积分环节微分环节 串级双闭环PID控制外环内环 模块化的源码主函数硬件初始化PID复位定义私有变量计算串级PIDPID计算公式源码LIMIT范围控制宏定义思维导图 摘要 小飞机由于飞手的技术和外部环境因素
  • 用驱动精灵和手动更新方式安装 Arduino mega 2560 驱动失败的解决方案

    文章目录 摘要安装步骤 下载安装包 安装地面站 安装驱动 驱动安装失败 补充知识 注意事项总结思考 摘要 硬件环境 xff1a AMP飞控 固件采用的3 2 1软件环境 xff1a Win7 xff0c 地面站采用MissionPlanne
  • 使用条件类型实现TypeScript中的函数重载

    假设有这样的一个函数 xff0c 你会怎么来声明他的类型呢 xff1f function add a b return a 43 b add函数可能有两种情况 参数a b为number类型 xff0c 返回值为number类型参数a b为s
  • 【星海出品】openstack LVM后端

    LVM后端创建 LVM的Red Hat 管理介绍 xff1a https access redhat com documentation zh cn red hat enterprise linux 7 html logical volum
  • xshell连接ubuntu虚拟机失败的2个问题

    问题1 xff1a 虚拟机查看ip失败 xff0c 只显示lo xff0c 不显示ens33 解决方法 xff1a 一句代码 sudo dhclient ens33 成功 xff01 问题2 xff1a xshell连接虚拟机ip地址失败
  • Ubuntu20.10 成功安装搜狗输入法的教程(图文详解)

    1 首先安装fcitx 在终端 xff08 Ctrl 43 Alt 43 T打开 xff09 输入 sudo apt get install fcitx 2 在搜狗输入法网页选择linux版本 https pinyin sogou com
  • (七)springcloud Oauth2授权-Spring Cloud Oauth2

    spring security oauth2 客户端四种授权模式 xff1a 授权码模式 xff08 authorization code xff09 xff1a 第三方应用先申请一个授权码 xff0c 然后再用该码获取令牌 简化模式 xf
  • ROS_Dynamic Reconfig 动态参数调节

    创建功能包 package cd catkin ws src catkin create pkg dynamic refg roscpp dynamic reconfigure cd catkin make 向功能包添加动态重配置文件 cf
  • BGA“焊点”虚焊原因分析及控制方法

    电路板调试过程中 xff0c 会出现 BGA器件外力按压有信号 xff0c 否则没有信号 的现象 xff0c 我们称之为 虚焊 本文通过对这种典型缺陷进行原因分析认为 xff1a 焊接温度曲线 焊膏量 器件及PCB板焊盘表面情况以及印制板设
  • Python中的列表(清晰易懂)

    列表是用来存放数据的 Python中的列表关键字是list 我们来定义一个列表 lista 61 34 a 34 34 b 34 34 c 34 666 34 a 34 可以看到列表lista中 有字符型数据 34 a 34 34 b 34

随机推荐

  • VR技术类毕业论文文献有哪些?

    本文是为大家整理的VR技术主题相关的10篇毕业论文文献 xff0c 包括5篇期刊论文和5篇学位论文 xff0c 为VR技术选题相关人员撰写毕业论文提供参考 1 期刊论文 运动炫科技 智慧赢未来 VR技术在体育领域内的应用与展望 期刊 xff
  • Haar特征类有哪些最新发表的毕业论文呢?

    一 总体简介 Haar特征的相关文献在2006年到2020年内共计132篇 xff0c 主要集中在自动化技术 计算机技术 无线电电子学 电信技术 公路运输 等领域 xff0c 其中期刊论文100篇 会议论文4篇 专利文献28篇 xff1b
  • 查阅国外文献的网站有哪些?

    毕业季不知道小伙伴们有没有为了论文感到头秃 xff0c 参考文献在我们的论文中有着举足轻重的作用 xff0c 每年这个时候都有大批小伙伴为这个寻找参考文献发愁 有些专业的小伙伴由于专业的特殊性很多需要的文献还是外文文献 xff0c 对他们来
  • 使用Python和C++的写数据结构和算法

    使用Python和C 43 43 的写数据结构和算法 1 数据结构和算法简介2 数据结构2 1 堆栈2 2 队列2 3 散列表2 4 二叉树2 5 线性搜索2 6 二进制搜索2 7 递归2 8 递归二进制搜索2 9 QuickSort2 1
  • Hive与Hbase的区别与联系

    一 概念 1 xff0c Hive hive是基于Hadoop的一个数据仓库工具 xff0c 用来进行数据提取 转化 加载 xff0c 这是一种可以存储 查询和分析存储在Hadoop中的大规模数据的机制 hive数据仓库工具能将结构化的数据
  • ros 命名空间

    文章目录 全局命名空间相对名称私有名称节点命名空间 全局命名空间 rosout前面的反斜杠 表明该节点名称属于全局命名空间 之所以叫做全局名称因为它们在任何地方 xff08 包括代码 命令行工具 图形界面工具等的任何地方 xff09 都可以
  • DenseNet及torchvision中的实现

    ResNets Highway Networks Stochastic depth DenseNet他们的共同的特点是 They create short paths from early layers to later layers 他们
  • Xmanager5用Xstart连接CentOS7

    今天安装了Xmanager5 xff0c 原本已经有了Xshell5 xff0c 没有冲突 xff0c 测试Xftp Xshell使用上均无问题 到了Xstart却出错了 xff0c 客户端设置完后点击运行 xff0c 出现报错 查找了许多
  • CAN总线入门学习(一)

    今天带着大家学习 xff0c CAN总线 1 概要 本资料是面向 CAN 总线初学者的 CAN 入门 对 CAN 是什么 CAN 的特征 标准规格下的位置分布等 CAN 的概要及 CAN 的协议进行了说明 2 使用注意事项 本资料对博世 B
  • java调用接口

    long dateStr 61 System currentTimeMillis 1000 String url 61 34 34 创建参数 JSONObject jsonObject 61 new JSONObject jsonObjec
  • 英特尔NUC 11板载USB3.0座子接口定义

    规格书没有座子PIN定义 xff0c 于是我找技术支持提供了定义
  • 宝塔配置Workerman

    map span class token variable http upgrade span span class token variable connection upgrade span span class token punct
  • px4飞控和机载电脑通信:机载电脑接收飞控的自定义px4消息

    机载电脑接收飞控的自定义px4消息 mavros功能包能够实现px4飞控和机载电脑之间的实时通信 而对于大部分的消息通信mavros都已经有相应接口可以调用 xff0c 例如 xff1a 位置 期望位置 速度 四元素等消息都可以通过C 43
  • px4飞控和机载电脑通信:飞控接收机载电脑的自定义mavlink消息

    前面一篇讲了机载电脑怎么接受飞控的px4消息 这一篇讲解如何飞控怎么接收从机载电脑传过来的消息 分成两部分 机载电脑发送消息 飞控接收消息 pixhawk版本 pixhawk4 px4版本 1 11 2 ros版本 1 14 10 机载电脑
  • 多无人机通信-路由器实现

    多无人机通信 多无人机之间相互通信是实现编队飞行的基础 而想要实现通信就需要组建网络 在网络之间实现数据信息的互相传输 按结构分成两大类 中心节点网络和无中心节点网络 我们这里所用的路由器就是中心节点网络 所有的数据的传输都要经过中心节点
  • js做文件分片上传

    js做文件分片上传 分片上传视频 xff0c 图片 xff0c 音频 xff0c 转base64 64 Layout 61 null lt DOCTYPE html gt lt html gt lt head gt lt meta name
  • 锐捷交换机基本配置命令

    锐捷交换机基本配置命令 锐捷交换机 xff0c 忘记colsole口的en密码 xff0c 重启交换机 xff0c 立即按ctrl 43 c xff0c 进入bootloader 菜单 xff0c 再按ctrl 43 q xff0c 然后输
  • 驱动设计思想(机制、策略、分离、分层)

    1 机制和策略 1 机制就是提供什么功能 xff0c 策略就是怎么使用这些功能 在编写驱动时需要在编程时间和驱动的灵活性之间取一个可接受的折中 xff0c 驱动提供机制 xff0c 尽量不提供策略 xff0c 策略让上层应用去做 2 机制和
  • debian重启没办法进入图形界面

    在遇到重启有时候没办法进入图形界面的情况下 xff0c 你可以考虑是自己电脑或者服务器显卡的问题 xff0c 如果你进入了命令行的界面 xff0c 执行 etc init d kdm restart 可以重新启动图形界面的话那么就可以肯定时
  • linux线程详解:线程概念、线程调度、线程安全、线程模型

    1 线程与进程的区别 1 线程是轻量级的进程 xff0c 是程序执行流的最小单位 xff1b 2 进程是资源分配的最小单位 xff0c 线程是调度的最小单位 xff1b 3 进程可以创建线程 xff0c 线程不可以创建进程 xff1b 4