Linux作業系統的概述與核心結構及程式設計

2021-10-10 15:56:05 字數 2758 閱讀 9425

人們常常說作業系統這個名詞啊,windows\linux\macos可以說是世間三大巨頭了。小眾的我們就不說了。

簡而言之,作業系統就做兩件事情。

對於整個計算機系統的軟硬體資源進行管理

給使用者提供服務

我們這些核心開發人員每次都在強調有什麼最優解決方案。側面說明了作業系統的目標就2個,乙個是提高資源的利用率,另乙個可不就是為了方便使用者使用嘛~~

歡迎各位大牛來指正!!

其實linux的結構也非常簡單,一般呢,我們將其分為使用者空間與核心空間。大體上就如圖所示嘍。

當乙個應用發起請求,其實是在給系統呼叫請求,然後作業系統根據系統呼叫請求,提供相應的服務。

在這裡一定要有個概念,即計算機上作業系統中的核心設計理念--機制與策略分離。

機制即提供什麼功能,策略則是如何使用這些功能。這裡也就明白了這邊的機制與策略的隔離,用什麼,不就是我們這邊的系統呼叫嘛,那麼多應用可都是呼叫同乙個系統呼叫介面的。

linux就是乙個單核心(又稱單核心)結構,所謂單核心就是作業系統的各個子系統(後續準備寫一系列linux子系統的文章,督催自己學習的同時,分享給大家)可以直接互相呼叫,而微核心的概念就核心的程序間的通訊中斷排程等放在微核心中,而其他像檔案系統,記憶體管理等是以伺服器的方式放在外面。

單核心效能高,直接可以呼叫介面,但是它的維護性差。

微核心呢由於它需要和伺服器進行通訊,那麼效能差不可避免,但是維護性好啊,最具代表性的就是谷歌的fuchsia作業系統。

linux可維護性差? 這時有人問了,差在**?那麼告訴你如果你想加乙個驅動,需要每次都編譯linux核心,而且它現在越來越大了,編譯會變得很慢,而且冗雜在一起的**,你不覺得可維護性比較差嗎?

為解決這個問題,提出了可載入的linux核心模組(lkm)。哎,好熟悉啊。這個呢,其實就是moduel載入。這裡我們不詳細敘述,後面的文章介紹驅動載入方面的知識的時候,再做分析。

執行在作業系統上的應用程式、服務及其他程式都被稱為程序。由於linux是多工的系統,看上去是多工併發的,其實真正正在執行的程式數量最多不過是cpu數目,原因是你所看到的各種程序是cpu不斷在不同的程序間進行切換,所以感覺不出來罷了。

一般核心啟動第乙個進行init程序為第乙個程序,作為1號父程序,其他的每個程序依賴於它。

我們可以用pstree命令看到程序樹

# pstree -pinit(1)---sh(243)---pstree(346)
在linux中建立程序有兩個函式:fork與exec。

除了重量級程序還有輕量級的子程序--執行緒,簡而言之,程序可以看做是正在執行的程式,而執行緒則是與程序並行執行的程式函式與例程。在linux裡面是使用clone方法建立執行緒,有關程序這塊的具體排程,還是要出一版專題去討論它。

我們再從程序角度看待整個位址空間的話,對於任何程序來講,它只有乙個位址空間,無法感知到別的程序,這就是我們常說的虛擬位址空間,為什麼說他是虛擬呢,很簡單,因為linux將其分為核心空間與使用者空間。

但在由於64位的系統為了優化cpu的工作量,可能使用的位址空間位數小於64位,所以上圖中的簡單劃分不一定是完全正確。

那麼如何能讓虛擬位址與實際實體地址聯絡在一起呢,這需要將實體地址空間對映到虛擬位址空間去。linux在這方面就是用頁來表示的。而用來將虛擬位址空間對映到實體地址空間的資料結構稱為頁表。大家都知道記憶體是很大的,為每頁都分配頁表,這種情況很糟糕,因而產生了多級分頁。linux一般採用4級分頁,pgd全域性頁目錄;pmd中間頁目錄;pte頁表陣列,然後再offset才能找到位址。

可以看到為了找到相應的位址,需要跨這麼多陣列列表,這影響效率啊,為了試**決這個問題,cpu一般專門會有mmu與tlb。mmu優化記憶體訪問操作,tlb是直接將訪問最頻繁的位址儲存起來,然後直接訪問即可。

在核心中,我們知道分配記憶體的時候,你必須先標記這個頁幀(實體地址記憶體頁)已分配或是空閒狀態。為了更加快速檢測記憶體的連續區域,核心採用了乙個方案,叫夥伴系統,其實非常簡單理解,就是記憶體中的連續的記憶體庫,可以單獨分配,當空閒的時候呢,兩個連續的記憶體變成更大的記憶體塊,作為下一次記憶體塊的夥伴。

而核心還有可能要用到更小塊的記憶體的時候,此時會用到在夥伴系統之上的乙個記憶體管理層,我們稱其為slab快取,一般它可以用兩種方法分配記憶體。乙個是對於頻繁使用的物件,核心會只定義物件例項快取,slab自動與夥伴系統互動,並完成快取用完後自動申請頁幀。而另外一種就是我們常常在核心中使用的kmalloc和kfree。

在linux的應用程式設計中,更多的開發者們一般呼叫posix標準定義的系統呼叫。一般我們將其分為

*  程序管理

*  訊號

*  檔案

*  目錄和檔案系統

*  保護機制

*  定時器函式

在系統呼叫這塊,其實可以從乙個小的ioctl的深入到核心的各個內部模組。還有bsd的套接字的抽象使用。檔案系統的各類呼叫。這些在我的博文中應該不會講的過於的多,後續會對網路的套接字做乙份有關系統呼叫到最底下實現的文章。

說實話,linux核心是乙個非常有意思的東西,我們常聽說c# c++等都是物件導向程式設計,而linux核心有嗎?其實有的,如果你細心關注過kobject.h,就是將核心抽象化的。還有一些類似於型別定義,陣列對齊,位元組對齊等等,絕對是值得深思的一些**。

Linux作業系統概述及核心介紹

在組織得當的前提下,通過抽象將系統分解為元件有助於我們了解其工作機制。我們將元件劃分為層次或級別。元件的層次 或級別 代表它在使用者和硬體系統之間所處的位置。web瀏覽器 遊戲等應用處於最高層,底層則是計算機硬體系統,如記憶體。作業系統處於這兩層之間。linux作業系統主要分為三層。如圖1 1所示,...

linux 作業系統概述

服務端作業系統 linux unix windows server 單機作業系統 windows dos ucdos win95 win98 win2000 xp vista win7 win8 mac linux ubuntu 移動作業系統 android ios windows phone 1....

作業系統是什麼?Linux作業系統概述!

linux 也是眾多作業系統之一,要想知道 linux 是什麼,首先得說一說什麼是作業系統。硬體是計算機賴以工作的實體,包括顯示器 鍵盤 滑鼠 硬碟 cpu 主機板等 作業系統 operating system,os 是軟體的一部分,它是硬體基礎上的第一層軟體,是硬體和其它軟體溝通的橋梁 或者說介面...