作者回复: cpu处于内核态时使用的是内核地址空间,用户线程的挂起其实是由内核完成的,具体来说就是系统调用发触发软中断,cpu在内核态模式下执行软中断程序,也就是系统调用的具体实现函数(内核代码),内核代码执行过程中发现网络数据未就绪就主动让出cpu。这个时候才会将当前线程阻塞,因此从这个角度看,不是两个线程,而是一个线程在不同cpu模式下的执行过程。
作者回复: 对的
作者回复: 如果是这样的话,你写的应用程序直接在内核态运行,权限级别太高,出了问题会导致整个操作系统崩溃,所有才有了用户态核心态,算是一种隔离和容错吧。
作者回复: 赞
作者回复: 每个线程都有tast_struct,由内核创建,在内核空间上。
作者回复: 每一个进程的进程空间都包含内核空间,但是内核是各进程共享的,因此可以这里理解,内核代码运行过程中访问的内存空间被映射到各个进程空间的高地址3-4G。
作者回复: 你可以理解为CPU上有个开关,可以设置CPU的工作模式:用户态和内核态。在用户态模式下访问用户空间,也就是低地址的3GB。
作者回复: 😁
作者回复: mmap不支持Socket读写,只支持磁盘文件。
通过mmap将文件映射到内存后,直接写读写内存,内核会负责将数据刷新到磁盘文件。
作者回复: 嗯,基本上每篇的留言回复里都能找到答案
作者回复: 是数据区和栈区的中间,这个中间的部分有本地堆区,JVM内存区,mmap映射都在这里
作者回复: task_struct存储了一个进程的所有信息,比如进程id,执行了什么程序,工作目录,打开了什么文件...