SAR (System Activity Report)

【譯名】系統運作報告書

【說明】SAR(System Activity Report)是 UNIX 上的一個公用軟體,它會隨時追蹤 CPU 的活動情形、各類週邊設備的使用情形等,並且提供系統管理者(system administrator)修正系統的最佳參考值,以達到最好的系統效率。

Scatter loading

【譯名】散佈載入法

【說明】這是一種記憶體管理技巧。當一個處理程序(process)被載到記憶體中時,其位址空間的內容可以放到不連續的記憶體區域中。如此作法是為了讓記憶體的使用有更大的彈性。但不可避免的,也會造成了記憶體的碎塊(fragmentation)現象。

【參考】process, fragmentation。

Scatter read

【譯名】散佈讀取

【說明】SVR4 提供了 readv() 函式,它能以單獨一次的叫用將資料由多個非連續的緩衝區中讀出,這稱為散佈讀取。

SCCS (Source Code Control System)

【譯名】原始碼控制系統

【說明】SCCS(Source Code Control System)是 UNIX 系統提供給使用者的一個公用軟體。最初的設計重點就在於各類文件的管理以及版本控制的服務,以及幫助使用者管理多個檔案,或是對多個用戶共同使用到的檔案進行維護。(例如:在同一時間內只有一個人可以寫入資料。)它利用一個主檔來掌管所有曾經修改過的文件,當用戶有加入新資料的同時,SCCS 就會給予一個最新的版本號碼(從 1.1、1.2 、1.3 開始慢慢增加),而不破壞原先的舊檔。如此一來使用者便可以從主檔中取得任何您想要的版本來進行修改、印表或編譯等工作。另外它也提供了一項「註解」的功能,好讓每個使用者知道不同的版本間的不同之處究竟在那裡。

Scripts

【譯名】指令檔

【說明】在 UNIX ﹐裡又被稱為 shell program。這一類的檔案必須透過某個指令解譯器(command interperter)來執行,在 UNIX 裡多半是 C shell 或 Bourne shell。Scripts 檔與 DOS 中的批次檔十分類似,但其還有設定變數的功能、執行迴圈的能力、各種控制流程的敘述,在最新的 korn shell 甚且提供了傳送參數和叫用副程式的能力。

【參考】command interperter, shell。

Semaphore

【譯名】信號

【說明】信號是處理程序間通訊的一種方式。和管線(pipe)、訊息佇列 (message queue) 不同的是,信號不是用來交換大量資料,而是著眼於促使多個處理程序同步運作。其功用是讓一個以上的處理程序能夠同步執行(synchronized execution)並分享數個系統資源(resource)。

這裡所說的同步是指數個有相互合作關係共同執行某個工作的處理程序,可以彼此不需互相等待而能完成工作。例如兩個處理程序可以同時讀取某一個檔案,這就是同步作業;相反的,如果乙處理程序必須等甲處理程序讀完這個檔案後才能讀取,這就是非同步作業了。

【參考】Interprocess Communication, pipe。

Session

【譯名】期間、會期

【說明】一個「期間」是由許多的「處理程序群」(process group)組合而成的。其中的一個「處理程序群首」(process group leader)同時也為此期間的「期間群首」( session leader)。也就是說其「處理程序識別碼」等於「處理程序群識別碼」及「期間識別碼」(process ID=process grooup ID = session ID)。

「期間群首」的識別碼會被此期間的所有成員所擁有,就像處理程序群的成員們保有它們處理程序群首的識別碼一樣。而保存此識別碼的作用之一是當系統有需要發送訊號(signal)給此期間的每個處理程序時,透過此識別碼便可輕易地做到。當「期間群首」建立一個新的期間時,一個新的期間生命週期就開始了。直到所有的處理程序結束了他們本身的生命週期,或是僅剩唯一的處理程序又離開了此群而告終止。讀者可將「期間」視為「處理程序群」的擴大,如此較容易理解些。

【參考】signal。

Session leader

【譯名】期間群組首領,會期群組首領

【說明】請參考 session 一辭。

【參考】session。

set group ID

【譯名】設定使用群識別碼

