110 年 國立中山大學資訊工程學系碩士班甲組《作業系統與資料結構》

📄 試題原卷 免費註冊後即可對照原始考卷 PDF免費註冊

第 1 題10 分

What would be the output of the following C program? (Note that the line numbers are for reference only.)

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. int main()
  6. {
  7. int fd[2];
    
  8. pipe(fd);
    
  9. pid_t pid = fork();
    
  10. if (pid > 0) {
  11.    close(fd[1]);
    
  12.    close(0);
    
  13.    dup(fd[0]);
    
  14.    close(fd[0]);
    
  15.    int status;
    
  16.    waitpid(-1, &status, 0);
    
  17.    char buf[128];
    
  18.    int n = scanf("%s", buf);
    
  19.    printf("%d:%s\n", n, buf);
    
  20. }
  21. else if (pid == 0) {
  22.    close(fd[0]);
    
  23.    close(1);
    
  24.    dup(fd[1]);
    
  25.    close(fd[1]);
    
  26.    execl("/bin/echo", "echo", "hello", "world!", (void*) 0);
    
  27. }
  28. else {
  29.    return 1;
    
  30. }
  31. return 0;
  32. }

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考察 pipe、fork、檔案描述符重導向、waitpid,以及 scanf("%s", ...) 的讀取規則。

pipe(fd) 建立單向管線:fd[0] 是讀取端,fd[1] 是寫入端。fork() 後,父子程序各自持有這兩個描述符的副本。dup(fd) 會把描述符複製到目前可用編號最小的描述符。

解題方法

先追蹤父子程序各自的標準輸入與標準輸出,再沿著資料流判斷輸出內容。假設 pipe、fork、dup、execl 等呼叫都成功,且原本的標準輸入、標準輸出均有效。

子程序執行:

  1. 關閉管線讀取端 fd[0]。
  2. 關閉標準輸出 1。
  3. dup(fd[1]) 將管線寫入端複製到描述符 1,因此子程序的標準輸出改接到管線。
  4. execl 執行 /bin/echo,寫入 hello world!\n。文字進入管線,不會直接顯示在終端機。

父程序執行:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 5 題共用同一段題幹

Suppose that a disk drive has 1001 cylinders, numbered from 0 to 1000. The drive is currently serving a request at cylinder 175, and the previous request was at cylinder 125. The queue of pending requests, in FIFO order, is:

50, 500, 225, 825, 350, 550, 400, 600, 100.

Starting from the current head position, what is the total distance (in cylinders) that the disk arm moves to satisfy all the pending requests for each of the following disk scheduling algorithms?

第 2-(a) 題2 分

FCFS

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

FCFS(先到先服務)依照請求進入佇列的先後順序處理,不重新排序。磁臂移動距離是每次服務前後磁柱編號差的絕對值;總移動距離為各段距離的總和。

解題方法

目前磁頭位於第 175175 號磁柱,依 FIFO 順序處理請求:

175→50→500→225→825→350→550→400→600→100175 \rightarrow 50 \rightarrow 500 \rightarrow 225 \rightarrow 825 \rightarrow 350 \rightarrow 550 \rightarrow 400 \rightarrow 600 \rightarrow 100

逐段計算移動距離:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(b) 題2 分

LOOK

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

LOOK 排程會依磁頭目前的移動方向,先服務該方向上的請求;到達該方向最遠的待處理請求後,再反向服務另一側的請求。與 SCAN 不同,LOOK 不會為了到達磁碟邊界而多移動一段距離。

目前磁頭位於第 175175 柱面,前一次位於第 125125 柱面,因此磁頭正朝柱面編號增加的方向移動。

解題方法

先將請求依磁頭方向排序。從 175175 往上依序服務:

225→350→400→500→550→600→825225 \rightarrow 350 \rightarrow 400 \rightarrow 500 \rightarrow 550 \rightarrow 600 \rightarrow 825

825825 是這個方向上最遠的待處理請求,因此磁頭在此反向,再依序服務 100100、5050。

完整服務順序為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(c) 題2 分

C-LOOK

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

C-LOOK 是 LOOK 的循環版本:磁頭依目前方向服務請求,直到該方向最遠的待處理請求;接著直接移到另一端尚未服務的請求,再沿原方向繼續服務。它不會為了到達磁碟邊界而移動。

題目中磁頭由 125125 移到目前的 175175,方向為往較大的柱面前進,因此先由小到大服務。

解題方法

將待處理請求依柱面位置排序:

50, 100, 225, 350, 400, 500, 550, 600, 82550,\ 100,\ 225,\ 350,\ 400,\ 500,\ 550,\ 600,\ 825

