天天看點

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決.

這句話幾乎概括了計算機軟體體系結構的設計要點.整個體系從上到下都是按照嚴格的層級結構設計的.

而這個中間層通過​

​映射​

​來連接配接上下文.

不僅是計算機系統的整個體系是這麼設計的, 體系裡面的每個元件,比如作業系統,很多應用程式甚至很多硬體系統結構都是按照階層化的結構來設計的.

遺憾的是,這句經典的名言出處無從考證.

本文就此展開.

計算機硬體體系架構

我們先看經典的 Von Neumann 架構:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

基于上面的架構, 典型的 PC 機架構圖如下

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

雖然硬體結構體系越來越複雜, 但目前來看, 計算機的架構還是沒有脫離最初的 CPU, 記憶體以及 IO 的基本結構.

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

計算機軟體體系架構

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

作為一個整體的計算機系統, 硬體跟軟體都是必不可少的.計算機體系結構圖如下:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

計算機軟體的體系結構分層示意圖:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

每個層次之間都要互相通信,既然需要通信就必須有一個通信協定,我們一般将其稱為接口(Interface),接口的下面那層是借口的提供者,由它定義接口;接口的上面那層是接口的使用者,它使用接口來實作所需要的功能。在層次體系中,接口是被精心設計過的,盡量保持穩定不變,那麼理論上層次之間隻要遵循這個接口,任何一個層都可以被修改或是替換。除了硬體和應用程式,其他都是所謂的中間層,每個中間層都是對它下面的那層的包裝和擴充。使得應用程式和硬體之間保持相對的獨立,比如硬體和作業系統都在日新月異的發展,但是最初為80386晶片和DOS系統設計的軟體在最新的多核處理器Windows Vista下還是能夠運作的,這方面硬體和作業系統本身保持了向後相容性,另一方面不得不歸功于這種層次結構的設計方式。

我們的軟體體系中,位于最上層的是應用程式,比如我們平時用的網絡浏覽器、Email用戶端、多媒體播放器、圖檔浏覽器等。從整個層次結構上來看,開發工具與應用程式是屬于同一個層次的,因為它們都是用一個接口,那就是作業系統應用程式程式設計接口(API)。應用程式接口的提供者是運作庫,什麼樣的運作庫提供什麼樣的API,比如Linux下的Glibc庫提供的POSIX的API;Windows的運作庫提供的Windows API。

運作庫使用作業系統提供的系統調用接口(System call Interface),系統調用接口在實作中往往以軟體中斷的方式提供,比如Linux使用0x80号中斷作為系統調用接口,Windows使用0x2E号中斷作為系統調用接口。

作業系統核心層對硬體層來是硬體接口的使用者,而硬體是接口的定義者,硬體的接口定義決定了作業系統核心,具體來講就是驅動程式如何操作硬體,如何與硬體進行通信。這種接口往往叫做硬體規格,硬體的廠商提供硬體規格,作業系統和驅動程式的開發者通過閱讀硬體規格文檔所規定的各種硬體程式設計接口标準來編寫作業系統和驅動程式。

記憶體的配置設定問題: 一切皆是映射

如何将計算機上有限的實體記憶體配置設定給多個程式使用。在早期的計算機中,程式是直接運作在實體記憶體上的,也就是說,程式在運作時所通路的位址都是實體位址。但這樣做的話會出現很多問題。

1 位址空間不隔離

所有的程式都直接通路實體位址,程式所使用的記憶體空間不是互相隔離的。惡意的程式很容易改寫其他程式的記憶體資料,以達到破壞目的。

2 記憶體使用效率低

由于沒有有效的記憶體管理機制,通常要一個程式執行時,監控程式就将整個程式裝入記憶體然後開始執行。

