天天看點

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

計算機作業系統簡介

目标

  • 了解作業系統的發展曆史
  • 知道 Linux 核心及發行版的差別
  • 知道 Linux 的應用領域

任何計算機都必須在加載相應的作業系統之後,才能構成一個可以運轉的、完整的計算機系統。作業系統的功能是否強大,決定了計算機系統的綜合能力;作業系統的性能高低,決定了整個計算機系統的性能;作業系統本身的安全可靠程度,決定了整個計算機系統的安全性和可靠性。作業系統是軟體技術的核心和基礎運作平台。是以,計算機科學技術專業的學生需要學習和掌握作業系統的基本原理和專業知識。

本課程的教學目标是:

1.掌握作業系統的基本概念、功能組成、系統結構及運作環境;

2.熟悉并運用作業系統工作原理、設計方法和實作技術,了解有代表性、典型的作業系統執行個體(如UNIX、Linux和Windows);

3.了解作業系統的演化過程、發展研究動向、新技術以及新思想,為後續相關課程的學習打下良好基礎,為後續職業發展奠定基石。

1. 作業系統的發展曆史

1.1 Unix

1965 年之前的時候,電腦并不像現在一樣普遍,它可不是一般人能碰的起的,除非是軍事或者學院的研究機構,而且當時大型主機至多能提供30台終端(30個鍵盤、顯示器),連接配接一台電腦:

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

為了解決數量不夠用的問題

  • 1965 年左後由貝爾實驗室加入了麻省理工學院以及通用電氣合作的計劃 —— 該計劃要建立一套多使用者(multi-user)、多任務(multi-processor)、多層次(multi-level)的MULTICS作業系統,想讓大型主機支援 300 台終端
  • 1969 年前後這個項目進度緩慢,資金短缺,貝爾實驗室退出了研究
  • 1969 年從這個項目中退出的Ken Thompson當時在實驗室無聊時,為了讓一台空閑的電腦上能夠運作 "星際旅行(Space Travel)" 遊行,在 8 月份左右趁着其妻子探親的時間,用了 1 個月的時間,使用彙編寫出了 Unix 作業系統的原型
  • 1970 年,美國貝爾實驗室的Ken Thompson,以BCPL語言為基礎,設計出很簡單且很接近硬體的B 語言(取BCPL的首字母),并且他用B 語言寫了第一個 UNIX 作業系統
  • 1971 年,同樣酷愛 "星際旅行(Space Travel)" 的Dennis M.Ritchie為了能早點兒玩上遊戲,加入了Thompson的開發項目,合作開發 UNIX,他的主要工作是改造B 語言,因為B 語言的跨平台性較差
  • 1972 年,Dennis M.Ritchie在B 語言的基礎上最終設計出了一種新的語言,他取了BCPL的第二個字母作為這種語言的名字,這就是C 語言
  • 1973 年初,C 語言的主體完成,Thompson和Ritchie迫不及待地開始用它完全重寫了現在大名鼎鼎的Unix 作業系統
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

肯·湯普遜(左)和丹尼斯·裡奇(右)

C 語言

  • 在把UNIX移植到其他類型的計算機上使用時,C 語言強大的移植性(Portability)在此顯現
  • 機器語言和彙編語言都不具有移植性,為 x86 開發的程式,不可能在 Alpha,SPARC 和 ARM 等機器上運作
  • 而C 語言程式則可以使用在任意架構的處理器上,隻要那種架構的處理器具有對應的 C 語言編譯器和庫,然後将 C 源代碼編譯、連接配接成目标二進制檔案之後即可運作

Unix 家譜

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

1.2 Minix

  • 因為AT&T(通用電氣)的政策改變,在 Version 7 Unix 推出之後,釋出新的使用條款,将 UNIX 源代碼私有化,在大學中不再能使用 UNIX 源代碼
  • Andrew S. Tanenbaum(塔能鮑姆)教授為了能在課堂上教授學生作業系統運作的細節,決定在不使用任何 AT&T 的源代碼前提下,自行開發與 UNIX 相容的作業系統,以避免版權上的争議
  • 以小型 UNIX(mini-UNIX)之意,将它稱為MINIX

1.3 Linux

  • 1991 年林納斯(Linus)就讀于赫爾辛基大學期間,對 Unix 産生濃厚興趣,嘗試着在Minix 上做一些開發工作
  • 因為Minix隻是教學使用,是以功能并不強,林納斯經常要用他的終端仿真器(Terminal Emulator)去通路大學主機上的新聞討論區和郵件,為了友善讀寫和下載下傳檔案,他自己編寫了磁盤驅動程式和檔案系統,這些在後來成為了 Linux 第一個核心的雛形,當時,他年僅 21 歲!
  • 林納斯利用 GNU 的 bash 當做開發環境,gcc 當做編譯工具,編寫了 Linux 核心,一開始 Linux 并不能相容 Unix
  • 即 Unix 上跑的應用程式不能在 Linux 上跑,即應用程式與核心之間的接口不一緻
  • 一開始 Linux 隻适用于 386,後來經過全世界的網友的幫助,最終能夠相容多種硬體
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

2. Linux 核心及發行版

2.1 Linux 核心版本

  • 核心(kernel)是系統的心髒,是運作程式和管理像磁盤和列印機等硬體裝置的核心程式,它提供了一個在裸裝置與應用程式間的抽象層
  • Linux 核心版本又分為穩定版和開發版,兩種版本是互相關聯,互相循環
  • 穩定版:具有工業級強度,可以廣泛地應用和部署。新的穩定版相對于較舊的隻是修正一些 bug 或加入一些新的驅動程式
  • 開發版:由于要試驗各種解決方案,是以變化很快
  • 核心源碼網址:​​http://www.kernel.org​​
所有來自全世界的對 Linux 源碼的修改最終都會彙總到這個網站,由 Linus 上司的開源社群對其進行甄别和修改最終決定是否進入到 Linux 主線核心源碼中

2.2 Linux 發行版本

  • Linux 發行版(也被叫做 GNU/Linux 發行版)通常包含了包括桌面環境、辦公套件、媒體播放器、資料庫等應用軟體
  • 常見的發行版本如下:
  • Ubuntu
  • Redhat
  • Fedora
  • openSUSE
  • Linux Mint
  • Debian
  • Manjaro
  • Mageia
  • CentOS
  • Arch
  • 十大 Linux 伺服器發行版排行榜:​​http://os.51cto.com/art/201612/526126.htm​​
在幾乎每一份與 Linux 有關的榜單上,基于 Debian 的 Ubuntu 都占有一席之位。Canonical 的Ubuntu 勝過其他所有的 Linux 伺服器發行版 ―― 從簡單安裝、出色的硬體發現,到世界級的商業支援,Ubuntu确立了難以企及的嚴格标準

3. Linux 的應用領域

3.1 伺服器領域

  • Linux 在伺服器領域的應用是其重要分支
  • Linux 免費、穩定、高效等特點在這裡得到了很好的展現
  • 早期因為維護、運作等原因同樣受到了很大的限制
  • 近些年來 Linux 伺服器市場得到了飛速的提升,尤其在一些高端領域尤為廣泛

3.2 嵌入式領域

  • 近些年來 Linux 在嵌入式領域的應用得到了飛速的提高
  • Linux 運作穩定、對網絡的良好支援性、低成本,且可以根據需要進行軟體裁剪,核心最小可以達到幾百 KB 等特點,使其近些年來在嵌入式領域的應用得到非常大的提高
主要應用:機頂盒、數字電視、網絡電話、程控交換機、手機、PDA、等都是其應用領域,得到了 Google、三星、摩托羅拉、NEC 等公司的大力推廣