【說明】設定使用群識別碼為設定檔案屬性的第十個位元( 簡稱 SGID)。它的作用與功能和 SUID 十分近似,但是它的對象是使用群識別碼。換言之,讓屬於同一個使用群的檔案能彼此分享資訊,對於其他的使用群則做了某些程度的安全防護。與使用者識別碼一樣,使用群識別碼也有真實使用群識別碼及有效使用群識別碼之別。它們的功能與區別和真實使用者識別碼及有效使用者識別碼間完全一樣,僅僅是對象由使用群取代了使用者。大多數的 UNIX 系統, SUID 設為 "on" 的檔案有數量上的限制(通常是小於 50 個)。同時 SUID

]立有其風險(請參閱關於 set user ID 的說明)。因此將檔案依性質分類,再用設定 SGID 位元來達到資源分享的目的,不失為一個較安全的辦法。

【參考】set user ID。

set user ID

【譯名】設定使用者識別碼

【說明】設定使用者識別碼位元(簡稱 SUID )為設定檔案屬性的第十一個位元,此位元的設定正確與否會關係到整個系統的安全, 所以非常的重要。

當一個處理程序被建立時,系統會給它兩個識別碼:真實使用 者識別碼(real user ID)與有效使用者識別碼( effective user ID )。真實使用者識別碼是取自於使用者在建立帳戶時所收到的使用者識別碼。這個識別碼是用來記錄使用者對資源的取用情況。而有效使用者識別碼則是用於決定那些資源可被那幾個處理程序所使用。對大部份的處理程序來說,真實使用者識別碼與有效使用者識別碼的值會是一樣的,比如說─指令 who。但是如果使用者所啟始的檔案將 SUID 位元設為 "on"(例如 passwd、ps、df 等),這時誰執行這個程式,它就變成該程式的擁有者;更精確的說,這時該處理程序的真實使用者識別碼不變,可是有效使用者識別碼變成了該檔案擁有者的識別碼。換言之如果該檔的擁有人為 root,則誰執行此程式,誰就會在那一刻變成超級使用者。這種情況對 passwd 這類的指令而言沒有任何風險,因為它只進行幾個特定的動作。但是假使一個 SUID 位元為 on 的程式會產生一個 sub-shell時,那麻煩就大了,因為該 shell 將是在超級使用者模式下。

【參考】set group ID, real user ID, effective user ID, superuser。

Sfs

【譯名】無

【說明】sfs 檔按系統的 inode 其識別碼為區分奇數與偶數,偶數的 inode 與 ufs 的 inode 完全一樣,而奇數的那個則儲存著安全資訊,當您下達顯示 inode 資訊的指令時(例如 ls -i),這些指令僅會顯示偶數的 inode 。在 "/usr/include/sys/fs/sfs_inode.h" 檔內有 sfs 的 inode 資料,您可將它與 "/usr/include/sys/fs/ufs_inode.h" 加以比較,會發現差別在 sfs_inode.h 中的 inode 結構多了一個叫 i_secure 的 union,該 union 是用於儲存有關安全的資料。

【參考】ufs。

Shadow password

【譯名】無

【說明】為了符合美國國防部橙皮書所規定的 C2 系統安全標準,則從 SVR 3.1 版起,UNIX 將原來的 "/etc/passwd" 檔分為 "/etc/shadow" 及 "/etc/passwd" 兩個檔案。這樣做是因為舊有的 "/etc/passwd" 檔為顧及一些公用程式,如 who、ls 等需要讀取它的內容,而將檔案存取權限設為 644。但是這樣一來,誰都可以閱讀這個檔的內容,這裡面也包括了用戶的簽入密碼。僅管這些密碼經過加密的處理,但是『露白』之後若是有人以愚公移山的幹勁來破解密碼,難保不被解;而通行密碼對大多數的系統公用程式來說根本用不到。因此最好是把密碼這一欄位移出 "etc/passwd" ,如此『眼不見為淨』,使有心破壞者根本無機可乘。被移出的密碼和 UNIX 系統的一些新增資訊就都存在 "/etc/shadow" 這個檔中。"/etc/shadow" 的檔案存取權限預設值是600,也就是說 "for superuser eyes only",其他用戶一概免談。只有極少數的系統指令需要讀取 shadow password 檔的內容(據作者所知僅有 login 及 passwd),這些指令都有一個共通點就是 SUID(set user ID)位元被設為 on。

