作者回复: cpu处于内核态时使用的是内核地址空间,用户线程的挂起其实是由内核完成的,具体来说就是系统调用发触发软中断,cpu在内核态模式下执行软中断程序,也就是系统调用的具体实现函数(内核代码),内核代码执行过程中发现网络数据未就绪就主动让出cpu。这个时候才会将当前线程阻塞,因此从这个角度看,不是两个线程,而是一个线程在不同cpu模式下的执行过程。
作者回复: 对的
作者回复: 每个线程都有tast_struct,由内核创建,在内核空间上。
作者回复: 你可以理解为CPU上有个开关,可以设置CPU的工作模式:用户态和内核态。在用户态模式下访问用户空间,也就是低地址的3GB。
作者回复: 赞
作者回复: 每一个进程的进程空间都包含内核空间,但是内核是各进程共享的,因此可以这里理解,内核代码运行过程中访问的内存空间被映射到各个进程空间的高地址3-4G。
作者回复: 😁
作者回复: mmap不支持Socket读写,只支持磁盘文件。
通过mmap将文件映射到内存后,直接写读写内存,内核会负责将数据刷新到磁盘文件。
作者回复: 嗯,基本上每篇的留言回复里都能找到答案
作者回复: 如果是这样的话,你写的应用程序直接在内核态运行,权限级别太高,出了问题会导致整个操作系统崩溃,所有才有了用户态核心态,算是一种隔离和容错吧。
作者回复: 是数据区和栈区的中间,这个中间的部分有本地堆区,JVM内存区,mmap映射都在这里
作者回复: unix环境高级编程,数据结构和算法,java编程思想
作者回复: 对的,进程控制块是个比较抽象的名字,具体实现就是内核的一个数据结构task_struct
作者回复: 1.task_struct上保存的是指针,本质是一个内存地址,比如打开的文件是这样的:
struct files_struct *files;
一个进程内的所有线程的task_struct的files变量都指向同一个内存地址,也就是同一个files_struct结构体
2,线程需要动态的创建和销毁,意味task_struct链表需要频繁的添加和删除节点,所以用链表
作者回复: 对的