4 經濟之旅之一 時間至上

2021-06-01 21:10:45 字數 4733 閱讀 3225

特此宣告,本章的設立,純粹為了愛惜生命與金錢的人們。

如果不清楚自己想幹嘛,能幹嘛,以及想瞧瞧別人在幹嘛的兄弟姐弟們,那就在先在這條路上碰碰運氣吧。

噢,出發之前,不要忘了三寶:

(1)裝備。經濟之路,帶上腦袋就行,不用別的了。

(2)目的地。既然是經濟之旅,那麼我們就優先選個大眾化的路線。 目的地,設暫定為"訪問控制乙個字元裝置"。如果大家有新的要求,我們還可以推薦其它的。雖然是大眾化的,可別小看它喲。我們的長城可就遜色多了,雖然也是大眾化的,而且還聲名顯赫,可實在沒有看頭。字元裝置卻好比是"北京香丘",幾百公尺高,一般人幾十分鐘就可以爬個來回,小是小點,但小有小的好處,而且好歹也是山呀。對於那些沒有上過山,或者見山色變的兄弟們而言,這山頭簡直恰到好處。俗話說的好,"麻雀雖小,五臟俱全"。雖然"那山更比這山高",但爬過這座山,就已經領略山的味到了。

(3)路線導遊圖。即使是座小山頭,在拐彎處,或風景獨到之處,往往也會立個指示牌,說明碑之類的,讓大家有個心頭一亮的感覺。那就先看看我們的導遊路線吧.

我把景點的情況大致介紹一下,然後我們就開始進發。

0) 當前位置。 某乙個具體應用程式的入口處,如main函式。

1) 信訪安檢服務。現實生活中都有這麼多****,虛擬世界中更不乏不法之徒。應廣大登山者的要求,在景區外圍通常會提供一些,道路指示,交通疏導,安檢等便民服務。

2) 南門入口。景區只能由特定入口進出,南門是我們平民百姓進出的通道,景區也有為其它目的設定的通道,但這些通道數量並不多。當然,後門是除linux核心極力避免之外,任何地方任何情況下,都會出現的通道。

3) 小竹林。時而不時遮蔽人們的視線,匆匆過客總是忽略它,但如果稍微留意一下,有一股風情說不盡...

4) 字元裝置驅動。旅遊目的地。在虛擬的數字世界裡,我們總是通過它來控制字元裝置。我們可以看看乙個實際的字元裝置,在虛擬世界的長相。外國人在中國人的腦海裡都是金髮碧眼,字元裝置在虛擬世界中的長相都是一樣的。

耶! 出發.....

土豆,土豆,我是地瓜,請報告你的方位...

土豆: 我們?

地瓜: 再重複一遍,請報告你們的方位..

土豆: 我們...在地球上.

我們剛踏出家門,就來到了乙個應用程式的入口點,例子4.1這種結構的入口點,學習過c語言的地球人都知道。

例子4.1  應用程式

int  main(int argc, char** argv)                         //程式的入口點

看到醒目的標誌open之後,你就要留神了,或許我們景點的入口就快要到了。當然,並不是所有的open標誌都是我們景點的入口。在這個醒目標誌後面,往往跟著景點的名稱,例子4.2就是告訴大家,名稱為"ttys0裝置"的景點,就要到了,要小心了.

例子4.2 開啟乙個裝置

............

fd = open ("/dev/ttys0",o_rd);

.............

我們可以進一步使用指令,如例子4.3,確認一下,目的地,也就是那個"裝置檔案(/dev/ttys0)"是否存在,它是否還是我們心目中的字元(char)裝置,以及景點是否仍在開放(許可權)。

例子4.3 確認裝置檔案是否存在

哪兒都有特權階層,在數字世界裡,也是如此。所以先看看這個裝置,是為哪個階層服務的,然後掂量一下自己身份。上面的例子中,明顯是為root小圈子服務的。

繼續前進...

"被迫"接收信訪安檢服務,無論願意與否...

