线程

  • 线程是CPU调度的最小单位

CPU 执行过程图

  • 比如我们有一个单核CPU,目前有3个想要执行的线程,这3个线程在执行过程中先执行1,在下一个时间片cpu让渡出来执行线程2,在下一个时间片cpu让渡出来执行线程3,以此类推,最终将3个线程执行完毕。
  • 如果我们不将CPU进行分片,按顺序先执行完线程1,再执行线程2,最后执行线程3。

线程单核cpu-导出.png

  • 我们是否有一个疑惑,前者(CPU切片)后者(顺序执行)使用的时间貌似是一样的,并且后者(顺序执行)只切换了2次上下文,这样是不是执行的效率更高呢?那多线程存在的意义有体现在哪里呢?
  • 提到了上面的疑问,我们就不得不说道一下I/O(磁盘的读写、网络的数据传输、音视频的输入输出等),那么我们在编程的中的I/O主要是磁盘I/O网络I/OI/O是非常耗时间的。

cpu-硬盘-内存.png

  • 假如我们有CPU、硬盘、内存,要想文件读取,我们最先想到的是CPU直接读取硬盘数据放入内存的变量中,这样在整个读取的过程中整个I/O都被占用的,因而这种方式会造成前者(CPU切片)后者(顺序执行)执行效率差不多的。
  • 但是实际的I/O并不是这样的,实际的I/O的过程中有一个非常重要的东西DMA控制器。在读取文件的过程中,其实CPU不会直接操作硬盘,而是给DMA控制器下达命令来完成文件的读取。首先,CPU 对DMA下达指令(这个指令中包含有磁盘设备信息和要读取的文件位置信息),然后DMA告知硬盘进行文件读取并将读取的文件内容加载到内存变量中,读取完毕之后硬盘会返回反馈一个读取结果完成的信息给到DMA,DMA之后以终端的形式通知CPU,然后CPU去内存中拉取数据,最终拿到数据。

DMA.png

  • 我们通过步骤一下达指令之后,其实CPU就处于闲置状态,就可以执行其他线程。我们现在再此回看单核cpu处理3个线程读取文件,CPU下达指令给DMA后(CPU闲置),假如线程2拿到CPU控制权,同样CPU下达指令给DMA后(CPU闲置),线程3拿到CPU控制权,同样CPU下达指令给DMA后(CPU闲置),CPU可以执行其他线程,最终实现并行读取,提高CPU利用率。另外,DMA进行数据读取是可以复用的,CPU的总线具有多条线路,DMA就可以充分利用这些线路,最终实现并行的读取文件。

112058489.png

协程

  • 协程是类似于编程语言级别的线程,一种用户态的轻量级线程,协程不像线程和进程需要进行系统内核上的上下文切换,协程的上下文切换是由用户自己决定的,有自己的上下文,所以说是轻量级的线程,也称之为用户级别的线程就叫协程,一个线程可以多个协程,线程进程都是同步机制,而协程则是异步。协程没有用户态和内核态的转化,性能会比线程效率更高。

异步

  • cpu 发送指令给DMA就是异步执行读取文件,cpu则会被空闲出来执行别的线程。程序级别的也有很多异步操作,比如充值成功短信通知用户的操作,一般都是异步存于队列。
Last modification:February 2, 2023
如果觉得我的文章对你有用,请随意赞赏