# 作業討論區 ## Project 1 * 公告:關於 Round Robin 那邊,使用 i+1%n 方法實作的同學,如果你用(i+1)%n 實作時,0沒有滿足先ready 的行程先使用cpu。ex:p1 ready at 0 exec for 1000,p2 ready at 500 exec for 500p3 ready at 700 exec for 500這種情況當p2結束的時候應當由p1繼續執行而非p3,原因為p1在500的時候重新請求cpu使用權,而p3在700才請求。如果你用(i+1)%n的方法排成但是有特別處理上述情況就不用修改,沒有的同學因為之前我沒說明清楚,沒有的同學如在禮拜天11:59之前將新版關於output、demo video、程式碼等等跟RR排程有關的修改傳上github並且來信您動工的時間即可。不另外扣分,但是算分時,只有RR的部分採用你新commit的code其他部分依舊照之前時限內的commit去改,如果你有這種情況還先寄信讓我們知道謝謝。另外如果你因為下禮拜的期中考loading實在太重,請另外寄信附上相關證明,我們會再討論處理辦法,謝謝。 * **Q:看了版本記錄,發現助教大約是在 4/30 (四) 18:15 左右完成此篇公告的編輯,不知道這種重要的公告,是否會發 email 通知大家?畢竟 OS 課程在很多不同的地方都有不同的公告([Project 的 spec 頁面](https://hackmd.io/@Ue96nvjESj2XsDXw532-qA/ryYqceUrU)、[作業討論版](https://hackmd.io/V2IYsTWfSN-a9MApgHxMjg)、[NTUCOOL 的課程首頁](https://cool.ntu.edu.tw/courses/1013)、[NTUCOOL 的公告頁面](https://cool.ntu.edu.tw/courses/1013/announcements)、[HackMD 的課程頁面](https://hackmd.io/1SncfOaGQVa2GsSgll8QOQ)、[HackMD 的 Lecture Notes](https://hackmd.io/Fy28YBZLT8uTn92lTWxUDw)、還有各個課程影片中口頭提到的事項),實在擔心同學們難免會漏掉一些資訊。** **建議助教可以參考過往 ceiba 系統,每當有重大公告的時候,以 OS 助教的名義寄一封信給所有的修課同學,相信比起 HackMD 不會主動通知學生,電子郵件的方式更能夠將訊息精準地傳達給同學們。** [time=23:36, Apr 30, 2020] 更新:感謝助教已於 23:55 發信通知同學們! * A:下禮拜會請老師在課堂影片說明,也於NTU COOL 發出公告。 * Q:關於個公告有些問題:只需要改code就好了嗎?還是連output和demo影片都要重弄?先謝謝助教回答了。 * A:output demo任何跟RR相關的部分也重新上傳。 * Q:關於公告還有問題想請問:請問RR如果要改的話,除了上述的output、demo,report的部分也要改嗎? * * A: 一人做. [time=Wed, Apr 1, 2020 12:17 PM] * Q:如果沒辦法install HW1裡面的linux版本,直接使用本來就有的linux 4.2.0-27-generic 可以嗎? * A:如果你可以正確安裝並執行的話並無限制 * Q:想確認一下題目的意思,是要我們自己根據input去fork相對應數量的process並根據input的ready time及execution time利用system call去改變他們的優先權及排班方式嗎?還有就是hint的函式跟指令一定都會用到嗎?目前想法好像只會用到其中幾個 * A:如果你認為只用部分就可以達成要求,那我們也不會對此做限制 * Q:題目會給N * A:MAX=20 * Q:關於要寫到dmesg的process start time,我應該是寫 process create time (也就是process read time),還是 process 真正開始執行的時間? * A:process start time ,process第一次搶到cpu並且執行時。 * ~~Q: ==請問下面的問題們教授跟助教們有要回答嗎?==~~ 感謝,底下問題已獲得解答。很抱歉回太慢了sorry。 * Q: Project 1 的 spec 內提到,要將與核心一同編譯的程式碼放入kernel_files 目錄,並且也要放上核心 system call table 及 syscall header file。 請問是要將這兩個檔案直接放在 kernel_files 下,或是要再建立一個資料夾於 kernel_files 下,然後把這兩個檔案放進來?先謝謝回答! * A:放在 kernel_files 下 * Q: 請問 spec 中 dmesg 的範例輸出是有參考價值的嗎?因為依照 FIFO 之排法和前面回答:start time 是第一次搶到CPU並執行的時間,範例中的數字似乎有點奇怪(所有 start time 皆早於所有 finish time) * A:因為之前定義的不清楚,所以你把start time當行程的創建時間或是放到cpu上的執行時間都會收,然後針對兩種case看你用哪種去跑分。 * Q: 請問測資會保證 process 的順序是按照 start time 來排序嗎?因為至少釋出的測資是這樣。另外給定的N之數量級最大為何?大於 int 範圍或小於 10 之類的。 * A:是,20 * Q: 承上,如果 N 不大的話,我們選 PSJF 可否用 O(n) 取 min 的方法? 還是應該要 maintain priority queue 來做到 O(1) 取 min? * A:都可以 * Q: 請問如果遇到初步判斷是同一個 priority 的 process 集,像是 FIFO 有相同 ready time,或是 SJF 有相同 ready time 及 exec time 等,最後是按照 input 順序來排程嗎? * A:對 * Q: 請問如果是要用單核,且自己的電腦也是單核的,可以不綁CPU嗎?(看technical issue是說可以把虛擬機設成單核的就好,但擔心就會跟助教測試程式的環境不一樣,還是說助教在測試時會先把自己的環境設成單核?) * A:可以 * Q: 依照助教給予的指令"./yourProgram < FIFO_1.txt > FIFO_1_stdout.txt"無法順利執行,但加上sudo => "sudo ./yourProgram < FIFO_1.txt > FIFO_1_stdout.txt"則可以,想請問這樣的話,是否可行呢? * A:可以 * Q:`//Ti - a non-negative integer, specifying the execution time of the i-th process.`代表測資的execution time有可能為0嗎? * A:NO * ==**Q: 請問關於 Round Robin 那邊,可以用 i+1%n 的方法找下一個人嗎?這樣還是會大家輪一圈,可是跟 queue 實作的答案會有不同,原因是因為中間新插入的東西 (ready time 到了) 在 queue 實作會跑到最後面,而在 i+1%n 的 array 實作則會差在中間對應他的 index 的地方。**== * ==**請問助教最後一天才改spec的意義是要我們怎麼改?**== * ==**哭啊們**== * 感覺就有 如果1跑500然後換2跑,而1就飛到queue最後,過了幾個unit之後3進來了,助教的「不行」感覺是要先跑1而不是先跑3,但如果用模的會先跑3 * A: 不行,謝謝上面的同學解答,我是這個意思沒錯。 另外有甚麼spec改了嗎,可以寄信讓我知道一下好方便跟老師討論? 例如 | process | ready | exec | | -------- | -------- | -------- | | p1 | 0 | 1500 | | p2 | 300 | 1000 | | p3 |700|1000| 甘特圖:P1-500unit -> p2-500unit(這時候p1在500 unit 進queue,p3在700 unit進queue)沒理由P3先執行吧。 能變動的情況是p3 ready at 1000 unit 同時p2在1000unit放棄cpu 再回來爭奪cpu,這種情況你可以亂挑。 還是我之前有說過可以用i+1%n那再請寄信告知我,我會跟老師討論,另外不管你做的正確與否可以的話還是先上傳。 * Q:題外話問一下:不是確定測資是按照ready time排序了 這樣還會有影響嗎 更:感謝上面同學的回答有回答到我的問題了總之如過ready time 沒有剛好在那個time slice的邊界的話就會有唯一解 * A:你的第一個子行程是拿ready time相同且未在最前面行數的process嗎? 可以詳述你的情況嗎? 或是寄信給我,看整個問題,謝謝。 * Q: 請問Child process output出的name和pid需要按照什麼順序嗎,還是怎麼排都可以?(例如fork的時間、process 開始執行的時間等等) * A:都可以,只有Dmesg的部分要一句子行程的結束順序去排 * Q: 請問不能include<linux/linkage.h>和<linux/timer.h>該怎麼辦...我爬了超多文章還是沒用,如果計時不用getnstimeofday還能有其他的替代方案嗎? * A:有其他資訊或error可以提供的嗎 (回上面:和時間相關的應該不是<linux/timer.h>?) * Q: 想請問如果編好kernel,卻沒辦法開機,一直卡在下面的畫面,可能是有甚麼問題? * A:你的kernel版本?cpu gpu或是虛擬機規格? ![](https://i.imgur.com/xuKlEA3.png) * Q:誤差的評分方式? * A:以FIFO這個input為例: p1 ready at 0 unit exec for 5 unit, p2 ready at 2 unit exec for 5 unit 標準答案依據你對start time的定義分兩種 -1.以child process創見為start time的標準答案為:p1 start at 0 unit end at 5 unit,p2 start at 2 unit end at 10 unit -2.以子行程child process第一次放到cpu上執行之時間之標準答案為: p1 start at 0 unit end at 5 unit ,p2 start at 5 unit end at 10 unit 之後我們會把你的程式碼依據你的unit time轉成類似上面這種格式 然後針對每一之process去比較每個行程的時間誤差 誤差計算為absolute((你被轉換過得輸出之end unit - start unit)-(標準答案的end unit - start unit)) 之後將每筆誤差做相加取平均 * Q:請問demo影片的結果要和交出去的output一樣嗎?因為每次跑的結果都不太一樣。 * A:不用,不用差太多即可 * Q: 請問github repository可以不設public嗎? 用collaborator之類的方式。 * A:Add osproject3310@gmail.com as collaborator is fine,but you still need to submit the form. * Q: 請問用priority queue造成順序不同,但總執行時間是對的,這樣可以嗎?像是PSJF的情況下,如果每個process都同時ready,執行時間都一樣,可能會排P0、P5、P4...之類的 * A: 可以但僅限使用於PSJF及RR(當1 process剛ready碰上另一個放棄cpu的process時),但如果Input一開始 ready time都一樣,請你假設最上面的process先執行。 * Q: 請問如果抓時間的syystemcall原本的kernel就有,還需要自己寫嗎?或可以直接call就好?(ex. sys_clock_gettime) * A: 不能,就是希望練習加入system call(hw1)。 * Q: 可以不要所有.c檔都放在最外面嗎,我想用資料夾把source code稍微分開,只要把makefile寫好就可以了嗎?還是說一定要把所有code展開放在第一層呢? * A:可以,你可以開一個src資料夾放進去 * Q: 我想確認一下" execution time Y should execute, not sleep"的意思是指其在fork出來後在執行時,連read之類的blocking指令都不可使用嗎?還是說只是不能用sleep指令,因為我根據project1頁面最下面助教的建議使用2CPU,一顆排程,一顆專門跑子行程,但若不互相溝通,有點怕2邊可能會時脈不同。 * A:不知道你的意思是不是用block來取代{ volatile unsigned long i; for(i=0;i<1000000UL;i++); } ,如果是的話那不行。 * Q: 請問report最後一題的差異是舉其中一個test去分析就好嗎?理論的時間是用time measurement的結果平均再除以500的秒數當一單位時間來計算嗎? * A: 1.你要怎麼說明都可以,只要你把所有你發現的情況都說明就好。 2.yes * Q:請問可以不要用./process < input > output來存輸出的資料嗎 想同時顯示在screen跟儲存用tee之類的方便錄影 * A:可以啊,只要最後格式要長一樣就好。 * Q: demo的時候可以寫一個.sh來跑五個檔案嗎 * A:可以,只要可以看清楚你五個跑的數據就好 * Q: by往前4個的問題,我的兩個CPU還是有各自跑{ volatile unsigned long i; for(i=0;i<1000000UL;i++); 但我的兩個CPU(一顆排程,一顆專門跑子行程)每跑一次上述的for迴圈後,會互相確認一次對方是否也跑完該次for迴圈了。這樣可以增加結果的穩定性(就像RR完成時間太近的情況發生時,沒互相確認的話,會導致實際狀況誰先誰後不太依定,因為兩邊的時脈有微小誤差,但有互相確認的話結果就會固定,因時脈保證相同),但不管有沒有確認,整體的結果會差不多。由於助教寫說40%是跟據測試結果<順序>有無錯誤,故想增加互相確認的機制(不過不加的話大體上都還是會正確,僅有上述的特殊狀況才會出現不穩定狀況)。但溝通可以使兩邊走的時間一樣,所以感覺誤差會變小?有點類似,就schedule用write然後子行程read,感覺我的做法比較用read write來確保順序,因為我不用read write結果大體上會是正確的,就schedule跑550次for時,可能子行程才跑530次。 * A:可以,只要你有確保child process足夠執行次數的{ volatile unsigned long i; for(i=0;i<1000000UL;i++)。 * Q: demo影片檔案太大,可以上傳壓縮檔嗎? * A:可以 * Q: 誤差計算的時候會除以理論時間嗎?不然像80000的時候只看絕對值誤差超級大 * A: deadline 結束後視情況決定 * Q: 請問之前填 google 表單時是選還沒完成 project 1,之後完成還要再填一次寫已完成嗎? * A: 是,你可以在期限之後轉成已完成沒關西,但我只會根據你在實現內的那個commit去改 * Q: 請問上傳影片用 Git LFS 是可以的嗎?(如果助教直接下載 repository 的 ZIP 檔來評分,影片會開不起來,需再麻煩助教直接在影片那裡額外下載) * A: 可,特別寄信說明一下 * Q: 請問 demo 影片的格式有限制嗎? * A: no * Q: 請問kernel file 內是不是除了source code, table, header,也要放入linux_XXX/kernel/Makefile? * A: 不用,你要放也可以 * Q: 請問stdout的部分,需要輸出有 [Project1] 的那些資料嗎? 還是只要name跟PID就好? * A:name跟pid * Q: 請問如果在填表單時,寫已完成,但之後又有在死線前做新的commit,助教還是會依據死線前最新的版本評分嗎?時序是這樣,舊版上傳,填表單,新版上傳,死線到。想知道最後會以新舊哪個版本評分。 * A:對,依照死線 * Q: 可以用C++嗎,不行的話,理由是要求我們要自己實作heap嗎? * A: TA might not be able to help using different languages. You are on your own risk communicating with kernel. It is not recommended but you are not limited to do so. Steven * Q: 請問RR使用queue實作的時候,如果ouput的結果順序是正確的,但因為發生race condition而造成child process實際的結束時間有些微誤差而有部分順序的調動,這樣是會影響到正確性嗎?(因為如果是發生race condition每次的結果會不同,還是一定要用signal的方式確保每一次的正確性呢) * A: 些微誤差不會當順序錯,端看你想用哪種作法. * Q: 在RR時,1 process ready洽碰上另一個到達500cycle放棄cpu的process時,我選擇讓放棄者先進入queue,ready的再進入queue是OK的嗎。 * A:可以 * Q: 如果dmesg上的pid和stdout的不同(順移1個),可依情況給分嗎? 我的system call突然怪怪的也沒時間再compile kernel了 * A: 會的 * Q:請問有延長deadline的可能性嗎? 這個作業以前是六個人做的,一個人做真的很吃力QAQ * A: 我昨天(4/29)有問過老師了,老師說延期可以,但分數會比較低詳細低多少還沒決定,不過今天我會再問老師一次,還是建議先繼續做,至少之後還是會有分數。 * Q:請問什麼時候會開始改作業? 如果在deadline後commit較完整的版本,是改最後的那版嗎? * A:今天開始陸陸續續改,是改deadline前的(除非決定要延期)。**(re:那若是保證deadline後的晚整性即便打折後還是比deadline前的高,能改較完整的那份嗎<--這部分還在跟老師討論中 ## Project 2 * Q: 請問一下現在 (期中考過後) 還可以再提自訂的project 2 proposal嗎? * (我記得老師在這周的直播好像說不行?而且也不會比考期末還要輕鬆) * A: Yes. So far no one is formally approved. The ones proposed before midterm need to be creative with your own idea and pass top 20% in midterm. After midterm, it is too late and looks speculative and not fair. Sorry. Basically, the self-designed project needs to do no less work than final exam + assigned project. > [name=Chih-Wen Hsueh] [time=Fri, May 1, 2020 4:58 PM] > * Q: 請問如果 N=3,master寫3個檔案出去,slave也就要輸出3個檔案嗎?還是說slave的輸出一定是從dev讀到的全部,也就是master寫的全部內容,3個檔案都在同一個檔案中輸出? 還有一個問題是file_size讀出來的應該已經是bytes了,為什麼輸出時要除8呢? * Q: "Given partial sample codes of virtual IoT..." 想問下sample code的連結在哪? * A:會和sample input一起公布。已公布。 > [name=TA] * Q: 請問所謂的slave device跟master device在我們實作程式的時候是什麼?還是說所謂access slave (master) device就只是用不同的IO方式做copy到指定地點? * Q: 檔案是要從master傳到slave還是slave傳到master?還是都要? * A:這兩個問題一起回答。檔案的傳輸路徑是input file經由master -> master device -> slave device -> slave,再由slave輸出成output file。 > [name=TA] * Q: 請問這個作業要怎麼在device各有不同的情況下評估功能正確性?因為正確解答似乎不存在? * A:會以input file是否和output file完全相同來評估功能正確性,因為每組之間device不同所以不會直接以時間長短來作為評分標準,而會以每btye的傳輸時間的穩定度作為評分標準。 > [name=TA] * Q: 請問transmission time和file size是要每傳一個檔案就印出,還是全部檔案的加總? 或是前者是總時間,後者是每個檔案? * A:全部檔案的加總。例如sample input 1有10個檔案,transmission time就是10個檔案都傳完花的時間,file size為10個檔案大小的總和;sample input 2只有1個檔案,transmission time就是那1個檔案傳完花的時間,file size為那1個檔案的大小。 > [name=TA] * Q: 請問兩個方法的差別就只是input file一個讀到buffer,一個直接map到address,然後兩個都write到device嗎? * A:用file IO和mmap IO讀寫檔案,一個是讀input file寫到device,另一個是讀device寫到output file。 > [name=TA] * Q: 想請問助教,spec中放sample code的用意是什麼?是要我們在這個code上面再加一些東西(裡面沒有mmap)?還是仿照這個架構,自己完整的實作? * A:sample code只是給你一部份的code,作業要求的東西要自己實作。當然如果你有自己的想法我們也鼓勵不按照sample code從頭自己實作。 > [name=TA] * Q: 請問 spec 上寫執行 slave 和 master 時,文字敘述是寫從 standard input 讀入,但是底下的範例卻是以 main 參數方式傳入,那麼我們要以哪種方式為準呢? * A:都可以,不過記得在report說明你們組採用的input方式對你們組的設計來說有什麼好處。 > [name=TA] * Q: 請問 input file 有限制最多有幾個檔案嗎? * A:除了範例的兩組input file以外,其餘的input file都是各組自行決定,只要能成功做得出來沒有限制最多幾個檔案。 > [name=TA] * Q: 請問如果 N=3,master寫3個檔案出去,slave也就要輸出3個檔案嗎?還是說slave的輸出一定是從dev讀到的全部,也就是master寫的全部內容,3個檔案都在同一個檔案中輸出? 還有一個問題是file_size讀出來的應該已經是bytes了,為什麼輸出時要除8呢? * A:master寫3個檔案出去,slave就一定要輸出3個一模一樣的檔案。如果sample code裡面有有問題的地方,你們都可以自己把它改掉。 > [name=TA] * Q: 請問有限制master傳的檔案數跟slave的檔案數一定要一樣嗎? * A:有,因為要保證輸入的檔案和輸出的檔案一模一樣。 > [name=TA] * Q: 請問有保證master、slave在傳遞資料的時候任一方都不會突然離線嗎? * A:傳遞資料的時候任一方都不會突然離線。 > [name=TA] > * ==Q: 請問spec中提到的kernel programs是要額外寫的嗎? 如果device之間已經可以透過slave program和master program溝通的話,為甚麼還需要kernel programs?== * A:kernel programs是指兩個device.c檔。 > [name=TA] * Q: 請問我們 implement 的普通 I/O 跟 MMAP I/O 都是在 master.c 或 slave.c 與 hard disk 的 * A:我看不太懂你的問題,你是不是沒把問題打完?總之就是該 implement 地方都要 implement ,不只 user program 的部分。 > [name=TA] * Q: 在 spec 中有一句 Sample output for the page descriptors ![](https://i.imgur.com/nR0AaqQ.png),是在 dmesg 中出現的,但是 sample code 內也有其它會在 dmesg 中輸出的資訊。請問最後繳交的程式碼中,需要把除了 page descriptor 資訊以外的東西刪除嗎? * A:是,請盡量把無關的東西刪掉, page descriptors 截圖放在 report 就好了, Time Size 的結果才要放在output資料夾。 > [name=TA] * Q: 請問file transmission time在master和slave中各是怎麼算的,只算寫到device的時間還是有含listen或是送socket的時間之類的,請問一下開始和結束的區間標準。 * A: from when the device is opened until the device is closed。 > [name=TA] * Q: 請問master和 slave會同時使用 fileIO 或是同時使用 mmap 嗎?還是會有可能一邊用mmap,一邊用fileIO? * A:可以自己選擇,當然有多做而且有在report比較效能差異會比較高分。 > [name=TA] * Q: 請問如果自己生的 input file 的大小超過 GitHub 的上傳限制,該怎麼處理呢? * A:我用關鍵字"GitHub的上傳限制"GOOGLE了一下有解除上限的方法,不過我自己沒試過所以請你們自己試試看。 > [name=TA] * Q 記得之前有說 project 2 的評分,有一半是組長負責,想請問評分格式和要在哪裡繳交? * A:評分寫在report裡面的分工比重,格式就每個人佔幾%這樣。 > [name=TA] * Q: 請問mmap io(以master為例)是指要實作以下哪種(哪種才叫做mmap io)? 1. 把file mmap之後write那段memory的內容到device 2. 把file mmap之後傳address和長度到device讓device去讀那段memory 3. 把device mmap之後read file到buffer再write到那段device memory 4. 把device和file都mmap再把file map的內容copy到device map * A:4 > [name=TA] * 接上次問 dmesg 的問題 1. 因為 page descriptor 的資訊,只有在使用 mmap 的 master/slave 上才會出現。如果兩個都用 mmap,不在 page descriptr 數值前面標上是 master 還是 slave 會不知道是誰的(如果在同一個機器下測試的話)。想請問可不可以在數字前面加上標示?還是一定要在兩台電腦間測試? 2. 請問 page descriptor 是要印出對 device 的,還是對 file 的?如果有要印對 file 的,檔案太大時會印出很多 page descriptor (我們的理解是 page descriptor 是指 page 對到 physical frame 的位置),這樣截圖不太能完整呈現;而印出對 device 的就沒有這個問題,因為都是相同的,只要印一次即可。 * A:1.這題的確希望你們用兩台機器測試。2.device的。 > [name=TA] - Q: 請問Time Size的結果是要輸出到一個file 還是輸出到終端機截圖即可? * A:輸出到一個file。 > [name=TA] > - Q: Spec中有說要把stdout的 Time Size放在 output,output file也要放在 output,我們覺得這樣會太亂,想請問能否另外創個資料夾叫做result專門放stdout的Time Size? * A:可以在output資料夾的底下再分成兩個資料夾分別放,不要放在output資料夾的外面。 > [name=TA] - Q: 請問page descriptor是什麼? 要如何印出這個資訊? - Q: 作業說明說![](https://i.imgur.com/O6Ovqn9.png),看起來是多檔案傳輸當作BONUS的意思,我們以為sample input 1只要挑一個傳即可,所以多檔案到底是要實作還是只是bonus? 如果不是bonus的話請助教解釋spec上面寫的那句是甚麼意思 * A: your own better idea such as many files in parameters。如果你有更好的想法在多檔案傳輸的"參數"上。指的是如果你覺得作業的 Program input 格式不夠好你們可以自己修改 Program input 格式。 > [name=TA] > - Q: 請問output資料夾裡面要交哪樣子檔案?以sample_input_1為例,是要分別執行十個檔案的mmap對mmap和fcntl對fcntl,總共20種結果?還是要根據我們report裡面的不同情況生出所有不同情況的結果? * A:可以這樣作:會有一個資料夾可能叫sample_output_1_mmap放mmap對mmap產生的output file,另一個資料夾可能叫sample_output_1_fcntl放fcntl對fcntl產生的output file,另外再有兩個檔案分別放mmap對mmap和fcntl對fcntl的Time Size結果。sample_input_1是同時執行十個檔案的mmap對mmap和fcntl對fcntl,所以Time Size結果只要分別放兩個檔案就好。 > [name=TA] - Q: 請問page descriptor到底是什麼東西,是: 1. 把device mmap到user space的virtual address的開頭(vma->vm_start,即user_program call mmap return的address) 2. 在device alloc的memory的virtual address的開頭(kmalloc return的address) 3. 在device alloc的memory的physical address的開頭(把2.拿去做virt_to_phys) 4. (更) 找到一個最像的東西,是struct page裡的flags嗎,如果是的話想問一下device的每個page都要截圖嗎還是第一個page就好 5. 以上都不是,所以到底是啥QQ * A:struct page裡的flags。截第一個就好。(Hint 的 Supplmental information for this project 有(pdg)) > [name=TA] - Q: 可以請一個會寫spec的來寫嗎,到底是要雷死誰 * 歡迎加入OS助教群來改寫spec(我不是助教) - Q: 請問一下github repo設private沒把助教加進collaborator要怎麼改,助教要提供一下github名稱嗎? * A:Add osproject3310@gmail.com as collaborator is fine,but you still need to submit the form。和project1時一樣。 > [name=TA] ## HW 1 * 提問 * Q: 請問一下。我run好ppt第22頁的指令後,reboot了。但,啟動時擇kernel的畫面沒有出現選,直接到login畫面。1.怎麼做可以設定出現選擇kernel的畫面? 2.另外,如果要以 Linux 4.14.25 為 default 的話,怎麼設定? 感謝!<!-- P.S. 1.為了設定出現出現選擇 kernel 的畫面做了以下操作 -做過3遍,但還是結果是一樣的。 -在 *home* directory run 了 `ll /lib/modules` -> 4.14.25 有存在 -在 *home* directory run 了 `ll /boot/` -> initrd.img-4.14.15 有存在 -把 */boot/grub/grub.cfg* 裡面的 `set default="0"` 改成 `set default=` ,選擇 kernel 的畫面還是沒有出現。 -把 */boot/grub/grub.cfg* 裡面的 `set default="0"` 改成 `set default=` 之後,run `update-grub` 再 reboot,但選擇 kernel 的畫面還是沒有出現。並且 */boot/grub/grub.cfg* 的內容是修改之前一樣 `set default="0"` 。 2.為了以 Linux 4.14.25 為default做了以下操作 -把 */boot/grub/grub.cfg* 裡面的 `set default="0"` 改成 `set default="Ubuntu, with Linux 4.14.25"` 之後,run `update-grub` 再reboot。`uname -a` 的結果還是沒變。並且 */boot/grub/grub.cfg* 裡面的內容是修改之前一樣`set default="0"`。 -把 */etc/default/grub* 裡面的`GRUB_DEFAULT=0` 改成 `GRUB_DEFAULT="Ubuntu, with Linux 4.14.25"` 之後,run `update-grub` 再reboot。`uname -a`的結果還是沒變。並且 */etc/default/grub* 的內容是修改之前一樣 `set default="0"` 。 --> * A: 啟動時,virtual box icon的頁面的時, 按著 Shift key 選擇kernel的頁面出來 * Q:進入advanced options for Ubuntu 後,選擇了前幾步驟弄好的kernel,但是出現 Gave up waiting for root device. Common problems: Boot args (cat /proc/cmdline) Check rootdelay= (did the system wait long enough?) Check root= (did the system wait for the right device?) Missing modules (cat /proc/modules; ls /dev) ALERT! UUID=9a740b53-b0fc-40d2-8126-87f4b0e6f975 does not exist. Dropping to a shell! BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1.1) built-in shell (ash) Enter 'help' for a lost of built-in commands. (initramfs) 這些錯誤訊息,爬文說要把hard disk controller 從SATA換成SCSI,試了結果還是一樣... * A: 如果是按照影片做的話(假設是虛擬機環境),可以用原本內核開機,然後重做sudo make install的部分(先不用重編)。實機的話,會涉及驅動程式、bios設定,問題會比較雜。 * Q:想請問HW1講義第31/45頁下方的『重新編譯安裝再重開機』是哪一頁的哪幾項指令呢?雖然感覺並不是太複雜的問題,但仍卡關一陣子,還請幫忙提點一下,感謝~~ ![](https://i.imgur.com/EsQpPcO.jpg) * A:『重新編譯安裝再重開機』是指前面的內核編譯部分,做過的再做一次即可。 * Q:跟前面的遇到一樣的問題 Gave up waiting for root device. Common problems: Boot args (cat /proc/cmdline)... 重新install還是沒解決,請問如何是好? * A: 請提供更多詳細資訊:virtualbox版本、ubuntu版本、核心版本,另外請確定重做裝上去的內核沒有在開機選單選錯。 * kernel-compilation-in-ubuntu-reboot-msg-gave-up-waiting-for-root-device: * https://unix.stackexchange.com/questions/195426/kernel-compilation-in-ubuntu-reboot-msg-gave-up-waiting-for-root-device * https://itsfoss.com/update-grub/ * Q: 安裝完 Virtual box 之後,按照教學影片設定好新的 virtual machine,在 start 之後遇到這樣的錯誤訊息 ![](https://i.imgur.com/WmFgxfW.png) 有 Google 過許多解法,包括使用 `apt install` 重新安裝、使用別的版本號、更新 `virtualbox-dkms`、`linux-header-generic` 等等,最後還是沒解決掉問題 我在猜會不會跟 `UEFI secure boot` 設定有關,但不知道怎麼做。請助教協助,感謝。 *作業系統:Ubuntu 18.04 Virtual box 版本: 6.0 Kernel 版本:5.3.0-42-generic* * A: https://hkgoldenmra.blogspot.com/2019/04/linux-uefi-secure-boot-virtualbox.html https://go-linux.blogspot.com/2019/04/virtualboxsecure-boot-enable.html > [name=TA] 感謝助教幫忙,但成功之後我發現電腦抓不到音效卡了,看影片聽音樂都聽不到聲音。 * Q:助教好 我在編譯kernel到`make install`的時候它產生了一段錯誤訊息 ![](https://i.imgur.com/lkVOhwu.jpg) 有爬文但是沒找到相關的資料 想請問有可能是哪裡出錯呢 謝謝 > [name=蔡亞辰] > It is saver using latest Ubuntu instead of Linux! > [time=Wed, Apr 1, 2020 12:24 PM] * A:建議找make.log查看更深入的出錯資訊 * Q:跟前面的遇到一樣的問題(解決了) ![](https://i.imgur.com/N87prjq.png) - 相關環境設置 ubuntu version: 16.04.4 Virtual box 版本: 6.1.4 Kernel 版本:Linux 4.14.25 - 嘗試過的: - [x] 前面文章提到的 `depmod -a` to refresh the module order in directory /lib/modules/<kernel_version> - [x] sudo update-grub - [x] "如果是按照影片做的話(假設是虛擬機環境),可以用原本內核開機,然後重做sudo make install的部分(先不用重編)。" > 成功的方法是"如果是按照影片做的話(假設是虛擬機環境),可以用原本內核開機,然後重做sudo make install的部分(先不用重編)。"這句。 >就是用原本的內核開機,然後“只”做`sudo make install` > 太誇張 真的像上面重做`sudo make install` > 感謝同學&助教 * sudo mkinitramfs -o /boot/initrd.img-4.14.25 4.14.25 關於Gave up waiting for root device,投影片內的操作改成下這條指令,明確指定版本號,原因參見: https://blog.csdn.net/Bsi_l4/article/details/49632717 (特此感謝:蕭景忠同學提供解決方案) ## HW 2 * 提問 * Q: 想請問EDF每個task的deadline是多少?謝謝 * A: deadline 是到下一次該 task 出現的時間 > [name=TA] > At the end of the period.[time=Wed, Apr 1, 2020 11:50 AM] * Q: 請問是否能給not schedulable的Sample input/ output?我看不太懂這個情況下整體的output應該要長怎樣,謝謝! * A: * input 1 // 1 run 1 // EDF 1 // display schedule 1 // 1 task 10 1 // (execution time 10, period 1), for the 1st task * output 1 // start the first run 0 0 // not schedulable, preempted 0 time > [name=TA] * Q: 想請問假如狀態為 running 的 task 超出 deadline,並且 start 下一個狀態為 ready 的 task,預期輸出為何?謝謝 * A: 視為 unschedulable 輸出格式請見上面問題 >[name=TA] * Q: 想請問在測資裡面,第二個run直接time 6的時候就沒有了,是因為題目只需要所有task在一個LCM裡面至少跑完一次嗎?題幹所謂的hybrid period就是LCM嗎?但是為什麼又說better not use the concept of LCM呢?謝謝 * A: 題目中提到的 "up to a hyperperiod", 概念類似 LCM, 因此測資的第二個 run 的 end simulated time 會輸出 6 >[name=TA] * Please refer to discussion video of Lecture 4. * Q: 請問unschedulable的是一律不會有中間`TIME [TASK ACTION]`的輸出嗎?因為上面助教給的例子,我以為會先輸出 `0 1 0` (at time 0, task 1 starts ),然後才因為deadline到了而unschedulable。另外好像有schedulability test可以判斷是否可排程,若是在一開始便因為test而判斷為unschedulable,那preempted time就只會輸出0嗎?如果我的理解有錯再請助教指正,謝謝! * A: 你的想法沒錯, 直接輸出 0 >[name=TA] * Q: 請問題目中的be careful of output "space"是什麼意思,謝謝! * A: 只是想提醒每一行的最後面沒有空格避免出錯 >[name=TA] * Q: 請問online judge有可能給更多測資嗎?因為得到wrong answer可是不知道是怎麼個錯法QQ,謝謝! * A: 測資可參考[去年課程網頁](http://rswiki.csie.org/dokuwiki/courses:104_2:homework_2), 但請注意輸入與輸出 >[name=TA] * Q: 去年測資中的the 2nd run,在execution time 10選擇執行 the 3rd task,但就我的理解此時the 2nd task和the 3rd task的deadline一樣,因此priority一樣,我看題目要求要執行id較小的task,想請問為什麼這裡是執行the 3rd task呢?謝謝! - input(擷取2nd run): ``` 1 1 3 1 3 2 5 3 15 ``` - output: ``` 2 0 1 0 1 1 1 2 0 3 2 1 1 0 4 1 1 3 0 5 3 2 2 0 6 2 2 1 0 7 1 1 2 3 8 2 1 3 3 9 3 2 1 0 10 1 1 3 3 11 3 1 2 0 13 2 1 1 0 14 1 1 15 3 ``` * A: 同學您好, 謝謝您的改正, 我們會盡快更新測資,同時也會重新檢查其餘測資,測資出錯深感抱歉 測資已更正完畢, 還請同學多加嘗試 >[name=TA] * Q: 請問批改系統的long long是64bits嗎?因為去年的測資也全過了,所以在懷疑是不是因為系統不同產生overflow的情形。 * A: [time=Wed, Apr 1, 2020 12:19 PM] * Even long long is not enough. Sould run "forever" efficiently such that longer than the data type can do. It is not in test case. * It is also time-driven using LCM to check for hyperperiod. * It might be also schedulable with utilization bigger than the RM bound. ## HW 3 * 提問