【參考】Trust Computer System Security Evaluation Criteria。

Share locking

【譯名】分享鎖定

【說明】分享鎖定也稱作讀取鎖定,當一個檔案或記錄以讀取鎖定的方式鎖住時,其他的處理程序僅能對被鎖定的檔案(或記錄)進行讀取作業;在該鎖定未被解除前,所有的更新及新增作業都將被拒絕。

Shared memory

【譯名】共享記憶體

【說明】所謂的「共享記憶體」是指 UNIX 系統達成「處理程序間通訊」(interprocess communication)的其中一種方式。它允許多個處理程序共同分享相同的資料空間。其作法是:先將一塊 記憶體宣告為共同區域,然後各處理程序再把這個區域映設(map)到本身的虛擬位址空間(virtual address space)上,如此一來,每個處理程序便可以使用這塊位置讀寫資料,好像這塊記憶體是它的一部份一樣。

有關「共享記憶體」的資料結構如圖所示:

Shared memory.gif (5241 bytes)

【參考】interprocess communication, virtual address space。

Shell

【譯名】無

【說明】shell 是一個程式,負責接受使用者所鍵入的命令,然後立即作解譯進而執行。換句話說它是 UNIX 底下的指令解譯器。使用者進入系統後,一個 shell 的處理程序環境便會自動建立。包括把標準輸入、標準輸出以及標準錯誤輸出連結到用戶所簽入(login)的終端設備上。

【參考】 login。

Signal

【譯名】訊號

【說明】「訊號」是系統用來通知處理程序(process)某些狀況的發生。針對不同的狀況,系統會發送出不同的訊號用以茲識別。我們可以將訊號視為系統核心(kernel)與處理程序間的一種溝通工具。不過讀者要注意,處理程序與處理程序之間也可以相互傳送訊號(以 kill 指令)。

AT&T 版的 UNIX 系統到 SYSTEM V Release 3.2 為止共定義了 20 種訊號,在 Release 4.0 時又增加一些新的功能到 31 種訊號。BSD4.3 版的 UNIX 系統則定義了 30 種訊號。

【參考】process, kernel, AT&T。

Single indirect block

【譯名】單一間接區塊

【說明】為便於詳盡說明,請讀者一併參考「間接區塊」一辭。

【參考】indirect block。

SLIP (Serial Line Interface Protocol)

【譯名】無

【說明】即 Serial Line Interface Protocol。SLIP 允許在兩端的電腦透過 serial line 連接。SLIP 是由 4.3 BSD 所發展的。

SMTP (Simple Mail Transfer Protocol)

【譯名】無

【說明】簡易電子郵件傳輸協定 (STMP) 提供系統之間得以交換電子郵件。SMTP 也使用 TCP,其通訊協定定義在 RFC821 文件中,電子郵件格式在 RFC822 中定義,而 RFC974 設定郵件路徑如何決定。

STMP 使用通訊埠號 25,利用 telent 通訊協定的部份指令比較重要的有:

HELO - 對談開始

MAIL From : <送信地址> - 開始電子郵遞工作,並且辨識送信人。

RCPT To : <收信地址> - 辨識收信人。

DATA - 開始信件內容,以句點 . 為信件結束的標識符號。

QUIT - 結束雙方的對談。

HELP - 線上說明。

SMTP 共有 14 個指令,讀者可參閱 RFC 821 文件。

SNA (System Network Architecture)

【譯名】無

【說明】IBM 在 1974 年發表的 SNA 架構,經過數次修訂後,已成為 IBM 電腦的主要網路架構。SNA 是一種架構而非產品,它並不是以 UNIX 為基礎的網路架構,但很多 UNIX 製造商已能支援 SNA 架構。大多偏重在 LU6.2。

SNA 架構與其他通訊協定不同的是,它當初設計的目的在連接終端機與印表機到 IBM 主機 (mainframe) 如 system1370 之間的連線。

一個 SNA 網路站(Node) 的架構,主要分有四層,如圖:

* 終端用戶(end user)

* 邏輯單位(logical unit or LU)

* 實體單位(physical unit)

* 資料鏈層(data link)

SNA 的層次與 OSI 一樣,都分為七層,當然每層的名稱與功能與 OSI 不盡相同,比較如下圖所示:

san.gif (5106 bytes)

Socket

【譯名】插座

【說明】「插座」是 BSD 4.2 版所提供的一種特殊型態的檔案。它的作用頗類似於管線(pipe),提供了處理程序之間通訊(inter process communication)的能力,並且支援了網路的功能。使用者可以用 "socket" 系統呼叫(system call)來建立它,傳回值是一個「檔案描述詞」(file descriptor)。

「插座」有許多不同的種類,其目的是用來支援不同的「通訊語義」(communication semantic)。如:資料可靠的傳遞、訊息先後次序的保持等;同時,「插座」比「管線」強的一點是,「管線」需要一個共同的父處理程序(parent process)來設立一個處理程序間的通訊管道,但是「插座」卻可以由兩個完全不相關的處理程序來設立,甚至這兩個處理程序還可以存在於不同的機器上。為了支援「插座」系統核心(kernel)的結構需包含以下三個主要的部份:

插 座 層

socket layer

用作系統呼叫與通訊協定層之間的介面

通訊協定層

protocal layer

包含了一些通訊協定模組

設 備 層

device layer

包含了一些控制網路設備的驅動程式

如下圖所示:

socket.gif (5409 bytes)

【參考】BSD, TCP/IP, interprocess communication, system call, parent process, client process,  pipe, protocol, kernel, named pipe。

Soft link

【譯名】軟式連接

【說明】同「符號連接」一辭。

【參考】symbolic link。

SPOOLER

【譯名】週邊設備同時作業器

【說明】這是一種以軟體加速週邊設備使用速率的方式。主要的功能是允許多個使用者分享一台或多台印表機,並將所有的列印要求作好排序並放進次儲存體中等待列印,而使用者可以繼續執行其他的工作。其特性歸納如下:

  1. 允許不同型式的各類印表機。
  2. 儲存多個列印要求並等待執行的檔案。
  3. 允許使用者臨時取消列印要求。
  4. 顯示目前各印表機的列印狀態。
  5. 由於列印內容是存放在次儲存體中,因此即使是系統關機後再開機也可以繼續列印。

SPP (Sequenced Packet Protocol)

【譯名】循序封包協定。

【說明】它在 XNS 架構中是用來作為第二層的服務站,它提供了可靠度高、絕不重複和可流量控制的訊息傳輸方式。

【參考】XNS。

Sticky bit

【譯名】黏著位元

【說明】在 UNIX 系統中,每個檔案所對應的索引節點(inode)中都有一個佔 16 位元的欄位來表示該檔的存取權限與屬性。其中第九個位元稱為黏著位元,主要是用來控制檔案的執行效率。當任一檔案的黏著位元被設為 1(on)時,只要此檔一旦被載入主記憶體後,即使執行完畢也不會從記憶體中移出。通常一些使用頻率高的公用程式如 vi、ls 等的黏著位元都設為 on。

然而,黏著位元的使用,在大部份新版 UNIX 都採行以虛擬記憶體管理記憶空間的情況下,已成昨日黃花,不再被大量使用。有一點讀者要注意,如果目標檔案為一目錄,而其黏著位元為 on,這時所表示的意義並非是整個目錄下的檔案執行完都會留在主記憶體內,它是指該目錄下的所有檔案只有該檔案的擁有者或是超級使用者才有權刪除或寫入資料。這種用法出現在系統的一些公用目錄下,例如 /tmp 或是 網際網路下的 /Public,這些目錄的使用權都是開放給所有的用戶,但是為了避免有人惡意的更改他人的資料或是刪除別人的檔案,故有將這類目錄之黏著位元設為 on 的措施。

【參考】inode。

stream

【譯名】資料流

【說明】所謂的「資料流」是指:在一個處理程序(process)與一個「設備區動程式」之間的一條全雙工(full-duplex)通道。它包含了一些輸出輸入的佇列序對(queue pair),如下圖:

stream.gif (5913 bytes)

當一個處理程序要寫資料到資料流�堶悼h的時候,系統核心會將資料送到輸出佇列。同樣地,當「資料流驅動程式」收到輸入資料的時候也會往上送給要讀取資料的處理程序。每一個佇列序對都會和系統核心內的某一個模組相對應。例如設備驅動程式(device driver)、線上控制(line discipline)、通訊協定(protocol)或是負責資料傳輸的模組等。