3.3 個人桌面領域

  • 此領域是傳統 Linux 應用最薄弱的環節
  • 傳統 Linux 由于界面簡單、操作複雜、應用軟體少的缺點,一直被 Windows 所壓制
  • 近些年來随着Ubuntu、Fedora等優秀桌面環境的興起,同時各大硬體廠商對其支援的加大,Linux 在個人桌面領域的占有率在逐漸的提高。

4.作業系統的架構

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

UNIX

UNIX 與 ​​Linux​​ 之間的關系是一個很有意思的話題。在目前主流的伺服器端作業系統中,UNIX 誕生于 20 世紀 60 年代末,Windows 誕生于 20 世紀 80 年代中期,Linux 誕生于 20 世紀 90 年代初,可以說 UNIX 是作業系統中的"老大哥",後來的 Windows 和 Linux 都參考了 UNIX。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

UNIX是一個多使用者、多任務的作業系統。 UNIX系統由硬體、核心、Shell和應用程式組成。 使用者通過shell向核心發出指令。 UNIX檔案系統是樹狀層次結構。

誕生

1965年時,​​貝爾實驗室​​​(Bell Labs)加入一項由​​通用電氣​​​(General Electric)和​​麻省理工學院​​(MIT)合作

​​

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

​​

圖1-1 PDP-7計算機

的計劃;該計劃要建立一套多使用者、多任務、多層次(multi-user、multi-processor、multi-level)的MULTICS作業系統 [1] 

MULTICS其實是"Multiplexed Information and Computing Service"的縮寫,在1970年時,那部PDP-7卻隻能支援兩個使用者,當時,Brian Kernighan就開玩笑地稱他們的系統其實是:"UNiplexed Information and Computing Service",縮寫為"UNICS",後來,大家取其諧音,就稱其為"UNIX"了。1970年可稱為"UNIX元年"。

流行

1971年,Ken Thompson寫了充分長篇的申請報告,申請到了一台PDP-11/24的機器。于是Unix第一版出來了。在一台PDP-11/24的機器上完成。這台電腦隻有24KB的實體記憶體和500K磁盤空間。Unix占用了12KB的記憶體,剩下的一半記憶體可以支援兩使用者進行Space Travel的遊戲。而著名的fork()系統調用也就是在這時出現的。

到了1973年的時候,Ken Thompson 與Dennis Ritchie感到用彙編語言做移植太過于頭痛,他們想用進階語言來完成第三版,對于當時完全以彙編語言來開發程式的年代,他們的想法算是相當的瘋狂。一開始他們想嘗試用​​Fortran​​​,可是失敗了。後來他們用一個叫​​BCPL​​​(Basic Combined Programming Language)的語言開發,他們整合了BCPL形成​​B語言​​​,後來Dennis Ritchie覺得B語言還是不能滿足要求,于是就改良了B語言,這就是大名鼎鼎的​​C語言​​。于是,Ken Thompson 與Dennis Ritchie成功地用C語言重

​​

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

​​

Unix

寫了Unix的第三版核心。至此,Unix這個作業系統修改、移植相當便利,為Unix日後的普及打下了堅實的基礎。而Unix和C結合成為一個統一體,C與Unix很快成為世界的主導。

Unix的第一篇文章 “The UNIX Time Sharing System”由Ken Thompson和Dennis Ritchie于1974年7月的 The Communications of the ACM發表。這是UNIX與外界的首次接觸。結果引起了學術界的廣泛興趣并對其源碼索取,是以,Unix第五版就以“僅用于教育目的”的協定,提供給各大學作為教學之用,成為當時作業系統課程中的範例教材。各大學公司開始通過Unix源碼對Unix進行了各種各樣的改進和擴充。于是,Unix開始廣泛流行。

在嚴格意義上,可将作業系統定義為一種軟體,它控制計算機硬體資源,提供程式運作環境,一般而言,我們稱此種軟體為核心(kenel),它相對較小,位于環境的中心。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

核心的接口被稱為系統調用(system call)。公用函數庫建構在系統調用接口之上,應用軟體既可使用公用函數庫,也可以使用系統調用。

Shell是一種特殊的應用程式,它提供接口來運作其他的應用程式。

廣義上來說,作業系統是核心和所有其他的軟體的集合,其讓一個計算機變得有用以及給計算機以個性。其他的軟體包括系統工具,應用程式,shells,通用函數庫等等。

Unix檔案系統是對儲存設備上的資料和中繼資料進行組織的機制。UNIX檔案系統是UNIX系統的心髒部分,提供了層次結構的目錄和檔案。

Unix核心基本上是按子產品進行設計的,比如檔案子系統,程序控制子系統等等,各個子系統相對比較獨立,但在有必要的時候又可以進行彼此的溝通交流。下圖就說明了早期Unix的系統核心架構。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

檔案子系統概要

什麼是檔案系統?

檔案系統是一個邏輯(看不見,摸不着)上的概念,而磁盤是一個實體(真實存在,看得見,摸得着)上的概念。

一套系統裝置可以有若幹個實體磁盤裝置,每一個實體裝置上可以包含一個或者多個檔案系統(如下圖所示),當然也可以不包含任何檔案系統(那你買它幹啥?)。下面涉及到的檔案系統都是在 Unix 上的。

Unix核心在邏輯上隻涉及檔案系統,屏蔽了磁盤,一個檔案系統就是一一個邏輯裝置,每個邏輯裝置(或檔案系統)由一個邏輯裝置号進行辨別。這些邏輯裝置被映射到實體裝置(磁盤)上,由磁盤驅動程式負責将邏輯裝置位址映射到實體裝置位址。一個實體裝置(磁盤)可以被分成好幾個邏輯裝置,可以使我們更好的管理我們的資料。

一個檔案系統由一個邏輯塊序列組成,塊大小可以為512位元組、1024位元組等(n*512位元組)。一個檔案系統中的每個邏輯塊大小是相同的,而不同的檔案系統間的邏輯塊大小可能會因為系統的配置而各不相同(如下圖所示)。核心在磁盤操作中以塊大小為基本機關進行資料的傳輸,而不是以磁盤上的扇區為基本機關。

一個檔案系統的結構包括引導塊(boot block)、超級塊(super block)、索引節點表(inode list)以及資料塊(data blocks)(如下圖所示)。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

引導塊:在檔案系統的開頭,典型地一般為一個扇區。如果作業系統裝在該檔案系統中,則該塊包含了引導或初啟作業系統的引導代碼。如果沒該檔案系統沒安裝作業系統,則這個塊的内容可能是空的。

超級塊:相當于是儲存了檔案系統的中繼資料資訊,描述檔案系統的狀态,比如它有多大,何處有空閑空間以及其他一些資訊等等。(可通過 $ tune2fs -l 檔案系統來檢視檔案系統的超級塊的内容,需要root權限)

索引節點表:相當于是索引節點的一個數組,核心所引用的索引節點号即是索引節點在該數組中的下标大小。類似于檔案的中繼資料資訊。每個檔案都有一個索引節點,但是一個索引節點可以對應幾個檔案名字,每個名字被稱為一個連結(link)。核心實作檔案名到索引節點的解析。

資料塊:真正存放資料的地方。目錄(PS:也是一個檔案)在資料塊中儲存的資料是一系列的索引節點 <-> 檔案名的 item。

核心中維護着三種表結構,分别是使用者檔案描述符表(user file descriptor table)、檔案表(file table)和索引節點表(inode table)。

