V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thomaswang
V2EX  ›  程序员

用户态,内核态相关问题

  •  
  •   thomaswang · 2017-12-28 17:40:24 +08:00 · 2067 次点击
    这是一个创建于 2504 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用户态进程用该进程的逻辑地址(记为 A)中的 0-3G 存东西,当执行到读取硬盘文件相关时候(假如读 10k 出来),切换到内核态,内核读到文件,把文件内容拷贝到 A 的(3G-4G)里面吗? ,切换到内核态,是不是: 把这个读取文件的任务给了某个内核线程,CPU 运行到这个内核线程了,就去干这个事儿
    5 条回复    2017-12-28 19:04:02 +08:00
    wevsty
        1
    wevsty  
       2017-12-28 17:53:44 +08:00
    详细追究很麻烦,不过大致上是这样子的没错。
    ryd994
        2
    ryd994  
       2017-12-28 17:57:01 +08:00
    我只说 linux 下
    不是
    linux 下内核态也是可以有进程上下文的,一定程度上可以说:读取文件的时候用户进程调用了一个特殊库(内核),只不过这个库有特权,而且内容不受进程控制。
    另外,不是你要读文件了操作系统才去读,操作系统的缓存在尽量避免这个事。很大概率是 readahead 已经读进缓存里,你 read 的时候只是从缓存里复制一份给你。
    如果缓存里没有怎么办呢,这个时候进程就被挂起,等读到了文件的时候会有 callback 把进程放回 cpu 队列。
    内核线程主要是异步处理一些系统任务,特别是中断的实际处理。为了保证中断最短时间内被处理,很多时候中断函数只是把数据从设备缓冲里取出,新建一个任务,就尽快退出。对数据的实际处理由内核进程在后台处理这些任务。
    easing
        3
    easing  
       2017-12-28 18:09:02 +08:00 via Android
    一个是考虑 io 缓存,一个是考虑是否 block io
    ironx
        4
    ironx  
       2017-12-28 18:53:33 +08:00 via Android
    简单的说。用户态通过某个系统调用主动进去入内核态,其实就是先进入一个软中断函数。这个函数会把用户线程 id 放到一个队列里面去,同时放入读取的信息,然后触发一个信号给某个内核线程,线程会根据队列里面存的文件信息,调用驱动读文件内容到内核的缓存空间,然后再复制到对应用户线程的用户态缓存中间里面去。
    ryd994
        5
    ryd994  
       2017-12-28 19:04:02 +08:00
    @ironx 实际还要更复杂,还有 block scheduler
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   996 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:21 · PVG 05:21 · LAX 13:21 · JFK 16:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.