在Linux中如何为用户级线程实施抢占式调度?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Linux中如何为用户级线程实施抢占式调度?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1686字,纯文字阅读大概需要3分钟。
内容图文
![在Linux中如何为用户级线程实施抢占式调度?](/upload/InfoBanner/zyjiaocheng/946/3d7569f5165049c7b3c177f13385a553.jpg)
使用用户级线程,在单个内核线程之上运行N个用户级线程.这与pthread相反,在pthread中,只有一个用户线程在内核线程上运行.
N个用户级线程被抢先调度在单个内核线程上.但是如何做到这一点的细节是什么.
我听到了一些建议,建议线程库进行设置,以便内核发送信号,这是将执行从单个用户级线程拉到信号处理程序的机制,然后可以执行抢先式调度.
但是,如何保存和/或修改状态(例如寄存器和线程结构)以使其全部正常工作的详细信息是什么?也许有一个非常简单的用户级线程对学习细节有用吗?
解决方法:
为了获得正确的细节,请使用源代码!但这就是我从阅读中所记得的…
可以通过两种方式调度用户级线程:自愿和抢先.
>自愿调度:线程必须定期调用一个函数,以将CPU的使用传递给另一个线程.此函数称为yield()或schedule()或类似的名称.
>抢先式调度:库从一个线程中强制删除CPU,并将其传递给另一个线程.这通常是通过计时器信号完成的,例如SIGALARM(有关详细信息,请参阅手动报警).
关于如何进行真正的切换,如果您的操作系统友好并且提供了必要的功能,那很容易.在Linux中,您具有makecontext()/ swapcontext()函数,这些函数使从一项任务转换为另一项任务变得容易.同样,请参见手册页以获取详细信息.
不幸的是,这些功能已从POSIX中删除,因此其他UNIX可能没有它们.如果真是这样,还可以采取其他措施.最受欢迎的是调用sigaltstack()来建立备用栈来管理信号,然后kill()本身进入备用栈,然后从信号函数中将longjmp()切换到实际的用户模式线程想跑.聪明吧?
附带说明一下,在Windows中,用户模式线程称为光纤,并且也完全受支持(请参阅CreateFiber()的文档).
不得已的方法是使用汇编程序,该汇编程序几乎可以在任何地方工作,但它完全是系统特定的.创建UMT的步骤为:
>分配堆栈.
>分配和初始化UMT上下文:一种用于保存相关CPU寄存器值的结构.
并从一个UMT切换到另一个:
>保存当前上下文.
>切换堆栈.
>在CPU中恢复下一个上下文,然后跳转到下一条指令.
这些步骤在汇编器中相对容易实现,但是在没有上面引用的任何技巧支持的情况下,在纯C语言中则完全不可能.
内容总结
以上是互联网集市为您收集整理的在Linux中如何为用户级线程实施抢占式调度?全部内容,希望文章能够帮你解决在Linux中如何为用户级线程实施抢占式调度?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。