舉個例子:計算機有128MB記憶體,程式A運作需要10MB,B需要100MB,C需要20MB。如果我們要同時運作A和B,比較直接的做法是将記憶體的前10MB配置設定給程式A,10MB~110MB配置設定給程式B。這樣就能夠實作A和B同時運作。但是,如果我們忽然要運作C,那麼這時記憶體空間已經不夠了。由于程式所需要的空間是連續的,那麼這個例子裡面,如果我們将A換出到磁盤所釋放的記憶體空間是不夠的,是以隻能将B換出,将C換入執行。可以看到整個過程中有大量的資料在換入換出,導緻效率十分低下。

3 程式運作位址不确定

因為程式每次需要裝入運作時,我們都需要給它從記憶體中配置設定一塊足夠大的空閑區域,這個空閑區域的位置是不确定的。這給程式設計造成了一定的麻煩,因為在程式編寫時,它通路資料和指令跳轉時的目标位址很多都是固定的。

解決方案

作為普通的程式,它需要一個簡單的執行環境,有一個單一的位址空間。位址空間是一個比較抽象的概念,可以把它想象成一個很大的數組,每個數組的元素就是一個位元組,數組的大小由位址空間的位址長度決定,比如32位的位址空間為2^32=4GB,位址空間的有效位址是0~4294967295,用16進制表示為0x0000 ~ 0xFFFFFFFF。

位址空間分為兩種:虛拟位址空間和實體位址空間。

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

實體位址空間是實實在在存在的,存在于計算機當中,而且對于每一台計算機來說是唯一的,可以想象成為計算機的實體記憶體,比如你的計算機用的是32位的處理器,即計算機位址線有32條,那麼實體空間就有4G。虛拟位址空間是指虛拟的、想象出來的位址空間,現實中并不存在,每個程序都有自己獨立的虛拟空間,而且每個程序隻能通路自己的位址空間,這樣就有效地做到了程序的隔離。

分段(Segmentation)

最開始人們使用的是一種分段的方法,基本思路是把一段與程式所需要的記憶體空間大小的虛拟空間映射到某個位址空間。比如程式A需10MB記憶體,那麼我們假設有一個位址從0x00000000到0x00A00000的10MB大小的虛拟空間,然後我們從實際實體記憶體中配置設定一個相同大小的實體位址,假設實體位址是0x00100000到0x00B00000。然後我們把這兩塊相同大小的位址空間一一映射,即虛拟空間裡的每個位元組對應實體空間中的每個位元組。這個映射過程由軟體來設定,實際的位址轉換由硬體完成。

比如,A和B同時運作時,它們的虛拟空間和實體空間映射關系如圖所示。

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

分段的方法基本上解決了上面問題中的第一個和第三個。

首先做到了位址隔離,因為A和B被映射到了兩塊不同的實體空間,它們之間沒有任何重疊,如果A通路虛拟空間的位址超過了0x00A00000這個範圍,硬體就會判斷這是一個非法的通路,并将這個請求報告給作業系統或者監控程式,由它決定如何處理。

再者,對于每個程式來說,無論它們被配置設定到位址空間的哪一個區域,對于程式來說都是透明的,它們不需要關心實體位址的變化,它們隻要按照從位址0x00000000到0x00A00000來編寫程式、放置變量,是以程式不需要重定位。

分頁(Pageing)

但是分段的方法沒有解決記憶體使用效率的問題。分段對于記憶體區域的映射還是按照程式為機關,如果記憶體不足,被換入換出的磁盤的都是整個程式,這樣勢必會造成大量的磁盤通路操作,進而嚴重影響速度,這種方法還是顯得粗糙,粒度比較大。事實上根據程式的局部性原理,當一個程式正在運作時,在某個時間段内,它隻是頻繁用到了一小部分資料,也就是說,程式的很多資料其實在一個時間段内是不會被用到的。人們很自然地想到了​

​更小粒度的記憶體分割和映射​

​​方法,使得程式的局部性原理得到充分利用,大大提高了記憶體的使用率。這種方法就是​

​分頁​

​。

