视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

并发历程详解:操作系统、进程、线程、纤程、并发、并行

  • 课程笔记
  • 问答交流

从这节课开始正式进入多线程与高并发编程这个专题,在开启这个专题前,我会带你先看并发编程是怎样一步步演变过来的,你只有了解了一个技术的来龙去脉,才能更好的掌握好它,甚至预判这个技术未来的发展方向。

为了助大家掌握好并发编程,本节课我会重点讲解以下4点:

1.操作系统的发展历程

2.进程、线程、多线程、纤程 (协程)

3.并发和并行

4.并发编程的发展历程总结

我先从操作系统的发展历程开始讲起。

操作系统发展历程

在早期计算机并没有包含操作系统,这个时候,这个计算机只跑一个程序,这个程序独享计算机的所有资源,这个时候不存在什么并发问题。

1.卡片机器

并发历程详解:操作系统、进程、线程、纤程、并发、并行-mikechen

1)卡片机运行方式

并发历程详解:操作系统、进程、线程、纤程、并发、并行-mikechen

 

评论交流
  1. 灞波儿奔?

    什么是进程?
    进程是资源分配的最小单位,他相当于一个资源的容器,为进程内所有线程提供共享资源,不同进程之间内存资源是隔离的,是对程序的一种静态描述
    进程间通信是通过tcp/ip端口来实现
    进程间切换:

    进程之间切换会涉及到,一些寄存器,保存了进程信息的进程表,内核栈,和内存空间切换,进程的内存空间为虚拟内存,是映射物理内存地址所对应的虚拟内存地址,物理内存地址和虚拟内存地址是通过页表来映射,每个进程都有一个属于自己的页表来映射地址关系,当cpu时间片切换进程的时候同时也需要切换进程上下文,里面就包含虚拟内存地址,同时也需要切换页表,页表为了快速访问也会有个cache来缓存虚拟内存地址和物理内存地址的映射关系即为TLB,切换了地址后TLB也会失效,这时cache失效会导致命中率降低,此时就会导致虚拟地址到物理地址的查找就会变慢,程序运行会变慢
    什么是线程
    线程是cpu调度的最小执行单位,它存在于进程中, 一个进程会存在多个线程,但是一个进程至少要包含一个线程
    线程间通信:
    同一个进程下的内存可以通过共享内存来通信(也是大多数并发问题的根源),同时线程也可以有自己独立的内存空间即为TLS (thread local storage)
    线程间切换
    同一个进程下的线程进行切换的时候,需要切换内核栈,硬件上下文,但是不需要切换虚拟内存空间

    什么是纤程?与线程的区别?
    纤程又称为协程,纤程是用户代码方式实现的,它并不归系统内核管理,
    同时纤程又是线程的细化,一个线程可以包含1个或者多个纤程,纤程什么时候执行是由用户决定的
    目前操作系统的内核调度,线程采用的是抢占式调度,而纤程一般会采用非抢占式调用
    线程和纤程的切换
    纤程完全在用户空间进行,而线程切换涉及特权模式切换,需要在拥有最高的权限内核空间来完成,所以就涉及到用户空间和内核空间的切换,而且除了和协程相同基本的 CPU 上下文,还有线程私有的栈和寄存器等,说白了就是上下文比协程多一些

    综合来说就是创建进程比创建线程需要耗费更多的资源和时间,最明显的是内存分配,创建线程和创建协程,协程的创建比线程更快,因为他需要的资源更少,同时在cpu时间片切换进程的时候比切换线程需要耗费更多的资源,因为不仅需要切换cpu上下文还需要切换内存空间,从而导致TLB失效,而切换协程比切换线程需要的资源更少,协程并不需要切换用户态和内核态,还有一些线程的私有栈和寄存器这些
    其目的都是为了提高cpu使用率提高并发

  2. 佳明

    1. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线

    2. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位

    3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信

    号等),某进程内的线程在其他进程不可见

    4. 线程相对进程的优势

    1)调度和切换:线程上下文切换比进程上下文切换要快得多

    2)线程廉价,线程启动比较快,退出比较快,对系统资源的冲击也比较小

    5.纤程:一个线程可以包含一个或多个纤程,纤程是根据用户定义的算法来调度的,纤程采用了非抢占式调度方式,而线程是抢占式调度的。

    6.纤程相对线程的优势:纤程是以用户方式代码来实现,不存在线程切换(内核与用户态切换),是一个程序级别的切换,所以使用纤程可以获得更大的并发量。

    • mikechen

      很全面 ,如果我是面试官还会问切换的细节,把这一点理解了,基本这个知识点就掌握好了 ✗咧嘴笑✗ 。

    • 佳明

      谢谢老师提示,我再补充下:

      系统内核调度的对象是线程,因为线程是调度的基本单元,线程的调度只有拥有最高权限的内核空间才可以完成,所以线程的切换涉及到用户空间和内核空间的切换。这里就是对应起来的Linux 80中断,流程如下:

      1.int0x80软中断

      2.保存寄存器信息到内核堆栈

      3.选择下一个要执行的线程

      4.恢复上下文

      5.返回用户堆栈

      总结:线程切换需要借助内核完成,意味着一次用户态到内核态的切换,以及一次内核态到用户态的切换。

      而纤程的切换只在用户态就可以完成,无需借助内核,也就不需要进入内核态。

      因为:用户态和内核态的切换才是最主要的开销,所以纤程并发高。

  3. 路正银

    进程是系统中正在运行的一个程序,进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。
    一个进程无法访问另一个进程的变量和数据结构。
    线程是操作系统能进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
    线程可以访问兄弟线程的数据和内存空间。
    纤程是更轻量级的线程,一个线程可以包含一个或者多个纤程。
    纤程是在用户模式下实现的,内核对纤程一无所知,线程是由操作系统的调度算法进行调度。

    • mikechen

      还可以把纤程说明更加详细特别是上面我提到的进程、线程、纤程三者为什么并发越来越快的核心原因,把这一点理解透彻了,基本就把这个知识掌握好了。加油,路正银! ✗拳头✗

    • 路正银

      进城、线程、纤城 是为了不断提高CPU利用率(吞吐率)而依次发明出现的,每一个概念的形成都是为了解决上一个概念的弊端,更高效的利用CPU,更好的去解决CPU运行速度远远高于内存速度、磁盘速度、I/O速度的矛盾。线程比进城快的原因有,线程占用的资源更少,相互切换消耗更小,进一步去分解了任务,尤其适合现在多核计算机的环境,纤程比线程快是由于纤程减少了(避免了)任务从用户态到内核态的切换时间。

    • mikechen

      最核心的几个关键点都谈到了 ,不错 ✗拳头✗ 。 回头如果还有时间还可以了解线程的切换(内核与用户态的切换细节),这一点在几个大厂问的比较细。

  4. JansenZhang

    进程是指在操作系统能独立运行并进行资源分配的基本单位,由机器指令,数据等组成。用户每运行一个程序就会开启一个进程。每个进程的内存空间都是独立、互不干扰的,具有隔离性。

    线程是为了弥补进程的不足而出现的技术,在一个进程中,同一时间只能处理一件事情,如果我们想在一个进程中处理多件事情的时候,进程就满足不了我们的需求,所以线程就出现了。在进程中,可以将每个子任务都创建一个线程,同时配合cpu的多核心技术,可以实现真正意义上的多线程并发执行,即在进程中同一时间处理多件事情。

    纤程是比线程颗粒度更细的并发单元,也是我们为了进一步提高系统的并发性能而出现的技术。线程和纤程都是为了提高系统的并发量。不过线程的调度是由系统的内核实现,而纤程的调度则是由开发人员自定义代码实现,所以从调度方式来讲,线程是属于抢占式调度方式,纤程是非抢占式调度方式。另外,因为纤程是属于用户态的线程,内核并不知道有纤程的存在,也就不会有内核切换线程带来的资源开销,所以纤程的并发效率比线程更高。但是使用纤程因为要开发人员自定义调度逻辑,也会给程序带来复杂度的提升。

    • mikechen

      这里有兴趣还可以利用业余时间研究下内核与用户态之间的切换细节,如果面试官还想深入,也就是这个点还可以切入了,整体回答得比较完整 ✗咧嘴笑✗

  5. 李鸿翼

    1.进程是操作系统分配资源的最小单元
    2.线程是CPU调度的最小单元
    3.纤程是一种更细粒度的线程。与线程区别是,纤程是由用户代码方式实现的,通过用户自定的算法来调度,并且是非抢占式的。线程则是抢占式调度的,一个线程可以包含多个纤程

    • mikechen

      这里面试官很容易还会问第二个点(这才是本考题的的重点):纤程为什么比线程并发快?让子弹飞一会了,你先想想想答案,回头周五我再公布答案 ✗咧嘴笑✗

    • 李鸿翼

      纤程比线程快,我的理解是因为纤程是用户态调度的,不存用户态与内核态的切换,所以纤程切换的成本比较线程小,并且纤程拥有的栈空间也比线程的小,这样时间和空间上消耗都小于线程,所以并发更快。

    • mikechen

      对的,纤程是以用户方式代码来实现的,并不受操作系统内核管理,所以内核并不知道纤程。而一个线程从用户态进入到内核态时会比较耗费时间(80中断切换),而纤程是在用户态里,不会发生80中断(用户态与内核态的切换消耗时间),这是纤程并发度高的最核心的原因。