CSci 4061 增強型自動平地機

浅笑心柔2發表於2024-03-28

CSci 4061:作業系統簡介2024年春季
專案2:增強型自動平地機中間到期時間:3/15午夜
1.目標
在這個專案中,你將透過多種方式擴充套件/增強你的自動標記。你將使用管道(管道)在自動轉換器及其子級(可執行檔案)之間通訊資訊,2)使用I/O
重定向(dup2)和隨機I/O(seek),3)使用訊息傳遞佇列來實現差異,並使用警報來實現真正的超時,以檢測無限/阻塞的情況(警報、sigaction、setitimer和sigfillset)。你會還可以找到一些方便的字串函式(sprintf、strchr、strrchr、strlen),以及
幾個I/O函式(unlink、getline、fgets、fseek)。閱讀所有這些系統呼叫。為了簡化問題,我們將刪除“慢速”事件,因此只有正確、不正確、崩潰、無限或檢測到阻塞。您還將在執行時透過將其設定為CPU計數,可以使用/proc/cpuinfo獲取。具體來說,計算次數
處理器出現在檔案中(在src的get_batch_size()函式中實現您的程式碼/utils.c)。這意味著新的autorader不會將B作為命令列引數。相反,它1
將接收包含要分級的可執行檔案的目錄作為第一個引數。新用法將如下所示:“./autorader<testdir><p1><p2>…<pn>”。
我們在utils.h/utils.c中提供了許多有用的程式碼,您可以使用(或忽略)這些程式碼。不管怎樣,
您必須在utils.c中填寫一些函式。
限制1:如果可能的話,請嘗試在負載較輕的機器上執行測試(鍵入uptime
shell獲取CPU負載;如果它很高,請等待或選擇另一臺機器)。
約束2:必須清除程式中的任何無限/阻塞程序
自動執行,但也可以在出現錯誤時在程式外的shell中執行。你可以使用“ps-u”
”和“pkill-9”來終止延遲程序。實際上pkill函式
允許模式匹配,因此您可能會發現以下命令很有用:pkill-9“sol_
”。
一些原始碼、目的碼和測試用例將根據需要在可下載的tar檔案中提供
來自Canvas。您可以使用自己的P1解決方案作為起點,也可以使用我們的解決方案。
2.改變資訊傳遞方式
您將對您的autorader解決方案進行一些更改。在P2中,您不僅要修改
autorader,但模板程式碼也是如此。
更改1:當前模板使用return語句返回答案。答案是
限制為8位或0。。255由於系統呼叫限制。這可能會限制一個“真正的”同志
其中實際答案可能遠遠超過將被返回的8位元值。要解決此問題,您將修改
將其答案輸出到STDOUT的模板。您還將修改autorader以重定向
child的STDOUT轉換為名為output/的檔案<引數>(例如輸出/sol.4)。到
這樣做,你會在自動標記器中使用dup2。小心開啟具有寫訪問許可權的檔案,並呼叫
dup2只在孩子身上。一旦autorader透過讀取輸出檔案從每個孩子那裡得到答案
(或確定子級的問題),它應該使用:int刪除批處理中的輸出檔案
unlink(const-charpathname),例如unlink(“output/sol.4”)。
透過將get_batch_size()函式與“grep processor/proc/cpuinfo|wc-l”1進行比較,可以仔細檢查它是否正常工作2.如果您有錯誤,您可能需要刪除shell中的輸出檔案。我們強烈建議為每個(可執行檔案,引數)對,即使事件已崩潰、無限或被阻止,對於一致性但這取決於你。輸出內容將在中為您定義
提供的程式碼。在轉到更改2之前,請確保更改1有效!2:當前的autorader在exec介面中傳遞了一個測試引數。你建立三個“版本”的模板(以及相應的)autorader。三者都更改輸入
僅限位置。
(i) 像以前一樣使用exec傳遞每個輸入引數(在這種情況下,沒有對Change1進行新的更改。)
(ii)使模板透過STDIN讀取其引數;為此,您將透過dup2將STDIN重定向到一個檔案在類似於更改1的自動標記中。注意不要只在孩子身上叫dup2。您要的檔案使用首先由autorader:input/.in為每個引數建立(例如input/4.in、input/7.in等)。最簡單的方法是使用autorader命令列建立檔案argv[]。您還必須在dup2之前的子級中開啟輸入檔案以進行讀取訪問。使用取消連結後刪除輸入檔案。如果你有bug,代 寫CSci 4061你可能需要刪除shell中的輸入檔案(make clean也會清除這些檔案)
(iii)使用自動分級器和每個子級之間的管道來傳遞輸入引數。
對於所有三個版本,請使用Change 1的輸出機制。在相同的原始檔中建立所有三個版本(就像真正的C系統程式設計師所做的那樣)。使用#ifdef,#eliftemplate.c和autorader.c中的#endif以選擇特定程式碼。您可能需要在多個地方執行此操作。請使用EXEC、REDIR和PIPE作為版本姓名。(例如#ifdef EXEC….#endif、#elif REDIR…、#elif-PIPE…#endif)。要編譯特定版本的模板和/或autorader:您可以執行“make”。這些目標使用-D標誌來指定版本(EXEC、REDIR或PIPE)。
3.使用警報進行時間檢測的更好方法
更改3:現在檢測一個子程序執行時間過長超時。為此,請修改autograder.c僅)透過sigaction建立報警處理程式,並使用setitimer啟動計時器(將其設定為過期
IMEOUT_SECS秒之後)。刪除檢測到執行時間過長的舊程式碼。當計時器熄滅時,仍在奔跑的孩子被歸類為無限/被阻擋,所以你應該殺死
它們使用int kill(pidt-pid,int sig)。記住仍然要等待每個過程。然而由於每個過程最終都會結束,現在不需要將WNOHANG傳遞給waitpid。所以,把它取下來。
相反,您將使用來自WEXITSTATUS(狀態)和WTERMSIG(狀態)的資訊確定每個子程序的結果。可能出現的一個問題是,警報可能會中斷
呼叫waitpid。在這種情況下,您應該重試對waitpid的呼叫。提示:使用errno的值EINTR以確定waitpid是否被中斷。您將建立的單獨版本
autorader,mq_autograder.c,以及本部分中的模板template_mq.c。
4.使用訊息佇列重新發布autorader範例更改4:您將實現另一種傳遞資訊的樣式,即Linux訊息佇列。這個分配工作的方法將遵循master worker模型。要做到這一點,你的親筆簽名將把一組[標記可執行引數]形式的“任務”寫入訊息佇列,其中標記
對應於特定的工作程序。首先,自動標記器將啟動所有B工人併傳送給工作程序的訊息,指示它將接收多少條訊息以便初始化資料用於儲存資訊的結構。然後,自動標記器應該生成所有任務並將其插入訊息佇列。工人們將閱讀所有發給他們的資訊,併傳送確認訊息到自動標記程式。收到自動標記程式後
來自每個工作人員的確認,它將向每個工作人員傳送一條訊息,告訴他們開始測試3.可執行檔案。此時,所有工作程式將開始批次執行它們的(可執行檔案,引數)對
8,在每批之後將結果傳送到自動標記程式,直到所有配對都經過測試。過程確定每個可執行檔案的結果的方法應該與src/autorader.c中的相同。記住
讓worker中的每個子程序為建立一個輸出檔案output/sol.4、output/sol.7等每個(可執行檔案、引數)對,並將輸出重定向到這些檔案。別忘了刪除訊息佇列。對於所有版本,最後一步是建立一個名為results.txt的輸出檔案。我們有提供了一個函式:src/utils.c中的write_results_to_file。
5.學生在提交的材料上做得怎麼樣?
最後一個“任務”是實現一個名為doubleget_score(char
results_file,charexecutable_name),它使用隨機I/O返回給定的分數
results.txt中的executable_name(學生)。給定可執行檔案的分數是結果為“正確”的引數除以測試的引數總數。您必須使用隨機I/O(
seek)以使其高效。請參閱include/utils.h中對此函式的描述,以獲取
更多的資訊和約束。
6.測試
為了進行測試,請觀察Makefile中的目標。有編譯autograder.c/template.c的選項對於EXEC、REDIR和PIPE,它們對應於make-EXEC、make-REDIR和make-PIPE。這個用於製作測試可執行檔案的方法類似於P1。常見的工作流可能看起來像下列的
$make-exec N=20#回想一下,N設定編譯的template.c檔案的數量
$ ./自動交易解決方案1 3 5
$make clean#這將清理輸入/輸出/解決方案目錄
對於測試更改4(訊息佇列),常見的工作流可能如下所示:
$make mqueue N=20#mq_autograder現在將使用sol_X檔案,而不是mq_sol_X
$ ./mq_自動平地機解決方案1 3 5
$make clean
隨著分配截止日期的臨近,我們將嘗試釋出更多的測試用例,但目前有一個
Makefile中的單個測試用例,即目標“test1_exec”。此測試的預期輸出
results.txt和scores.txt的case位於預期的/資料夾中。它使用EXEC模式,但
無論使用EXEC、REDIR還是PIPE,結果都應該相同。

相關文章