分頁的基本方法是把位址空間人為得等分成固定大小的頁,每一個頁的大小由硬體決定,或硬體支援多種頁的大小,由作業系統選擇決定頁的大小。目前幾乎所有PC的作業系統都是用4KB大小的頁。我們使用的PC機是32位虛拟位址空間,也就是4GB,按4KB分頁,總共有1048576個頁。

舉個例子,如圖所示:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

那麼,當我們把程序的虛拟位址空間按頁分割,把常用的資料和代碼裝載到記憶體中,把不常用的代碼和資料儲存在磁盤裡,當需要用到的時候再把它們從磁盤裡取出即可。圖中的線表示映射關系,我們可以看到虛拟空間有些頁被映射到同一個實體頁,這樣就可以實作記憶體共享。

我們可以看到Process 1 的VP2和VP3不在記憶體中,但是當程序需要用到這兩個頁的時候,硬體就會捕獲到這個消息,就是所謂的頁錯誤(Page Fault),然後作業系統接管程序,負責将VP2和VP3從磁盤讀取出來裝入記憶體,然都将記憶體中的這兩個頁和VP2和VP3建立映射關系。以頁為機關存取和交換資料非常友善,硬體本身就支援這種以頁為機關的操作方式。

保護頁也是頁映射的目的之一,簡單地說就是每個頁可以設定權限屬性,誰可以修改,誰可以通路,而且隻有作業系統有權修改這些屬性,那麼作業系統就可以做到保護自己和保護程序。

虛拟存儲的實作需要硬體支援,幾乎所有CPU都采用稱為MMU的部件來進行頁的映射:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

在頁映射模式下,CPU發出的是Virtual Address ,即我們程式看到的是虛拟位址。經過MMU轉換以後就變成了Physical Address。一般MMU內建在CPU内部,不會以獨立的部件存在。

計算機網絡體系架構: OSI 模型

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

The International Standards Organization (ISO) developed the Open Systems Interconnection (OSI) model. It divides network communication into seven layers. In this model, layers 1-4 are considered the lower layers, and mostly concern themselves with moving data around. Layers 5-7, called the the upper layers, contain application-level data. Networks operate on one basic principle: "pass it on." Each layer takes care of a very specific job, and then passes the data onto the next layer.

The 7 Layers of the OSI

In the OSI model, control is passed from one layer to the next, starting at the application layer (Layer 7) in one station, and proceeding to the bottom layer, over the channel to the next station and back up the hierarchy. The OSI model takes the task of inter-networking and divides that up into what is referred to as a vertical stack that consists of the following 7 layers.

Layer 7 - Application
Layer 6 - Presentation
Layer 5 - Session
Layer 4 - Transport
Layer 3 - Network
Layer 2 - Data Link
Layer 1 - Physical      
計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

OSI 模型中的資訊交換:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

作業系統架構

作業系統是一個一直運作在計算機中的程式。它管理着計算機的硬體和軟體資源,提供一些服務給計算機的程式。

Linux OS

以 Linux OS 為例.

現代 Linux 系統核心結構采用元件化結構,如圖

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決
計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Linux is one the popular modified version of UNIX operating system. It is an Open Source OS and it is free to use as well as for modifications. Linux was design by considering UNIX compatibility. Its functionality list is quite similar to that of UNIX.

The operating system architecture is organized in two parts :

  • Kernel Mode
  • User Mode

Kernel Mode executes the operating system processes.

User Mode executes application program of the user.

The architecture of operating system consist of five Components:

Kernel
Shell
System Utilities
User application
Hardware platform      

權限等級

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Windows OS 架構:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Diagram of Mac OS X architecture:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

iOS 架構:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

As shown above, the Core OS and Core Services make up the base and very strongly support the iOS application. On top of that comes the Media and Cocoa Touch which are again very essential for supporting an iOS application. All of these reside on top of the Kernel and device drivers.

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Cocoa has a very important role to play for supporting an iOS application. It provides UIKit for the application to work which is essentially the USP of an iOS application.