使用者檔案描述符表:每個程序被單獨配置設定一個。該表辨別着一個程序的所有打開的檔案。對于系統調用 open和系統調用 creat,核心傳回一個檔案描述符(file descriptor),它是在使用者檔案描述符表中的索引值(每次調用這兩個函數中的任意一個時,核心傳回該使用者檔案描述表中可用的最小的表項的索引值,如果調用系統調用close時,核心會釋放傳遞給close的檔案描述符所對應的表項,使該表項重新可用)。0、1和2這三個檔案描述符分别表示标準輸入檔案、标準輸出檔案和标準錯誤輸出檔案。

檔案表:是一個全局核心結構。檔案表儲存着檔案中的位元組偏移量(下一次讀或寫的位置),并儲存着對打開的程序所允許的存取權限。

索引節點表:也是一個全局核心結構。索引節點被存儲在檔案系統中(磁盤上),但是當操縱檔案的時候,核心把它們讀到記憶體索引節點表中。

當一個程序打開或建立一個檔案時,核心在每個表中為相應于該檔案的索引節點配置設定一個表項,用這三種結構表中的表項來維護檔案的狀态及使用者對它的存取。使用這三張表,可以實作對一個檔案的不同程度的存取共享。下圖表示了這三張表即它們之間的互相關系。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

Linux

​​https://www.linux.org/​​

随後出現了各種版本的 UNIX 系統,目前常見的有 Sun Solaris、FreeBSD、IBM AIX、HP-UX 等。

Solaris 和 FreeBSD

我們重點介紹一下 Solaris,它是 UNIX 系統的一個重要分支。Solaris 除可以運作在 SPARC CPU 平台上外,還可以運作在 x86 CPU 平台上。在伺服器市場上,Sun 的硬體平台具有高可用性和高可靠性,是市場上處于支配地位的 UNIX 系統。

對于難以接觸到 Sun SPARC 架構計算機的使用者來說,可以通過使用 Solaris x86 來體驗世界知名大廠的商業 UNIX 風采。當然,Solaris x86 也可以用于實際生産應用的伺服器,在遵守 Sun 的有關許可條款的情況下,Solaris x86 可以免費用于學習研究或商業應用。

FreeBSD 源于美國加利福尼亞大學伯克利分校開發的 UNIX 版本,它由來自世界各地的志願者開發和維護,為不同架構的計算機系統提供了不同程度的支援。FreeBSD 在 BSD 許可協定下釋出,允許任何人在保留版權和許可協定資訊的前提下随意使用和發行,并不限制将 FreeBSD 的代碼在另一協定下發行,是以商業公司可以自由地将 FreeBSD 代碼融入它們的産品中。蘋果公司的 OS  X 就是基于 FreeBSD 的作業系統。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

FreeBSD 與 Linux 的使用者群有相當一部分是重合的,二者支援的硬體環境也比較一緻,所采用的軟體也比較類似。FreeBSD 的最大特點就是穩定和高效,是作為伺服器作業系統的不錯選擇;但其對硬體的支援沒有 Linux 完備,是以并不适合作為桌面系統。

Linux 的那些往事

Linux作業系統的誕生、發展和成長過程始終依賴着五個重要支柱:Unix作業系統、​​MINIX​​​作業系統、​​GNU​​​計劃、​​POSIX​​标準和Internet網絡。

20世紀80年代,計算機硬體的性能不斷提高,PC的市場不斷擴大,當時可供計算機選用的作業系統主要有Unix、DOS和MacOS這幾種。Unix價格昂貴,不能運作于​​PC​​​;​​DOS​​顯得簡陋,且源代碼被軟體廠商嚴格保密;

​​MacOS​​​是一種專門用于蘋果計算機的作業系統。此時,計算機科學領域迫切需要一個更加完善、強大、廉價和完全開放的作業系統。由于供教學使用的典型作業系統很少,是以當時在荷蘭當教授的美國人AndrewS.Tanenbaum編寫了一個作業系統,名為​​MINIX​​,為了向學生講述作業系統内部工作原理。MINIX雖然很好,但隻是一個用于教學目的的簡單作業系統,而不是一個強有力的實用作業系統,然而最大的好處就是公開源代碼。

全世界學計算機的學生都通過鑽研MINIX源代碼來了解電腦裡運作的MINIX作業系統,芬蘭赫爾辛基大學大學二年級的學生Linus Torvalds就是其中一個,在吸收了MINIX精華的基礎上,Linus于1991年寫出了屬于自己的Linux作業系統,版本為Linux0.01,是Linux時代開始的标志。他利用Unix的核心,去除繁雜的核心程式,改寫成适用于一般計算機的x86系統,并放在網絡上供大家下載下傳,1994年推出完整的核心Version1.0,至此,Linux逐漸成為功能完善、穩定的作業系統,并被廣泛使用。

Linux 核心最初是由李納斯•托瓦茲(Linus Torvalds)在赫爾辛基大學讀書時出于個人愛好而編寫的,當時他覺得教學用的迷你版 UNIX 作業系統 Minix 太難用了,于是決定自己開發一個作業系統。第 1 版本于 1991 年 9 月釋出,當時僅有 10 000 行代碼。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

李納斯•托瓦茲沒有保留 Linux 源代碼的版權,公開了代碼,并邀請他人一起完善 Linux。與 Windows 及其他有專利權的作業系統不同,Linux 開放源代碼,任何人都可以免費使用它。

據估計,現在隻有 2% 的 Linux 核心代碼是由李納斯•托瓦茲自己編寫的,雖然他仍然擁有 Linux 核心(作業系統的核心部分),并且保留了選擇新代碼和需要合并的新方法的最終裁定權。現在大家所使用的 Linux,我更傾向于說是由李納斯•托瓦茲和後來陸續加入的衆多 Linux 好者共同開發完成的。

李納斯•托瓦茲無疑是這個世界上最偉大的程式員之一,何況,他還搞出了全世界最大的程式員交友社群 ​​​GitHub​​​ (開源代碼庫及版本控制系統)。

關于 Linux Logo 的由來是一個很有意思的話題,它是一隻企鵝。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

為什麼選擇企鵝,而不是選擇獅子、老虎或者小白兔?有人說因為李納斯•托瓦茲是芬蘭人,是以選擇企鵝,有人說因為其他動物圖案都被用光了,李納斯•托瓦茲隻好選擇企鵝。

我更願意相信以下說法,企鵝是南極洲的标志性動物,根據國際公約,南極洲為全人類共同所有,不屬于世界上的任何國家,可國家都無權将南極洲納入其版圖。Linux 選擇企鵝圖案作為 Logo,其含義是:開放源代碼的 Linux 為全人類共同所有,可公司無權将其私有。

UNIX與Linux的親密關系

二者的關系,不是大哥和小弟,"UNIX 是 Linux 的父親"這個說法更怡當。之是以要介紹它們的關系,是因為要告訴讀者,在學習的時候,其實 Linux 與 UNIX 有很多的共通之處,簡單地說,如果你已經熟練掌握了 Linux,那麼再上手使用 UNIX 會非常容易。

二者也有兩個大的差別:

  1. UNIX 系統大多是與硬體配套的,也就是說,大多數 UNIX 系統如 AIX、HP-UX 等是無法安裝在 x86 伺服器和個人計算機上的,而 Linux 則可以運作在多種硬體平台上;
  2. UNIX 是商業軟體,而 Linux 是開源軟體,是免費、公開源代碼的。

Linux 受至曠大計算機愛好者的喜愛,主要原因也有兩個:

  1. 它屬于開源軟體,使用者不用支付可費用就可以獲得它和它的源代碼,并且可以根據自己的需要對它進行必要的修改,無償使用,無限制地繼續傳播;
  2. 它具有 UNIX 的全部功能,任何使用 UNIX 作業系統或想要學習 UNIX 作業系統的人都可以從 Linux 中獲益。

開源軟體是不同于商業軟體的一種模式,從字面上了解,就是開放源代碼,大家不用擔心裡面會搞什麼存在某種問題或陰謀,這會帶來軟體的革新和安全。

另外,開源其實并不等同于免費,而是一種新的軟體盈利模式。目前很多軟體都是開源軟體,對計算機行業與網際網路影響深遠。

近年來,Linux 已經青出于藍而勝于藍,以超常的速度發展,從一個醜小鴨變成了一個擁有龐大使用者群的真正優秀的、值得信賴的作業系統。曆史的車輪讓 Linux 成為 UNIX 最優秀的傳承者。

總結一下 Linux 和 UNIX 的關系/差別

Linux 是一個類似 Unix 的作業系統,Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和使用者體驗上進行優化,是以 Linux 模仿了 UNIX(但并沒有抄襲 UNIX 的源碼),使得 Linux 在外觀和互動上與 UNIX 非常類似。

說模仿可能會被人噴,你也可以說微創新或者改進。

相比于 UNIX,Linux 最大的創新是開源免費,這是它能夠蓬勃發展的最重要原因;而目前的 UNIX 大部分都是收費的,小公司和個人都難以承受。

正是由于 Linux 和 UNIX 有着千絲萬縷的聯系,是以人們把 Linux 叫做“​​​類UNIX系統​​”,下節我們将會着重講解。

UNIX/Linux系統結構

UNIX/Linux 系統可以粗糙地抽象為 3 個層次(所謂粗糙,就是不夠細緻、精準,但是便于初學者抓住重點了解),如圖所示。底層是 UNIX/Linux 作業系統,即系統核心(Kernel);中間層是 ​​Shell​​ 層,即指令解釋層;高層則是應用層。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

UNIX/Linux 系統結掏層次概要

1) 核心層

核心層是 UNIX/Linux 系統的核心和基礎,它直接附着在硬體平台之上,控制和管理系統内各種資源(硬體資源和軟體資源),有效地組織程序的運作,進而擴充硬體的功能,提高資源的利用效率,為使用者提供友善、高效、安全、可靠的應用環境。

2) Shell層

Shell 層是與使用者直接互動的界面。使用者可以在提示符下輸入指令行,由 Shell 解釋執行并輸出相應結果或者有關資訊,是以我們也把 Shell 稱作指令解釋器,利用系統提供的豐富指令可以快捷而簡便地完成許多工作。

3) 應用層

應用層提供基于 X Window 協定的圖形環境。X Window 協定定義了一個系統所必須具備的功能(就如同 TCP/IP 是一個協定,定義軟體所應具備的功能),可系統能滿足此協定及符合 X 協會其他的規範,便可稱為 X Window。

現在大多數的 UNIX 系統上(包括 Solaris、HP-UX、AIX 等)都可以運作 CDE (Common Desktop Environment,通用桌面環境,是運作于 UNIX 的商業桌面環境)的使用者界面;而在 Linux 上廣泛應用的有 Gnome、KDE 等。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

Gnome圖形界面

X Window 與微軟的 Windows 圖形環境有很大的差別:

  • UNIX/Linux 系統與 X Window 沒有必然捆綁的關系,也就是說,UNIX/Linux 可以安裝 X Window,也可以不安裝;而微軟的 Windows 圖形環境與核心捆綁密切。
  • UNIX/Linux 系統不依賴圖形環境,依然可以通過指令行完成 100% 的功能,而且因為不使用圖形環境還會節省大量的系統資源。

Linux 的發行版

Linux 的發行版說簡單點就是将 Linux 核心與應用軟體做一個打包。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

目前市面上較知名的發行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

Linux 應用領域:

今天各種場合都有使用各種 Linux 發行版,從嵌入式裝置到超級計算機,并且在伺服器領域确定了地位

Linux 檔案系統

盡管大多數檔案系統代碼在核心中(後面讨論的使用者空間檔案系統除外),但是圖 1 所示的體系結構顯示了使用者空間和核心中與檔案系統相關的主要元件之間的關系。

圖 1. Linux 檔案系統元件的體系結構

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

使用者空間包含一些應用程式(例如,檔案系統的使用者)和 GNU C 庫(glibc),它們為檔案系統調用(打開、讀取、寫和關閉)提供使用者接口。系統調用接口的作用就像是交換器,它将系統調用從使用者空間發送到核心空間中的适當端點。

VFS 是底層檔案系統的主要接口。這個元件導出一組接口,然後将它們抽象到各個檔案系統,各個檔案系統的行為可能差異很大。有兩個針對檔案系統對象的緩存(inode 和 dentry)。它們緩存最近使用過的檔案系統對象。

每個檔案系統實作(比如 ext2、JFS 等等)導出一組通用接口,供 VFS 使用。緩沖區緩存會緩存檔案系統和相關塊裝置之間的請求。例如,對底層裝置驅動程式的讀寫請求會通過緩沖區緩存來傳遞。這就允許在其中緩存請求,減少通路實體裝置的次數,加快通路速度。以最近使用(LRU)清單的形式管理緩沖區緩存。注意,可以使用 ​

​sync​

​ 指令将緩沖區緩存中的請求發送到存儲媒體(迫使所有未寫的資料發送到裝置驅動程式,進而發送到儲存設備)。

這就是 VFS 和檔案系統元件的高層情況。現在,讨論實作這個子系統的主要結構。

主要結構

Linux 以一組通用對象的角度看待所有檔案系統。這些對象是超級塊(superblock)、inode、dentry 和檔案。超級塊在每個檔案系統的根上,超級塊描述和維護檔案系統的狀态。檔案系統中管理的每個對象(檔案或目錄)在 Linux 中表示為一個 inode。inode 包含管理檔案系統中的對象所需的所有中繼資料(包括可以在對象上執行的操作)。另一組結構稱為 dentry,它們用來實作名稱和 inode 之間的映射,有一個目錄緩存用來儲存最近使用的 dentry。dentry 還維護目錄和檔案之間的關系,進而支援在檔案系統中移動。最後,VFS 檔案表示一個打開的檔案(儲存打開的檔案的狀态,比如寫偏移量等等)。

虛拟檔案系統層

VFS 作為檔案系統接口的根層。VFS 記錄目前支援的檔案系統以及目前挂裝的檔案系統。

可以使用一組注冊函數在 Linux 中動态地添加或删除檔案系統。核心儲存目前支援的檔案系統的清單,可以通過 /proc 檔案系統在使用者空間中檢視這個清單。這個虛拟檔案還顯示目前與這些檔案系統相關聯的裝置。在 Linux 中添加新檔案系統的方法是調用 ​

​register_filesystem​

​​。這個函數的參數定義一個檔案系統結構(​

​file_system_type​

​)的引用,這個結構定義檔案系統的名稱、一組屬性和兩個超級塊函數。也可以登出檔案系統。

在注冊新的檔案系統時,會把這個檔案系統和它的相關資訊添加到 file_systems 清單中(見圖 2 和 linux/include/linux/mount.h)。這個清單定義可以支援的檔案系統。在指令行上輸入 ​

​cat /proc/filesystems​

​,就可以檢視這個清單。

圖 2. 向核心注冊的檔案系統

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

VFS 中維護的另一個結構是挂裝的檔案系統(見圖 3)。這個結構提供目前挂裝的檔案系統(見 linux/include/linux/fs.h)。它連結下面讨論的超級塊結構。

圖 3. 挂裝的檔案系統清單

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

超級塊

超級塊結構表示一個檔案系統。它包含管理檔案系統所需的資訊,包括檔案系統名稱(比如 ext2)、檔案系統的大小和狀态、塊裝置的引用和中繼資料資訊(比如空閑清單等等)。超級塊通常存儲在存儲媒體上,但是如果超級塊不存在,也可以實時建立它。可以在 ./linux/include/linux/fs.h 中找到超級塊結構(見圖 4)。

圖 4. 超級塊結構和 inode 操作

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

超級塊中的一個重要元素是超級塊操作的定義。這個結構定義一組用來管理這個檔案系統中的 inode 的函數。例如,可以用 ​

​alloc_inode​

​​ 配置設定 inode,用 ​

​destroy_inode​

​​ 删除 inode。可以用 ​

​read_inode​

​​ 和 ​

​write_inode​

​​ 讀寫 inode,用 ​

​sync_fs​

​​ 執行檔案系統同步。可以在 ./linux/include/linux/fs.h 中找到 ​

​super_operations​

​ 結構。每個檔案系統提供自己的 inode 方法,這些方法實作操作并向 VFS 層提供通用的抽象。

inode 和 dentry

inode 表示檔案系統中的一個對象,它具有惟一辨別符。各個檔案系統提供将檔案名映射為惟一 inode 辨別符和 inode 引用的方法。圖 5 顯示 inode 結構的一部分以及兩個相關結構。請特别注意 ​

​inode_operations​

​​ 和 ​

​file_operations​

​​。這些結構表示可以在這個 inode 上執行的操作。​

​inode_operations​

​​ 定義直接在 inode 上執行的操作,而 ​

​file_operations​

​ 定義與檔案和目錄相關的方法(标準系統調用)。

圖 5. inode 結構和相關聯的操作

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

inode 和目錄緩存分别儲存最近使用的 inode 和 dentry。注意,對于 inode 緩存中的每個 inode,在目錄緩存中都有一個對應的 dentry。可以在 ./linux/include/linux/fs.h 中找到 ​

​inode​

​​ 和 ​

​dentry​

​ 結構。

緩沖區緩存

除了各個檔案系統實作(可以在 ./linux/fs 中找到)之外,檔案系統層的底部是緩沖區緩存。這個元件跟蹤來自檔案系統實作和實體裝置(通過裝置驅動程式)的讀寫請求。為了提高效率,Linux 對請求進行緩存,避免将所有請求發送到實體裝置。緩存中緩存最近使用的緩沖區(頁面),這些緩沖區可以快速提供給各個檔案系統。

有趣的檔案系統

本文沒有讨論 Linux 中可用的具體檔案系統,但是值得在這裡稍微提一下。Linux 支援許多種檔案系統,包括 MINIX、MS-DOS 和 ext2 等老式檔案系統。Linux 還支援 ext3、JFS 和 ReiserFS 等新的日志型檔案系統。另外,Linux 支援加密檔案系統(比如 CFS)和虛拟檔案系統(比如 /proc)。

最後一種值得注意的檔案系統是 Filesystem in Userspace(FUSE)。這種檔案系統可以将檔案系統請求通過 VFS 發送回使用者空間。是以,如果您有興趣建立自己的檔案系統,那麼通過使用 FUSE 進行開發是一種不錯的方法。

結束語

盡管檔案系統的實作并不複雜,但它是可伸縮和可擴充的體系結構的好例子。檔案系統體系結構已經發展了許多年,并成功地支援了許多不同類型的檔案系統和許多目标儲存設備類型。由于使用了基于插件的體系結構和多層的函數間接性。

Windows

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

windows作業系統發展史:

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

上面這個系統結構圖在很多書上都有,它就是windows2000的結構圖,下面我們就來詳細說說各個部分的功能:

      從上圖我們可以看出,在使用者态,windows2000有三個子系統,分别為win32,posix,os/2.其中最重要的就是win32,它負責輸入輸出管理,沒有它,系統将無法工作,其它兩個子系統需要配置才能啟動。我們主要精力放在win32上,因為這是我們用的最廣的。我們要特别注意以下三個關鍵點:子系統程序,子系統動态連結庫,使用者程序。

   (1) 子系統程序:win32子系統在windows2000中是以一個程序的形式出現的(csrss.exe)。它負責所有win32使用者程序,線程的建立與撤消,建立與撤消臨時檔案,以及控制台的管理。

   (2)子系統動态連結庫:win32子系統用的動态連結庫,裡面有子系統所需要的大部分功能。

    (3)使用者建立的運作于wn32子系統之上的應用程式。

   使用者程序并不直接地調用系統服務,它們直接調用子系統動态連結庫,當一個程式調用子系統動态連結庫的一個功能時,可能會發生以下三中情形之一:

   (1)所要求的功能全部是由子系統動态連結庫提供,也就是說程式完全運作于使用者态。

   (2)需要調用一個或者多個運作于核心态的服務。

   (3)需要子系統程序的協助才能完成,這時,使用者程序向子系統程序發送一C/S請求,具體工作由子系統程序來完成。

 特别說明,當使用者程序調用系統服務時實際上是通過設定一個陷阱陷入到核心态來運作,将運作權交給系統服務排程程式來排程,并不用通過建立新的程序,線程來實作。

ntdll.dll

子系統下面是 ntdll.dll,它提供了一些子系統動态連結庫所需要的功能。其實,NTDLL.DLL的最主要功能就是為它的下層---執行體提供一個文檔化接口,使得它以上的各個子產品可以調用執行體提供的服務。

執行體:

      這是令人激動的一層,因為從這層開始我們就進入了windows的核心态,雖然我們對核心态的具體含義不是太清楚,沒有關系,随着我們研究的深入你就會慢慢發現這是最重要的一層,因為所有windows的主要功能都是在這裡完成的,下面我們就一點一點剖開:

     這一層包含以下幾種重要函數(服務):

(1)可以從使用者态直接調用的函數,這些在NTDLL中文檔化(前面已說過),這些中大多數都可以調用某個WIN32 API來啟動所對應的服務。

(2)隻能從核心态調用的函數,其中有一些在DDK中已文檔化,編寫windows上驅動程式的人員必須熟悉的

(3)沒有文檔化的函數,供執行體内部使用

執行體從總體上可以分為以下幾個子產品:

(1)配置管理器:負責管理系統資料庫,我們以後會詳解

(2)程序、線程管理器:負責建立和終止程序、線程。

(3)安全引用螢幕:在本地計算機上執行安全政策,保護計算機的資源

(4)I/O管理器:實作I/O的裝置無關性,并負責把I/O請求配置設定給相應的裝置驅動程式以進一步處理

(5)即插即用管理器(PNP):确定裝置應該由哪個驅動程式來支援并負責加載相應驅動。在啟動時的枚舉過程中,它收集每個裝置所需要的硬體資源,并根據裝置的需要來配置設定合适的硬體資源如I/O端口,IRQ,DMA通道之類,當系統中的裝置發生變化時它負責向系統和應用程式發送通知消息。

(6)電源管理:協調電源時間,通過合理的配置,使得CPU降低電源消耗

(7)緩沖管理器:将最近使用過的資料留在CACHE中來提高系統的整體性能

(8)虛拟記憶體管理:這是最為讓人激動的地方,對于這個部分的了解會影響我們對整個系統結構的了解,我們會在以後詳細解說

(9)WDM管理方法例程:可以讓裝置驅動程式釋出性能和配置資訊以及從使用者态的WMI服務接受指令

         在WINDOWS平台上有過程式設計經曆的人一定對句柄(handle)不陌生,句柄到底是什麼樣的東東呢??這往往給一些初學者帶來一些迷惑。其實要真正了解句柄就要從windows的設計理念上來解決這個問題,那就是wndows是面向對象的,它把系統的一些資源,程序,檔案等都看成對象,用對象管理器對這些對象統一管理。對于使用者來說是通過句柄來操作響應對象的,可以看成是對象的一個引用。

