(1)核心基礎層提供的服務

2021-10-01 10:24:39 字數 2142 閱讀 2877

作業系統通常提供的服務是記憶體管理、程序管理、裝置管理、檔案系統

核心提供了兩個層次的記憶體分配介面:從夥伴系統分配、從slab系統分配。

夥伴系統是最底層的記憶體管理機制,提供頁式的記憶體管理。

slab是夥伴系統之上的記憶體管理,提供基於物件的記憶體管理。

從夥伴系統分配記憶體呼叫的是alloc_pages,此時得到的是頁面位址,要獲得能使用的記憶體位址,需要呼叫page_address來獲得記憶體位址。(直接獲取記憶體位址可以使用__get_free_pages)。

alloc_pages申請的記憶體是以頁為單位的,最少要乙個頁。如果只是申請一小塊記憶體,乙個頁就浪費了,而且核心中很多應用也希望一種物件化的記憶體管理,希望記憶體管理能自動地構造和析構物件,這就是slab記憶體管理。

要從slab申請記憶體,需要建立乙個slab物件,使用kmem_cache_create建立slab物件。kmem_cache_create可以提供物件的名字和大小、建構函式和析構函式等,然後通過kmem_cache_alloc和kmem_cache_free來申請和釋放記憶體。

核心中常用的kmalloc其實也是slab提供的物件管理,只不多核心已經構建了一些固定大小的物件,使用者通過kmalloc申請時,就使用了這些物件。

核心中經常需要進行程序的排程,使用wait_event實現。核心中還實現了一系列函式:

wait_event_timerout:和wait_event的區別是有時間限制,如果條件滿足,程序恢復執行,或者時間到達,程序同樣恢復進行。

wait_event_interruptible:和wait_event類似,不同之處是程序處於可中斷的睡眠。而wait_event設定程序處於不可中斷的睡眠。

wait_event_interruptible_timeout:和wait_event_interruptible相比,多個時間限制。在規定的時間到達後,程序恢復執行。

wait_event_interruptible_exclusive:和wait_event_interruptible區別是排他性的等待。

linux核心把對應中斷的軟體執行**分拆成兩部分。

一部分**和硬體關係緊密,這部分**必須關閉中斷來執行,以免被後面觸發的中斷打斷,影響**的正確執行,這部分**放在中斷上下文中執行。

另一部分**和硬體關係不緊密,可以開啟中斷執行,這部分**放在軟中斷上下文執行。

linux核心定義了幾個預設的軟中斷,網路裝置有自己的傳送和接收軟中斷,塊裝置也有自己的軟中斷。為了方便使用,核心還定義了乙個tasklet軟中斷。tasklet是一種特殊的軟中斷同一時刻乙個tasklet只能有乙個cpu執行,不同的tasklet可以在不同的cpu上執行。這和軟中斷不同,軟中斷同一時刻可以在不同的cpu並行執行,因此軟中斷必須考慮重入的問題。

工作佇列和tasklet相似,都是一種延緩執行的機制。

不同之處是工作佇列有自己的程序上下文,所以工作佇列可以睡眠,也可以被排程,而tasklet不可睡眠。

使用工作佇列很簡單,schedule_work把使用者定義的work_struct加入系統的佇列中,並喚醒系統執行緒去執行。那麼是哪個系統執行緒執行使用者的work_struct呢?實際上,核心初始化的時候,就要建立乙個工作佇列keventd_wq,同事為這個工作佇列建立核心執行緒(預設是為每個cpu建立乙個核心執行緒)。

核心同時還提供了create_workqueue和create_singlethread_workqueue函式,這樣使用者可以建立自己的工作佇列和執行執行緒,而不用核心提供的工作佇列。

create_workqueue和create_singlethread_workqueue類似,不同的是,create_singlethread_workqueue只建立乙個核心執行緒,而不是為每個cpu建立乙個核心執行緒。

自旋鎖用來在多處理器的環境下保護資料。

自旋鎖可以用在中斷等禁止睡眠的場景。

核心訊號量和自旋鎖類似,作用也是保護資料。不同的是,程序獲取核心訊號量的時候,如果不能獲取,則程序進入睡眠狀態。

核心訊號量和自旋鎖的不同之處:

原子變數提供了一種原子的、不可中斷的操作。

核心提供了一系列的原子變數操作函式:

atomic_add:加乙個整數到原子變數。

atomic_sub:從原子變數減乙個整數。

atomic_set:設定原子變數的數值。

atomic_read:讀原子變數的陣列。

核心基礎層提供的服務 核心中使用記憶體

linux記憶體關係參考 很詳細很清晰 linux採用夥伴系統解決外部碎片的問題,採用slab解決內部碎片的問題。避免外部碎片的方法有兩種 一種是之前介紹過的利用非連續記憶體的分配 一種是用一種有效的方法來監視記憶體,保證在核心只要申請一小塊記憶體的情況下,不會從大塊的連續空閒記憶體中擷取一段過來,...

傳輸層提供的服務

1 提 用程式間 的邏輯通訊。2 差錯檢測 對收到報文的首部和資料部分都進行差錯檢測。3 提供無連線的或面向連線的服務 udp,tcp 4 復用和分用 復用指傳送方不同的應用程式都可以使用同乙個傳輸層協議傳送資料。分用指接收方的傳輸層在剝去報文的首部後能夠把這些資料正確的交付到目的應用程式。面向連線...

5 1傳輸層提供的服務

傳輸層概述 只有主機才有的層次 可以提供程序和程序之間的邏輯通訊 復用和分用 可以使用同乙個網路協議 報文段可以交付網路層,兩個程序進行復用 對資料差錯檢測,網路層不用 tcp vs udp tcp,udp tcpudp 建立連線 可靠 面向連線 時延大 適用於大檔案 不可靠 無連線 時延小 適用於...