【參考】STREAM, kernel, device driver, potocol, line discipline。

STREAM

【翻譯】無

【說明】STREAMS 是指一組具備介面通用性及使用彈性的系統開發工具,它的發展是為了因應 UNIX 系統中日益殷切的通訊服務。它支援的範圍極其廣泛,從整個網路通訊協定到單獨一個設備驅動程式,皆在其涵蓋範疇內。

有一點讀者得留意,當我們稱 STREAMS 時,指的是上述整個系統開發工具,當我們指 STREAMS �堶惘U別的工具時,我們採用英文小寫的 stream,例如 stream head、stream message 等。讀者務必留意,別將標準輸出輸入函式館�堛爾禤えy(data stream)與本章所討論的 STREAMS 弄混,兩者完全是風馬牛不相干。STREAMS 的觀念是由 UNIX 作業系統的設計者之一 Dennis Ritchie 所提出的,這是一種新式的處理程序與終端機(或者網路)間的介面,用以取代舊有的處理程序與終端機(或者網路)之連接方式。STREAMS 將核心內部的輸出輸入與核心和其餘 UNIX 系統元件的介面加以標準化。它的設計是將特定功能的常式(routine)集中在一個模組(module)中,不同的模組負責不同特性的任務。模組的組成份子包括了核心內的常式、系統呼叫以及若干核心的資源(kernel resources)。終端機線上控制(terminal line discipline)就是 streams 模組的一種。顯示使用者處理程序、STREAMS 及設備驅動程式間的關係。

stream01.gif (10115 bytes)

由上圖我們可以下面得知數點:

  1. 從使用者處理程序到設備驅動程式的資料流通路徑皆是採行 full-duplex 的模示(因為所有的↑↓都是雙向的)。
  2. stream不一定非和實際硬體設備相連,它也可以和假設備驅動程式連接(pseudo driver,又稱軟體驅動程式,software driver,例如假終端機- pseudo terminal)。
  3. 負責使用者與核心連繫的模組稱做 head,負責核心與硬體間連繫的模組則叫作 driver;而介於 head 和 driver 間的各種模組則是扮演過濾器(filter)的角色,這些模組可以視實際的需要以 ioctl() 系統呼叫動態(dynamic)的加入(push onto)STREAMS 中。
  4. 擔任使用者與核心程式間介面的 stream head ,和擔任程式與硬體 stream driver 都僅有一個,但是模組可以有多個或是根本沒有,每個模組均負責不同的功能。

由於模組可以動態的刪除或新增,因此 STREAMS 可以很有彈性地隨時改變或新增其功能,不像傳統驅動程式,雖然以 C 語言撰寫,但是由於在執行時一切功能皆已固定,若遭遇設計時未考慮到的狀況,往往就只能束手無策。再者各種設備驅動程式往往是在建立核心(build kernel)就已植入核心,以致增刪一個驅動程式都得大費周章地重建核心(rebuilt kernel),若採用 STREAMS,這一切麻煩都得以迎刃而解。以網路系統上的應用為例,STREAMS 的運用使得用戶可以彈性地更改通信協定。

假設我們所面對的硬體裝置為終端機,那麼上圖的模組部份就需要改為終端機線上控制,驅動程式就變為該終端機的驅動程式,整個新架構如下圖:

STREAM02.gif (8738 bytes)

由上面兩張圖之間的變化,我們應該能深切認知到 STREAMS 的基本精神就是將各種任務模組化,不同的模組在核心中提供一系列完備的處理機能及相關服務。模組也可以由用戶在啟動時選擇,並依用途連接以契合工作的需求,無須重行連結(LINK),如此使得用戶層的處理程序可以完全不依賴特定的通訊協定(protocol)及媒體(media),完全獨立於外部的硬體裝置。

Super block

【譯名】管理區塊、超級區塊

