簡體   English   中英

C程序在Linux上運行時應該在空閑時間做什么?

[英]What should C program do in idle time when running on Linux?

我已經為微控制器編寫了許多C程序,但從來沒有一個在像linux這樣的操作系統上運行的程序。 linux如何確定為我的應用程序提供多少處理時間? 當我有空閑時間告訴操作系統去做其他事情並稍后再回到我身邊以便其他進程也有時間運行時,我需要做些什么嗎? 或者OS是否只是自動執行此操作?

編輯:添加更多細節我的c程序有一個任務調度程序。 有些任務每100毫秒運行一些,有些任務每50毫秒運行一次,依此類推。 在我的主程序循環中,我調用ProcessTasks來檢查是否有任何任務准備好運行,如果沒有准備就緒它會調用空閑函數。 空閑功能除了它之外什么都不做,所以我可以用Ocope窺鏡切換GPIO引腳並監視空閑時間...或者如果我願意的話。 所以也許我應該在這個空閑函數中調用sched_yield()???

linux如何確定為我的應用程序提供多少處理時間

每個調度程序都有自己的想法。 有些人獎勵你沒有用完你的份額,有些擲骰子試圖預測你會做什么等等。在我看來你可以認為它是魔術 在我們進入循環之后,調度程序神奇地決定我們的時間到了等等

當我有空閑時間告訴操作系統去做其他事情時,我需要做些什么

你可以打電話給sched_yield 我從來沒有打電話給它,也不知道為什么會有人想要的原因。 該手冊確實說它可以改善性能。

或者操作系統是否只是自動執行此操作

它肯定會。 這就是為什么他們稱之為“先發制人”的多任務處理。

這取決於你為什么以及如何擁有“空閑時間”。 任何對阻塞I / O函數的調用,等待互斥鎖或休眠都將自動取消調度你的線程並讓操作系統繼續使用其他東西。 只有繁忙的循環才會出現問題,但在任何情況下都不應該出現在你的設計中。

你的程序應該只有一個中心“無限循環”。 如果循環體有可能“失去工作”,那么最好是讓循環執行上述系統函數之一,這將使所有的好處自動出現。 例如,如果你的中心循環是一個epoll_wait ,你的所有I / O,定時器和信號都是由epoll處理的,那么在超時為-1調用該函數,以便在沒有任何操作的情況下使其休眠。 (相比之下,用超時0調用它會使它忙碌循環 - 糟糕!)。

其他答案IMO進入太多細節。 簡單的事情是:

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

注意:這是一個簡單的解決方案,它在單線程應用程序中很有用,或者像您在指定時間內沒有任何操作的情況一樣; 只是為了得到一些體面的工作。 關於這一點的另一件事是睡眠將調用os更喜歡的任何yield函數,因此在這個意義上它比os特定的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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM