Unix Linux 程式設計實踐教程第四章習題

2021-09-25 18:20:23 字數 3098 閱讀 1657

tips: 答案僅供參考,不保證正確

4 .1

這個硬體位置一般稱作chs位址,既磁頭數(heads)、柱面數(cylinders)、 扇區數(sectors),而在系統中描述資料所在的區塊稱作lba(邏輯區塊位址),這種定址方式把硬碟看成乙個大的陣列,每乙個資料塊有乙個編號。兩個位址進行轉換時要注意:由於系統在寫入資料時是按照從柱面到柱面的方式,在上乙個柱面寫滿資料後才移動磁頭到下乙個柱面,並從柱面的第乙個磁頭的第乙個扇區開始寫入,從而使磁碟效能最優,所以,在對物理扇區進行線性編址時,也按照這種方式進行。即把第一柱面(0柱)第一磁頭(0面)的第一扇區(1扇區)編為邏輯「0」扇區,把第一柱面(0柱)第一磁頭(0面)的第二扇區(2扇區)編為邏輯 「1」 扇區,直至第一柱面(0柱)第一磁頭(0面)的第63扇區(63扇區)編為邏輯「62」扇區,然後轉到第一柱面(0柱)第二磁頭(1面)的第一扇區(1扇區),接著上面編為邏輯 「63」 扇區,0柱面所有扇區編號完畢後轉到1柱面的0磁頭1扇區,依次往下進行,直至把所有的扇區都編上號。從這個關係就可以推測出lbachs的轉換公式:這裡規定用c表示當前柱面號,h表示當前磁頭號,s表示當前扇區號,cs表示起始柱面號,hs表示起始磁頭號,ss表示起始扇區號,ps表示每磁軌扇區數,ph表示每柱面磁軌數。

c=lba div (ph﹡ps) + cs

h=(lba div ps) mod ph + hs

s=lba mod ps + ss

4.2檢視資料塊的大小,我檢視後是4096位元組:

stat -f .
檢視磁碟分割槽及資料塊資訊,這裡可以使用

df --block-size=4096
檢視每個分割槽 i-節點 資訊:

df -i
4.4

inode bitmap: inode 位圖,用二進位制的方式記錄了 inode 的使用情況,比如 inode 是否空閒等。

block bitmap: 塊點陣圖,型別 inode 位圖,用二級制記錄塊的使用情況,當查詢或建立檔案時,會掃瞄此位圖來尋找空閒 inode 號對應的塊。

bitmap中,每乙個bit表示乙個塊,為 1 表示該塊已用,為 0 表示該塊空閒可用。

4.5不會

4.6在ext2檔案系統上,結構體ext2_inode_info中定義了資料塊列表i_data[15],在ext4檔案系統中,結構體ext4_inode中定義了資料塊列表i_block[ext4_n_blocks],其中ext4_n_blocks也是15,共有12個直接塊,一級、二級、**間接快各乙個。

使用df命令可以檢視檔案系統資訊,找到系統根目錄所在磁碟,我這裡是sda7,然後通過

dumpe2fs /dev/sda7
檢視該磁碟的所有資訊,其中block size表示塊大小,我這裡是4096也就是4kb直接塊一共12個,每個塊大小4kb,所以不使用間接塊的檔案最大是48kb

乙個索引位址是4個位元組,那麼乙個間接塊可以存放1024個資料塊,在加上12個直接塊,最大可以表示4144kb的檔案

4.7目錄的鏈結數指的是目錄的硬鏈結,即目錄有多少個別名,建立目錄時,缺省會生成兩個目錄項:...。前者的 inode 號碼就是當前目錄的 inode 號碼,等同於當前目錄的"硬鏈結";後者的 inode 號碼就是當前目錄的父目錄的 inode 號碼,等同於父目錄的"硬鏈結"。所以,任何乙個目錄的"硬鏈結"總數,總是等於2加上它的子目錄總數(含隱藏目錄)。

4.8在我的 deepin 中無法進行此操作,而且如果給目錄建立硬鏈結可能造成死迴圈,比如在乙個目錄下建立乙個硬鏈結指向該目錄,那麼便利的時候就會造成死迴圈。

4.9顯示 mount point /home2 does not exist

可以裝載,裝載後裝載點下的子目錄和檔案消失,umount 後子目錄和檔案又恢復了。

4.10

為了防止偶然發生的誤刪事件,unix/linux 關於 rmdir 加了兩條規則:第一條規則是不能移除非空的目錄;第二條規則是不能刪除工作目錄和根目錄之間的任何目錄,工作目錄就是你當前所在的目錄,刪除工作目錄相當於你坐在一顆樹上,卻要把坐著的樹枝砍掉一樣,這顯然是不合理的。

4.11

硬碟通常由重疊的一組碟片構成,每個盤面都被劃分為數目相等的磁軌,並從外緣的「0」開始編號,具有相同編號的磁軌形成乙個圓柱,稱之為磁碟的柱面。磁碟的柱面數與乙個盤面上的磁軌數是相等的。由於每個盤面都有自己的磁頭,因此,盤面數等於總的磁頭數。

4.12

mke2fs格式化工具的預設策略是乙個塊組有多少個 8kb 就分配多少個 inode。但是資料塊的大小可能不是 8kb,比如是 1kb,那麼 inode 的數量就小於資料塊。如果平均每個檔案的大小是8kb,當分割槽存滿的時候inode表會得到比較充分的利用,資料塊也不浪費。如果這個分割槽存的都是很大的檔案(比如電影),則資料塊用完的時候inode 會有一些浪費,如果這個分割槽存的都是很小的檔案(比如源**),則有可能資料塊還沒用完 inode 就已經用完了,資料塊可能有很大的浪費。

4.13

假設假設乙個路徑是 /opt/file,則查詢的順序是:

讀出 inode 表中第2項,也就是根目錄的 inode,從中找出根目錄資料塊的位置

從根目錄的資料塊中找出檔名為 opt 的記錄,從記錄中讀出它的 inode 號

讀出 opt 目錄的 inode,從中找出它的資料塊的位置

從 opt 目錄的資料塊中找出檔名為 file 的記錄,從記錄中讀出它的 inode號

讀出 file 檔案的 inode

填充 stat 結構體並返回

Unix Linux程式設計實踐教程 pwd

created by eddie on 2020 3 16.include include include include include include include ino t get inode char fname return info.st ino void inum to name ...

unix linux程式設計實踐教程讀後感(2)

從最開始的who命令,然後cp,ls,pwd等等,都是根據這是什麼?能幹什麼?怎麼實現的?由這三個問題來驅動程式設計學習。這三個命令其實也是大同小異,拋開具體的業務邏輯功能,其本質就是對相關的檔案 或者是目錄 進行讀取操作,然後獲取其中的相關屬性,在進行相關的邏輯操作。大致的過程還是梳理下。首先是開...

《Unix Linux程式設計實踐教學》筆記

ctrl alt t 開啟命令列終端 chapter 1概述 目錄操作 1 ls 列出目錄內容 eg ls 列出當前目錄內容 ls etc 列出 etc目錄裡面所包含的檔案和子目錄 2 cd 改變當前目錄 剛登入系統時,當前目錄是自己的主目錄 eg cd bin 轉到 bin目錄下 cd.轉到上一層...