先服務目前位置 175175 以上的請求,再從最高請求 825825 循環移至最低請求 5050,最後繼續往上服務 100100。

磁頭移動距離為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(d) 題2 分

SCAN

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

SCAN(電梯演算法)讓磁頭沿目前方向依序服務沿途請求,直到磁碟端點,再反向服務另一側的請求。磁頭目前位於 175,前一次請求位於 125,因此磁頭正朝較大的柱面號碼移動;SCAN 會先朝 1000 前進,再反向移動。

總移動距離只計算磁頭實際經過的柱面距離,不是請求數量。

解題方法

先將請求依柱面號碼排序:

50, 100, 225, 350, 400, 500, 550, 600, 82550,\ 100,\ 225,\ 350,\ 400,\ 500,\ 550,\ 600,\ 825

磁頭由 175 向上移動,依序服務 225、350、400、500、550、600、825,接著繼續到柱面端點 1000。之後反向移動,依序服務 100、50。

路徑可表示為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 2-(e) 題2 分

C-SCAN

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

循環掃描(C-SCAN)讓磁頭固定朝同一方向服務請求。磁頭由目前位置往較大柱面號碼移動,途中依序服務請求;到達磁碟末端後,直接回到另一端,再繼續朝原方向服務剩餘請求。

前一次請求在 125,目前在 175,因此磁頭正朝柱面號碼增加的方向移動。柱面範圍為 0 至 1000。

解題方法

先將待處理請求依目前磁頭方向分成兩組:

  • 大於 175:225、350、400、500、550、600、825
  • 小於 175:50、100
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 3 題10 分

A computer whose processes have 2048 pages in their address spaces keeps its page tables in memory. The overhead required for reading a word from the page table is 500 nsec. To reduce this overhead, the computer has a TLB, which holds 32 (page, frame) pairs and can do a lookup in 50 nsec. What hit rate is needed to reduce the mean overhead to 150 nsec or less, assuming that the TLB is looked up first before the page table is read?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考 快取命中率與平均存取時間。TLB(快取轉譯旁查緩衝區)先查詢:

  • 命中:只花 5050 nsec 查 TLB。
  • 未命中:先花 5050 nsec 查 TLB,再花 500500 nsec 讀取記憶體中的頁表,總開銷為 550550 nsec。

平均開銷依命中與未命中的機率加權計算。

解題方法

令 TLB 命中率為 hh,則未命中率為 1−h1-h。平均開銷為:

50h+550(1−h)50h + 550(1-h)

題目要求平均開銷不超過 150150 nsec,因此:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

Given a UNIX i-node with sixteen direct blocks and four levels of indirect blocks (i.e., a single, a double, a triple, and a quadruple) and assuming that the sizes of a pointer and a block are, respectively, 8 bytes and 8 Kbytes, answer the following questions.

第 4-(a) 題5 分

What would be the size of the smallest file allowed in bytes?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

題目問的是檔案的邏輯大小,也就是檔案內容的位元組數。i-node 的直接與間接區塊指標決定檔案可使用的區塊範圍,區塊大小則影響磁碟空間的配置;這些資訊不會讓檔案必須至少包含一個資料位元組。

在 UNIX 中,檔案可以是空檔案,i-node 儲存檔案的中繼資料,不必配置資料區塊。因此,空檔案的邏輯大小可以是 00 位元組。

解題方法

直接判斷檔案內容所占的位元組數。若檔案沒有任何內容,其大小為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 4-(b) 題5 分

What would be the size of the largest file allowed in bytes?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

i-node 可用直接區塊與多層間接區塊指向檔案資料。間接區塊本身用來存放指標,不算入檔案資料大小。

每個間接區塊可容納的指標數為:

區塊大小指標大小=8×10248=1024\frac{\text{區塊大小}}{\text{指標大小}} = \frac{8 \times 1024}{8} = 1024

解題方法

直接區塊可指向 1616 個資料區塊;單、雙、三、四層間接區塊分別可指向 10241024、102421024^2、102431024^3、102441024^4 個資料區塊。因此,最多可容納的資料區塊數為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

Consider the two-dimensional array aa:

double a[][] = new double[400][400];

Each double occupies 8 bytes, and a[0][0]a[0][0] is at location 400 in a paged system with pages of size 400 bytes. A small process is in page 0 (locations 0 to 399) for manipulating the matrix; thus, every instruction fetch will be from page 0. For three page frames, how many page faults are generated by the following array initialization loops, using LRU replacement and assuming:

(1) Page frame 0 has the process in it.
(2) The other two are initially empty.
(3) The array is stored in memory row-major.