【說明】UNIX 的檔案系統(file system)我們可視作是由一連串的區塊(block)所組成的,其中的第二個區塊稱為「管理區塊」,功能與 DOS 中的 FAT 類似,它儲存了整個檔案系統的相關資訊,大致有下列幾項:

  1. 整個檔案系統的大小,也就是所佔的區塊總數。
  2. 目前可供使用的區塊總數及其可供使用區塊所組成之串列。
  3. 目前可供使用的索引節點(inode)總數及一部份可使用的索引節點編號。
  4. 第一個可用資料區塊的編號及第一個可用的 inode 編號。
  5. 管理區塊是否被修改過?如果是,當核心程式執行 "sync" 系統呼叫時,便會將主記憶體中新的管理區塊寫回磁碟裡。
  6. 管理區塊最後一次被修改過的時間。
  7. 檔案系統與磁碟的邏輯名稱。

其中,檔案系統的大小、資料區塊的大小以及索引節點的數量是屬於於靜態資料,不會改變的。其餘的均為動態資料。

【參考】file system, inode, kernel, system call。

Superuser

【譯名】超級使用者

【說明】由於 UNIX 為開放式的系統,因此必須要有一位系統管理者的存在。這位系統管理者應具備 superuser 的身份,以 root 作為登錄名稱,而且其 shell 提示符號是 "#",而非一般的 "$" 符號。其使用者識別碼為 0,在 superuser 模式下所產生的處理程序比一般使用者的處理程序擁有較特殊的使用權限。

其主要負責事項有下列幾點:

  1. 系統的正確運轉。
  2. 資源的分配。
  3. 網路的建立與管理。

【參考】shell。

Swap area

【譯名】置換區域

【說明】它是由次儲存體(例如硬式磁碟)所劃分出來的一塊區域,與檔案系統(file system)分開,在做「置換工作」時使用。

Swap device

【譯名】置換設備

【說明】「置換區域」(swap area)所在的儲存體稱之,它是用來儲存暫時從主記憶體置換出去的處理程序(process)。

【參考】swap area。

Synchronous writing

【譯名】同步寫入

【說明】使用同步寫入其實就形同沒有緩衝區的存在,系統直接叫用控制寫入的系統常式,提出寫入要求的處理程序這時便進入睡眠狀態(sleep),直到輸入作業結束,由於在進行寫入工作的這個時段,處理程序完全是處於閒置的狀態,因此使用效率十分低落,但是它最大的特色便是安全。UNIX 的系統呼叫 sync() 就採用同步寫入的方式。

【補充】 sync() 系統呼叫將超級區塊的內容寫回硬碟,使 in-disk inode 和 in-core inode 的資料能夠一致。UNIX 每隔一會兒便會自動執行此 sync(),系統關機(shutdown)時也一定會執行這指令。由於 sync() 的執行成敗涉及系統資料的一致性與整合性,故十分緊要,不容許出錯,因此採行同步式的寫入作業。

【參考】Asynchronous writing

Symbolic link

【譯名】符號連接

【說明】UNIX 系統中的每個檔案都有一個獨一無二的索引節點(inode)作代表,但是在同一個檔案系統可能有多個使用者他們想用不同的的檔案名稱來參考到同一份檔案內容,這就要透過「硬式連接」的功能來達成了。然而「硬式連接」(hard link) 無法跨越檔案系統,因此 BSD 版的 UNIX 首先提供了「符號連接」的功能,使得在不同檔案系統的檔案也能連接在一起。AT&T 的 UNIX 則直到 SVR4 才有支援符號連接。

此外只有超級使用者(superuser)才能以硬式連接去連接一個目錄,但任何使用者都能利用符號連接去連接目錄。不過大部份的系統都對符號連接的數量有所限制。符號連接功能的支援表示 UNIX 的檔案系統已徹底邏輯化,因此完全不受實體設備容量或其他特性的限制。

下圖說明了如何用符號連接到一個檔案:

Symbolic link.gif (6752 bytes)

【參考】inode, BSD, hard link, superuser, file system。

【附註】符號連接與軟式連接(soft link)是同義辭。

System call

【譯名】系統呼叫、系統調用

【說明】「系統呼叫」是讓使用者與系統核心(kernel)直接溝通的介面之一。說得更清楚些,所有用戶產生的處理程序(process)都要透過它們才能完成類似檔案的存取、處理程序間的通訊(interprocess communication)、記憶體管理、硬體的控制等較低階(low level)的工作。下圖所示為使用者處理程序、系統呼叫與核心程式三者間的互動關係。

System call.gif (5226 bytes)