Android 系統架構:

Android 是一種基于 Linux 的開放源代碼軟體棧,為廣泛的裝置和機型而建立。下圖所示為 Android 平台的主要元件。

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Linux 核心

Android 平台的基礎是 Linux 核心。例如,Android Runtime (ART) 依靠 Linux 核心來執行底層功能,例如線程和低層記憶體管理。

使用 Linux 核心可讓 Android 利用主要安全功能,并且允許裝置制造商為著名的核心開發硬體驅動程式。

硬體抽象層 (HAL)

硬體抽象層 (HAL) 提供标準界面,向更進階别的 Java API 架構顯示裝置硬體功能。HAL 包含多個庫子產品,其中每個子產品都為特定類型的硬體元件實作一個界面,例如相機或藍牙子產品。當架構 API 要求通路裝置硬體時,Android 系統将為該硬體元件加載庫子產品。

Android Runtime

對于運作 Android 5.0(API 級别 21)或更高版本的裝置,每個應用都在其自己的程序中運作,并且有其自己的 Android Runtime (ART) 執行個體。ART 編寫為通過執行 DEX 檔案在低記憶體裝置上運作多個虛拟機,DEX 檔案是一種專為 Android 設計的位元組碼格式,經過優化,使用的記憶體很少。編譯工具鍊(例如 Jack)将 Java 源代碼編譯為 DEX 位元組碼,使其可在 Android 平台上運作。

ART 的部分主要功能包括:

預先 (AOT) 和即時 (JIT) 編譯

優化的垃圾回收 (GC)

更好的調試支援,包括專用采樣分析器、詳細的診斷異常和崩潰報告,并且能夠設定監視點以監控特定字段

在 Android 版本 5.0(API 級别 21)之前,Dalvik 是 Android Runtime。如果您的應用在 ART 上運作效果很好,那麼它應該也可在 Dalvik 上運作,但反過來不一定。

Android 還包含一套核心運作時庫,可提供 Java API 架構使用的 Java 程式設計語言大部分功能,包括一些 Java 8 語言功能。

原生 C/C++ 庫

許多核心 Android 系統元件和服務(例如 ART 和 HAL)建構自原生代碼,需要以 C 和 C++ 編寫的原生庫。Android 平台提供 Java 架構 API 以向應用顯示其中部分原生庫的功能。例如,您可以通過 Android 架構的 Java OpenGL API 通路 OpenGL ES,以支援在應用中繪制和操作 2D 和 3D 圖形。

如果開發的是需要 C 或 C++ 代碼的應用,可以使用 Android NDK 直接從原生代碼通路某些原生平台庫。

Java API 架構

您可通過以 Java 語言編寫的 API 使用 Android OS 的整個功能集。這些 API 形成建立 Android 應用所需的建構塊,它們可簡化核心子產品化系統元件和服務的重複使用,包括以下元件和服務:

豐富、可擴充的視圖系統,可用以建構應用的 UI,包括清單、網格、文本框、按鈕甚至可嵌入的網絡浏覽器

資料總管,用于通路非代碼資源,例如本地化的字元串、圖形和布局檔案

通知管理器,可讓所有應用在狀态欄中顯示自定義提醒

Activity 管理器,用于管理應用的生命周期,提供常見的導航傳回棧

内容提供程式,可讓應用通路其他應用(例如“聯系人”應用)中的資料或者共享其自己的資料

開發者可以完全通路 Android 系統應用使用的架構 API。

系統應用

Android 随附一套用于電子郵件、短信、月曆、網際網路浏覽和聯系人等的核心應用。平台随附的應用與使用者可以選擇安裝的應用一樣,沒有特殊狀态。是以第三方應用可成為使用者的預設網絡浏覽器、短信 Messenger 甚至預設鍵盤(有一些例外,例如系統的“設定”應用)。

