多线程简介&应用


我们来先看一下冯诺依曼计算机硬件结构:
冯洛伊曼

在早期的简单批处理操作系统中,存储设备I/O相对于处理器速度太慢,导致处理器经常空闲。如下所示:

单任务

执行任务内容耗时(us)
CPU等待I/O15
CPU运行2
总计17
C P U 利用率 CPU利用率 CPU利用率 2 / 17 = 0.1176 = 11.76 % 2/17 = 0.1176 = 11.76\% 2/17=0.1176=11.76%

从上述表格中各个环节的表现结果,可以提出两种方案:

  • 方案一:提高存储器的I/O速度。

    如果把存储设备的速度再提高,就可以提高CPU的利用率了。确实,在计算机发展的历史中,也在不断地提高存储设备的I/O速率。将计算机的存储设备,分级提高速率,并努力的靠近CPU,如下图所示:
    存储器分级

    但是,尽管这样,仍然无法使得我们的存储设备I/O与CPU的速度媲美。如若未来,将大容量的存储设备与CPU在同一个芯片中,且存储设备的I/O速率能达到与CPU计算速率匹配,将把计算效率推向一个新的高度。

  • 方案二:多任务使用CPU,避免等待,提高CPU使用效率。

    其实,方案一,将存储设备I/O速率提升至与CPU计算速率媲美,所需要付出的代价很高。

    那多个任务使用CPU是否会提高CPU的利用率呢?
    假设两个完全相同的任务类型,那么执行效果如下:
    多任务CPU等待IO

    执行任务内容耗时(us)
    CPU等待I/O30
    CPU运行4
    总计34
    C P U 利用率 CPU利用率 CPU利用率 4 / 34 = 0.1176 = 11.76 % 4/34 = 0.1176 = 11.76\% 4/34=0.1176=11.76%

    多个任务就是简单的串行处理任务,效率并没有提升。

    ① 那是否可以让正在等待存储器中数据的任务释放CPU的使用权,让其他任务获取CPU使用权,以此来提高CPU的使用效率?——可以
    ② 等待存储器数据的任务,释放了CPU的使用权,又让谁来完成数据的搬移呢?—— DMA

DMA(Direct Memory Access)

DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制。想了解更多DMA知识,参见知乎-Linux的彻底搞懂零拷贝技术( DMA、PageCache)一文。

DMA

从上图可以看出,CPU发起I/O请求后,后续的数据搬移工作,都交由DMA完成,等到数据都搬移完毕后,DMA向CPU发起程序中断请求,告知数据搬移完毕。在整个从外部设备读写过程中,CPU仅参与控制,大大减少了CPU的开销。

多任务

有了DMA的助力,DMA搬移数据的过程中,CPU资源可以被释放出来,执行其他任务。

多任务

执行任务内容耗时(us)
CPU等待I/O13
CPU运行4
总计17
C P U 利用率 CPU利用率 CPU利用率 4 / 17 = 0.2353 = 23.53 % 4/17 = 0.2353 = 23.53\% 4/17=0.2353=23.53%

从上述结果可以看出,两个任务情况下,CPU的利用率是原来的2倍。如果有16个相同的任务执行,那么运行结果如下表所示:

执行任务内容耗时(us)
CPU等待I/O0
CPU运行32
总计32
C P U 利用率 CPU利用率 CPU利用率 32 / 32 = 1 = 100 % 32/32 = 1 = 100\% 32/32=1=100%

在多任务调度的情况下,能充分利用CPU,提高任务处理的及时性。处理效率对比如下:

任务处理方式(16个相同任务)耗时(us)
单任务串行执行 16 ∗ 17 = 272 16*17=272 1617=272
多任务调度执行 16 ∗ 2 = 32 16*2=32 162=32
效率提升 272 / 32 = 8.5 272/32=8.5 272/32=8.5

多任务,可以是多个进程,也可以是单进程中的多个线程。当前我们重点介绍的是多线程,因此多线程也是能够提高任务的处理效率。

在本节的最后,给读者提一个问题:

单核CPU是否支持多线程?多线程任务一定可以提高效率吗?

解析 1. 单核CPU是支持多线程。操作系统中,每个任务会被分配不同的调度时间片,一旦调度时间到达,即便任务未完成,也会被切换到其他任务上执行。由于调度时间周期比较短,在用户层面感知不到,只能感受到是多个任务同时在执行。
2. 多线程任务不一定可以提高效率。这需要区分I/O密集型,还是计算密集型。如果是I/O密集型,是可以提高效率的。计算密集型,单核CPU会一直参与计算,多个线程任务将等效于串行执行。另外,多个线程任务之间的切换还会带来一定的开销,计算密集型多线程时比单线程任务效率低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值