2013年6月11日 星期二

Back to Mac 之 "自動關閉"


Mac OSX 在 10.7 之後進入了一個新的境界,當初的發表會名為 "Back to Mac",一度讓人以為 Apple 太重視 iOS 這個金雞母,所以在冷落 Mac 許久之後,希望大家 "Back to Mac",再次關心一下 Mac 的發展。然而其正解並非如此,而是 Mac OSX 要在多個方面 "學習"(自家的產品就姑且用這個字眼) iOS 的特殊功能,一來推動 Mac OSX 自身的進步,二來加深 iCloud 的整合,三來統一使用者體驗,可說是一舉數得,但是 .....

咳咳,這次的主題是 Mac OSX 10.7 Lion 新增的一個功能 -- "Automatic Termination" (自動關閉),這玩意的影響顯而易見,有在用 Lion 或 Mountain Lion 的人應該都有察覺到,但奇怪的是網路上鮮少關於此事的中文文章,而老外的討論文也大多是 "該如何關掉它?",少有深入的探討,故這次我們來看看這個惹人嫌的功能究竟在搞什麼鬼。


何謂 "自動關閉"?

"自動關閉" 是 Mac OSX 10.7 預設開啟的一個系統功能,也就是說,它是跨程式的功能之一 (像 "複製" 及 "貼上"),故理論上你可以在很多程式中看到它的身影,但目前我尚未看到任何第三方軟體支援它,不過根據 Apple 的開發者文件所示,其實任何軟體都可以加入這個功能。

那麼,這個功能到底在做什麼呢?簡單地說有兩種:
  1. 當一個軟體的視窗全部都被關閉時 [1],該軟體就會被退至後台,不僅從 Dock 上消失,連 App switcher (Cmd + Tab 呼叫出的切換區) 中也沒有它的身影,但它依然在背景運行,直到 "某個時刻" 的到來,它就會被自動關閉。
  2. 當一個軟體的視窗不在螢幕上時 (例如被 "隱藏" 或是在另一個 Space 裡),等到 "某個時刻" 到來,它就會被自動關閉。
我相信大部分的人應該只遇過第一種,像下面我以支援 "自動關閉" 的 "預覽程式" 為例:


不過還有一個問題,上述的 "某個時刻" 到底是什麼呢?老實說我也不知道,因為 Apple 並沒有明確地說出答案,只用 "Some time" 這種字眼塘塞,但我們可以回想一下 "Back to Mac" 的設計理念,便不難猜出其中的輪廓。


Mac OSX 及 iOS 的記憶體管理


關於一個程式的運行,除了 CPU 的使用量之外,最重要的就是記憶體的取用,Mac OSX 及 iOS 雖然系出同門,但對於記憶體的管控有著不小的差異,而這也直接反映出一般電腦與移動裝置搭載之記憶體的大小不同,所採取的配套措施亦不同。在 Mac OSX 中,記憶體依使用的方式分為四種:
  1. 固定的 (Wired):作業系統固定使用的記憶體,一般來說量不太會更動。
  2. 現用的 (Active):現在被各軟體使用的記憶體。
  3. 非現用的 (Inactive):之前被軟體所使用的記憶體,但因為該軟體已被關閉,所以其記憶體空間被釋出,可供其他程式使用,但未被再次使用前依然保有原軟體的部份資料 [2]。
  4. 可用的 (Free):也就是可供程式使用,且未保有程式資料的記憶體。
不過呢,在 iOS 中並沒有分得那麼細,基本上就只有 "已使用" (Used) 及 "未使用" (Free) 而已,但意義上是相同的,就是把 Mac OSX 之 "固定的" 及 "現用的" 歸類為 "已使用",而 "非現用的" 及 "可用的" 歸類為 "未使用"。可是,一般來說 "已使用" 與 "未使用" 的記憶體是井水不犯河水的,若使用者沒有出手將某程式關閉,該程式就會一直佔用著記憶體不放,這對於記憶體只有不到 1GB 的移動裝置是多恐怖的事!故 iOS 就設計讓 "已使用" 與 "未使用" 之記憶體的界線模糊化,使其用量完全由系統去控制。

