【问题标题】:How does a user process perform system call without going through context switch?用户进程如何在不经过上下文切换的情况下执行系统调用?
【发布时间】:2012-02-24 15:49:47
【问题描述】:

当用户进程执行系统调用时,会调用内核进程。现在这个 NOT 如何导致上下文切换?由于内核进程 不同于用户进程。或者我说内核例程(由系统调用调用)和用户进程属于同一个进程是错误的吗?

【问题讨论】:

    标签: operating-system context-switch kernel-mode


    【解决方案1】:

    '当用户进程执行系统调用时,会调用内核进程'——实际上,内核代码会被调用。任何系统调用都将不可避免地导致保护上下文的变化——一个环循环。这有多深取决于通话。如果调用到达 ring 0,那里的内核代码可以访问所有用户和内核线程,因此那里的内核代码通常不能被描述为“进程”——具有内存管理/安全上下文的东西保护。通常,往返于 ring 0 的 ring-cycle 需要 2000+ cpu-cycles(德国歌剧除外,它需要三天)。无论系统调用是否导致线程上下文切换和/或进程上下文切换,这种开销都是绝对需要的。

    在系统调用导致更改运行线程集的情况下,线程上下文切换会产生额外开销,尤其是在更改需要抢占另一个处理器上运行的线程时。

    如果任何新运行的线程与被抢占的线程属于不同的进程,则进程上下文切换的开销更大。

    【讨论】:

    • 那么内核代码是用户进程二进制/可执行映像的一部分吗?链接过程中内核代码是否成为用户进程二进制文件的一部分?
    • 操作系统链接的细节取决于操作系统。通常,一个构建时库被链接,它在运行时提供操作系统访问,例如。通过与 DLL 的动态链接。因此,访问内核的代码成为二进制可执行文件的一部分,实际的内核代码由所有进程共享。
    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2012-02-11
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多