【问题标题】:why user level threads need no system call?为什么用户级线程不需要系统调用?
【发布时间】:2011-08-01 20:43:15
【问题描述】:

我读过用户级线程的优点是它们不需要内核调用来进行切换。加载寄存器(IP,SP)不需要系统调用吗?我在 C 中使用函数 getcontext、setcontext 编写了用户级线程?这些函数不会调用系统调用吗?

【问题讨论】:

    标签: multithreading operating-system


    【解决方案1】:

    (大部分)对用户模式代码可见的寄存器也可以在用户模式代码中保存/恢复。

    由于用户模式线程(至少通常情况下)不会被抢先切换,因此您通常不需要保存所有寄存器。一个典型的实现使用 setjmp 和 longjmp 来保存/恢复必要的状态。这些通常不涉及任何用户/内核模式切换。

    【讨论】:

    • 这里我有点怀疑。这是否意味着用户级线程可以在不经过内核的情况下将 IP 和 SP 加载到它喜欢的任何值?
    • 或多或少,是的。加载到 IP 只是跳转到一个位置——在你执行代码的所有时间里,你一直在将值加载到 IP 中。 SP 或多或少也是如此——每次调用函数或从函数返回时,都会为它加载一个新值。
    • 这是否意味着检查这些寄存器中的无效地址不是操作系统的关注点?
    • 否——由 CPU 处理。如果加载无效地址,操作系统可能会参与处理引发的异常。
    猜你喜欢
    • 2016-03-24
    • 2019-06-06
    • 2017-04-14
    • 1970-01-01
    • 2021-01-14
    • 2017-03-14
    • 2014-07-07
    • 1970-01-01
    • 2014-09-28
    相关资源
    最近更新 更多