• Barry
    2019-05-21
    有一个小建议,能否再每篇文章的最后面预告一下,下一篇要讲的主题。这样我们跟着主题先思考,等看文章的时候就可以看到作者和自己的想法有什么出入和补充。更有利于吸收

    作者回复: 挺好的建议,多谢。下一节我们讲 “进程内协同:同步、互斥与通讯”。

    
     25
  • kirogiyi
    2019-05-21
    这才是真正的架构师课程,如果不具备这些基础知识,很难想象能够设计出好的软件系统架构。现在看到很多懂点技术和懂点产品的人自封为架构师,并没有去真正抓住软件架构的本质,实在感到有些汗颜。
    
     24
  • 一步
    2019-05-21
    对于协程的概念没有理解,协程不也是走系统调用吗?走系统调用不就是走到了系统内核态呢?后面任务调度,cpu执行指令

    作者回复: 协程不走系统调用。协程切换只是寄存器的保存和恢复,所以可以在用户态下自己来实现。

    
     20
  • Linuxer
    2019-05-21
    有一个疑问:协程属于用户态的线程,它跟线程之间怎么对应呢?协程之间也需要切换,那线程切换的那些成本它一样有啊,没想明白它的优势在哪

    作者回复: 从单位时间成本来说,有一定优势但也不会特别大。主要少掉的代价是从用户态到内核态再回到用户态的成本。这种差异类似于系统调用和普通函数调用的差异。因为高性能服务器上io次数实在太多了,所以单位成本上能够少一点,积累起来也是很惊人的。

     1
     11
  • 王聪 Claire
    2019-05-24
    您好,问一下epoll的意义在于让线程数量变少,是指等待执行的线程变少了吗?是因为都登记然后才能执行的机制吗?还是其他原因呢?谢谢。

    作者回复: 如果用同步 io,那么每个并行 io 必然需要需要一个线程。epoll 在于让 io 等待都发生在相同的地方,相当于线程做了多路 io 复用。

    
     7
  • youyui
    2019-05-29
    想了解下协程如何操作寄存器切换CPU上下文的,有没有什么好的资料可以学习下

    作者回复: https://github.com/Tencent/libco

    
     6
  • 钱晟龙🐲龍🐉
    2019-05-29
    老师,我一直有个问题没理解到,计算机在做IO的时候会不会使用CPU,如果会怎样使用的? 阻塞IO阻塞的时候,也就是IO进行时,它对应的线程是否已经放弃了CPU的执行权? 或者老师建议我查阅什么书籍。。

    作者回复: 1、https://m.baidu.com/sf_edu_wenku/view/3210fec818e8b8f67c1cfad6195f312b3169ebe8
    2、是的,执行权会转移

    
     5
  • 闫飞
    2019-06-06
    这里对NodeJS部分的引述有点小错误,它本身厉害的地方应该是争取了很多不想学习底层C/C++语言又喜欢得到高性能的"懒惰"的程序员。它的底层是由v8解释器和基于用户代码单事件循环调用的libev调度框架组成。

    可惜的是遇到复杂的事件循环堵死的情况,不理解这些底层原理的流水线JS程序员依然不能很快找到解决方案。碰到一些封装了第三方C库的运算复杂度高的代码,FFI接口反而隐藏了更大的问题。

    至于异步编程回调麻烦的问题,其实编程语言也在另外一个纬度上封装异步原语,通过promise/await等高级抽象缓解回调地狱困境。
    展开
    
     4
  • 行者
    2019-05-23
    不太理解协程的是怎么做到文中提到的两个优势的。只是看了一下python的协程,能理解它能减少执行体切换的时间成本(因为全在用户态中),但它的执行本质上就是串行执行呀,只是不同的子程序有了更多的入口而已,那怎么做到加速呢?

    作者回复: python的协程是比较狭义的,它只是一种编程模式,并不算执行体。你可以了解一下Go语言的goroutine。

    
     4
  • 大糖果
    2019-05-21
    那可以理解为如果操作系统把线程实现的足够灵活,轻便,就不需要协程这个机制了吗?

    作者回复: 我认为是这样

    
     4
  • 13601994625
    2019-06-19
    理论上协程可以做到的优化,线程都可以做到。为什么不在操作系统层去解决这个问题呢?

    作者回复: 但是操作系统太多了,语言适配操作系统易,反过来难

    
     3
  • 饭
    2019-07-29
    老师,可以这样理解吗?因为时代背景久远,当初操作系统设计的线程,不太适应现在巨流量的互联网时代,在网络IO请求过高的情况下,性能开销太大,所以才出现了协程的概念,还有一些线程池的手段来弥补这个问题

    作者回复: 应对方式有两种:一种是经典的线程池+异步io,一种是基于协程的同步io。后者背后的原理也是线程池+异步io,只不过加上了协程的语法糖了。

    
     2
  • Sylh
    2019-05-28
    https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/

    官方文档里面的,我看就是说是多进程的

    作者回复: https://linux.cn/article-5681-1.html?pr
    你可以仔细看一下中文版的

    
     2
  • fjpcode
    2019-05-25
    多路IO复用: 让IO的等待都发生在相同的地方。 用了不少,今天才终于弄理解清楚为啥叫 '多路IO复用'。
    
     2
  • Geek_03056e
    2019-05-21
    有几个问题请教一下老师:
    1 cpu时间片运行执行体,选择执行体时,是cpu控制,还是操作系统控制?进程、线程、协程获得的概率是一样的吗?
    2 通过sh,cpu知道了进程的首地址,执行进程,这个线程是怎么执行的呢?
    3 文中提到网络服务器的存储是个共享状态,这个存储指哪些存储呢?

    作者回复: 1、文章中有表格,里面的调度方就是你说的控制方。不同执行体控制方不一样,调度算法不一样,概率也就不一样。
    2、线程知道函数地址就行,一样是入口。
    3、共享存储包括内存、数据库等等。

    
     2
  • 贾志猛
    2019-05-21
    感觉进程与子进程的关系还不是很清楚,如果父进程执行结束后,子进程会怎样?子进程结束后,父进程会怎样?

    作者回复: 不会相互影响

     2
     2
  • 韩春亮
    2019-05-21
    “在创建一个进程这个事情上,UNIX 偷了一次懒,用的是 fork(分叉)语义。所谓 fork,就是先 clone 然后再分支,父子进程各干各的。”这句话不太理解,希望老师帮忙指点一下

    作者回复: 可以查一下fork相关的资料,这个api很经典,有很多介绍材料

    
     2
  • Messi Curry
    2019-06-02
    古代将职业发展分为奴、徒、工、匠、师、家、圣,读老师的文章如同听推理故事,不断刺激大脑,激发思考,理通脉络,这才是真正的师!
    
     1
  • zzx10
    2019-05-28
    多任务需求,既可以单核系统上通过分时系统实现。也可以通过
    多核CPU、多核心运行不同程序实现

    任务可以抽象为执行体。执行体有三类:线程、进程、协程。
    实现任务切换核心在于:记录任务状态、以及切换任务
    记录任务状态:
    通过寄存器实现。同时保护模式下,需要通过寄存器切换内存地址映射表,改变内存地址使用
    切换任务:
    进程与线程主要靠操作系统切换,规则基于时钟中断
    协程需用户自己实现

    进程内创建子进程,通过fork父进程创建子进程实现后。此后父子进程相对独立。
    但是进程占用资源比较多,后期出现了在同一软件需要多任务,同时共享内存地址空间,于是线程产生了

    协程产生的主要是网络服务器的需要。协程仅作用于用户态,避免原先系统调用产生的开销。
    同时出现了多路复用技术。
    使用线程进行网络通信,有时间成本、空间成本

    协程主要需求:
    协程创建、执行权切换
    协程调度
    协程的同步、互斥与通讯
    协程系统调用封装
    协程堆栈大小的分配
    展开
    
     1
  • keshawn
    2019-05-21
    1. UNIX的fork API clone父进程,减少参数的传递。看起来和面向对象当初设计的继承一样,当初设计的时候觉得会简化编程,经过大量的实践之后会发现耦合越来越严重。
    2. 线程的设计是否成功不好评价,协程相比线程的改进主要有以下几点:
     1)堆栈按需增长(线程是否也能如此实现?)
     2)去除线程局部存储,线程之所以提供线程局部存储是为了减少参数传递吧(比如ThreadLocal)?
     3)调度方由操作系统内核变成了用户态,用户态实现上和操作系统内核要做的调度应该没太多本质区别,但是节省了系统调用的成本?
    
     1
我们在线,来聊聊吧