由上圖可以清楚看出,使用者的處理程序有兩種方法進行系統呼叫。一是透過編譯程式提供的函式來叫用,例如 C 語言標準函式館所提供的 popen() 函示。 popen() 是個函示,但是函式本身卻會叫用 pipe() 這個系統呼叫。又如 getc() 也是一個函示,但它卻會呼叫 read() 系統呼叫。換言之,使用者是間接叫用系統呼叫常式。當然直接在程式中叫用系統呼叫也是可以的,不過愈是新版的 UNIX 系統,愈是將系統呼叫函式化。這也就是以函式來取代舊有系統呼叫的功能,這麼做的主因是提供應用程式更大的可攜性。

在系統呼叫被叫用時會執行一個特殊的指令叫做 "trap" 。它將處理程序由使用者模式切換到系統核心模式,進入系統核心模式後,UNIX 會根據傳入的引數與系統呼叫的名稱到系統核心空間中去尋找對應的系統核心常式碼來執行。因為使用者空間與系統核心空間是兩塊截然不同的記憶空間,所以在執行系統呼叫時,系統核心程式必須把資料完整安全地在兩個地址間傳送。因此從使用者模式過渡到系統核心模式時,核心程式必須將處理程序在使用者模式下作業的狀態儲存起來,等到系統呼叫執行結束,執行狀態由系統核心模式返回使用者模式時,再繼續剛才未完的工作。

僅管在 C 語言的使用環境下,呼叫函式與叫用系統呼叫似乎是沒有差別,但是實際上兩者差別很大。我們可就下列幾點來驗証:

一)功能性:

系統呼叫是要求系統核心為使用者處理程序做某種服務。比如說 getpid() 系統呼叫就是讓作業系統傳回現在執行的處理程序之識別碼;而 C 語言函式則通常不需要(注意:不是絕對不需要,例如 malloc() 就要)系統核心的服務。比如說 exp() 函示。因此一叫用系統呼叫,處理程序的執行就會從使用者模式轉入核心程式模式;然而執行函式時,處理程序多半都是在使用者模式下運作(僅有少數的函式例外)。

二)層次性:

C 語言函式(特別是與輸出輸入及記憶體配置有關的函式)多半得透過 UNIX 的系統呼叫來達成。因此我們可以將 C 語言的函式當成是應用程式設計人員與系統呼叫常式間的一層絕緣。這些函式提供外觀一致的介面,讓程式設計師能夠不因 UNIX 的版本不同而遭到程式設計上的困擾。

三)執行效率:

系統呼叫的執行效率在大部分的時候要比函式來的好,特別是執行與輸出輸入有關的函式。在所處理的資料量不很大時,函式之執行效率會較佳,因為它是將待處理的資料先存在緩衝區,等到緩衝區裝滿了再將資料一次寫入或寫出。這種方式在處理小量資料時較為快速,例如單一字元的輸出輸入。相對地,在進行系統呼叫時,由於使用者處理程序得從使用者模式進入系統核心模式,其間核心程式要做不少的額外工作(overhead),這些額外工作當然對系統的執行效率有影響。但是在資料量大的時候,函式所採用的方式就顯得缺乏效率且多此一舉,例如在拷貝大型檔案時,緩衝區的存在反而是一種負擔。

四)可攜性:

這點毫無疑問,函式比系統呼叫擁有較高的可攜性。

【參考】kernel, process, interprocess communication。

system device

【譯名】系統設備

【說明】在一個電腦網路中,當週邊設備(periphral device)是直接連接在主機上,而不是與個人電腦或工作站(work station)相連接,此類設備便稱為「系統設備」。與此相對的是「區域設備」(local device)。

【參考】 local device。

system process

【譯名】系統處理程序

【說明】系統處理程序是指一些在系統初始時就由系統核心(kernel)所啟動的處理程序。這些處理程序往往是負責整個系統的管理及維護工作。這些處理程序以處理程序 0(swapper)、處理程序 1(init process)、處理程序 2(pagedaemon)為代表。

【參考】initialization process, page daemon, scheuler process。

system space

【譯名】系統區間

【說明】同「系統核心空間」一辭。

【參考】kernel space。

system time

【譯名】系統時間

【說明】一個處理程序(process)在核心模式(kernel mode)下所執行的時間。與此相對的名詞為「使用者時間」(user time)。

【參考】process, kernel mode, user time。