作者回复: 回答正确!写时复制只能发生在进程之间。同一个进程的线程因为共享资源,只能提前分配。
作者回复: 赞!很准确了。我们在第10节课会讲页中断,那时候就会更加深一层理解。
作者回复: Good
作者回复: 你后面的理解在linux上大致是对的。虽然确实每个进程有自己的内核态栈,但你要牢记,在内核态运行时,内核代码段有能力访问任何一个进程的核心结构。这是用户态和内核态最大的不同。还有,你前边的理解也没错,微内核的操作系统就是这么设计的。windows和minix都是由内核进程提供服务。
作者回复: 编译器的优化没做好,开O1优化就不会了
作者回复: 不是规则不一致哦。规则是永远都一样的,都是MMU根据页表进行三级映射,从虚拟地址映射为物理地址。不一样的是页表里面的内容。两个进程可以把自己的虚拟地址映射到相同的物理地址。这就是共享内存。一个进程里的多个线程共享同一个页表,所以线程的私有内存是肯定不会有相同的地址的。
作者回复: 是的,我们是把堆上的一块内存区域当成了栈来用。这个例子也说明了,内存区域划分是我们根据人的理解去做的划分,而不是说就此固定了的。你可以了解一下js或者python中的generator,他们是stackless的,我们这节课的协程是stackful的。对比一下自己就清楚了。
作者回复: 哈哈哈,说得很有趣也很正确
作者回复: Linux系统是这样的。这是因为Linux系统没有很好地支持线程,而是直接利用了进程的结构。当然,Linux的多线程支持也在不断地完善中,未来会是怎么样,我们拭目以待。
作者回复: 没有。当前线程的用户态的状态还会保存在内核态栈上。