樸素的UNIX之 Linux CFS乙個注釋

2021-06-26 06:59:13 字數 1030 閱讀 2623

本系列名為樸素的unix,但是也包括各個類unix系統的細節,本系列文章整理自本人幾年來的學習筆記,著重分析各個unix,類unix的實現思想以及感悟。

本文比較短,只是分析一下linux cfs排程器的乙個細節。

在程序尋找下乙個將被執行的程序時,難道僅僅只是在紅黑樹上取下左下角的程序嗎?事實上最樸素的實現就是這樣,但是考慮到優化的話,就沒有這麼簡單了。要考慮cpu快取的利用率,即如果乙個程序a搶占了程序b,那麼在a程序的上下文中,pick next是選擇程序b呢還是選擇紅黑樹的左下角程序呢?另外如果程序a剛被喚醒,企圖搶占程序b,但是沒有成功,那麼下乙個是選擇紅黑樹的左下角程序呢還是選擇程序a呢?是的,這些都是問題。

我們看一下pick next的實現:

static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq)

很顯然,要把紅黑樹最左下角的程序和另外兩個程序,即next和last最比較,next是搶占失敗的程序,而last則是搶占成功後被搶占的程序,這三個程序到底哪乙個是最優的next程序呢?linux cfs實現的判決條件是:

1.盡可能滿足需要剛被喚醒的程序搶占其它程序的需求;

2.盡可能減少以上這種搶占帶來的快取重新整理的影響。

linux cfs實現是怎麼做到的呢?linux儲存了兩個變數,即搶占失敗的程序和搶占成功後被搶占的程序,在權衡的時候,優先選擇的順序是:

搶占成功後被搶占的程序》搶占失敗的程序》紅黑樹最左下角的程序

到底能不能選擇前兩個程序,則是wakeup_preempt_entity函式來決定的,**太多無益,看下面的**即可:

這個cfs的細節在linux 2.6.23最初實現cfs時並沒有實現。因此從最樸素的時代開始,你才能逐漸理解細節的來龍去脈,看changelog是有好處的。不得不說,讀史使人明智。

串之樸素的模式匹配演算法

一 串的模式匹配的定義 這個問題其實就是乙個字串在乙個大的字串中的定位問題。這種子串的定位問題的操作通常叫做串的模式匹配 二 舉例說明 假如主串是s qbfhilmeach 模式串 p hilk 現在我們需要在主串中找到模式串。它的匹配過程如下 直到匹配成功 簡單得來說,就是對主串的每乙個字元作為子...

資料探勘之樸素貝葉斯定理

樸素貝葉斯公式 首先這個公式為什麼叫樸素貝葉斯呢?他是英國數學家托馬斯 貝葉斯 thomas bayes 在1763年發表的一篇 中首次提出的這個定理。首先我們了解下 條件概率 在事件b發生的情況下,事件a發生的概率,用p a b 表示 對條件概率進行變形 先驗概率 p a 即在b事件發生之前,對a...

UNIX學習之執行緒

後記本章開始學習unix執行緒的概念,首先看一看什麼是執行緒。我們或多或少地對執行緒有一定了解。每乙個單獨的執行緒可以用來執行乙個操作,這樣我們就經常可以同時執行很多互不相干的操作。執行緒有啥子優點?注意,單核處理器也是可以多執行緒的。include intpthread equal pthread...