系統應用可用作使用者的應用,以及提供開發者可從其自己的應用通路的主要功能。例如,如果您的應用要發短信,您無需自己建構該功能,可以改為調用已安裝的短信應用向您指定的接收者發送消息。

來自: ​​https://developer.android.com/guide/platform​​

JVM 體系架構

JVM stands for Java Virtual Machine. It provides you with environment to execute your compiled programs, called bytecode. There are multiple implementations of JVM from different vendors for variety of platforms. In this article I will explain the main components of JVM, including memory management, class loading and the Garbage collector.

Usually we do not dig deep into the internal mechanics of JVM. If our code works, then we go on without caring much about the internal mechanics… until the day something goes wrong and we need to tweek JVM or fix a memory leak for example.

Java Virtual Machine questions are very popular in job interviews. Interviewers love to ask various questions about JVM to prove your general understanding of the Java platform.

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Java Virtual Machine Architecture

The Java virtual machine consists of three main areas:

  • Class loader subsystem
  • Runtime data area
  • Execution engine

We will look at each one in greater details:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Java Platform:

The following conceptual diagram illustrates the components of Oracle's Java Platform Products:

Jave SE Platform at a Glance

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

資料庫系統架構

The following diagram shows in-memory and on-disk structures that comprise the InnoDB storage engine architecture.

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

參考:​​https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html​​

MySQL InnoDB File Architecture

Keep in mind that /var/lib/mysql/ibdata1 is the busiest file in the InnoDB infrastructure. It normally houses six types of information:

Table Data
Table Indexes
MVCC (Multiversioning Concurrency Control) Data
Rollback Segments
Undo Space
Table Metadata (Data Dictionary)
Double Write Buffer (background writing to prevent reliance on OS caching)
Insert Buffer (managing changes to non-unique secondary indexes)      

Please find below architecture for complete details

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Spring 5 架構

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

太陽系結構圖

The Solar System is our local neighborhood in space. This incredible system of celestial pobjects contains a star, eight planets, 140 moons, and a variety of other objects such as asteroids, comets, and dwarf planets. At the center the is an average-sized, middle aged yellow star known as the Sun. The eight planets and other bodies orbit the Sun in a perpetual dance that has been going on for nearly five billion years. The planets in this system range in size from small, rocky worlds to gigantic balls of gas and ice. These planets are orbited by a multitude of moons that vary from asteroid-sized chunks of rock to nearly planet-sized worlds with atmospheres of their own.

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

​​http://www.seasky.org/solar-system/solar-system.html​​

Structure Of Atom

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

Food Chain

A Food Web displays more of the interactions that take place within the ecosystem and therefore would be a better representation. Food web is a realistic, true to life representation.

Explanation:

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

The Food Web shows more of the interactions between the organisms of the ecosystem and the trophic levels included from Producers to Primary/Secondary Consumers up through the Tertiary Consumers.

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

​​https://sciencezoneja.files.wordpress.com​​

While a food Chain is more of a linear representation of a specific line of interaction within the greater Food Web. Thus food chain is a part of the whole story.

陰陽

計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決

老子在《道德經》中說:“道生一,一生二,二生三,三生萬物。萬物負陰而抱陽,沖氣以為和”。陰陽的特性如下:

“對立而統一關系”( the contradictoryunity)(太極)

兩者互相對立:萬物皆有其互相對立的特性。如熱為陽,寒為陰;天為陽,地為陰,說明了宇宙間所有事物皆對立存在。然這種相對特性并非絕對,而是相對。如上為陽,下為陰,平地相對于山峰,山峰為陽,平地為陰;但平地若相對于地底,則平地屬陽、地底屬陰,可見陰陽的相對性關系。

兩者互相依靠、轉化、消長:陰陽存在互根互依,互相轉化的關系,陰中有陽,陽中有陰,因彼此的消長,陰陽可以變化出許多不同的現象分類。

陰陽的例子:

Kotlin 開發者社群