为何设计为单线程?

多线程好处

在高性能编程时,经常接触到多线程,起初总以为多线程并行执行总比单线程要快,然而实际情况是多线程之间需要竞争IO设备,或者竞争锁资源,导致往往执行速度比不上单线程,那为什么要用多线程呢?这要讲一下用多线程的好处:

  1. 在多核CPU上使用多线程能提高资源利用率。
  2. 多线程时模块化的编程模型,在单线程中如果在一个耗时较长的任务上卡住,那后面都别动了,这就很尴尬。多线程可以将程序分成几个功能相对独立的模块,单独分配一个线程去处理这个耗时长的任务。
  3. 多线程相对于多进程有几个好处,一个是线程的启动切换相比进程小得多。另一个就是线程之间也可以共享信息,相比之下进程间通信则需要专门的信息传递机制。

上下文切换

1、上线文切换的概念

多线程经常提及的一个概念就是上下文切换(Context Switch)。它的精确定义可以参考:http://www.linfo.org/context_switch.html。多任务系统往往需要同时执行多项任务,任务数大于CPU数量时,如何让用户感觉这些任务同时进行呢?操作系统的设计者利用了时间片轮转的方式,CPU给每个任务一定的时间,时间片时间用完的时候就把当前任务的状态保存下来,在加载下一个任务的状态后继续服务下一个任务。任务的状态保存及再加载,这段过程就叫上下文切换。

2、引起上线文切换的原因

对于我们经常使用的抢占式操作系统来说,引起上下文切换的原因大概有以下几种:

  1. 当前执行任务的时间片用完,CPU正常调度下一个任务。
  2. 当前执行任务碰到IO阻塞,调度器挂起此任务,执行下一个任务。
  3. 多任务抢占锁资源,当前任务没抢到,被调度器挂起。
  4. 用户代码挂起当前任务。
  5. 硬件中断。

多线程的本质是什么?

多线程的本质其实还是单线程,因为在任一时间点其实只有一个线程在跑。只不过CPU切换线程速度太快,让我们感觉是多个线程在一起跑,其实所有的指令还是一个接着一个的跑的。

多线程一定比单线程快吗?

答案肯定是否定的。
线程快,是因为其降低了不必要的耗时,耗时其实主要集中在两大块,磁盘IO 线程切换。
磁盘IO耗时远远大于线程切换耗时。多线程有助于降低磁盘IO耗时,单线程没有线程切换耗时。日常开发涉及磁盘IO因此使用多线程,磁盘IO的耗时危害已经将线程切换的危害忽略了,因此会觉得多线程快。Redis中没有磁盘IO,使用单线程没有CPU切换耗时,也不用考虑同步锁问题,因此速度更快。

猜你喜欢

转载自blog.csdn.net/songtaiwu/article/details/125277717
今日推荐