2013-08-31 99 views
0

我正在嘗試編寫一個進程管理器,它使用實時調度策略SCHED_FIFO調度不同的進程。我想要做的是設置進程的優先級,並根據優先級執行它們。Linux進程調度程序

我有暫停的測試進程,並等待進程管理器恢復,以便他們執行他們的任務。

下面是測試過程中的部分代碼:

while(1) { 
    kill(myPid, SIGTSTP); // pause process until resumed by scheduler 
    printf("Process %s with PID %d and priority %d\n", 
    argv[0], myPid, param.sched_priority); 
    printf("Process %s processing...\n", argv[0]); 
    k = 0; 

    for (i = 0; i < 10000; i++) // do random task 
    { 
    for (j = 0; j < 10000; j++) 
    { 
     k++; 
    } 
    } 
    printf("Process %s done. Going to sleep.\n", argv[0]); 
    sched_yield(); // yield the processor 
} 

以下是進程管理器示例代碼:

pid_t child[3]; // holds child processes 
while(1) 
{ 

    for (i = 0; i < num_child; i++) 
    { 
     kill(child[i], SIGCONT); // resume process 
     child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10; // set priority 
     sched_setscheduler(child[i], SCHED_FIFO, &child_param); // set policy 
    } 

} 

雖然我能夠獲得最高的優先級先運行,這些進程在完成處理器之前不會完全完成任務。我的問題的輸出可以在下面看到。

Process 1 with PID 5975 and priority 79 
Process 1 processing... 
Process 2 with PID 5974 and priority 69 
Process 3 with PID 5973 and priority 59 
Process 2 processing... 
Process 3 processing... 
Process 1 done. Going to sleep. 
Process 2 done. Going to sleep. 
Process 3 done. Going to sleep. 

爲什麼不SCHED_FIFO策略的過程中完成自己的任務的整個下道工序開始前?

+1

這是對的'的sysctl -a單核電腦 – TheCodeArtist

+0

?| grep sched_rt_'? – Olivier

+0

輸出運行任何機會,這是一個多核CPU上運行... – ninjalj

回答

1

sched_setscheduler()手冊頁,

對於SCHED_FIFO政策下調度的過程中,遵循以下規則:

  1. 一個SCHED_FIFO過程已先行通過 更高優先級的另一個進程會留在列表的首位,其優先級爲 ,並且將在所有優先級更高的 再次被阻止時立即恢復執行。

  2. SCHED_FIFO過程變得可運行,將在 列表其優先權的端部插入。

  3. sched_setscheduler()sched_setparam()調用將把由PID標識的 SCHED_FIFO過程在 名單開始,如果它是可運行的。因此,如果它具有相同的優先級,它可以搶佔當前正在運行的進程。 (POSIX.1-2001指定的進程應該去的 結束列表。)

  4. 調用sched_yield()的處理將在 列表的末尾放。

規則1規則3間接暗示SCHED_FIFO保證FIFO行爲只如果更高優先級的另一個過程沒有得到 調度。


再往下man page

進程實時策略之一下調度具有範圍1(低)至99(高)一個sched_priority值。

的代碼在你的片段下面一行

child_param.sched_priority = BASE_CHILD_PRIORITY + i * 10; 

提出了更高的優先級後者過程。因此他們傾向於搶佔先前的流程。

注意:POSIX.1-2001要求實現只支持最小32級不同優先級的實時政策水平,以及一些系統供應只是這個最小。便攜式程序應使用sched_get_priority_min()sched_get_priority_max()來查找特定策略支持的優先級範圍。

+0

後者的進程似乎也被搶佔了。如果你看看輸出,那麼沒有一個過程完全完成他們的任務。 – Olivier

+0

你可以嘗試調用'sched_setscheduler()** **之前**恢復與'SIGCONT'的過程? – TheCodeArtist

+0

我試過了。它給了我相同的結果。是否有其他進程可以搶佔我的測試過程? – Olivier