舉個例子,若你在 iOS device 上分次使用多個 App,只要沒有超過記憶體總量,你用多工工具列切換 App 時,會發現 App 都處於你上一次使用完的狀態,因為它們用的記憶體都是 "已使用" 的記憶體,或稱 "現用的" (Active) 的記憶體,並沒有被抹除或修改過。可是,若你持續開啟多個 App,使得 iOS device 的記憶體不夠了,它就會從最早啟動的 App 開始,依次關閉 App 以釋出記憶體,讓它們變成 "未使用" 或 "非現用的" (Inactive) 記憶體,進而提供給即將啟動的其他 App 使用,而被關閉的 App 在下一次啟動時,雖然其中的檔案修改會被記錄下來,但 App 本身會從最初的畫面開始啟動,這就是曾經被關閉過的證據。

另外,在多工工具列裡關閉 App 則是將該 App 佔用的記憶體直接歸類至 "未使用" 或 "非現用的" (Inactive) 記憶體 (若原本就已經被關閉了,這個動作就等於清除 "最近使用之程式" 的清單),基本上也算是關閉了 App,但程式的部份資料還是在記憶體中 (想想 "非現用的" 記憶體特性),故有人說在多工工具列中關閉 App 不會比較省電是真的,但它的確關閉了程式,也清除了記憶體,不過就算你不去清,系統遲早也會幫你清就是了。

那 Mac OSX 的 "自動關閉" 跟 iOS 有啥關係呢?顯而易見地,Apple 希望 Mac OSX 跟 iOS 一樣,將記憶體全權交由系統管理,而使用者不再需要手動關閉程式以釋放出記憶體,因為不夠的時候,系統會自動將其他程式關閉,以釋出記憶體挪作他用。若與一般桌面系統的管理方式相比,以往的桌面系統遇到記憶體不夠的時候就是拿硬碟來當記憶體 (又稱為 swap),然後 lag 到死,直到程式或系統當掉。

想當初 10.7 Lion 正式版發布之前,Apple 曾經多次提供測試版給開發者們測試,不知道大家還記不記得,在某一個測試版中 Dock 上的程式指示燈被完全地取消了,也就是說你根本不知道你執行了哪些程式,當然也不知道執行過的程式是否已經被關閉了,一切都交由系統,使用者就像 iOS 用戶一樣,什麼都不要管就好,TechSpot 對此的評語為:

In OS X 10.7 running applications are no longer marked with an indicator light in the Dock (by default). The notion is that multitasking could be made completely seamless to the user, not having to worry whether an application is already running or not, particularly as they begin to support Auto Save.

如此看來,所謂的 "某個時刻" (Some time) 極有可能是 "記憶體不夠的時刻"。


"自動關閉" 的缺點

由上可知,"自動關閉" 可說是完全使用者導向的功能,而且在 iOS 上頗受好評,那為什麼在 Mac OSX 上卻是人人喊打呢?我簡單列舉幾點:
  1. Mac OSX 是 "桌面系統",而一般桌面系統的記憶體都很大,很少會出現記憶體不夠的狀況,至少多數人是這樣。若記憶體沒有不夠用,這個功能就雞肋了,取而代之的就是它帶給使用者的不便。
  2. 由於 UI 設計上的考量,Mac OSX 的 "自動關閉" 不像 iOS 的多工工具列那麼方便,它反而造成支援此功能的程式不易被手動關閉,原因我在上面的段落有提過。然而 "自動關閉" 就是希望使用者不用手動關閉程式,但 Mac OSX 並非跟 iOS 一樣是 App 取向,而是跟一般系統相同的檔案取向,故若你要將一個檔案刪除,而開啟它的程式尚未被關閉時,就有可能發生 "無法刪除" 的情況,例如下圖即為一例,當然 Quicktime Player 理論上不會發生這種事,這個例子的始作俑者是它的外掛 Perian 害的:
  1. 被關閉的程式何去何從?


