Home
Explore Uedu
Student Console
Register as Member/Login
(2) In future presentations of the research findings, in addition to the course project website and public presentations, your real name and personal information will not appear in this research report. If you are interested in the research results, we can provide you with an executive summary after the study is completed.
問卷中心
Teacher Console
Course Setup
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

0

Local AI

--

CISOSE26 本地 AI UG26
政治大學 AQI 18 29°C

AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

雲端運算

雲端運算

從 IaaS、PaaS、SaaS 到虛擬機與容器、彈性擴展與分散式系統,看懂「運算即服務」背後的取捨

為什麼期末報告的那台「伺服器」,不在你的桌子底下

學期末,一群修課同學要把作業展示成一個能讓全班即時投票的網站。半夜尖峰湧入三百人,平常空蕩蕩的時段卻沒人上線。如果他們真的去買一台主機放在宿舍,要嘛平常多數時間機器閒置、電費白繳,要嘛尖峰時刻當機、被同學罵翻。最後他們做的事很簡單:打開瀏覽器,點幾下,租了一台「線上的電腦」,跑完那一晚就關掉,只付了幾十塊台幣。

這就是雲端運算(cloud computing)最樸素的樣貌——把「運算資源」變成像水電一樣,需要時打開水龍頭、用多少算多少、不用時關掉。背後那台機器到底長什麼樣、放在哪個國家、是不是一台實體電腦,使用者其實不需要知道。這種「資源即服務」的思維,正是過去二十年資訊基礎建設最深刻的轉變。

雲端到底「雲」了什麼:三種服務模型

網路與網際網路概念示意圖

理解雲端,最好的起點是區分它替你「接管」了多少工作。傳統上,要讓一個應用程式上線,你得自己準備機房、伺服器、作業系統、執行環境、再到應用程式本身。雲端的三種經典服務模型,差別就在於這條「責任堆疊」從哪裡開始由雲端業者負責。

  • IaaS(基礎設施即服務,Infrastructure as a Service):業者提供虛擬機器、儲存空間、網路。你拿到的是一台「空的電腦」,要自己裝作業系統、設定環境、部署程式。彈性最高,但管理負擔也最重。例:AWS EC2、Google Compute Engine。
  • PaaS(平台即服務,Platform as a Service):業者連作業系統、執行環境、資料庫都幫你管好,你只要把程式碼丟上去,平台自動跑起來。你不必煩惱作業系統更新或伺服器修補。例:Heroku、Google App Engine。
  • SaaS(軟體即服務,Software as a Service):你連程式都不用寫,直接用現成的軟體。Gmail、Google Docs、Notion 都是。使用者只負責「使用」,其餘全部交給業者。

有個常見的比喻能幫助記憶:披薩的三種吃法。IaaS 像買冷凍披薩回家,烤箱、盤子、用餐空間自己準備;PaaS 像叫外送,披薩做好送到家,你只管吃,但要自己擺桌;SaaS 像直接去餐廳,連洗碗都不用。

你負責的部分 自建機房 IaaS PaaS SaaS
應用程式
執行環境/資料庫
作業系統
虛擬化/硬體
機房/電力/網路

由上往下,你扛的責任越來越少,自由度也越來越低。選哪一層,本質上是在「掌控權」與「省事」之間做取捨。

一台機器變很多台:虛擬化(virtualization)

雲端能成立的技術基石,是虛擬化。一台實體伺服器往往配備了幾十核心、上百 GB 記憶體,若整台只租給一個使用者,多數時候資源都閒著。虛擬化讓一台實體機器在邏輯上「切」成許多台互相隔離的虛擬機器(virtual machine, VM),每台 VM 都以為自己獨占一台完整的電腦,擁有自己的作業系統。

實現這件事的關鍵角色叫超管理器(hypervisor),它坐在硬體與多個 VM 之間,負責把實體 CPU、記憶體、磁碟分配給各個 VM,並確保它們彼此隔離——A 客戶的 VM 當機,不會拖垮 B 客戶的 VM。正因為一台機器能服務多位互不相識的使用者(這稱為「多租戶(multi-tenancy)」),雲端業者才能把硬體成本攤薄,再以低廉價格租給你。

比 VM 更輕巧:容器(container)

虛擬機很好用,但它有個代價:每台 VM 都要扛一整套作業系統,開機慢、佔空間。如果我只是想跑一個小小的網站程式,何必為它配一整套 Linux?

容器就是為了解決這個浪費而生。容器不虛擬化整台硬體,而是共用宿主機(host)的作業系統核心(kernel),只把應用程式與它依賴的函式庫、設定檔打包在一起。結果是:容器啟動只要幾秒甚至更快,體積小、密度高,一台機器能塞下的容器數遠多於 VM。Docker 是最知名的容器工具,而當容器一多、需要自動調度時,就交給 Kubernetes 這類「容器編排(orchestration)」系統管理。

容器最迷人的承諾是「在我電腦上跑得起來,在伺服器上也一定跑得起來」——因為環境被一起打包了,不再有「明明同一份程式碼卻在不同機器上行為不一致」的惡夢。

動手看一個例子

假設你寫了一支 Python 小程式,想讓它「無論搬到哪台機器都能一樣執行」。用容器,你只要寫一份 Dockerfile 描述「環境長什麼樣」:

# 從一個已備好 Python 的基礎映像開始
FROM python:3.12-slim

# 設定工作目錄
WORKDIR /app

# 把依賴清單複製進去並安裝
COPY requirements.txt .
RUN pip install -r requirements.txt

# 把程式碼複製進去
COPY app.py .

# 容器啟動時要執行的指令
CMD ["python", "app.py"]

接著兩行指令就能把它「封裝成一個可攜帶的執行包」並跑起來:

docker build -t my-app .    # 依 Dockerfile 建出映像(image)
docker run my-app           # 由映像啟動一個容器來執行

這份映像可以推到任何雲端、任何同事的電腦,跑出來的環境一模一樣。對比之下,若用傳統 VM,你得開機一整台作業系統、手動裝 Python、裝套件、複製檔案——容器把這一切壓縮成一份可重現的「食譜」。

為什麼雲端不會被尖峰壓垮:彈性擴展(elasticity)

回到開頭那個半夜湧入三百人的網站。雲端的殺手級能力,是彈性擴展:系統能依負載自動增減資源。當流量上升,自動多開幾台機器分攤;流量退去,自動關掉、停止計費。

擴展有兩種方向:

  • 垂直擴展(scale up):把單台機器升級得更強(更多 CPU、更多記憶體)。簡單,但有物理上限,且升級時往往要重啟。
  • 水平擴展(scale out):多開幾台同樣的機器,用負載平衡器(load balancer)把請求分散過去。理論上可以一直加下去,是雲端時代的主流做法。

水平擴展之所以強大,正是因為它把問題從「一台超級電腦」轉成「許多台普通電腦合作」——這就把我們帶進了分散式系統的領域。

分散式系統初探:合作的代價

當你的服務跑在許多台機器上,新的麻煩就來了:這些機器之間要透過網路溝通,而網路會延遲、會塞車、甚至會斷線。一台機器以為的「現在」,跟另一台機器以為的「現在」,資料可能對不上。分散式系統(distributed system)研究的,正是「如何讓一群可能各自故障的機器,協同表現得像一個可靠的整體」。

舉個直覺的例子:你在台灣的伺服器更新了庫存數量,美國的伺服器要過一小段時間才會收到這個更新。在這個空窗期,如果有人去問美國伺服器,它看到的會是「舊的」庫存。要嘛你讓它先等一等、把資料同步好再回答(但使用者就得等);要嘛你讓它直接回答舊資料(但可能不一致)。這個兩難,被精煉成了分散式系統最著名的一條定理。

重點回顧

  • 三種服務模型:IaaS 給你空機器、PaaS 給你執行平台、SaaS 給你現成軟體;越往上,業者接手越多、你越省事但掌控越少。
  • 虛擬化讓一台實體機切成多台隔離的虛擬機,是多租戶與成本攤薄的基礎;容器則更輕巧,共用作業系統核心、啟動快、可攜帶。
  • 彈性擴展讓資源隨負載自動增減,水平擴展(多開機器)是雲端主流,按用量計費。
  • 多機器合作就進入分散式系統,網路的不可靠帶來資料一致性的根本難題。
  • 雲端的優點是省去前期建置、彈性、全球觸及;缺點是長期成本可能更高、受制於供應商(vendor lock-in)、隱私與資料主權需謹慎評估。

