112 港務人員升資考試員級晉高員級 技術類(選試港埠工程)-臺灣港務公司 電子計算機概論 考古題詳解
第 一、 題20 分
在物件導向程式設計中,何謂多重繼承(Multiple Inheritance)?請舉出一種程式語言可使用多重繼承。使用多重繼承時,若設計不當可能衍生何種問題?請舉例說明。
登入後即可作答並保存紀錄。
核心觀念
多重繼承(Multiple Inheritance)是指一個子類別同時繼承兩個以上父類別的屬性與方法。子類別因此能重用多個父類別所提供的功能,並可依程式語言的規則覆寫或擴充繼承來的行為。
例如,程式語言 C++ 支援類別的多重繼承:
class Printer {
public:
void print {}
};
class Scanner {
public:
void scan {}
};
class AllInOne : public Printer, public Scanner {
};
AllInOne 同時繼承 Printer 與 Scanner,因此可使用 print 和 scan。
解題方法
題目分成三個部分作答:
- 說明多重繼承的定義:一個子類別繼承多個父類別。
- 舉出支援多重繼承的語言:例如 C++。
- 說明設計不當時的問題,並用具體例子呈現。
常見問題是菱形繼承(Diamond Problem)。假設 Person 是基底類別,Student 和 Employee 都繼承 Person,而 TeachingAssistant 同時繼承 Student 與 Employee:
第 二、 題20 分
何謂虛擬私人網路(Virtual Private Network, VPN)?其用途為何?試述實現虛擬私人網路所需的技術,並說明使用虛擬私人網路時,可能產生的缺點。
登入後即可作答並保存紀錄。
核心觀念
虛擬私人網路(Virtual Private Network, VPN)是利用公用網路(例如網際網路)建立邏輯上的私人通訊網路,讓不同地點的使用者或網路能安全地交換資料。它不必實際租用專線,而是以隧道技術在公用網路上傳送資料,因此兼具私人網路的連線方式與公用網路的傳輸基礎。
VPN 主要考驗三個面向:安全傳輸、遠端或跨地連線,以及其代價與限制。VPN 的安全性仰賴加密、身分驗證及資料完整性保護;「建立隧道」本身不等於資料必然安全。
解題方法
依題目依序回答「定義與用途」、「實現技術」、「使用缺點」,即可完整作答。
一、VPN 的用途
- 遠端存取:員工在外地透過網際網路連回公司內部網路,存取授權的檔案、系統或服務。
- 站點互連:利用 VPN 連接不同辦公室或分公司,使各地網路能透過公用網路安全通訊。
- 保護傳輸中的資料:在不可信任的網路上加密資料,降低遭竊聽或竄改的風險。
- 隱藏對外連線來源:流量經 VPN 閘道轉送後,外部服務通常會看到閘道的 IP 位址;但這不代表使用者因此完全匿名。
二、實現 VPN 所需技術
- 隧道技術:將原始封包封裝在另一種協定封包中,經公用網路傳送,抵達另一端後再解封裝。常見技術或協定包括 IPsec、TLS/SSL VPN、WireGuard,以及歷史上使用的 PPTP、L2TP。
- 加密技術:將資料轉為未持有金鑰者難以理解的形式,保護傳輸機密性。實際採用的演算法與設定會影響安全強度。
第 三、 題20 分
有一整數陣列 ,儲存資料為 。使用堆積排序法(Heap Sort)將此陣列由小到大排序,請詳細列出排序步驟。
登入後即可作答並保存紀錄。
核心觀念
堆積排序(Heap Sort)先將資料建立成最大堆積,再反覆把堆頂最大值移到未排序區間的末端,縮小堆積範圍並重新調整最大堆積。完成後,陣列即由小到大排列。
最大堆積是一棵完全二元樹,且每個父節點都大於或等於其子節點。因此,堆頂是目前未排序資料中的最大值。本題以陣列索引從 起算;索引為 的節點,其左、右子節點索引分別為 、。
解題方法與步驟
原始陣列為:
一、建立最大堆積
由最後一個非葉節點開始,自底向上調整。,最後一個非葉節點的索引為 。
- 調整索引 :節點 的子節點為 、,最大者為 ,交換:
- 調整索引 :節點 的子節點為 、,最大者為 ,交換:
- 調整索引 :節點 的子節點為 、,先與較大的 交換:
繼續調整索引 :節點 的子節點為 、,與較大的 交換:
建立完成的最大堆積為:
二、反覆取出堆頂並重新調整
第 四、 題20 分
當電腦系統發生死結(Deadlock)時,有何方法可以讓系統回復到正常狀態?詳細說明解決方案,並說明執行的困難點與可能衍生的問題。
登入後即可作答並保存紀錄。
核心觀念
死結(Deadlock)是指一組行程或執行緒彼此等待對方持有的資源,因而全部停滯,無法繼續執行。系統發生死結後,若要回復正常,須採取**死結復原(deadlock recovery)**措施,解除造成循環等待的行程與資源關係。
本題重點在作業系統的死結處理方式,特別是死結發生後如何復原,以及復原時的執行困難與副作用。死結的四個必要條件為互斥、占有並等待、不可搶先、循環等待;復原的目的,是破壞其中至少一項條件,使等待循環解除。
解題方法:死結發生後的復原方案
死結發生後,常見的處理方式有終止行程與資源搶奪兩類。系統可依死結範圍、資源種類及復原成本選擇方案。
一、終止行程(Process Termination)
直接終止死結中的行程,釋放其持有的資源,使其他行程得以繼續執行。常用作法如下:
-
一次終止所有死結行程 將死結中的所有行程全部終止,快速釋放資源,通常能立即解除死結。缺點是許多已完成的工作也會一併損失,重做成本高。
-
逐一終止行程,直到死結解除 每終止一個行程,就重新檢查系統是否仍有死結;若仍存在,再挑選下一個行程終止。此法減少不必要的行程損失,但需多次偵測與判斷,處理時間較長。
逐一選擇行程時,可考量行程優先權、已執行時間與剩餘時間、已持有及尚需資源數量、終止後重啟成本,以及該行程是否為互動或批次工作等因素。
二、資源搶奪(Resource Preemption)
從部分行程手中搶回資源,再將資源分配給其他行程,以打破等待循環。實作時要處理下列問題:
- 選擇犧牲者:選擇被搶回資源後總成本較低的行程,並兼顧其重要性與復原成本。
第 五、 題20 分
詳細說明下列 Java 語言程式的執行過程,並寫出程式的輸出。
public class Test { static int x = 0;
public static int foo (int n)
{
x++;
if (x == 26) System.out.println(n);
if ((n == 0) || (n == 1)) return 1;
if (n < 0) return foo(n + 2);
else return (foo(n - 2) + foo(n - 3));
}
public static void main (String args[])
{
System.out.println(foo(10));
System.out.println(x);
}
}
登入後即可作答並保存紀錄。
核心觀念
本題考查 Java 的遞迴呼叫、短路運算、靜態變數,以及運算式中的呼叫次序。
static int x = 0;是類別變數,所有foo呼叫共用同一個x。每次進入foo,第一個動作都是執行x++。||是短路 OR:左側條件成立時,不會再判斷右側;但本題的兩側條件都沒有副作用。foo(n - 2) + foo(n - 3)會先求左運算元,再求右運算元。因此兩個遞迴分支依序執行,且x會累計所有呼叫次數。- 遇到
n == 0或n == 1時回傳1;若n < 0,則以n + 2繼續遞迴,直到進入基本情況。
解題方法
先計算 foo(10) 的完整遞迴呼叫次數。以 表示執行 foo(n) 會呼叫 foo 的總次數,包含該次本身:
此遞迴會走到的參數及其呼叫次數如下:
| 呼叫次數 | 回傳值 | |
|---|---|---|