核心:

     核心是執行體的下一個層次,它為執行體提供一些最基本的功能,簡單的對象,而執行體就通過在這些簡單對象上加上一些安全屬性,控制屬性等來完成更為複雜的功能。它重要提供以下四種函數:

(1)線程排程

(2)陷阱處理和異步排程

(3)中斷處理和排程

(4)多處理器同步

   核心提供了一個低層次的系統原語和機制供執行體來調用以實作其功能。核心隻是提供了底層的機制,而不做任何政策性的事務。但線程的排程和異常處理是在核心中實作的,核心永遠都運作在核心态。

   一類對象叫做控制對象,包括APC,DPC對象以及I/O要用到的對象,如中斷對象。

   一類對象叫做排程對象,用于線程排程。這些對象包括線程,互斥體,事件,核心事件對,信号量,定時器,可等待定時器。

   硬體支援:

   核心的另一主要功能是使得執行體和裝置驅動獨立于硬體,這個工作包含處理多個方面的差異:中斷處理,異常處理,多處理器同步方式的差異

硬體抽象層(HAL):

   這是windows2000實作其可移植性最重要的組成部分,HAL是一個可加載的核心态子產品(HAL.DLL),它提供了windows2000所運作的硬體平台的底層接口,HAL隐藏了各種與硬體有關的細節,比如I/O接口、中斷控制器、多處理通信機制等----這些都是平台相關的。當需要平台相關的資訊時,windows2000的内部子產品或者使用者程式通過HAL來實作。

裝置驅動程式:

    裝置驅動程式是核心态可加載子產品(以.SYS為擴充名),它們是I/O管理器和相關硬體裝置的接口。它們運作于以下三種環境之一:

    (1) 在一個初始化了I/O函數的使用者線程環境中

    (2) 在核心模式的系統線程中

    (3) 中斷發生後(不在任何程序和線程中運作,中斷發生時哪一個程序或者線程正在運作)

    如前所述,windows2000的裝置驅動程式并不直接操作硬體,而是調用HAL中的函數作為與硬體的接口。驅動程式通常用C語言寫(有時用C++)。是以,裝置驅動程式通過使用HAL可以實作平台無關性。

     有以下幾中裝置驅動程式:

    (1)硬體驅動程式:實作對實體硬體的讀寫(通過使用HAL)。

    (2)檔案系統驅動程式:是面向檔案I/O的驅動程式,它把這些請求轉化成綁定到特定裝置的I/O請求

    (3)檔案過濾器驅動程式

    (4)網絡重定向驅動程式

    (5)協定驅動程式

    (6)核心流過濾器驅動程式

  因為安裝驅動程式是把使用者編寫的使用者态代碼添加到系統的唯一辦法,是以,一些程式員通過編寫裝置驅動程式可以通路OS的内部函數或者内部資料結構。

Android

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介
  • Android System Structure. Underscore the concept of service
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介
  • Android's procedures of starting up.
【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

iOS

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

iOS基于UNIX系統,iOS的系統架構分為四層,由上到下一次為:可觸摸層(Cocoa Touch layer)、媒體層(Media layer)、核心服務層(Core Services layer)、核心作業系統層(Core OS layer),如下圖:

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

(1)觸摸層:為應用程式開發提供了各種常用的架構并且大部分架構與界面有關,本質上來說它負責使用者在iOS裝置上的觸摸互動操作。如NotificationCenter的本地通知和遠端推送服務,iAd廣告架構,GameKit遊戲工具架構,消息UI架構,圖檔UI架構,地圖架構,連接配接手表架構,自動适配等等

(2)媒體層:提供應用中視聽方面的技術,如圖形圖像相關的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO等等。聲音技術相關的CoreAudio,OpenAL,AVFoundation,視訊相關的CoreMedia,Media Player架構,音視訊傳輸的AirPlay架構等等。

(3)核心服務層:提供給應用所需要的基礎的系統服務。如Accounts賬戶架構,廣告架構,資料存儲架構,網絡連接配接架構,地理位置架構,運動架構等等。這些服務中的最核心的是CoreFoundation和Foundation架構,定義了所有應用使用的資料類型。CoreFoundation是基于C的一組接口,Foundation是對CoreFoundation的OC封裝。

(4)核心作業系統層包括:包含大多數低級别接近硬體的功能,它所包含的架構常常被其它架構所使用。Accelerate架構包含數字信号,線性代數,圖像處理的接口。針對所有的iOS裝置硬體之間的差異做優化,保證寫一次代碼在所有iOS裝置上高效運作。CoreBluetooth架構利用藍牙和外設互動,包括掃描連接配接藍牙裝置,儲存連接配接狀态,斷開連接配接,擷取外設的資料或者給外設傳輸資料等等。Security架構提供管理證書,公鑰和私鑰信任政策,keychain,hash認證數字簽名等等與安全相關的解決方案。 

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

 架構是一個目錄,這個目錄包含了共享庫,通路共享庫裡代碼的頭檔案,和其它的圖檔和聲音的資源檔案。一個共享庫定義的方法或函數可以被應用程式調用。

       IOS提供了很多你可以在應用程式裡調用的架構。要使用一個架構,需要将它添加到你的項目中,你的項目才可以使用它。許多應用程式都使用了如Foundation、UIKit、和Core Graphics這些架構。根據你為應用程式選擇的模版,相關的架構就已經被自動引入了。如果預設加入的架構不能滿足你的應用程式的需求,你也可以加入需要的架構。

       看看HelloWorld.xcodeproj項目裡都包含了哪些架構(注:HelloWorld.xcodeproj是《Your First iOS App tutorial 》這篇教程裡的一個項目)

       1.在XCode裡打開HelloWorld.xcodeproj項目(如果還沒有打開)

       2. 在project navigator視窗裡點選,點選Frameworks目錄前面的三角形圖示。你會看到:

            UIKit.framework,Foundation.framework, 和CoreGraphics.framework

       3. 點選任意一個framework前面的三角,然後再點選Headers前面的三角,可以看到架構裡的頭檔案。

        每個架構對應IOS系統裡的一層,每層建立在它下面層的上面。應該盡量使用上層的架構來代替下面的架構。更高層次的架構是對底層架構基于對象的抽象。

【“計算機科學與技術”專業小白成長系列】 計算機作業系統簡介

iOS應用程式基于Foundation和UIKit架構

       在你開發程式時,主要使用架構就是Foundation和UIKit,因為它們包含了你需要的大部分東西。

Foundation架構為所有的應用程式提供基本系統服務

        你的應用程式,UIKit和其它的架構都是建立在Foundation架構上面的。Foundation架構是用Object-C對Core Foundation架構裡許多特性的封裝。

       使用Foundation可以:

  • 建立和管理集合,比如數組和字典
  • 通路存儲在應用程式裡的圖檔和其它資源
  • 建立和管理字元串
  • 送出和接收通知
  • 建立日期和時間對象
  • 自動發現IP網絡上的裝置
  • 操作URL流
  • 執行異步代碼

      你已經在《Your First iOS App》裡使用到了Foundation架構。比如,你使用一個NSString類的執行個體存儲使用者輸入的userName。你還使用了Foundation架構的initWithFormat方法建立了一個字元串。

