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

线程的概念

一、重谈地址空间

每一行代码都有地址,函数连续的代码地址构成的代码块,一个函数对应一批连续虚拟地址。

二、线程

1、理解线程

在进程内部运行,CPU调度的基本单位。

windows有真正意义上的进程(pcb)和线程(tcb),有独立的数据结构和调度算法。

但是Linux线程设计复用进程代码。

所以在CPU中 task_struct <= 进程,CPU不区分进程还是线程,因为两个执行方法是一样的,CPU看到的执行流 <= 进程,叫轻量级进程。

2、创建线程

pthread_t* thread:线程id

const pthread_attr_t* attr:线程属性

void* (*start toutine)(void*):函数指针,新进程的执行方法

举例

三、线程的优势和劣势

1、优势

创建一个新线程的代价要比创建一个新进程小得多

与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多

线程占用的资源要比进程少很多

能充分利用多处理器的可并行数量

在等待慢速I/O操作结束的同时,程序可执行其他的计算任务

计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现

I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

问题:为什么线程调度成本比进程低?

进程A被调度时会把内存中相关数据调入CPU的cache,叫热数据,若切换进程B,cache中的热数据全部作废,重新加载进程B的数据,导致速度变慢。

2、劣势

性能损失:个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型 线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的 同步和调度开销,而可用的资源不变。

健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了,不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。最典型的就是如果一个进程中的一个线程出错就会导致整个进程崩溃。

缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。

编程难度提高:编写与调试一个多线程程序比单线程程序困难得多。

3、线程的私有属性

线程其实大部分属性和进程属性相同,但是每一个线程一定会有属于自己的属性。

线程ID,一组寄存器,栈,errno,信号屏蔽字,调度优先级...

其中最重要的两个是寄存器和栈。

寄存器

进程在调度时不会一下子执行完再执行下一个,CPU的调度要遵守公平性,所以没执行完的进程会有属于自己的寄存器去保留上下文数据,供下一次调度时的数据恢复。

线程也是如此,他也会有自己的寄存器。

线程运行时会形成各种临时变量,必须保存在自己的栈上。

四、pthread库

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于inotif的文件同步备份
  • 服务器是什么?怎么选择适合自己的服务器?
  • 设计模式 - 组合模式
  • 百问网全志系列开发板音频ALSA配置步骤详解
  • 找到财富杠杆然后再行动中精进 -《纳瓦尔宝典》读后感
  • 苍穹外卖(四):swagger导入接口文档
  • 《Advanced RAG》-12-增进RAG的全局理解(二)
  • Golang 中的 XML 魔法:encoding/xml 包的精妙运用
  • 『大模型笔记』基于LLM生成真实世界数据的合成问答数据!
  • Apache,Tomcat,Nginx有什么关系?
  • 《SQL 中计算地理坐标两点间距离的魔法》
  • 目录与文件相关的命令
  • Spring Boot全局异常
  • SQL server 同环比计算模板
  • HDU动态规划——1114.Piggy-Bank,1121.Complete the Sequence,1158.Employment Planning
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • bootstrap创建登录注册页面
  • CSS 三角实现
  • JAVA_NIO系列——Channel和Buffer详解
  • Java反射-动态类加载和重新加载
  • JS学习笔记——闭包
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • OSS Web直传 (文件图片)
  • QQ浏览器x5内核的兼容性问题
  • Sass 快速入门教程
  • vue-cli在webpack的配置文件探究
  • 关于Java中分层中遇到的一些问题
  • 汉诺塔算法
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 七牛云假注销小指南
  • 入门级的git使用指北
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • linux 淘宝开源监控工具tsar
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #QT(智能家居界面-界面切换)
  • (06)金属布线——为半导体注入生命的连接
  • (1)STL算法之遍历容器
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (4) PIVOT 和 UPIVOT 的使用
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (独孤九剑)--文件系统
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转) ns2/nam与nam实现相关的文件
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .net Application的目录
  • .NET NPOI导出Excel详解
  • .net web项目 调用webService
  • .NET 解决重复提交问题
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET开发者必备的11款免费工具
  • .NET命名规范和开发约定