如何启动和停止操作系统中的任务?

时间:2017-05-02 20:25:33

标签: c operating-system context-switch

尝试用上下文切换练习我发现了以下问题:

上下文保存和恢复似乎不是问题,但启动和停止任务似乎有点棘手。

虽然设置任务只是正确设置PC寄存器,堆栈指针和一些寄存器,但问题是,当任务结束时,我们无法控制下一步会做什么(我们不知道返回地址) )。

我想出了两个解决这个问题的方法:

  1. 设置程序的返回地址,告诉操作系统终止,取消分配与任务相关的内存并从队列中删除任务。
  2. Wrap函数,它将被启动到另一个函数中,它将参数指针作为被调用的函数。
  3. 第二种解决方案看起来更像是跟随

    void pre_startup(void(*funct)){
        funct();
        task_end();
    }
    

    作为参数,我们将正确的寄存器设置为指向任务的指针。

    我的问题是:

    操作系统如何处理所描述的问题?他们是否使用上述解决方案之一,或者有更好的方法来处理这个问题?

3 个答案:

答案 0 :(得分:1)

在大多数平台上,C运行时中的启动函数将在exit()返回后调用main(),例如

void _start(int argc, char **argv, char **envp) {
    // call initializers...
    int r = main(argc, argv, envp);
    // call finalizers...
    exit(r);
}

答案 1 :(得分:1)

这是所有系统特定的,但在较高级别,您可以通过以下方式实现exit()或其等效项:

  1. 进入内核模式退出处理程序。
  2. 调用调度程序并执行上下文切换到新进程。
  3. 执行删除第一个过程所需的处理。
  4. 从新流程中的异常返回。

答案 2 :(得分:-1)

他们使用内存控制器来移动内存 - 这会交换内存的整个部分,包括所有堆,堆栈和可执行文件,还原寄存器,程序计数器,堆栈指针。等。见:

What is a context switch?

Context switch