不用擔心,數字世界裡的服務是非常"人性化的",幾乎都感覺不到它們的存在,不像我們的城管如此的囂張,搞得地球人都知道。 這些服務通常是以動態庫的形式存在著,例如linux下的libc.so,它把所有的系統呼叫,也就是我們的請求,接管過去後,轉換成核心可以理解的形式。再具體一點就是,它給每個系統呼叫分配乙個編號,按規則使用暫存器(或堆疊)來儲存函式的引數。

對人類而言,函式名字更容易識別,而對核心而言,使用編號可以使程式結構更精簡。

我們的請求通過"信訪辦"遞交上去之後,通常既可以在"原地"等待回應,或者回家等待通知,具體等多少時間,那就要看你提的要求以及"系統"的心情了。至於如何秉公辦理,那也是我們決定不了的,我們只能等。幸運的是,linux核心總會按照規則,秉公辦理,不會說一套做一套,而且對我們的請求會想盡辦法完成,即使完成不了,也會迅速的告訴我們原因,決不推脫或拖延。這也是我們廣大網民沉溺於"虛擬社會",而逃避"現實社會"的重要原因吧。

"南門"到了

「朱門酒肉臭,路有凍死骨」,這是杜甫對現實社會門裡門外"**兩重天"的控訴。當然,我們的世界也並不總是這樣的,也有像南京中山陵「天下為公」的大門。雖然我們的社會越來越適合野獸們居住,但中國人還是有機會湧現出像中山先生一樣優秀的人物。

這個"南門"的橫幅上,也有"天下為公"四個大字,且看看linux核心系統是如何兌現承諾的。

無論是誰的請求,它都一視同仁,無論美醜,貧寒與貴賤。

無論你提把要求,重提多少次,它都耐心的把你的要求,「當成自己的事」秉公處理,一絲不苟。

它的服務真正體現了,"客戶是上帝"的服務宗旨。它總是以沒有最好,只有更好的態度,向我們提供服務。

當然,我們也不能太過分,向它提出超出它能力之外的服務。我們也不用擔心,當提出過分要求時,編譯系統就會好心的提醒我們,"抱歉,錯了,不是這樣的"。那麼, 它的服務範圍到底有多大? 可以在網上搜尋一下"系統呼叫表",也就三百多條吧。而這三百多條「服務指南」,基本上就把系統所有的能力展現出來了。

我們在門外,看到的只有「熱情的服務」? 是的,是這樣的。

我們在入口處,裡外一瞧,看到的是兩種處世哲學。

南門外,處理問題的原則是,如何挖掘所有可用的資源,以滿足自身需求為最高目的。

南門裡,處理問題的原則是,如何有效使用可用的資源,以滿足社會需求為最高目的。

通常,我們把「門裡」,稱作"核心空間",而把「門外」叫做"使用者空間"。目前,門的開關閉合,要麼是人為的(軟體中斷),要麼靠天意(硬體中斷),無論軟硬,都有機械(硬體)輔助裝置。

可別小看這個「門神」輔助裝置,它可不是擺設。我們的前輩們,把所有的中斷,無論是外部中斷,還是軟體中斷,都統一召集到一張中斷表中,並依靠這個"中斷表"幫我們分流"請求"。

系統呼叫只是這個中斷表中的乙個小角色而已。我們的"open"請求又由「系統呼叫」部下轄的乙個分支機構,「檔案系統"負責,所以我們被分流到檔案系統的入口處vfs,一片竹林。

"小竹林"

竹子最大的特點是,無論春夏秋冬的環境如何變化,總能給環境配上相同的一片綠色。

vfs最大的特點是,無**件系統的特徵如何變化,總能給特徵配上相同的一組介面。

我們看看,這片竹林在"open"請求的眼裡,都有些什麼風采呢?

首先,它會檢查我們的"證明材料"是否齊全,這可要比過"南門哨卡"時仔細多了,畢竟是這裡負責具體事務。它會確認,我們的身份證(使用者號,組號等),以及我們宣稱的目的,是否與這兒提供的服務相匹配。 如果,我們有權力,按指定的方式訪問,期望的裝置檔案,我們才被允許放行。

我們在open的引數裡,明確已經告訴vfs,我們想訪問誰。

它就會按照我們描述的位址,去查詢"戶籍",看看這個檔案存在不存在。如果從"手頭"的資料裡沒有找到,vfs還會下基層去走訪,確認這個位址是否確實住著這麼乙個"人"。

如果你要找的東西不存在,你就不用繼續了,可以打道回府了。

如果你要找的東西,需要申請相關的許可權(讀,寫,可執行)你也沒有,你也不用繼續走了。

好了,可以舒一口氣了,第一關過了。

好,接著,vfs會進一步使用,與"戶口簿"放在一起的"個人檔案"來確認,這個裝置檔案的基本情況。確認完畢之後,vfs馬上就會意識到,我們要找這個檔案,其實是個裝置檔案,所以也就很快能從"檔案"中,收集到這個裝置檔案的主裝置號及次裝置號。所有的字元裝置驅動,都依靠這兩個編號標示自己。獲得了這兩個編號,就等同於,我們找到了存在於記憶體中的字元裝置驅動了。

"山頂"

我們這趟行程的終點,"字元裝置驅動",到了,歇息一會,四周到處望望,都有些什麼? 

"不識廬山真面目,只緣身在此山中"。

但在山頂上,相信大家不會有這種煩擾。一眼望過去,四周景色一覽無餘。我們很快就能發現,字元裝置驅動的"景點特色"。

例子4.4 字元裝置特色

struct file_operations ;

這實際上是這個山頭的"門面"或"結構藍圖"。毋庸置疑,你所訪問的目標驅動,結構也是這樣的。

再仔細看一下,你會發現,關於乙個檔案開啟,讀寫等訪問請求的所有操作,在這都可以找到原型。說白一點,就是

你所發出的open等請求,最終都會被vfs引導到這裡了。具體做什麼呢?那完全是由裝置驅動及其特點決定了。熱心於山頭私裝改造的核心工程師們,在既要展現統一的"風格或門面",又要展現裝置的效能的旗幟下,建設或改裝自己的小別墅。

山頭上,還有別的風景嗎?還有一處。前一小節,我們已經瞅了它一眼。還記得嗎,"戶口薄",以及主裝置號以及次裝置號嗎?

我們的裝置驅動,只要被裝載入記憶體,就要向linux核心登記, 使用特定的主裝置號,次裝置號標示自己的存在。順便把已經建設完畢的"門面"也告訴核心。ok, 完工了,就等待顧客上門了,所有的客戶可以通過"門面"來獲得服務。

所以,幾乎所有的驅動,可以簡單的劃分成兩個部分,向系統(linux核心)昭示自己的存在,並按規範申報自己的能力,以及按照我們宣稱的能力向客戶提供服務。

"回顧"

每一層的景點都是極具特色的,或者說層與層之間的景色是涇渭分明的。這也正是linux系統層次結構設計,所追求的。

linux核心這個山脈,大大小小的山頭雖然數千個,但在同一屋簷下,也只以很少(10個左右)的"金字招牌"招攬天下豪傑,字元裝置驅動是我們經常看到的乙個。

一 時間複雜度

一 時間複雜度計算規則 1.基本操作,即只有常數項,其時間複雜度為o 1 比如if,print 與規模n無關 2.順序結構 按加法計算 3.迴圈結構,按乘法計算 4。分支結構,時間複雜度取最大值。二 常見時間複雜度與大小關係 常數項 o 1 12線性項 o n 2n 3平方項 o n 2 4n 3 ...

第一時間響應客戶

為響應各種特殊需求,卓越亞馬遜開始大刀闊斧地變革其物流管理系統。早上到公司上班,只要輕點滑鼠,選中一本 杜拉拉公升職記 下午,它就被送到了你的面前。國內b2c電子商務公司卓越亞馬遜的這項服務討到了很多上班族的歡心。最近,這家網際網路公司又開始了他們的新一 勢,以滿足消費者的各種特殊要求。可是目前,國...

演算法(一)時間複雜度

演算法很重要,但是一般情況下做移動開發並不經常用到,所以很多同學早就將演算法打了個大禮包送還給了老師了,況且很多同學並沒有學習過演算法。這個系列就讓對演算法頭疼的同學能快速的掌握基本的演算法。過年放假階段玩了會遊戲nba2k17的生涯模式,沒有比賽的日子也都是訓練,而且這些訓練都是自發的,沒有人逼你...