整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          【操作系統】 簡易文件系統

          【操作系統】 簡易文件系統

          這個是本學期最后一次的操作系統實驗,個人覺得做得還行,故寫篇博客分享一下。

          實驗要求

          創建一個100M的文件或者創建一個100M的共享內存

          嘗試自行設計一個C語言小程序,使用步驟1分配的100M空間(共享內存或mmap),然后假設這100M空間為一個空白磁盤,設計一個簡單的文件系統管理這個空白磁盤,給出文件和目錄管理的基本數據結構,并畫出文件系統基本結構圖,以及基本操作接口。(30分)

          在步驟1的基礎上實現部分文件操作接口操作,創建目錄mkdir,刪除目錄rmdir,修改名稱,創建文件open,修改文件,刪除文件rm,查看文件系統目錄結構ls。(40分)注明:全部在內存中實現

          參考進程同步的相關章節,通過信號量機制實現多個終端對上述文件系統的互斥訪問,系統中的一個文件允許多個進程讀,不允許寫操作;或者只允許一個寫操作,不允許讀。(30分)

          (1)磁盤基本數據結構

          首先申請一段100M的內存空間,將這段內存空間視為我們的磁盤空間,來進行本次實驗的磁盤的文件系統管理。這里我一開始是使用malloc操作進行,但在第三部分中需要用到信號量機制,需要進行進程間通信,所以在最后還是使用了共享內存的方式進行。

          使用共享內存的方式參考先前的綜合實驗1進行。這里申請了100MB空間之后,將得到共享內存ID:shmid,使用shmat將共享內存映射到進程空間中,則使用即可訪問共享內存。

          簡單管理系統_簡單管理系統源代碼_c 簡單管理系統

          簡單管理系統源代碼_c 簡單管理系統_簡單管理系統

          關于文件系統的結構劃分,這里為了盡可能模擬Linux的ext2文件系統,于是采取以下劃分,與ext2不同的是,由于一個4KB的數據塊,最多表示410248*(4*1024) = 128MB的數據空間,而128MB在Linux系統中是遠遠不夠用的,于是在ext2文件系統中,采用了多個塊組的形式。而本次實驗中,由于我們申請的內存空間僅有100M,于是使用一個塊組的形式是足夠使用的,于是為了簡單起見,本次實驗將整個磁盤空間視為一個塊組,同時也不需要使用引導塊來模擬linux的啟動引導功能。

          簡單管理系統源代碼_簡單管理系統_c 簡單管理系統

          下圖展示的是linux中的Ext2文件系統,從下圖中可以看出與本次實驗的不同之處,在ext2文件系統中,一個塊組中含有多個塊組描述符,來存放文件系統中各個塊組的狀態,但是本次實驗并不需要,所以本次實驗省略塊組描述符項。(下圖源自小林coding公眾號)

          c 簡單管理系統_簡單管理系統源代碼_簡單管理系統

          在文件系統中,超級塊存儲的是塊組中的全局信息,例如空閑inode的個數等,不過這些信息存入在超級塊中在本次實驗過程中沒有體現出其應有的作用,因為我們只用了一個超級塊,而超級塊在第三部分進程間通信中就體現了其重要之處,我們可以將一些塊組全局的信息存儲在超級塊中,由于超級塊是出于我們的“磁盤”的一部分,是共享內存的一部分,于是不同的進程之間可以通過訪問超級塊來獲取塊組的一些全局信息,這些信息是重要的。在本次實驗中,本來應該將一些其他的靜態信息存儲入超級塊中才能盡可能模擬ext2,但是由于時間關系,這里只存入了必要信息。下圖是本次實驗中超級塊的聲明。

          簡單管理系統源代碼_c 簡單管理系統_簡單管理系統

          注意到這里我使用了一個union聯合這個數據結構,使用這個數據結構的原因是因為在ext2文件系統中,由于磁盤的讀取是按照一個一個數據塊來讀取的,超級塊是需要占據一個數據塊的,為了使超級塊所占的內存滿足一個數據塊的大小,于是將超級塊的本身內存作為一個結構體和一個數據塊數據結構聯合起來,使得超級塊真實存儲在一個數據塊中。

          物理數據塊設置為一個char結構體,為4096,也就是占4KB。

          關于數據區和位圖,其結構如下圖所示,為了簡單起見和時間關系,這里采取一個數據塊存儲一個文件的方式(有時間是可以改成混合索引的方式),下圖中的數據區中,每一個單位為一個數據塊,然后位圖單獨占據一個數據塊。

          簡單管理系統源代碼_c 簡單管理系統_簡單管理系統

          簡單管理系統_c 簡單管理系統_簡單管理系統源代碼

          我們使用一個char數組來實現一個bitmap,由于一個char為一個字節8個位,所以一個char是可以表示8個數據塊的,于是我們bitmap的行就只要/8,即可用個位來表示所有的數據塊。

          簡單管理系統源代碼_c 簡單管理系統_簡單管理系統

          由于在UNIX中萬物皆文件,所有文件和目錄的存儲方式應該是比較相似的,目錄和文件之間的關系如下圖所示,他們的區別在于目錄中的文件區存儲的是目錄項,而文件中的文件區存儲的是數據。目錄中的一個目錄項位一個文件的FCB,一個FCB就是一個目錄項。

          簡單管理系統_c 簡單管理系統_簡單管理系統源代碼

          而目錄和文件的數據結構的定義如下圖所示。文件File是由目錄區中的FCB和文件區的數據部分組合起來的,然后目錄的DirFile是由目錄區中的FCB和文件區中的多個FCB項組合而成的。這個定義和上圖的邏輯結構是相同的。文件和目錄的區別主要在于區每一個記錄的類型不一樣。

          簡單管理系統源代碼_c 簡單管理系統_簡單管理系統

          而FCB中按照ext2的定義是由一個文件名和索引結點編號組成。存放的是文件的控制信息,索引結點編號指代的是inode區中的inode編號,如下圖所示。一個索引指針指向了inode區中的一個inode項,然后inode項中含有數據區的編號,通過這個編號索引到文件所在的位置。

          簡單管理系統_c 簡單管理系統_簡單管理系統源代碼

          在inode中存放的是關于文件的一些控制信息,這里我在inode項中定義了四項,分別為文件類型、父結點的inode編號,文件的大小以及數據塊的編號。在ext2文件系統中,數據塊號這一項是由含15個指針的數組組成的,其中12個為直接索引項,1個一級索引,1個二級索引,1個三級索引,通過這個數組實現的混合索引,但是這里由于時間關系和簡單起見,簡單的定義一個數據塊號中只放有一個文件,也就是我們文件的大小不大于4KB。

          c 簡單管理系統_簡單管理系統源代碼_簡單管理系統


          主站蜘蛛池模板: 蜜桃视频一区二区三区在线观看 | 中文字幕精品一区影音先锋| 国产成人欧美一区二区三区 | 精品久久国产一区二区三区香蕉| 久久精品无码一区二区三区| 97人妻无码一区二区精品免费| 国产欧美色一区二区三区| 国产麻豆媒一区一区二区三区| 久久国产精品免费一区| 精品一区二区三区免费毛片爱 | 人成精品视频三区二区一区| 国产精品无码一区二区三区电影| 人妖在线精品一区二区三区| 日本一区二区三区在线网 | 国产在线精品一区二区中文| 亚洲一区二区三区国产精品无码| 中文字幕乱码一区久久麻豆樱花| 无码人妻AⅤ一区二区三区水密桃| 国语精品一区二区三区| 人妻夜夜爽天天爽一区| 人妻少妇一区二区三区| 无码人妻精品一区二区蜜桃 | 国产99久久精品一区二区| 一区二区三区免费在线视频| 中文字幕精品一区二区日本| 视频一区二区中文字幕| 国产精品一区二区久久| 成人免费一区二区三区| 性色AV一区二区三区无码| 无码人妻精品一区二区三区东京热| 国产精品综合一区二区| 亚洲一区二区三区高清视频| 精品视频在线观看你懂的一区 | 亚洲一区在线视频观看| 久久久久人妻一区精品果冻| 亚洲综合激情五月色一区| 国产精品丝袜一区二区三区| 国产一区二区三区不卡在线看 | 相泽南亚洲一区二区在线播放 | 97人妻无码一区二区精品免费| 亚洲乱码一区二区三区在线观看|