c语言怎么样从底层实现任务调度

User mode thread (windows那边微软管这个叫 User-Mode Scheduling)
■网友
谢邀。@iux001对题主的问题的理解我认为是对的,不仅是C,在其他语言中也有这样的用户态线程实现,也叫做coroutine要实现coroutine,有两个最基本的问题,如 @熊峰答案中所提到的。这里对它进行一点补充。对于何时调度的问题,如果在用户态线程中用如时间片轮转这样的调度方式来调度,注定任务的数量不不会太多,这样还不如用操作系统提供的多线程。一般coroutine用于任务数量巨大,并且任务存在大量的I/O操作的场景,例如Python的gevent。这需要在实现基本的coroutine的同时完成一套与之配合的异步I/O库,可以在当前coroutine运行到I/O操作时交出CPU给其他coroutine如何切换的问题上,Windows可以用fiber,Posix兼容的系统可以使用set/getcontext这里提供一个云风的非常精简的coroutine库的例子,一起学习cloudwu/coroutine · GitHub
■网友
问题很多,我却很水,简单回答一下,欢迎指正。根据我的理解,你是想在用户态实现一个简单的调度器。这里牵扯到最直接的两个问题:1 何时调度?2 你提到的如何保存和恢复现场?对于1 , 最为直接的方法就是时间片轮转,用定时器就可以了。对于2 , 在linux下可以使用setjmp保存,longjmp恢复。每个任务都分配自己的栈,所以这里保存和恢复的都是栈。为了方便,任务之间的就用简单的链表连起来就可以了。其实细想还有更多的问题,如果一个任务在执行系统调用的时候阻塞了怎么办?由于内核不知道你的多任务,岂不是所有任务都会被阻塞?顺带提一下,现在的操作系统,比如linux,为了实现Pthread接口,用的是内核态多线程,和用户空间的线程是一一对应的关系。


    推荐阅读