首页 > 系统相关 >1、多线程同步——CPU、core核、线程、内存

1、多线程同步——CPU、core核、线程、内存

时间:2024-07-14 21:19:48浏览次数:15  
标签:core 缓存 线程 内存 L1 多线程 数据 CPU

CPU 的运行原理

控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里的)送到地址总线上去,然后 CPU 将这个地址里的指令读到指令寄存器进行译码。对于执行指令过程中所需要用到的数据,会将数据地址也送到地址总线,然后 CPU 把数据读到 CPU 的内部存储单元(就是内部寄存器)暂存起来,最后命令运算单元对数据进行处理加工。周而复始,一直这样执行下去。

CPU的缓存

CPU缓存通常分成了三个级别:L1L2L3。级别越小越接近 CPU,所以速度也更快,同时也代表着容量越小。

L1 是最接近 CPU 的, 它容量最小(例如:32K),速度最快。每个核上都有一个 L1 缓存,每个核上其实有两个 L1 缓存, 一个用于存数据的 L1 d-Cache(Data Cache),一个用于存指令的 L1 i-Cache(Instruction Cache)。

L2 缓存 更大一些(例如:256K),速度要慢一些, 一般情况下每个核上都有一个独立的 L2 缓存。

L3 缓存是三级缓存中最大的一级(例如:3MB),同时也是最慢的一级, 在同一个 CPU 插槽之间的核共享一个 L3 缓存。

读取数据过程。就像数据库缓存一样,首先在最快的缓存中找数据,如果缓存没有命中(Cache miss) 则往下一级找, 直到三级缓存都找不到时,向内存要数据。一次次地未命中,代表取数据消耗的时间越长。

计算过程。程序以及数据被加载到主内存;指令和数据被加载到 CPU 的高速缓;CPU 执行指令,把结果写到高速缓存;高速缓存中的数据写回主内存。

 

【参考】

进程、线程与多核、多CPU之间的关系 (qq.com)

 

Core核

一个核心只能同时执行一个线程

线程切换

  • cpu给线程分配时间片(也就是分配给线程的时间),执行完时间片后会切换都另一个线程。
  • 切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。
  • 从保存线程A的状态再到切换到线程B时,重新加载线程B的状态的这个过程就叫上下文切换。
  • 而上下切换时会消耗大量的cpu时间。

【参考】

认识cpu、核与线程 - jiajun_geek - 博客园 (cnblogs.com)

关于线程上下文切换,你知道多少? (qq.com)  有协程内容

 

重排序与内存可见性

CPU中每个核在执行线程时,都会创建一个本地缓存来保存主内存中的数据。在修改后,再异步写会给主内存。多个线程间对于变量的交互,是通过主内存来进行的。那么这个过程中,就存在一个多个线程间本地缓存同步的问题。比如说,现在对于一个主内存中的变量x=3,线程A将该值修改为x=4,但是,在线程A将数据同步到主内存前,线程B中就读取了数据。那么线程B中就讲讲本该x=4的值读成了x=3,造成了线程间同步的错误。

 【参考】

内存一致性,指令重排序,内存屏障,volatile解析_volatile内存屏障证明-CSDN博客

 

标签:core,缓存,线程,内存,L1,多线程,数据,CPU
From: https://www.cnblogs.com/xixixing/p/18302029

相关文章

  • [深入理解Java虚拟机]线程
    Java与协程在Java时代的早期,Java语言抽象出来隐藏了各种操作系统线程差异性的统一线程接口,这曾经是它区别于其他编程语言的一大优势。在此基础上,涌现过无数多线程的应用与框架,譬如在网页访问时,HTTP请求可以直接与ServletAPI中的一条处理线程绑定在一起,以“一对一服务”的方式处......
  • STAThread与Windows UI线程模型
    STAThread与WindowsUI线程模型1.STAThread属性标注Main方法,使主线程运行在STA模式。用于兼容需要STA环境的COM组件,特别是UI组件。2.线程模式STA(SingleThreadedApartment)一个线程处理所有STA组件。UI线程通常为STA,负责消息处理和UI更新。MTA(MultiThreaded......
  • Qt-线程和线程池
    前言Qt实现在线程中执行任务有4种方法,分别是:1. 创建一个派生于QThread类的子类,重写run函数,在run函数中执行任务2.创建一个派生于QObject的子类,调用QObject::moveToThread()方法将子类对象移动到子线程对象中。3.使用线程池QThreadPool4.使用QtConcurrent执行并......
  • Linux系统编程-线程同步详解
    线程同步是指多个线程协调工作,以便在共享资源的访问和操作过程中保持数据一致性和正确性。在多线程环境中,线程是并发执行的,因此如果多个线程同时访问和修改共享资源,可能会导致数据不一致、竞态条件(racecondition)等问题。线程同步通过协调线程的执行顺序和共享资源的访问来避免......
  • C#面:dot net core管道里面的map拓展有什么作用?
    在.NETCore管道中,Map拓展方法用于将中间件添加到请求处理管道中。它的作用是根据请求的路径或其他条件来选择性地执行中间件。具体来说,Map方法接受一个路径参数和一个委托参数。当请求的路径与指定的路径匹配时,该委托中的中间件将被执行。这使得我们可以根据不同的路径来应用......
  • 【tomcat】Tomcat如何扩展Java线程池原理
    池化技术在后端中,对于经常使用池化就是来提升系统性能,比如数据库连接池、线程池连接池等,本质都是利用空间换时间的来提升性能,用来避免资源的频繁创建和销毁,以此提高资源的复用率,所以合理设置系统所需的线程池大小非常重要,一般都需要结合线程启动监控系统来观察,查看设置的是......
  • [rCore学习笔记 015]特权级机制
    写在前面本随笔是非常菜的菜鸡写的。如有问题请及时提出。可以联系:[email protected]:https://github.com/WindDevil(目前啥也没有官方文档仍然是一上来就丢出来的官方文档.只摘抄了我觉得有意思的部分:实现特权级机制的根本原因是应用程序运行的安全性不可充分信任......
  • Java优雅使用线程池连接SFTP进行文件上传下载 解决请求量大问题
    Java优雅使用线程池连接SFTP进行文件上传下载解决请求量大问题使用FTP连接池降低资源消耗,提高响应速率为什么要使用线程池连接SFTP呢?在Java中使用线程池来连接SFTP(SecureFileTransferProtocol)工具的原因主要与性能、资源管理和效率有关。以下是一些关键原因:资源管......
  • 【Linux】多线程_3
    文章目录九、多线程3.C++11中的多线程4.线程的简单封装未完待续九、多线程3.C++11中的多线程Linux中是根据多线程库来实现多线程的,C++11也有自己的多线程,那它的多线程又是怎样的?我们来使用一些C++11的多线程。Makefile:testThread:testThread.cc g++-o$@......
  • python进程和线程_day013
    python进程和线程概念相关进程概览线程概览Python中的多进程Python中的多线程多进程还是多线程单线程+异步I/O(协程)应用案例示例1:将耗时间的任务放到线程中以获得更好的用户体验示例2:使用多进程对复杂任务进行“分而治之”。今天我们使用的计算机早已进入多CPU或多核......