第 5-(a) 題5 分

for (int j = 0; j < 400; j++)
for (int i = 0; i < 400; i++)
a[i][j] = 0;

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查分頁系統的位址換算、矩陣的 row-major 儲存,以及 LRU 頁面置換。

頁面大小為 400400 bytes,因此位址 xx 所在頁號為:

⌊x400⌋\left\lfloor \frac{x}{400} \right\rfloor

每個 double 佔 88 bytes,一列有 400400 個元素,所以每列佔:

400×8=3200 bytes=8 pages400 \times 8 = 3200\text{ bytes} = 8\text{ pages}

指令都在第 00 頁,且該頁已放在 frame 0。總共只有兩個 frame 可供陣列資料頁使用。

解題方法

陣列採 row-major 儲存,元素 a[i][j]a[i][j] 的位址是:

400+(400i+j)×8400 + (400i+j)\times 8

因此頁號為:

⌊400+(400i+j)×8400⌋=1+8i+⌊j50⌋\left\lfloor\frac{400+(400i+j)\times 8}{400}\right\rfloor = 1+8i+\left\lfloor\frac{j}{50}\right\rfloor

固定一個欄索引 jj,令 k=⌊j/50⌋k=\lfloor j/50\rfloor。內層迴圈依序存取 i=0,1,…,399i=0,1,\ldots,399,對應頁號為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 5-(b) 題5 分

for (int i = 0; i < 400; i++)
for (int j = 0; j < 400; j++)
a[i][j] = 0;

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

分頁系統以「頁」為單位載入資料。當程式存取的頁不在記憶體中時,會發生一次 page fault。題目給定 3 個頁框,其中 1 個固定放置程式指令所在的第 0 頁,因此只有 2 個頁框可供陣列資料使用。

陣列採 row-major 儲存,元素依序排列。每個元素占 8 bytes,每頁大小為 400 bytes,因此每頁可容納:

4008=50\frac{400}{8}=50

個 double 元素。

解題方法

題目中的雙層迴圈依序寫入 a[0][0]、a[0][1],直到 a[399][399],也就是依照 row-major 順序連續存取所有元素。

陣列共有:

400×400=160,000400 \times 400=160{,}000

個元素。每頁容納 50 個元素,因此陣列占用的頁數為:

160,00050=3,200\frac{160{,}000}{50}=3{,}200
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊
📄 以下 2 題共用同一段題幹

What are printed by each of the following program segments?

第 6-(a) 題5 分

int a = 48;
printf("%d \n", (a & (-a)) >> 2);

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考的是位元運算中的「取出最低位的 11」。對正整數 aa,在二補數表示法下:

a&(−a)a \mathbin{\&} (-a)

會保留 aa 最右邊的 11,並將其他位元清為 00。接著右移 2 位,相當於將結果除以 22=42^2=4。

解題方法

將 4848 轉成二進位:

48=00110000248 = 00110000_2

其負數 −48-48 的二補數表示,低 8 位為:

−48=110100002-48 = 11010000_2

因此:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 6-(b) 題5 分

int a = 68, b = 34, c = 25;
printf("%d %d \n", a ^ a ^ a ^ b ^ a, (a ^ b ^ c ^ b ^ a ^ c ^ a) + 17); // ^: XOR

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

位元 XOR(互斥或)具有交換律與結合律,因此可以調整運算順序。常用性質為:

x⊕x=0,x⊕0=xx \oplus x = 0,\qquad x \oplus 0 = x

所以同一個值出現偶數次會互相抵消;出現奇數次則保留一次。

解題方法

第一個參數中,aa 出現 4 次、bb 出現 1 次:

a⊕a⊕a⊕b⊕a=(a⊕a)⊕(a⊕a)⊕b=b=34a \oplus a \oplus a \oplus b \oplus a = (a \oplus a) \oplus (a \oplus a) \oplus b = b = 34

第二個參數中,aa 出現 3 次,bb 和 cc 各出現 2 次:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 7 題10 分

Suppose that the preorder sequence of a binary tree is ABCDEFGH, and the inorder sequence is ABDAFGHE. What is the postorder sequence of the binary tree?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

前序走訪依序為「根、左子樹、右子樹」;中序走訪依序為「左子樹、根、右子樹」。同一棵二元樹的前序與中序序列必須包含完全相同的節點,且每個節點出現次數相同。

解題方法

比較題目給的兩個序列:

  • 前序:ABCDEFGH,節點 A 至 H 各出現一次。
  • 中序:ABDAFGHE,其中 A 出現兩次,且沒有 C。
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 8 題15 分