AutoSave、Versions、Resume

既然要談 "自動關閉",那 Mac OSX 內的儲存機制就不能不提,基本上 "自動關閉" 的功能完全是建立在這些儲存機制上的,它們就是 AutoSave、Versions 及 Resume。為什麼說它們很重要呢?因為 "自動關閉" 可是六親不認的,關閉了就是關閉了,如果被關閉的軟體內有尚未儲存的資料,不好意思,那是你家的事。想想以往就算電腦再慢,也不會未經使用者同意就關閉他開的軟體,iOS 及 Mac OSX 敢做這種事,鐵定要有適當的配套措施,而這也是 iOS 的賣點之一,在 10.7 Lion 中正式被帶入 Mac OSX 中。

以下稍微簡介一下它們三者:
  1. AutoSave:這是一個以 "檔案" 為主的功能,它能夠在 "檔案被修改" 時,(幾乎) 即時地將最新的檔案內容儲存下來,讓你省去手動存檔的麻煩。
  2. Versions:這也是一個以 "檔案" 為主的功能,它能在 "一定的時間週期" 內,將該檔案的不同狀態儲存下來,如此一來使用者可以在事後回溯該檔到未修改前的版本。
  3. Resume:這是一個以 "程式" 為主的功能,它能夠將該程式當時所開啟的視窗及其內容全部記錄下來、以期該程式在下一次啟動時能夠完全回復到前一次使用的狀態 [3]。
如上,很多細節就不在這裡說了,有興趣的人請自行留言詢問。看起來很美好對吧?搭配上 "自動關閉" 功能簡直就是絕配!但我想問一句:

有哪些程式支援上述的功能?

如果你能舉出三個第三方程式有支援上述功能的任何一個,那就很不容易了,為什麼呢?你以為那些功能只要寫程式時在屬性表裡打個勾就好?才沒有這麼簡單!比如說 Versions 只支援特定的檔案類型,MS Office 格式想都別想!而 Resume 更為複雜,因為開發者必須 "手動設定" 你要讓程式回復哪些類型的視窗及其資料,非常麻煩;比較容易的應該是 AutoSave,但實際支援的第三方軟體也不多,搞到最後,除了幾個中大型軟體公司的 "鉅作",大部分的第三方軟體都與此無緣,那這樣 "自動關閉" 還有什麼搞頭?


"解決" 方法

由上可知,由於軟硬體環境的不同、UI 設計的不同 ..... 等,"自動關閉" 的美意在 Mac OSX 被折損殆盡,以致於網友一提到它,就只想問該如何關閉,故我也將該指令列出:

defaults write -g NSDisableAutomaticTermination -bool yes

(上式的 "yes" 改成 "true" 也可以) 如上,這就是我的 "解決" 方法,雖然對 Apple 工程師很不好意思,但目前只能如此,希望未來的 Mac OSX 能夠將此功能重新設計,讓記憶體管理能夠既自動又不失方便性。



附註
1. 在 Mac OSX 裡,視窗只是程式的一個物件,"關閉視窗" 跟 "關閉程式" 本來就是兩回事,某些程式在關閉視窗時會直接關閉程式是特殊設計過的。
2. 一個程式在啟動及運行時,除了將硬碟內的軟體檔案複製到記憶體中,還要連結一堆系統提供的函式庫,故開機後第一次啟動程式都會比較慢,但第二次的速度則有明顯的提升 (關了再開),那是因為 "非現用的" 記憶體中包含了一些啟動時需要的資訊。
3. 由此可見 iOS 其實並不包含 "真正" 的 Resume 功能。

1 則留言: