我为微控制器写了很多C程序,但从来没有一个能在linux这样的操作系统上运行。linux如何决定给我的应用程序多少处理时间?当我有空闲时间告诉操作系统去做其他事情,然后再回来找我,以便其他进程也能有时间运行时,我需要做些什么吗?还是操作系统会自动执行此操作?
编辑:添加更多细节我的c程序有一个任务调度程序。有些任务每100ms运行一次,有些任务每50ms运行一次,以此类推。在我的主程序循环中,我调用ProcessTasks来检查是否有准备好运行的任务,如果没有准备好,它调用一个空闲函数。idle函数什么也不做,但它就在那里,这样我就可以切换GPIO引脚,并使用O‘’scope监视空闲时间……或者其他我想要的东西。所以也许我应该在这个空闲函数中调用sched_yield()?
发布于 2012-08-17 00:41:04
linux如何决定给应用程序多少处理时间?
每个调度器都有自己的想法。一些奖励你没有用完你的份额,一些掷骰子试图预测你会做什么等等。在我看来,你可以认为这是神奇的。在我们进入循环之后,调度器神奇地判断我们的时间到了,等等。
当我有空闲时间告诉操作系统去做其他事情时,我是否需要做一些事情
您可以调用sched_yield。我从来没有调用过它,也不知道为什么会有人想要调用它。手册确实说过,它可以提高性能。
或操作系统会自动执行此操作吗
它肯定是这样的。这就是为什么他们称之为"preemptive"多任务处理。
发布于 2012-08-17 00:43:36
这取决于你为什么有“空闲时间”以及如何有“空闲时间”。任何对阻塞I/O函数的调用、等待互斥锁或休眠都会自动取消对线程的调度,并让操作系统继续处理其他事情。只有像繁忙循环这样的东西才会有问题,但这在任何情况下都不应该出现在你的设计中。
你的程序实际上应该只有一个中心的“无限循环”。如果有任何机会,循环体“用完了工作”,那么最好你可以让循环执行上面的系统功能之一,这将使所有的美好自动出现。例如,如果您的中央循环是一个epoll_wait,并且所有的I/O、计时器和信号都由epoll处理,那么在无事可做的情况下调用超时为-1的函数以使其休眠。(相比之下,在超时为0的情况下调用它会使它忙-循环-坏!)。
发布于 2012-08-17 00:53:43
国际海事组织的其他答案涉及到太多细节。要做的简单事情是:
while (1){
if (iHaveWorkToDo()){
doWork();
} else {
sleep(amountOfTimeToWaitBeforeNextCheck);
}
}注意:这是一个简单的解决方案,它在单线程应用程序中很有用,或者像您的情况一样,您在指定的时间内没有任何事情要做;只是为了让一些像样的东西工作。关于这一点的另一件事是,睡眠将调用操作系统喜欢的任何输出函数,因此在这个意义上它比特定于操作系统的输出调用更好。
如果你想追求高性能,你应该等待事件。
如果您有自己的事件,它将如下所示:
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, ¤tSocketSet, NULL, NULL, NULL);
process_result();
}https://stackoverflow.com/questions/11991740
复制相似问题