我正在设计一个具有以下功能的调度算法:
- 在一个进程中有 2 个用户线程(上下文)(我应该做 3 个线程,但这在 osx 上还不起作用,所以我决定现在让 2 个工作)
- 使用每 1 秒关闭一次的 SIGALRM 信号进行抢占,并将控制从一个上下文更改为另一个上下文,并保存在执行切换之前正在运行的上下文的当前状态(寄存器和当前位置)。
我注意到的是以下内容:
- ucontext.h 库在 mac osx 上的行为很奇怪,而当它在 Linux 中应用时,它的行为完全符合预期(此 man 链接中的示例:http : //man7.org/linux/man-pages/man3/makecontext .3.html在 linux 上完美运行,而在 mac 上,它在进行任何交换之前因分段错误而失败)。不幸的是,我必须让它在 osx 上运行,而不是在 linux 上运行。
- 我设法通过使用 getcontext() 然后 setcontext() 进行上下文交换来解决 osx 上的 swapcontext 错误。
- 在我的信号处理函数中,我使用 sa_sigaction( int sig, siginfo_t *s, void * cntxt ) 因为第三个变量曾经将它重新转换为 ucontext_t 指针是关于被中断的上下文的信息(这在 Linux 上是正确的)一旦我测试了它)但在 mac 上它没有指向正确的位置,因为当我使用它时我再次遇到分段错误。
我为每个上下文设计了我的测试函数,使其在 while 循环内循环,因为我想中断它们并确保它们返回到该函数内的适当位置执行。我已经定义了一个静态全局计数变量,它可以帮助我查看我是否在正确的用户线程中。
最后一个注意事项是,我发现在我的 while 循环中调用 getcontext() 并在测试函数中不断更新我当前上下文的位置,因为它是空的 while 循环,因此在该上下文的时间到来时调用 setcontext() 使得它从适当的地方执行。此解决方案是多余的,因为这些功能将从 API 外部提供。
#include <stdio.h> …
Run Code Online (Sandbox Code Playgroud)