操作系统Nachos总结
由于大家的操作系統設計思想都不一樣,直接貼代碼也沒什么意思,就簡單記錄下自己的思路吧。
實驗一
這個實驗就是搭建環境,分析一下源碼各個文件的作用。沒什么好記錄的。
實驗二 具有優先級的線程調度
個人感覺這個實驗比較簡單。
- 修改thread文件,為線程增加成員優先級以及相應的set、get函數。按照自己的設計來就行
 - 修改scheduler文件, 使得等待隊列按照優先級將線程排序,而不是之前的直接插入。
 - 修改ThreadTest文件,按照自己的設計改測試函數
 
PS:優先級調度分搶占式和非搶占式的。按照上面來只能實現非搶占式的,至于搶占式的的實現,估計還得修改machine下面的Interrupt文件。
實驗三 信號量
實驗比較簡單,信號量的實現已經很明白了,直接拿來用就可。
prodcons++文件里面要改的地方也有英文的代碼注釋,很清晰。比如:
 
實驗四 擴展文件
實驗四和實驗五就是有關文件系統的了,難度明顯比之前的要大。
 
這個實驗主要改的就是filehdr和openfile。
filehdr文件
這個類相當于inode,記錄了文件基本信息。包括大小、占用了幾個扇區、內容分別放在哪些扇區中。
openfile文件
用于實現文件的打開、讀入等,使用一個filehdr對象。
- filehdr中就是多了擴充文件大小的函數,為了方便,還加了設置文件長度的函數。
 - openfile中要新加一個inode請求空間函數,還加了WriteBack函數,用于將hdr修會磁盤
 - openfile中要根據以上兩步的修改,重寫WriteAt函數
 
實驗五 二級索引
這個我是在實驗四的基礎上就地修改的,只需要改filehdr。這個實現方案能百度到一大堆,我就記錄下我的。
 引入了一個新的類subhdr,基本成員類似于filehdr。原來的filehdr中的數組留出一個int的大小。數組前面的仍然為一級,最后一個指向的扇區是subhdr對象的扇區。
 
 其實也可以直接最后一個指向filehdr對象,這樣就實現了多級索引,就是類似于鏈表的實現,但是估計很出很多bug,有創新意識的讀者可以試下。
這樣子確定好思路后,就可以改.cc文件了,可以說是全部重寫一遍了,除了FetchFrom、WriteBack 和FileLength,所有方法都改了,還需要根據你的設計重新定義宏。但說白了就是按照一級二級的邊界劃分改就行,就多了幾個判斷條件多了幾種可能的情況罷了。
 邏輯理清楚了,改的時候就很簡單了,但是一定要仔細,我就是忘了改一個邊界條件導致一用到二級的時候就報段錯誤,核心已轉儲,還不知道哪里錯了,這是最要命的。(就是太菜了,一個bug在眼前就是看不出來。。。)
實驗六
這兩個實驗都是關于內存管理的。
交叉編譯環境的注意事項
我在按照實驗指導書的步驟來,是獲得不了Nachos下的用戶可執行程序的,make時報錯如下:
 
 所以,我查看了../bin/arch/unknown-i386-linux/bin/這個目錄,發現兩個可執行文件都是沒有可執行權限的:
 
 這樣子Permission denied是理所當然的了,所以要先給他們可執行的權限
 命令:chmod 764 *。再次make,就OK了。
 
這個實驗考察兩個方面,一是內存中要有多個程序駐留,二是系統調用Exec的實現。這兩個要求是相輔相成。一是二的基礎,二是一實現的證明。
 先說要求一,就是重新設計分配內存方案,目錄中也有bitmap文件,就明示要用位圖來記錄,當然位圖一個就ok,要么聲明稱全局變量,要么聲明成AddrSpace的靜態屬性,我選了后者,因為前者要改別的文件,怕改亂了,再牽扯到其他實驗。
 要求二也很直白了,就是改exception.cc實現Exec的處理,就是要注意文件名的獲得和PC的推進。(我就是忽視了這個,之前一直陷入死循環找不出錯)。
實驗七
我的思想是固定分配 + 局部置換的策略。
 看TranslateEntry類中用use和dirty,而且注釋中也是寫明了通過這兩個位可以構造虛擬內存,很明顯是在提示用二次機會法。不過,用其他的犧牲頁面選擇方法(比如FIFO、LRU)也是可行的。
 (上學期,h老師說二次機會法只需要兩次循環,但我總是覺得是三次循環,沒怎么想明白,有明白的小伙伴可以在下方留言,萬分感謝)
 寫代碼的時候,要注意的倒不是操作系統方面的問題,反倒是C++的語法問題(沒辦法就是菜。。。)
總結
以上是生活随笔為你收集整理的操作系统Nachos总结的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: android 加载显示富文本——Tex
 - 下一篇: Android与服务器通信之socket