【问题标题】:Context switching - ucontext_t and makecontext()上下文切换 - ucontext_t 和 makecontext()
【发布时间】:2014-02-23 11:11:46
【问题描述】:

我正在研究 C 编程中的上下文切换,并在 Internet 上找到了以下示例代码。我试图弄清楚是否只有 makecontext() 函数可以触发一个函数来做某事。其他函数如setcontext()getcontext()swapcontext()用于设置上下文。

makecontext() 将函数及其参数附加到上下文中,该函数是否始终坚持上下文,直到对其提交更改?

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <ucontext.h>
  4 #define MEM 64000
  5 
  6 ucontext_t T1, T2, Main;
  7 ucontext_t a;
  8 
  9 int fn1()
 10 {
 11   printf("this is from 1\n");
 12   setcontext(&Main);
 13 }
 14 
 15 void fn2()
 16 {
 17   printf("this is from 2\n");
 18   setcontext(&a);
 19   printf("finished 1\n");
 20 }
 21 
 22 void start()
 23 {
 24   getcontext(&a);
 25   a.uc_link=0;
 26   a.uc_stack.ss_sp=malloc(MEM);
 27   a.uc_stack.ss_size=MEM;
 28   a.uc_stack.ss_flags=0;
 29   makecontext(&a, (void*)&fn1, 0);
 30 }
 31 
 32 int main(int argc, char *argv[])
 33 {
 34   start();
 35   getcontext(&Main);
 36   getcontext(&T1);
 37   T1.uc_link=0;
 38   T1.uc_stack.ss_sp=malloc(MEM);
 39   T1.uc_stack.ss_size=MEM;
 40   makecontext(&T1, (void*)&fn1, 0);
 41   swapcontext(&Main, &T1);
 42   getcontext(&T2);
 43   T2.uc_link=0;
 44   T2.uc_stack.ss_sp=malloc(MEM);
 45   T2.uc_stack.ss_size=MEM;
 46   T2.uc_stack.ss_flags=0;
 47   makecontext(&T2, (void*)&fn2, 0);
 48   swapcontext(&Main, &T2);
 49   printf("completed\n");
 50   exit(0);
 51 }

【问题讨论】:

    标签: c context-switch ucontext


    【解决方案1】:

    makecontext 将函数信息写入上下文中,并且它将一直保留在那里,直到被其他内容覆盖。 getcontext 覆盖整个上下文,因此会覆盖之前调用 makecontext 时写入的任何函数。同样,swapcontext 会完全覆盖其第一个参数所指向的上下文。

    基本思想是u_context 在某个时间包含部分进程上下文的快照。它包含所有机器寄存器、堆栈信息和信号掩码。它不包括任何内存映射或文件描述符状态。 u_context 中的状态正是您为了实现线程或协程而需要操作的所有状态。

    编辑

    swapcontext(&amp;current, &amp;another) 将当前上下文保存在current 并切换到another。稍后,代码(从another 上下文运行)可能会切换回current(再次调用swapcontext)或者它可能会切换到第三个上下文。 当上下文结束时(使用makecontext 设置到其中的函数返回),如果其uc_link 字段指向某个上下文,它将切换到该上下文。但是如果uc_link 为NULL,则线程(如果只有一个线程,则进程)将退出——其他未运行的上下文将被放弃。

    【讨论】:

    • 非常感谢您的解释。我认为 swapcontext(&currentContext, &anotherContext) 会先切换到 &anotherContext,完成后,它将继续完成 &currentContext。这种理解不正确吗?感谢您的回复
    猜你喜欢
    • 2017-03-11
    • 2017-09-09
    • 2017-11-19
    • 2021-04-07
    • 2011-07-23
    • 2013-04-21
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多