iteye不支持markdown格式,建议大家点击我csdn的连接看文章
https://blog.csdn.net/u010454030/article/details/80709515
### (一) 前言
作为一名优秀的攻城师,了解多线程的知识非常有必要,尤其在人工智能和机器学习的热潮下,如何提高程序或者算法的运行效率是非常有价值的一件事情。
在当代大多数的操作系统,都有能力同时的运行多个程序或者app,比如在windows上你可以同时打开多个QQ,多个不同的浏览器,多个不同的视频播放器。或者在你的苹果或者安卓手机上边听歌边使用地图功能,这背后其实用的就是用的是多线程的技术。
![image](https://www.logicbig.com/quick-info/images/multithreading.png)
### (二)多任务处理
在同一时刻运行多个程序也叫做多任务处理,每个程序会由一个单独的task来执行,每个task运行在一个单独的处理器中(可以理解为是一个进程或者一个CPU)。在早期的计算机操作系统中,往往都是单处理器的,这时候你也能同时运行多个程序,这种情况我们称为并发而不是并行,因为这个时候多个程序其实是共用的一个CPU时钟,由于计算机的时间片切换非常快,所以大多数时候你是感觉不到这种差异的,但其实是一种假象。随着社会的进步,现在的电脑基本上都是多个CPU的,所以在多个CPU的情况下,程序才能够真正的并行起来。
### (三)线程与多线程
每个处理器可以创建多个子任务,这里的每一个子任务都是一个线程。一个线程执行的其实就是一段代码指令序列。在一个处理器内的多个线程是可以通过处理器的共享内存进行交互的,关键词并发(concurrency)指的就是在一个处理器内同时执行多个线程。
多线程通常是通过把大的任务切分成多个子任务运行,以此来提高程序运行效率的。比较典型的例子就是现实中修一段高速公路时,最快的方法就是,把这条公路切分成多段,然后每个段由一个工程队负责,这样同时工作就能大大提高效率。
### (四)并发与线程上下文切换
上面说过,单个处理器内的多线程任务其实是一种假象,其实是通过切换CPU时钟实现的,这个时候,在切到另一个线程之前,CPU必须保存当前线程的状态,这被称为上下文切换,这也是单核处理器能同时执行多个任务的秘密。
线程切换是一个比较昂贵的操作,调度器需要花费额外的CPU时间来临时暂停当前活跃的线程为了让另外一个线程运行,然后保存当前线程状态,在需要的时候,还得恢复当前挂起的线程状态。
![image](https://www.logicbig.com/quick-info/images/context-switching.png)
### (五)线程调度
线程调度主要负责线程的上下文切换,它决定了接下来要选择哪个挂起的线程执行。线程调度是操作系统的一部分。
### (六)互斥
互斥的目的是保证在两个线程之间不能同时执行同一个代码片段。通俗点来说就是我们在大街上看到的红绿灯,任何时候只能有一种颜色的灯在亮。 互斥的资源通常是需要被共享的,比如卫生间的马桶,任何时候只能有一个人用,如果同时有多个人用那么就会出现问题,这也叫竞争,反映到程序中,可能是一种数据解构,一个外部设备如打印机,或者一个网络连接。
竞争通常会带来问题,所以在程序中通常使用锁机制(lock)来达到互斥的目的,互斥也可以称为线程同步(synchronization)
同步带来的缺点是,在一个线程没有释放锁之前,另外一个线程需要一直等待。它强制调度是串行操作的,即使这里有多个空闲的CPU资源,所以在日常开发中要合理使用。
### (七)并发与并行
并行:
并行指的是多线程运行在不同的CPU或者处理器上,从而避免了在同一个CPU或者处理器中的上下文切换的操作。当然这里是多个线程之间不需要通信或者有共享资源需要访问。这种情况就可以独立的执行和计算。当然前提是硬件有多个CPU或者处理器。
并发:
并发指的是多个线程有通信或者需要访问共享的数据,这个时候需要考虑加锁,否则有可能安全问题。通常情况下并发是指运行在同一个CPU或者core内,但这并不是十分准确,多个线程也可以运行在多个CPU内但是他们有合理的同步策略。
![image](https://www.logicbig.com/quick-info/images/parallelism-vs-concurrency.png)
### (八)多处理器 vs 多core vs 超线程
多处理器是指在单台电脑上有多个CPU单元,每一个处理器可以有多个core,每个core可以运行一个任务,多线程程序每个线程都可以并行的运行在一个core中。
注意单个core也有可能运行两个并行的线程,这种能力被称为超线程。
>超线程(HT, Hyper-Threading)[1]是英特尔研发的一种技术,于2002年发布。超线程技术原先只应用于Xeon 处理器中,当时称为“Super-Threading”。之后陆续应用在Pentium 4 HT中。早期代号为Jackson。 <br/> 通过此技术,英特尔实现在一个实体CPU中,提供两个逻辑线程。之后的Pentium D纵使不支持超线程技术,但就集成了两个实体核心,所以仍会见到两个线程。超线程的未来发展,是提升处理器的逻辑线程。英特尔于2016年发布的Core i7-6950X便是将10核心的处理器,加上超线程技术,使之成为20个逻辑线程的产品。
超线程其实是一个CPU单元内,提供了两个逻辑线程,依赖于底层操作系统,如果操作系统不支持,也可以禁用掉。因此在一个4 core 处理器系统中可能有8个逻辑处理器。
### (九)线程 与 CPU缓存
依赖于CPU的类型,当前的操作系统基本都支持三级缓存,CPU缓存的目的是为了CPU访问CPU缓存数据更快,这种快是相对于CPU读取内存数据而言(RAM),通常情况下一般高出几个数量级。
L1 级别缓存 在cpu的芯片中,体积一般是8-64kb
L2 级别缓存 通常位于CPU和RAM之间,体积一般是2-4MB
L3 级别缓存 如果存在一般都位于主板上,体积一般是8-16MB (注:跟CPU类型有关,一些CPU类型可能直接用L2替代L3了)
![image](https://www.logicbig.com/quick-info/images/cpu-cache.png)
下面通过表格看下不同的介质,访问的耗时情况,其中L1缓存属于core级别的,所以每个运行在core里面的线程都可以拥有自己的local cache。
从CPU到| 大约需要的CPU周期 |大约需要的时间(单位ns)
---|---|---
寄存器 | 1 cycle| 可以忽略
L1 Cache | ~3-4 cycles|~0.5-1 ns
L2 Cache | ~3-4 cycles|~0.5-1 ns
L3 Cache | ~3-4 cycles|~0.5-1 ns
跨槽 | ~30-40 cycles|~20 ns
内存 | ~120-240 cycles |~60-120ns
### (十) 总结
本篇主要介绍了多线程有关的一些基础概念以及CPU的cache模型,在一个多线程的程序中,为了提高处理性能,每个线程都有自己的CPU缓存,而同时如果多个线程想要访问一块共享的区域(位于主内存中),需要考虑同步和可见性的问题,,所以一些编程语言如C,C++,C#和Java都会有确保变量在修改之后对其他线程可见的语义,如Java里面的volatile关键词会强制flush线程的local cache的数据到主存中,除此之外一些锁机制也会触发,如lock和unlock指令,这些知识点会在后面的文章中一一介绍。
参考文章:
https://www.logicbig.com/quick-info/programming/multi-threading.html#processor-cache
https://medium.com/@bkodirov/threading-in-java-55ec2e184fe7
![image](https://img-blog.csdn.net/20180615202937138?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA0NTQwMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
分享到:
相关推荐
了解线程池的概念也是Java多线程编程中的一个重要知识点。线程池是一种多线程处理形式,它将线程和任务的概念分离开来,能够有效管理线程资源,减少线程创建和销毁的开销,提高程序性能。Java中可以通过Executors类...
本压缩包“多线程基础与基于多线程的简单聊天室”提供了对多线程技术的实践理解和二次开发的基础。以下是关于这个主题的详细知识点: 1. **多线程的概念**:多线程是指在一个程序中同时执行多个不同的线程,每个...
线程是操作系统中并发执行的...了解并掌握这些基础知识和常见问题,对理解和编写高效的多线程程序至关重要。在实际开发中,还需要根据具体应用场景选择合适的线程模型和同步策略,以实现高效、稳定、可靠的并发程序。
在IT行业中,多线程是程序并发执行的一种方式,它极大地提高了系统资源的利用率和程序...在学习过程中,可以参考"多线程基础总结01.bmp"和"多线程基础总结01.mmap"等文件,它们可能提供了更为详细和直观的结构化知识。
总的来说,理解和掌握进程与线程对于程序员来说至关重要,特别是在开发多线程应用或系统级软件时。深入学习MFC框架中的线程管理机制,可以提升代码的效率和可靠性,同时使程序更加符合并发执行的最佳实践。
### 多线程知识总结 #### 一、线程基础概念 **线程状态:** 在探讨多线程之前,我们需要了解线程的基本状态转换。一个典型的线程生命周期包括以下几个阶段: 1. **Start(启动):** 当线程被创建后调用`start()`...
"大漠多线程模板"是一个专门针对C#开发的多线程处理框架,它为开发者提供了便捷的方式来管理和优化多线程应用。这个框架由知名开发者"大漠"创建,旨在简化复杂的并发编程,提高代码的可读性和可维护性。 多线程允许...
适合人群:具备基本Java编程知识,希望深入了解多线程编程的开发者。 使用场景及目标:① 掌握线程的基本概念和多线程编程的重要知识点;② 学习多种创建线程的方法及其优缺点;③ 理解和应用线程同步与互斥的技术;...
通过学习这个示例项目,开发者不仅可以掌握STM32单片机的RT-Thread多线程编程,还能深入了解RTOS的运行机制,为进一步的嵌入式系统开发打下坚实基础。在实践中不断探索和优化,可以将STM32的性能发挥到极致。
Java 多线程基础知识的了解是 Java 程序设计的重要组成部分,本资源摘要信息对 Java 多线程基础知识进行了详细的讲解和练习题。 1. sleep() 和 wait() 的区别 sleep() 是 Thread 类的方法,导致线程暂停执行指定...
一、Java多线程基础 1. **线程的概念**:线程是程序执行的最小单元,一个进程可以有多个线程同时执行,使得程序能够并行处理多个任务。 2. **线程的创建方式**:Java提供了两种创建线程的方式,一是继承Thread类,...
一、多线程基础知识 多线程是指一个程序中可以同时存在多个执行流程,每个流程称为一个线程。在易语言中,多线程可以帮助开发者实现并行处理,提高程序运行速度,尤其是在处理大量数据或需要进行复杂计算时。同时,...
综合上述内容,iOS多线程编程指南是一份极具价值的资源,它不仅详细介绍了iOS平台下多线程编程的基础知识,还包括了许多编程实践中的技巧和最佳实践,对于iOS开发者来说,是提高开发技能不可或缺的学习资料。
标题所指的知识点是“多线程编程的入门教程”,这意味着本文档是为那些刚接触多线程编程的初学者提供的基础教学材料。通过这个标题,我们可以推断文档内容会从最基础的多线程概念讲起,逐渐过渡到实际编程技巧和例子...
1. 多线程基础介绍:包括多线程术语的定义、多线程标准的符合、多线程的好处,如提高应用程序响应性、有效使用多处理器、改进程序结构以及减少系统资源占用。此外,还涉及了并发性与并行性的概念,以及多线程的结构...
### 多线程开发基础知识与核心概念 #### 一、多线程开发概述 多线程编程是指在程序中创建多个线程来并发执行任务的一种技术。这种技术能够充分利用现代多核处理器的能力,提高应用程序的运行效率。多线程开发在软件...
本资料包是针对多线程入门的学习资源,涵盖了多线程的基础概念、创建与管理以及同步控制等多个方面。 首先,让我们了解什么是多线程。在单线程系统中,程序的执行是顺序的,而多线程则允许在一个进程中同时运行多个...
总的来说,多线程游戏坦克大战涉及到多线程编程、游戏逻辑设计、工具使用等多个方面的知识点,这些都需要开发者具备扎实的技术基础和丰富的实践经验。通过理解并掌握这些内容,我们可以更好地理解和开发类似的游戏...
从标签“vc++多线程”可以看出,本书不仅涵盖了VC++的基础知识,还特别关注了在VC++项目中实现多线程的技术细节。 压缩包内的文件名称列表显示了书籍内容的章节分布,主要涉及以下几个方面: 1. "VC多线程编程(转)...