6

我已经为微控制器编写了许多 C 程序,但从来没有在像 linux 这样的操作系统上运行过。linux 如何决定给我的应用程序多少处理时间?当我有空闲时间告诉操作系统去做其他事情并稍后返回给我以便其他进程也有时间运行时,我需要做些什么吗?还是操作系统会自动执行此操作?

编辑:添加更多细节 我的 c 程序有一个任务调度程序。有些任务每 100 毫秒运行一次,有些任务每 50 毫秒运行一次,依此类推。在我的主程序循环中,我调用 ProcessTasks 来检查是否有任何任务准备好运行,如果没有准备好,它会调用一个空闲函数。空闲功能什么也不做,但它在那里,所以我可以切换一个 GPIO 引脚并使用 O'scope 监控空闲时间......或者如果我愿意的话。所以也许我应该在这个空闲函数中调用 sched_yield() ???

4

3 回答 3

6

linux如何决定给我的应用程序多少处理时间

每个调度程序都有自己的想法。一些奖励你没有用完你的份额,一些掷骰子试图预测你会做什么等等。在我看来,你可以认为它很神奇在我们进入循环之后,调度器神奇地决定我们的时间到了等等

当我有空闲时间告诉操作系统去做其他事情时,我需要做些什么吗

你可能会打电话给sched_yield. 我从来没有打电话给它,我也不知道有什么理由想要这样做。该手册确实说它可以提高性能。

还是操作系统会自动执行此操作

它肯定会。这就是为什么他们称其为“抢先式”多任务处理。

于 2012-08-16T16:41:03.583 回答
5

这取决于您为什么以及如何拥有“空闲时间”。任何对阻塞 I/O 函数的调用、等待互斥体或休眠都会自动取消调度您的线程并让操作系统继续执行其他操作。只有像繁忙循环这样的问题才会成为问题,但无论如何都不应该出现在您的设计中。

您的程序实际上应该只有一个中央“无限循环”。如果循环体有可能“无法正常工作”,那么最好让循环执行上述系统功能之一,这将使所有的美好都自动出现。例如,如果您的中央循环是一个epoll_wait并且您的所有 I/O、计时器和信号都由 epoll 处理,-1则在无事可做的情况下调用超时为 的函数以使其休眠。(相比之下,使用超时调用它0会使其忙于循环——糟糕!)。

于 2012-08-16T16:43:36.007 回答
1

IMO的其他答案太详细了。简单的做法是:

while (1){
    if (iHaveWorkToDo()){
        doWork();
    } else {
        sleep(amountOfTimeToWaitBeforeNextCheck);
    }
}

注意:这是一个简单的解决方案,在单线程应用程序中很有用,或者像您在指定时间内无事可做的情况一样;只是为了得到一些体面的工作。另一件事是 sleep 会调用操作系统喜欢的任何 yield 函数,所以从这个意义上说,它比操作系统特定的 yield 调用更好。

如果你想追求高性能,你应该等待事件。

如果您有自己的事件,它将如下所示:

Lock *l;
ConditionVariable *cv;

while (1){
    l->acquire();
    if (iHaveWorkToDo()){
        doWork();
    } else {
        cv->wait(lock);
    }
    l->release();
}

在网络类型的情况下,它将更像:

while (1){
    int result = select(fd_max+1, &currentSocketSet, NULL, NULL, NULL);
    process_result();
}

于 2012-08-16T16:53:43.093 回答