UIKit架構提供建立基于觸摸使用者界面的類

      所有的iOS應用程式都基于UIKit,你不能是應用程式脫離這個架構。UIKit提供了在螢幕上繪制的機制,捕獲事件,和建立通用使用者界面元素。UIKit也通過管理顯示在螢幕上的元件來組織複雜的項目。

      使用UIKit可以:

  • 建構和管理你的使用者界面
  • 捕獲觸摸和基于移動的事件
  • 呈現文字和web内容
  • 優化你的多任務程式
  • 建立定制的使用者界面元素

     在《YouFirst iOS App Tutorial》裡,你也使用到了UIKit。當你仔細檢視程式是怎麼運作起來的時候,你會看到UIApplicationMain函數建立一個UIApplication類的執行個體,這個執行個體會捕獲進來的使用者事件。你實作UITextFieldDelegate協定,然後在使用者按下Done時隐藏鍵盤。實際上,你是在使用UIKit建立使用者界面上的UITextField, UILabel,和UIButton類。

你需要知道的其它重要的架構

Core Data , Core Graphics, Core Animation,和OpenGLES架構都是進階的技術。是以這些架構對于你開發應用程式也是很重要的,它們都需要時間去學習和掌握。

Core Data架構管着理應用程式資料模型

         Core Data提供對象的管理,使用Core Data,你可以建立模型對象,并管理這些對象。你管理這這些對象間的聯系并修改資料。Core Data提供的内建SQLlite技術可以高效的管理資料。

         使用Core Data可以:

  • 在庫裡存儲和接收對象
  • 提供基本的undo/redo
  • 自動驗證屬性值
  • 過濾、分組和優化記憶體中的資料
  • 用[NSFetchedResultsController]管理表視圖中的結果
  • 支援基于文檔的應用程式

Core Graphics架構幫助你建立圖形

       高品質的圖形對于所有的iOS應用程式都是很重要的。在iOS中最簡單且最快捷的建立圖形的方式是使用UIKit架構提供的基于預渲染圖形的視圖和控件,然後讓UIKit和iOS完成繪制。但是當你需要建立複雜的圖形時,Core Graphics則提供了更底層的庫來幫助你。

       使用Core Graphics可以:

  • 建立基于路徑的繪圖
  • 抗鋸齒渲染
  • 添加梯度、圖檔和顔色
  • Use coordinate-space transformations.
  • 建立、顯示和分析PDF文檔

Core Animation允許你建立進階的動畫和虛拟效果

           UIKit提供建立在Core Animation之上的動畫。如果你需要比UIKit能力更進階的功能,可以直接使用Core Animation。Core Animation接口包含在Quartz Core架構裡。使用Core Animation可以建立嵌套的對象,并且可以對它們操作、旋轉、縮放和轉換。使用Core animation,你可以建立動态的使用者界面而不用使用更底層的圖形API,如OpenGL ES。

           使用Core Animation可以:

  • 建立定制動畫
  • 添加定時函數和圖形
  • 支援幀動畫
  • Specify graphical layout constraints.
  • Group multiple-layer changes into anatomic update.

OpenGL ES 架構提供2D和3D繪圖工具

OpenGL ES支援2D和3D繪圖,Apple的OpenGL ES實作通過硬體提供了高速的全屏遊戲式的應用程式。

           使用OpenGL ES可以:

  • 建立2D和3D圖形
  • 建立更複雜的圖形,比如資料虛拟化、模拟飛行,或者視訊遊戲
  • 通路底層圖形裝置

根據需要向項目中添加其它架構

           還有許多架構可以添加到你的程式裡。當你決定使用一個架構但項目裡卻沒有引入這個架構時,你就需要将它加入到你的項目裡。

計算機科學與技術

數學基礎

高等數學

線性代數

機率論與數理統計

離散數學

數值分析

資料庫系統

計算機網絡

網絡安全

資料結構與算法

編譯原理

作業系統

是什麼?

  • operating system,OS。管理計算機硬體與軟體資源的程式。作業系統處理如管理與配置記憶體、決定系統資源供需的優先次序、控制輸入裝置與輸出裝置、操作網絡與管理檔案系統等基本事務。作業系統也提供一個讓使用者與系統互動的操作界面。

組成部分

  • 核心、驅動程式、接口庫、外圍

常見系統

  • Windows,macOS,Linux,iOS,Android

特 征:并發、共享、虛拟、異步

  • 并發:同一段時間内多個程式執行(注意差別并行和并發,前者是同一時刻的多個事件,後者是同一時間段内的多個事件)
  • 共享:系統中的資源可以被記憶體中多個并發執行的進線程共同使用
  • 虛拟:通過時分複用(如分時系統)以及空分複用(如虛拟記憶體)技術實作把一個實體實體虛拟為多個
  • 異步:系統中的程序是以走走停停的方式執行的,且以一種不可預知的速度推進

功 能:處理器管理、存儲器管理、裝置管理、檔案管理

  • ①程序管理,其工作主要是程序排程,在單使用者單任務的情況下,處理器僅為一個使用者的一個任務所獨占, 程序管理的工作十分簡單。但在多道程式或多使用者的情況 下,組織多個作業或任務時,就要解決處理器的排程、 配置設定和回收等問題 。
  • ②存儲管理分為幾種功能:存儲配置設定、存儲共享、存儲保護 、存儲擴張。
  • ③裝置管理分有以下功能:裝置配置設定、裝置傳輸控制 、裝置獨立性。
  • ④檔案管理:檔案存儲空間的管理、目錄管理 、檔案操作管理、檔案保護。
  • ⑤作業管理是負責處理使用者送出的任何要求。

基本類型:批處理系統、分時作業系統、實時操作系

統體系結構:子產品組合結構、層次結構、微核心結構

簡史

  • 批量模式
  • 分時機制
  • 多處理器
  • 分布式

設計哲學

  • 子產品化
  • 結構化
  • 通訊接口
  • 層次式結構

作業系統虛拟化

  • 容器的核心技術

作業系統執行個體

  • 嵌入式系統
  • VxWorks、eCos、Symbian OS及Palm OS
  • iOS
  • 以Darwin為基礎,屬于類Unix 的商業作業系統。
  • Android
  • 基于Linux
  • 類Unix系統
  • System V、BSD與Linux
  • 惠普的HP-UX以及IBM的AIX僅設計用于自家的硬體産品上
  • SUN的Solaris可安裝于自家的硬體或x86計算機上
  • 蘋果計算機的Mac OS X是一個從NeXTSTEP、Mach以及FreeBSD共同派生出來的微核心BSD系統
  • 微軟Windows
  • Microsoft Windows系列作業系統是在微軟給IBM機器設計的MS-DOS的基礎上設計的圖形作業系統。現在的Windows系統,如Windows 2000、Windows XP皆是建立于現代的Windows NT核心。NT核心是由OS/2和OpenVMS等系統上借用來的。
  • MacOS X
  • Mac OS是首個在商用領域成功的圖形使用者界面系統。Macintosh開發成員包括比爾·阿特金森(Bill Atkinson)、傑夫·拉斯金(Jef Raskin)和安迪·赫茨菲爾德(Andy Hertzfeld)。
  • Chrome OS
  • Google的輕型的、基于網絡的計算機作業系統計劃,其基于Google的浏覽器Google Chrome的Linux核心。

