c - 操作系统中的任务的启动和停止是如何完成的?

标签 c operating-system context-switch

尝试进行上下文切换练习时,我发现了以下问题:

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

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

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

  1. 设置过程的返回地址,告诉操作系统终止、释放与任务连接的内存并从队列中删除任务。
  2. 包装函数,该函数将在另一个函数中启动,该函数将作为被调用函数的参数指针。

第二个解决方案可能看起来更像下面的

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

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

我的问题是:

操作系统如何处理所描述的问题?他们是否使用提到的解决方案之一,或者有一些不同的方法可以更好地处理这个问题?

最佳答案

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

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

关于c - 操作系统中的任务的启动和停止是如何完成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746648/

相关文章:

c++ - valuechange 事件类似 c 或 c++ 中的功能

c - fork 系统调用

c - 在 C 中读取 Unicode 文件并通过套接字将内容作为 ASCII 传递

multithreading - 线程上下文切换 Vs.进程上下文切换

c - makecontext uc_link 给出段错误

c - 测量上下文切换时间 C (Windows)

使用 bool 值检查整数溢出

python - 通过Python输入终端输入

c++ - 清除 RAM 中的内存?

multithreading - 一对一的多线程模型