初探 Linux操作系統 (一):站在巨人的肩膀上

(一)何爲Linux系統?

(Linux是GNU操作系統的內核,將這種操作系統稱爲GNU/Linux操作系統)
我們通常所說的Linux內核,只是指Linux內核(只是一個內核,並不是完整的操作系統)
在這裏插入圖片描述
內核是操作系統的核心,是一個支撐軟件,管理着計算機所有的硬件資源(CPU,I/O,存儲資源),並提供上層應用程序環境

從上圖;我們就可以看到,應用程序要訪問計算機的資源,就必須通過內核,而想陷入內核(內核態),又必須通過系統調用

系統調用:最小的功能單位,是原子操作,不可分,系統調用本身就是一種中斷(軟中斷)

shell也是一種程序,用於執行我們鍵入的命令,在Linux系統中,最強大的就是終端,命令了(非UI)其實,在Linux的桌面同樣是一個運行程序,(Ubuntu的爲GHOME)

shell;命令解釋器,讀取用戶輸入,然後執行命令 (用戶輸入:終端 文件:shell腳本)

說白了,計算機就是跑程序
或者可以這樣說: 在“真”(硬件) 上運行 “假” (軟件)

由系統內核所提供的功能模塊說開來!

第一步:

瞭解OS是如何管理計算機硬件的

(1)下圖是一個典型計算機的硬件組成,具體的不做介紹,應該有相關的瞭解
在這裏插入圖片描述
我們可以瞭解到一個程序是如何存放的: 磁盤,非易失性
是如何運行的:CPU,解釋或執行存儲的指令的引擎
是如何與外部交互的: I/O設備,圖形適配器,網絡適配器(網卡)

(2)
其實說透了操作系統的功能就是爲我們的運行應用程序而準備的,核心就是兩個:<1>管理硬件的資源 <2> 管理應用程序
於是乎,操作系統有了以下幾個抽象
在這裏插入圖片描述
然後,我們就要開始說Linux操作系統的最重要的三個模塊了
文件I/O
虛擬內存
進程

第二步:

開始寫我們自己的程序

一般而言在LInux系統上寫C/C++程序,有這麼個過程
VIM(工具)- GCC/G++(編譯系統) - a.out(可執行文件)交由shell執行

  • Linux程序編譯的過程
    在這裏插入圖片描述
    (看圖理解)

補充:

  1. 這裏裏要說的是各項做了些什麼事情,
    預處理器:宏替換,符號解析,去註釋,頭文件替換
    編譯器:詞法分析,語法分析(分析程序的語法錯誤)
    彙編器:將程序彙編碼生成機器碼
    鏈接器:鏈接靜態庫,當然也要爲動態庫做一些事情了

  2. ELF文件: 也就是我們在上圖看到的二進制文件
    注意:雖然ELF文件是二進制的,但是又不同於一般的二進制文件,含有機器碼之外還有其它信息,如:段加載地址,運行入口地址,數據段等
    1)可重定位目標文件
    2)可執行目標文件
    3)共享目標文件(即動態庫)

說到了這裏又不得不提一下靜態庫和動態庫了

可以參考一下下面這篇博客
動態庫&靜態庫

動態庫:
①鏈接器拿它和其他可重定位的文件( .o 文件)以及其他 .so 文
件作爲輸入,經鏈接處理後,生成另外的可共享的目標文件( . so 文件)或者可執行的目標文件;
②在運行時,動態鏈接器拿它和一個可執行的目標文件以及另外-些可共享的目標文件
C.so )來一起處理,在 Linux 系統裏面創建一個進程映像 。

需要注意:
靜態庫(.a) & 動態庫(.so)的區別

  1. 由上圖可知,靜態庫在編譯的過程就被裝載進了ELF;動態庫,爲運行時載入內存
  2. 靜態庫,每一份都有一份拷貝,浪費資源較大; 而動態庫,只保留接口

舉個例子:(1) 終端shell之後怎麼運行程序
當你在 shell 中敲入一個命令要執行時,內核會幫我們創建一個新的進程,它在往這個新進程的進程空間裏面加載進可執行程序的代碼段和數據段後,也會加載進動態鏈接器(在Linux裏面通常就是 /lib/ld-linux.so 符號鏈接所指向的那個程序,它本省就是一個動態庫)的代碼段和數據。
在這之後,內核將控制傳遞給動態鏈接庫裏面的代碼。動態連接器接下來負責加載該命令應用程序所需要使用的各種動態庫。
加載完畢,動態連接器纔將控制傳遞給應用程序的main函數。如此,你的應用程序才得以運行。(過程鏈接表(PLT),Global Offset Table(GOT))

第三步:

運行我們所編寫的程序:進程
關於進程 & 線程的概念,參見下面這篇博文

LInux(UNIX)關於線程的經典描述:“未分配資源的進程”

理解進程 & 線程的概念後

說一下進程(線程)幾個的點:
【1】操作系統調度進程
進程可爲: 實時進程 , 普通進程
交互式程序和批處理程序(統稱爲普通進程),

Linux進程調度

實時進程: 基於優先級 採用FIFO或者Round Robin的調度策略.
普通進程: 基於優先級 & 公平佔有CPU
對於普通進程調度,需要區分交互式和批處理式的不同

根據進程的不同分類Linux採用不同的調度策略.

對於普通進程,則需要區分交互式和批處理式的不同。傳統Linux調度器提高交互式應用的優先級,使得它們能更快地被調度。而CFS和RSDL等新的調度器的核心思想是”完全公平”。這個設計理念不僅大大簡化了調度器的代碼複雜度,還對各種調度需求的提供了更完美的支持.

注意Linux通過將進程和線程調度視爲一個,同時包含二者。進程可以看做是單個線程,但是進程可以包含共享一定資源(代碼和/或數據)的多個線程。因此進程調度也包含了線程調度的功能.

linux進程的調度算法其實經過了很多次的演變, 但是其演變主要是針對與普通進程的, 因爲前面我們提到過根據進程的不同分類Linux採用不同的調度策略.實時進程和普通進程採用了不同的調度策略, 更一般的普通進程還需要啓發式的識別批處理進程和交互式進程.

【2】進程之間如何同步
(同步是建立在進程之間通信之上的,進程通過通信來實現同步)

【3】進程之間通信方式

管道pipe

命名管道FIFO

【4】線程同步

進程 & 線程

第四步:

加載到內存中運行的程序:虛擬內存

上來又是一張圖:

在這裏插入圖片描述

不得不提的幾個OS概念

  • 中斷

  • 關於OS操作系統各類調度算法總結:

參見下文:
調度算法

關於操作系統中可能會令我們困惑的一些術語:

  1. 任務
    任務: 任務(task)是最抽象的,是一個一般性的術語,指由軟件完成的一個活動。一個任務既可以是一個進程,也可以是一個線程。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取數據並將數據放入內存中。這個任務可以作爲一個進程來實現,也可以作爲一個線程(或作爲一箇中斷任務)來實現。

  2. 併發 & 並行

併發:宏觀意義上的同時運行
並行:嚴格意義上的,如多核CPU

  1. 虛擬內存實現
    請求分頁式
    請求分段式
    請求段頁式

  2. 同步和異步 & 阻塞和非阻塞

同步,異步,阻塞,非阻塞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章