我去年学习了操作系统,在此期间,我使用用户上下文(在标题中定义ucontext.h
)为项目实现线程调度程序(其中每个线程模拟一个进程)。我正在参加一个讲座,将讨论用户上下文,我突然想到,尽管去年完成了这个项目,但我并不真正了解getcontext
系统调用究竟做了什么。
手册页getcontext
声明它
将 ucp 指向的结构初始化为当前活动的上下文。"
它还指出,对于 的论点setcontext
,如果 ucp 论点
通过调用 getcontext() 获得,程序继续执行,就好像这个调用刚刚返回一样。
好的,所以我明白了。
所以这就是我感到困惑的地方。通常,按照我的学习方式,要执行上下文切换,需要初始化ucontext_t
结构并将其交换/设置为:
ucontext_t ucp;
ucontext_t oucp;
getcontext(&ucp);
// Initialize the stack_t struct in the ucontext_t struct
ucp.uc_stack.ss_sp = malloc(STACK_SIZE);
ucp.uc_stack.ss_size = STACK_SIZE;
ucp.uc_stack.ss_flags = 0;
ucp.uc_link = /* some other context, or just NULL */;
// Don't block any signals in this context
sigemptyset(&ucp.uc_sigmask);
// Assume that fn is a function that takes 0 arguments and returns void
makecontext(&ucp, fn, 0);
// Perform the context switch. Function 'fn' will be active now
swapcontext(&oucp, &ucp);
// alternatively: setcontext(&ucp);
getcontext
如果我在较小的程序中省略,不会发生任何有趣的事情。在通过用户上下文进行更多上下文切换的较大程序中,我遇到了分段错误,只能通过重新添加getcontext
来解决。
具体是getcontext
做什么的?为什么我不能只分配一个ucontext_t
结构,通过初始化uc_stack
and字段来初始化它,然后在没有 ? 的情况下uc_sigmask
调用?是否有一些必要的初始化执行但不执行?makecontext
getcontext
getcontext
makecontext