Linux下的异步编程——线程概述及详细的使用方法(一)【建议新手收藏】

一、前言

做交互式客户端应用程序,用户总希望程序能时刻响应UI操作;做高性能服务器开发,使用者总希望服务器能同时处理多个请求……等等,这时我们可以使用多线程技术来保证UI线程可响应、提高服务器吞吐量、提升程序处理速度,设置任务优先级进行调度。

多线程技术只是多个线程在操作系统分配的不同时间片里执行,并不是程序开12个线程12个线程都在同一个 “时间点”执行,同一“时间点”能执行多少线程由CPU决定,各个执行线程的衔接由操作系统进行调度。即,在线程数量超出用于处理它们的处理器数量的情况下,操作系统将定期为每个线程调度一个时间片来控制处理器,以此来模拟同时并发。

在认识线程前,我们需要了解下CPU,了解下进程。

二、多核心CPU超线程CPU

1、多核心处理器(CPU)

指在一块处理器(CPU)中含有多个处理单元,每一个处理单元它就相当于一个单核处理器(CPU)。因此,多核处理器的功能就相当于多台单核处理器电脑联机作战。

2、超线程处理器(CPU)

指在一块CPU中,用虚拟的方法将一个物理核心模拟成多个核心(一般情况是一个单物理核心,模拟成二个核心,也即所谓的二线程。只有当线程数比物理核心数多才能叫超线程。如四核四线程并不是超线程,而四核八线程才能叫超线程)。

3、 优缺点:

  • 1)多核心是真正的物理核心,一块多核心的处理器(CPU),就相当于多块单核心的处理器(CPU)相互协作。因此,从理论上说,多核心比超线程具有更高运算能力。虽然多核心比超线程的运算速度快很多,但多核心也有一个明显的缺点,那就是多核心的使用效率比超线程处理器(CPU)低。因为,多核心在处理数据时,它们相互“合作”的并不是很完美,常常某个核心需要等待其他核心的计算数据,从而耽误时间,被迫怠工。另外,由于目前多核心都是采用共享缓存,这更使多核心的CPU运算速度减慢不少(因为:CPU读取Cache时是以行为单位读取的,如果两个硬件线程的两块不同内存位于同一Cache行里,那么当两个硬件线程同时在对各自的内存进行写操作时,将会造成两个硬件线程写同一Cache行的问题,它会引起竞争)。
  • 2)超线程是用虚拟的方法将一个物理核心虚拟成多个核心,它能够最大限度地利用现有的核心资源,具有较高性价比。

三、操作系统对多核处理器的支持

主要体现在调度和中断上:

  1. 对任务的分配进行优化。使同一应用程序的任务尽量在同一个核上执行。
  2. 对任务的共享数据优化。由于多核处理器(ChipMulti-Processor,CMP)体系结构共享缓存(目前),可以考虑改变任务在内存中的数据分布,使任务在执行时尽量增加缓存的命中率。
  3. 对任务的负载均衡优化。当任务在调度时,出现了负载不均衡,考虑将较忙处理器中与其他任务最不相关的任务迁移,以达到数据的冲突最小。
  4. 支持抢先多任务处理的操作系统可以创建多个进程中的多个线程同时执行的效果。它通过以下方式实现这一点:在需要处理器时间的线程之间分割可用处理器时间,并轮流为每个线程分配处理器时间片。当前执行的线程在其时间片结束时被挂起,而另一个线程继续运行。当系统从一个线程切换到另一个线程时,它将保存被抢先的线程的线程上下文,并重新加载线程队列中下一个线程的已保存线程上下文。

四、进程和线程之间的关系

1、进程

进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。

2、线程

线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程。主执行线程终止了,进程也就随之终止。

每个线程都维护异常处理程序、调度优先级和线程上下文。(线程上下文,当前执行的线程在其时间片结束时被挂起,而另一个线程继续运行。当系统从一个线程切换到另一个线程时,它将保存被抢先的线程的线程上下文,并重新加载线程队列中下一个线程的已保存线程上下文)

3、关系

操作系统使用进程将它们正在执行的不同应用程序分开,.NET Framework 将操作系统进程进一步细分为System.AppDomain (应用程序域)的轻量托管子进程。

线程是CPU的调度单元,是进程中的执行单位,一个进程中可以有多个线程同时执行代码

小编推荐自己的linuxC/C++语言技术交流群:【1106675687】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_50662680/article/details/113122216