用户态,内核态相关问题

2017-12-28 17:40:24 +08:00
 thomaswang
用户态进程用该进程的逻辑地址(记为 A)中的 0-3G 存东西,当执行到读取硬盘文件相关时候(假如读 10k 出来),切换到内核态,内核读到文件,把文件内容拷贝到 A 的(3G-4G)里面吗? ,切换到内核态,是不是: 把这个读取文件的任务给了某个内核线程,CPU 运行到这个内核线程了,就去干这个事儿
1977 次点击
所在节点    程序员
5 条回复
wevsty
2017-12-28 17:53:44 +08:00
详细追究很麻烦,不过大致上是这样子的没错。
ryd994
2017-12-28 17:57:01 +08:00
我只说 linux 下
不是
linux 下内核态也是可以有进程上下文的,一定程度上可以说:读取文件的时候用户进程调用了一个特殊库(内核),只不过这个库有特权,而且内容不受进程控制。
另外,不是你要读文件了操作系统才去读,操作系统的缓存在尽量避免这个事。很大概率是 readahead 已经读进缓存里,你 read 的时候只是从缓存里复制一份给你。
如果缓存里没有怎么办呢,这个时候进程就被挂起,等读到了文件的时候会有 callback 把进程放回 cpu 队列。
内核线程主要是异步处理一些系统任务,特别是中断的实际处理。为了保证中断最短时间内被处理,很多时候中断函数只是把数据从设备缓冲里取出,新建一个任务,就尽快退出。对数据的实际处理由内核进程在后台处理这些任务。
easing
2017-12-28 18:09:02 +08:00
一个是考虑 io 缓存,一个是考虑是否 block io
ironx
2017-12-28 18:53:33 +08:00
简单的说。用户态通过某个系统调用主动进去入内核态,其实就是先进入一个软中断函数。这个函数会把用户线程 id 放到一个队列里面去,同时放入读取的信息,然后触发一个信号给某个内核线程,线程会根据队列里面存的文件信息,调用驱动读文件内容到内核的缓存空间,然后再复制到对应用户线程的用户态缓存中间里面去。
ryd994
2017-12-28 19:04:02 +08:00
@ironx 实际还要更复杂,还有 block scheduler

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/418369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX