• 一塌糊涂
    2019-07-11
    老师问个问题,用户态切换到内核态,使用的是虚拟空间内核地址?这时用户线程会挂起执行内核线程吗?这是两个线程吗?

    作者回复: cpu处于内核态时使用的是内核地址空间,用户线程的挂起其实是由内核完成的,具体来说就是系统调用发触发软中断,cpu在内核态模式下执行软中断程序,也就是系统调用的具体实现函数(内核代码),内核代码执行过程中发现网络数据未就绪就主动让出cpu。这个时候才会将当前线程阻塞,因此从这个角度看,不是两个线程,而是一个线程在不同cpu模式下的执行过程。

     1
     9
  • 东方奇骥
    2019-06-30
    答疑干货还挺多的,操作系统一直是自己的弱项,最近也在学习,然后发现极客时间专栏里牛逼的老师操作系统基础都很好。
    
     5
  • 佑儿
    2019-07-01
    虚拟内存是一个联系的地址空间,该地址空间由不一定连续的物理内存组成。 这样理解对吗?

    作者回复: 对的

    
     4
  • 帽子丨影
    2019-09-24
    老师好,既然用户态运行时也会占用cpu,内核态又可以访问整个虚拟空间,为什么不让cpu一直处在内核态呢,这样就没有切换带来损耗了

    作者回复: 如果是这样的话,你写的应用程序直接在内核态运行,权限级别太高,出了问题会导致整个操作系统崩溃,所有才有了用户态核心态,算是一种隔离和容错吧。

    
     3
  • 长脖子树
    2019-08-16
    看了作者的文章又去看了 copy-on-write 和 MappedByteBuffer 了解又加深了一层 哈哈

    作者回复: 赞

    
     3
  • brianway
    2019-07-05
    “线程有自己的task_struct结构体和运行栈区,但是线程的其他资源都是跟父进程共用”,这句话怎么理解。线程的task_struct结构体和运行栈区在图中哪个部分?

    是从进程的内核空间里面分配出来的,还是用户空间里分配出来的?具体哪个部分的内存?

    作者回复: 每个线程都有tast_struct,由内核创建,在内核空间上。

    
     3
  • nightmare
    2019-06-30
    老师今天讲了线程和进程,进程和线程都是统一在内核空间建立task_truct,根据代码是否有系统调用在用户态和内核态来做上下文切换,然后还讲了read的系统调用过程以及进程的虚拟内存和物理内存的机制,有一点没明白,是每个进程都会有一个虚拟内核空间吗?然后进程的虚拟内核空间映射到系统管理的内核空间上?

    作者回复: 每一个进程的进程空间都包含内核空间,但是内核是各进程共享的,因此可以这里理解,内核代码运行过程中访问的内存空间被映射到各个进程空间的高地址3-4G。

    
     3
  • 飞翔
    2019-06-29
    用户态和用户空间是啥关系?

    作者回复: 你可以理解为CPU上有个开关,可以设置CPU的工作模式:用户态和内核态。在用户态模式下访问用户空间,也就是低地址的3GB。

     1
     3
  • -W.LI-
    2019-06-29
    感谢老师,万分感谢。上次有个问题我不明白,老师还帮我查阅源码确认了。李老师,还有http那个老师是最最负责的真的万分感谢。
    向老师,我要把计算机组成原理和操作系统自己看一遍看不懂就看两遍。

    作者回复: 😁

    
     2
  • Liam
    2019-06-29
    如果是通过mmap读数据,流程是怎样的呢?

    1 如果没有数据,是否会阻塞?
    2 不需要拷贝数据?意思是用户进程可以直接读mmap,不需要拷贝到堆吗?

    作者回复: mmap不支持Socket读写,只支持磁盘文件。

    通过mmap将文件映射到内存后,直接写读写内存,内核会负责将数据刷新到磁盘文件。

    
     2
  • 代码搬运工
    2019-06-29
    老师,每节课后的思考题什么时侯也答疑下

    作者回复: 嗯,基本上每篇的留言回复里都能找到答案

    
     2
  • Ericens
    2019-10-09
    李老师,请教个关于协程与线程的疑问。比如,a协程调用socket. read(),此时数据没有准备好,则继续调度b协程。

    把协程换成线程,上面这个过程哪个更加轻量?协程还是线程?
    我理解这个过程涉及的过程如下,都一样。
    1.都有系统调用read(),从用户态切换到了内核态,
    2.都有上下文切换。(不同协程的寄存器,和不同线程的寄存器)
    3. 都要执行任务调度。协程调度或者线程调度。

    那协程到底轻量在哪?
    展开
     2
     1
  • 妥协
    2019-07-04
    您是不是指的数据区和堆区?数据区和栈区不是连续的呀

    作者回复: 是数据区和栈区的中间,这个中间的部分有本地堆区,JVM内存区,mmap映射都在这里

    
     1
  • 迎风劲草
    2019-07-01
    老师,task_struct 具体是什么结构,都存储了什么?

    作者回复: task_struct存储了一个进程的所有信息,比如进程id,执行了什么程序,工作目录,打开了什么文件...

    
     1
  • sun留白
    2020-01-08
    进程唤醒的时候,为何内核为何不直接把数据读到共享区,而是先读到内核去,在拷贝到用户区?
    请问老师。
    
    
  • sun留白
    2020-01-08
    进程唤醒的时候,为何内核为何不直接把数据读到共享区,而是先读到内核去,在拷贝到用户区?
    请问老师。
    
    
  • sun留白
    2020-01-08
    唤醒线程的时候为何,内核不是直接数据放在共享区,而是放在内核区,然后再有内核去想用户去拷贝,请问老师?
    
    
  • sun留白
    2020-01-08
    用户空间上还有一个共享库和 mmap 映射区,Linux 提供了内存映射函数 mmap, 它可将文件内容映射到这个内存区域,用户通过读写这段内存,从而实现对文件的读取和修改,无需通过 read/write 系统调用来读写文件,省去了用户空间和内核空间之间的数据拷贝。
    请问老师,这一段是用户程序已经通过系统调用,将数据从硬件资源读到了内存空间,然后用户需要用者须数据时,可以直接使用共享去的数据,不用讲数据从内核空间拷贝到用户空间,省去了拷贝仅仅拷贝这一过程?
    
    
  • sun留白
    2020-01-08
    32位机器的内存16个g,每个进程虚拟出来4g。请问老师,这个进程的个数有控制吗,是和CPU的个数有关联吗?
    
    
  • 朱东旭
    2020-01-05
    您好,老师,您提到阻塞的本质是将"进程"的task_struct移出运行队列,添加到等待队列,将这里的"进程"改为"用户线程"是否更准确。
    
    
我们在线,来聊聊吧