程序與線程

  • 程序
  • 1)PCB(Process Control Block):用來記錄程序資訊的資料結構(管理程序的核心,包含了PID等程序的所有關鍵資訊)
  • 2)程序的狀态:1:就緒狀态,2:執行狀态,3:阻塞狀态(多線程時也是這些狀态)
  • 3)隊列:就緒隊列、等待(阻塞)隊列。
  • 通信
  • 共享存儲
  • 消息傳遞
  • 管道通信:固定大小,半雙工通信,即某一時刻隻能單向傳輸。
  • 共享檔案
  • 線程
  • TCB(thread control block線程控制塊)
  • 包括PC程式計數器,SP棧,State狀态,和寄存器,線程id。

    線程有核心級線程和使用者級線程,我們一般說的都是使用者級線程,核心級線程由核心管理。

  • 發揮多核性能
  • 1)隻有核心級線程才能發揮多核性能,因為核心級線程共用一套MMU(即記憶體映射表),統一配置設定核1核2(即有多個CPU,可以一個CPU執行一個核心級線程)。程序無法發揮多核性能,因為程序切換都得切MMU。
  • 2)為什麼需要核心級線程?如果隻有使用者級線程,在核心中隻能看到程序,是以當使用者級線程中一個線程進行IO讀寫阻塞時,核心會将該線程所在的程序直接切換。
  • 使用者級線程
  • 核心級線程
  • 程序和線程的對比
  • 程序是系統進行資源排程和配置設定的基本機關;線程是CPU排程的基本機關。
  • 程序 = 資源 (包括寄存器值,PCB,記憶體映射表)+ TCB(棧結構)
  • 線程 = TCB(棧結構)
  • 線程 的資源是共享的
  • 程序 間的資源是分隔獨立的,記憶體映射表不同,占用實體記憶體位址是分隔的
  • 線程 的切換隻是切換PC,切換了TCB(棧結構)
  • 程序 的切換不僅要切換PC,還包括切換資源,即切換記憶體映射表
  • 程序間通信
  • 同步
  • 經典的程序同步問題:生産者-消費者問題;哲學家進餐問題;讀者-寫者問題
  • 同步的解決方案:管程,信号量。
  • 死鎖
  • 在兩個或多個并發程序中,如果每個程序持有某種資源而又都等待别的程序釋放它或它們現在保持着的資源,在未改變這種狀态之前都不能向前推進,稱這一組程序産生了死鎖。通俗地講,就是兩個或多個程序被無限期地阻塞、互相等待的一種狀态。
  • 産生條件:
  • 1:互斥條件:一個資源一次隻能被一個程序使用
  • 2:請求保持條件 : 一個程序因請求資源而阻塞時,對已經獲得資源保持不放
  • 3:不可搶占條件 : 程序已獲得的資源在未使用完之前不能強行剝奪
  • 4:循環等待條件 :若幹程序之間形成一種頭尾相接的循環等待資源的關系
  • 死鎖處理:
  • 預防死鎖:破壞産生死鎖的4個必要條件中的一個或者多個;實作起來比較簡單,但是如果限制過于嚴格會降低系統資源使用率以及吞吐量
  • 避免死鎖:在資源的動态配置設定中,防止系統進入不安全狀态(可能産生死鎖的狀态)-如銀行家算法
  • 檢測死鎖:允許系統運作過程中産生死鎖,在死鎖發生之後,采用一定的算法進行檢測,并确定與死鎖相關的資源和程序,采取相關方法清除檢測到的死鎖。實作難度大
  • 解除死鎖:與死鎖檢測配合,将系統從死鎖中解脫出來(撤銷程序或者剝奪資源)。對檢測到的和死鎖相關的程序以及資源,通過撤銷或者挂起的方式,釋放一些資源并将其配置設定給處于阻塞狀态的程序,使其轉變為就緒态。實作難度大
  • 死鎖忽略: windows,Linux個人版都不做死鎖處理,直接忽略,大不了重新開機就好了,小機率事件,代價可以接受
  • CPU排程算法:在就緒隊列中,怎麼挑選程序讓CPU執行?
  • 先來先服務排程算法FCFS:按作業或者程序到達的先後順序依次排程;(平均周轉時間可能會很長 )
  • 短作業優先排程算法SJF:算法從就緒隊列中選擇估計時間最短的作業進行處理,直到得出結果或者無法繼續執行(周轉時間短,但是響應時間長 )
  • 高相應比算法HRN:響應比=(等待時間+要求服務時間)/要求服務時間;
  • 時間片輪轉排程RR:按到達的先後對程序放入隊列中,然後給隊首程序配置設定CPU時間片,時間片用完之後計時器發出中斷,暫停目前程序并将其放到隊列尾部,循環 ;(響應時間可以得到保證)
  • 多級回報隊列排程算法:目前公認較好的排程算法;設定多個就緒隊列并為每個隊列設定不同的優先級,第一個隊列優先級最高,其餘依次遞減。優先級越高的隊列配置設定的時間片越短,程序到達之後按FCFS放入第一個隊列,如果排程執行後沒有完成,那麼放到第二個隊列尾部等待排程,如果第二次排程仍然沒有完成,放入第三隊列尾部…。隻有目前一個隊列為空的時候才會去排程下一個隊列的程序。

記憶體管理

  • 分段
  • 一個程式分成多個段(每個段特性不同為了友善管理,例如代碼段隻讀、資料段等等),當然這都是邏輯上的。
  • 管理段的結構叫段表,段表儲存中程序的PCB中。
  • 頁表
  • 把程式按段分對程式員是友好的,但是如果實體存儲也按段存,則會導緻大塊的記憶體碎片,例如現在需要分個10M的段但是連續的存儲空間隻有8M/9M/5M三個。
  • 解決辦法: 将段細化到頁 Page,存到頁中。不要對記憶體進行連續的配置設定,将記憶體劃分成1頁1頁,按頁配置設定,1頁4kb大小,最多浪費的也就4KB。這樣不會有記憶體碎片,也不會出現沒有符合要求大小的記憶體可以申請的情況,因為可以打散了分散到一頁一頁中。
  • 程序需要有自己的“頁表”,裡面映射雙方是程式的邏輯位址中的頁号和系統分給這給程式的頁框号。
  • 段頁結合的記憶體管理
  • 頁号加偏移稱為虛拟位址,MMU負載從虛拟位址到實體位址的轉換,同時也負責權限檢查。
  • 請求調頁記憶體換入
  • CPU對資料進行請求時,才會進行映射(虛拟記憶體到實體記憶體)。例如程序1正在運作,進行映射拿資料,查頁表發現頁框号中沒有資料或有程序2的資料,則需要頁表調入記憶體。
  • 記憶體換出
  • 有頁表需要調入,那麼誰被調出?
  • 頁面置換算法
  • 1:最佳置換算法(Optimal):一種理論的算法,選着淘汰的頁面是以後一定不再使用的頁面(理想化的),該算法無法實作,隻能作為其他算法好壞的一個評價對比。
  • 2:先進先出(FIFO)算法:總是最先淘汰最先進去的頁面,該算法容易實作。缺點:通常程式調入記憶體的先後順序和程式執行的先後順序不一緻,導緻缺頁率高。
  • 3:最近最久未使用算法LRU:算法賦予每個頁面一個通路字段,用來記錄上次頁面被通路到現在所經曆的時間t,每次置換的時候把t值最大的頁面置換出去(實作方面可以采用寄存器或者棧的方式實作)。
  • 4:時鐘算法clock(也被稱為是最近未使用算法NRU):頁面設定一個通路位R,并将頁面連結為一個環形隊列,頁面被通路的時候通路位設定R為1。頁面置換的時候,如果目前指針所指頁面通路R為0,那麼置換,否則将其置為0,循環直到遇到一個通路為位0的頁面。
  • 但是這個方法有缺點:缺頁比較少的時候(最近沒有使用淘汰中的“最近”太長了),所有的R都為1(很少變成0),每次都要轉一圈才能找到換出去的頁,退化成FIFO,效率不高。
  • 改進: 雙指針,一個快,一個慢,像時鐘一樣 (定時清除R位)(更像clock)
  • 快時鐘做R的清0定時清0,等到慢指針轉到這裡的時候R=0,說明在定時時間片内沒有備通路,該頁可以被替換了。

軟體工程

電路原理

模拟電子技術

數字邏輯系統

微機原理

系統仿真和虛拟現實

大資料技術

資料采集與處理

Web前/後端開發

機器學習&人工智能

自然語言處理

繼續閱讀