深入探討(研究所視角)

虛擬機 vs 容器:隔離的層次差異

VM 與容器的根本分野,在於它們「在哪一層做隔離」。VM 由 hypervisor 在硬體層之上虛擬出完整的虛擬硬體,每台 VM 跑自己的客體作業系統核心(guest kernel),彼此之間幾乎沒有共用面,隔離邊界堅實。代價是每台 VM 都背負一整套作業系統的開機時間與記憶體足跡。

容器則建立在單一宿主核心之上,靠 Linux 核心的 namespaces(隔離視角:行程、網路、檔案系統掛載點等,讓容器「看不見」彼此)與 cgroups(限制與計量資源:CPU、記憶體、I/O)這兩組機制達成隔離。因為共用核心,容器省去了重複的作業系統開銷,啟動以秒甚至毫秒計,密度遠高於 VM。但代價是隔離邊界較薄——容器逃逸(container escape)漏洞一旦得手,攻擊面直達宿主核心,而 VM 之間的攻擊則還需穿透 hypervisor。因此安全敏感的多租戶環境,常採折衷方案如 Kata Containers、gVisor、Firecracker,把「容器的輕量」與「VM 級的隔離」結合起來。從研究角度,這體現了系統設計永恆的權衡:隔離強度 ⟷ 資源效率 ⟷ 啟動延遲,三者難以同時最大化。

CAP 定理的直覺

CAP 定理是分散式系統的基石之一。它斷言:一個分散式資料系統,在以下三個性質中,當網路發生分區(partition)時,最多只能同時保證其中兩個——

  • 一致性(Consistency, C):所有節點在同一時刻看到的資料一致;任何讀取都拿到最新一次寫入的結果。
  • 可用性(Availability, A):每個請求都能在有限時間內得到(非錯誤的)回應。
  • 分區容忍(Partition tolerance, P):即使節點間的訊息遺失或延遲(網路被切成幾塊),系統仍能繼續運作。

關鍵在於:在真實世界裡,網路分區遲早會發生,不是「要不要容忍」的選擇題,而是必然。所以 P 幾乎是必選項。真正的抉擇發生在分區當下,系統只能在 C 與 A 之間二選一:

  • CP:寧可拒絕服務,也不回傳可能過時的資料。回到前面台灣/美國庫存的例子,美國伺服器在收不到同步時,乾脆回「暫時無法服務」,保證你看到的永遠正確。
  • AP:寧可回傳可能過時的資料,也要保持回應。美國伺服器照樣回答,只是可能是舊庫存,待網路恢復後再「最終一致(eventual consistency)」地對齊。

值得澄清一個常見迷思:CAP 並非要你在「正常情況」下永久放棄某一性質,它描述的是分區發生時的瞬間抉擇。在網路健康時,系統其實可以兼顧 C 與 A。這個更細緻的觀點被 PACELC 定理補完:若有分區(P),在 A 與 C 之間取捨;否則(E, else),在延遲(Latency, L)與一致性(C)之間取捨——也就是說,即使沒有分區,想要更強的一致性往往得付出更高的延遲。

形式上,若以 $N$ 為複本總數、$W$ 為一次寫入需確認的複本數、$R$ 為一次讀取需查詢的複本數,當 $W + R > N$ 時可保證讀到最新寫入(強一致的法定數讀寫,quorum)。提高一致性(加大 $W$ 或 $R$)必然增加被慢節點拖累的機率,這正是延遲與一致性張力的數學寫照。

與其他主題的連結

雲端把計算機概論裡許多看似分立的主題串成一條線:作業系統的行程隔離與資源排程,在虛擬化與容器中以新形態重現;計算機網路的延遲、頻寬、可靠性問題,在分散式系統中被放大成一致性難題;演算法裡的負載平衡與快取策略,決定了水平擴展的效率上限。理解雲端,某種意義上是把這些基礎拼回一張完整的系統圖像——並學會在「沒有完美解、只有取捨」的真實工程世界裡做出明智的選擇。

AI 共讀助教正在陪你讀:雲端運算
嗨!我是這篇文章的共讀助教,只根據〈雲端運算〉的內容回答。可以問我「解釋某段」「舉個例子」「出題考我」,或反白文中段落後點下方「解釋選取段落」。