2012-08-16 35 views
6

我已經爲微控制器編寫了許多C程序,但從來沒有在Linux等操作系統上運行過的程序。 linux如何決定給我的應用程序多少處理時間?當我有空閒的時間讓操作系統去做別的事情並在稍後再回到我身邊時,我還需要做些什麼,以便其他進程也可以有時間運行?或者操作系統是否自動執行該操作?在Linux上運行時,C程序在空閒時間應該做什麼?

編輯:添加更多細節 我的c程序有一個任務調度程序。一些任務每100毫秒運行一次,一些每50毫秒運行一次等等。在我的主程序循環中,我調用ProcessTasks來檢查是否有任何任務已準備好運行,如果沒有準備好,它會調用一個空閒函數。空閒功能什麼都不做,只是它在那裏,所以我可以切換GPIO引腳並用O'scope監視空閒時間......或者如果我願意的話。所以也許我應該在這個空閒函數中調用sched_yield()?

回答

6

Linux如何決定多少處理時間給我的應用程序

每個調度使得了自己的想法。一些獎勵你沒有使用你的份額,一些擲骰子試圖預測你會做什麼等等。在我看來,你可以只是認爲它是神奇的我們進入循環後,調度程序神奇決定我們的時間到了等

有什麼需要我時,我有空閒時間告訴OS 去做些別的事情

你可以稱呼sched_yield做。我從來沒有打過電話,也不知道爲什麼要這樣做。該手冊確實說它可以提高性能。

抑或是OS只是做自動

它肯定不會。這就是爲什麼他們把它稱爲"preemptive"多任務處理。

+0

所以其他的答案說,使用睡眠( )。我應該調用sleep()和sched_yield()嗎?如果是這樣的話,應該先在哪個地方叫? – PICyourBrain 2012-08-16 17:16:07

+0

@PICyourBrain閱讀手冊。如果沒有別的事情可以做,產量會讓你的過程繼續運行,而「睡眠」會明確地導致你的過程等待。 – cnicutar 2012-08-16 17:17:30

+0

如果您正在實現自旋鎖,則每次鎖定失敗時都要調用sleep(0)或sched_yield()。 – Arvid 2013-05-05 02:15:46

5

這取決於你爲什麼以及如何擁有「空閒時間」。任何對阻塞I/O函數的調用,等待互斥或睡眠都會自動取消預定線程,讓操作系統繼續其他工作。只有像繁忙循環這樣的問題會成爲問題,但在任何情況下都不應出現在您的設計中。

你的程序應該只有一箇中心「無限循環」。如果循環體有可能「不工作」,那麼最好能讓循環執行上述系統函數之一,這將使所有的好處自動出現。例如,如果您的中央環路是epoll_wait,並且您的所有I/O,定時器和信號都由epoll處理,請在超時時間爲-1的情況下調用該功能,以便在無需任何操作時使其進入休眠狀態。 (相反,使用0的超時呼叫它將使其忙循環–不好!)。

+0

我爲我的問題添加了更多信息 – PICyourBrain 2012-08-16 17:01:06

+1

@PICyourBrain:聽起來你可以用epoll做所有事情。定時器可以通過'timerfd'設置,我想其他事件也可以通過文件描述符處理。睡在一個'epoll_wait'是一個有效的方式來傳遞空閒時間。 – 2012-08-16 19:08:27

1

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(); 
} 

+0

waitForSomeEvent而不是隻是睡覺 – CyberDem0n 2012-08-16 16:56:31

+0

@ Cyber​​Dem0n是的,我正在嘗試第二部分,因爲你評論說。對於那些不想深入研究多線程世界的人,我只是想給出一些不同的解決方案。這也從他正在尋找睡眠的問題看來。 – chacham15 2012-08-16 17:00:13

+0

@ chacham15我猜你的意思是l-> acquire和l-> release,對吧?> – PICyourBrain 2012-08-16 17:02:35

相關問題