In the hash method, suppose that a rehash function hi(x)=(5i+x) mod 13h_i(x)=(5i+x)\bmod 13 is applied sequentially when a new element is inserted into the hash table, but a hash collision occurs. In other words, h1()h_1() is applied for the first time; h2()h_2() is applied if a hash collision occurs; h3()h_3() is applied if a hash collision occurs again; and so on. What is the content of the hash table after the elements 35, 22, 9, 24, 16, 19, 3 are inserted sequentially into an empty hash table of size 13, indexed as 0 through 12?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

這題考查雜湊表的開放定址法。插入元素 xx 時,依序檢查

hi(x)=(5i+x) mod 13,i=1,2,3,…h_i(x)=(5i+x)\bmod 13,\qquad i=1,2,3,\ldots

第一次檢查使用 h1(x)h_1(x);若該位置已被占用,就使用下一個 hi(x)h_i(x),直到找到空格。每插入一個元素後,該位置便固定占用。

解題方法

依題目給定順序逐一插入,並記下每個元素檢查的位置:

插入元素依序檢查的位置放入位置
3535h1(35)=(5+35) mod 13=1h_1(35)=(5+35)\bmod 13=111
2222h1(22)=1h_1(22)=1(碰撞);h2(22)=(10+22) mod 13=6h_2(22)=(10+22)\bmod 13=666
99h1(9)=1h_1(9)=1(碰撞);h2(9)=6h_2(9)=6(碰撞);h3(9)=(15+9) mod 13=11h_3(9)=(15+9)\bmod 13=111111
2424h1(24)=(5+24) mod 13=3h_1(24)=(5+24)\bmod 13=333
1616h1(16)=(5+16) mod 13=8h_1(16)=(5+16)\bmod 13=888
1919h1(19)=11h_1(19)=11(碰撞);h2(19)=3h_2(19)=3(碰撞);h3(19)=8h_3(19)=8(碰撞);h4(19)=(20+19) mod 13=0h_4(19)=(20+19)\bmod 13=000
🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9-(a) 題5 分

Please give the definition of an AVL binary search tree.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

AVL 樹是一種自平衡二元搜尋樹。它同時符合兩項條件:

  1. 二元搜尋樹性質:對每個節點 vv,其左子樹中所有鍵值小於 vv 的鍵值,右子樹中所有鍵值大於 vv 的鍵值。
  2. 高度平衡性質:對每個節點 vv,左右子樹的高度差至多為 11:
∣h(v.left)−h(v.right)∣≤1\left|h(v.\text{left})-h(v.\text{right})\right|\leq 1

其中 h(T)h(T) 表示子樹 TT 的高度。這項限制必須對樹中的每個節點成立,不能只檢查根節點。

解題方法

題目要求定義 AVL 二元搜尋樹,因此先說明它保有二元搜尋樹的鍵值順序,再補上 AVL 特有的平衡條件。

也可定義節點 vv 的平衡因子為:

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

第 9-(b) 題10 分

Assume that the initial AVL tree is empty. Please draw the AVL tree after the numbers 8, 9, 6, 3, and 2 are inserted into the tree sequentially. Then, please draw the AVL tree after the number 5 is inserted into the AVL tree obtained above.

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

AVL 樹是每個節點左右子樹高度差至多為 11 的二元搜尋樹。定義平衡因子為:

BF(v)=h(左子樹)−h(右子樹)BF(v)=h(\text{左子樹})-h(\text{右子樹})

每個節點都必須滿足 ∣BF(v)∣≤1|BF(v)|\le 1。插入新值時,先依二元搜尋樹規則找到位置,再從插入位置往上檢查平衡因子;若有節點失衡,依插入方向進行旋轉。

以下以空樹高度為 00、葉節點高度為 11。

解題方法

依序插入 8,9,6,3,28,9,6,3,2。插入 8,9,6,38,9,6,3 後,樹仍符合 AVL 平衡條件:

    8
   / \
  6   9
 /
3

接著插入 22。依二元搜尋樹規則,22 成為 33 的左子節點:

      8
     / \
    6   9
   /
  3
 /
2

節點 66 的左子樹高度為 22、右子樹高度為 00,因此 BF(6)=2BF(6)=2,是第一個失衡節點。新節點位於 66 的左子節點 33 的左側,屬於 LL 型,對節點 66 做一次右旋:

    8
   / \
  3   9
 / \
2   6

這就是依序插入前五個數字後的 AVL 樹。

插入 5

🔒

後續完整解題步驟與【答案】

免費註冊,享三天全站完整詳解閱覽。

免費註冊

其他考古題