最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

通俗視角說系統(tǒng)(Operation System)

2023-06-11 02:07 作者:飛翔の回聲_FlappyEcho  | 我要投稿

????各位好,我是回聲,今天我們聊一聊操作系統(tǒng)。

????開始之前,我仍然需要負(fù)責(zé)人的和各位說,在此文章處于謄寫的狀態(tài)時(shí),我不能保證文章所有概念、術(shù)語以及專業(yè)的正確性。

????在此文章寫完以及發(fā)出的一段時(shí)間里,我會(huì)把它呈遞給我的同學(xué)、前輩等同行業(yè)愛好者進(jìn)行閱覽,并即時(shí)改正其中的問題,若是問題過多,我則會(huì)刪除該文章以防止它過度的誤導(dǎo)其他學(xué)習(xí)者。當(dāng)然閱讀的各位也可以在評(píng)論區(qū)中書寫你所認(rèn)定的錯(cuò)誤之處,只是煩請各位指正錯(cuò)誤的時(shí)候不要焦躁,討論技術(shù)咱們有話好說,切勿以帶著任何令人不悅的口吻來討論。我雖然才疏學(xué)淺但并不缺可以和諧討論并共同學(xué)習(xí)的朋友、前輩與師長。

????當(dāng)然,雖然我尚不能說我的理解都是正確的,但在我自己的認(rèn)知體系里可以做到自圓其說,如果它的存在能為一些同行業(yè)者帶來不錯(cuò)的啟事或者為一些學(xué)習(xí)者帶來一個(gè)不錯(cuò)的理解體驗(yàn),那都是最令我開心的事。

????這篇文章我姑且放在了我的【深入淺出C++】專欄里,但是今天我一點(diǎn)都不打算談C++的事,甚至有關(guān)代碼的事我也只會(huì)寥寥幾句帶過。在這篇文章中,我的內(nèi)容中會(huì)盡量使用很通俗的說法,以至于這之中專業(yè)術(shù)語肯定會(huì)出現(xiàn)不嚴(yán)謹(jǐn)?shù)牡胤?,但不?huì)影響理解,還望各位諒解。

????好,那既然前話都說完了,讓咱們正式開始:

????程序員有三大浪漫,分別對應(yīng)著計(jì)算機(jī)行業(yè)三個(gè)可以說是最難的專業(yè)方向,從我自己的角度上說,我會(huì)加一個(gè)服務(wù)器開發(fā),這樣一來總結(jié)出來的四個(gè)專業(yè)方向:

????操作系統(tǒng)開發(fā)
????編譯器研發(fā)
????圖形學(xué)
????高性能服務(wù)器開發(fā)

幾乎可以說得上是計(jì)算機(jī)行業(yè)中,最常有大神大佬涉足的領(lǐng)域。一般的,從事這四個(gè)領(lǐng)域的程序員(其實(shí)能完美駕馭這四個(gè)領(lǐng)域的人,應(yīng)該用專業(yè)的工程師來稱呼了)收入也都不低。

????對于我個(gè)人而言哈,這四個(gè)領(lǐng)域我肯定是完完全全的門外漢,跟那些耕耘其中的工程師相比,說是渣渣也不為過。但作為一個(gè)C++的學(xué)習(xí)者和愛好者,修煉內(nèi)功建立底層的基本認(rèn)知并助力我們平日里對開發(fā)的深層次理解卻是一件美事。

????學(xué)習(xí)的過程里,咱們總是遇上形形色色的,完全不會(huì)的東西。打個(gè)比方,就像最初做算法題的時(shí)候,雖然死活就是不會(huì)吧,但似乎腦子里還能隱約有這個(gè)問題的解決方向,似乎使使勁就可以將之攻破,哪怕你無法實(shí)操,卻也能猜出其大致的運(yùn)作原理,我會(huì)稱呼這種問題為可預(yù)知的問題。而自然另一類問題,則似乎完全被封裝在了一個(gè)黑盒中,從原理到概念上就完全不知道其內(nèi)部是怎么運(yùn)作的,想破腦袋都想不出個(gè)所以然,我一般稱呼其為不可預(yù)知的問題。今天要聊的操作系統(tǒng),在很長的一段時(shí)間里,對我而言都是這樣的不可預(yù)知的問題。試想一下,憑什么咱們最初書寫的hello world代碼最后能成為一個(gè)大型的,帶精妙算法的,帶各種華麗視覺特效的程序?甚至可以說,你寫的那個(gè)hello world都不是靠純粹的編程語言寫出來的,而是所謂系統(tǒng)調(diào)用。假設(shè)一個(gè)語言保留語法卻刪除了所有系統(tǒng)調(diào)用后,讓顯示器輸出幾個(gè)簡單字符的程序又應(yīng)該如何實(shí)現(xiàn)?

????幸運(yùn)的是,雖然我主攻的專業(yè)是C++的程序開發(fā),卻也擔(dān)任著半個(gè)電氣工程師的職務(wù),以至于我得以有限的接觸硬件,雖然不及嵌入式或是電力電子那般底層吧,但我個(gè)人覺得,這些硬件的基礎(chǔ)認(rèn)知還是幫助我形成了現(xiàn)在我對操作系統(tǒng)的一個(gè)初步的概念。

????對于大多數(shù)人而言,咱們謄寫的程序無論多么的復(fù)雜,多么的高級(jí),但簡略的概括程序組成其實(shí)就兩部分:【由編程語言的語法提供的內(nèi)存操作】和【系統(tǒng)調(diào)用】。當(dāng)然,這個(gè)時(shí)候各位不要跟我較真什么泛型編程之類的東西,那玩意本質(zhì)上都是編譯器幫咱們寫代碼,而代碼的內(nèi)容最終超不過上述的兩個(gè)范疇。

????以編譯型語言來說,將上述的內(nèi)容轉(zhuǎn)換到匯編的代碼中后,【系統(tǒng)調(diào)用】的部分仍然被封裝了起來,【內(nèi)存的數(shù)學(xué)操作】則全部轉(zhuǎn)換成匯編代碼,總結(jié)一下匯編代碼的所有內(nèi)容,其實(shí)就是下面幾個(gè):
????內(nèi)存及寄存器數(shù)學(xué)操作,如mov、lea、add等
????代碼跳轉(zhuǎn),如jmp等
????數(shù)學(xué)比較,如cmp等
(如pop、push、ret、call等其實(shí)也都可以用上面那些基礎(chǔ)指令實(shí)現(xiàn))

????其中數(shù)學(xué)比較和代碼跳轉(zhuǎn)配合起來就是十分基本的if else語法,也包括for、while循環(huán)(本質(zhì)上for就是拿while寫的)。

? ? 咱們上C語言的第一節(jié)課時(shí)就被教過:計(jì)算機(jī),準(zhǔn)確的說是CPU執(zhí)行的是二進(jìn)制代碼。因?yàn)槎M(jìn)制代碼是可以和匯編一一對應(yīng)的,咱們暫且將匯編當(dāng)成CPU最終執(zhí)行的語言,那么憑借這些基本的操作,系統(tǒng)調(diào)用的功能是怎么實(shí)現(xiàn)的?難道說匯編還有其他的語法,隱藏了它直接控制硬件的一些隱性操作?

? ? 這當(dāng)然是否定的,CPU能執(zhí)行的代碼跳出大圈了就那幾個(gè),可憑借這些個(gè)東西,憑什么顯示器上能打印hello world?憑什么內(nèi)存里的數(shù)字?jǐn)[來擺去就能讓顯示器又干這又干那?那同為系統(tǒng)調(diào)用的網(wǎng)絡(luò)通信呢?線程管理呢?

????在聊這個(gè)之前,咱們回歸一些本質(zhì)且簡單的“公理”,那就是:計(jì)算機(jī)是一臺(tái)電子、或者電氣設(shè)備。

????電氣設(shè)備是什么東西?當(dāng)我思考最基礎(chǔ)的電子和電氣設(shè)備時(shí),我想到的就是一個(gè)燈泡或是說LED,你給他通上電,它就會(huì)亮,映射為其他硬件其實(shí)也是,你給他通電,或者用更專業(yè)的說法,叫使能,你給了設(shè)備一個(gè)使能,這個(gè)硬件就開始以他電路設(shè)計(jì)的功能開始工作。

????不要小看這個(gè)似乎誰都知道的公理,畢竟計(jì)算機(jī)歸根結(jié)底仍然是一個(gè)電氣設(shè)備,它是要符合這個(gè)公理的。當(dāng)能夠理解消化這個(gè)公理的時(shí)候,就不難理解為什么計(jì)算機(jī)被設(shè)計(jì)成了二進(jìn)制。它可不想人類一般有陰晴圓缺,而就是一個(gè)二極管,對于某一個(gè)電氣部件而言,它要么有電,要么沒電,這即是1或者0。請不要較真說這世界上有一個(gè)叫‘模擬量’的存在,因?yàn)槿魏文M量在進(jìn)入系統(tǒng)內(nèi)部的時(shí)候,都會(huì)經(jīng)歷一個(gè)叫做AD轉(zhuǎn)換的過程轉(zhuǎn)換成數(shù)字量。

????以這個(gè)公理為出發(fā)點(diǎn),我們回頭看一看CPU,最終編譯成的二進(jìn)制代碼就是這臺(tái)計(jì)算機(jī)的大腦可以執(zhí)行的最終物。那么,為什么CPU可以執(zhí)行代碼?

? ? 在系統(tǒng)編程課程上,我們經(jīng)常會(huì)遇到那些使用起來特別蹩手蹩腳的系統(tǒng)調(diào)用,它的參數(shù)或者返回可能是一個(gè)四字節(jié)整形,但用意卻絕對不是讓我們把他當(dāng)成整形用,而是將之視作一個(gè)32位的比特序列,進(jìn)而通過指定位是0(false還是1(true來判斷、設(shè)定系統(tǒng)運(yùn)行的情況亦或是某種狀態(tài)。

????結(jié)合上述系統(tǒng)調(diào)用的這種思想,再去思考CPU的運(yùn)行,代碼的最終展示如果都是二進(jìn)制的話,那么組成它內(nèi)容的就會(huì)是true和false的通斷序列,對于一個(gè)硬件而言,這不就是一個(gè)輸入陣列嗎?學(xué)過數(shù)字電路的同學(xué)肯定不難理解,如果將CPU當(dāng)做是一個(gè)有引腳的芯片(雖然它就是),那么每一條指令都會(huì)標(biāo)記處它的輸入引腳何處應(yīng)該是0何處應(yīng)該是1。換句話說就是:每一條指令都會(huì)承載這個(gè)CPU芯片的輸入引腳何處應(yīng)該使能何處不應(yīng)該使能的記錄。最終讓代碼執(zhí)行的過程就可以理解為:為CPU這個(gè)硬件的指定引腳進(jìn)行使能的過程,而不同的使能組合,則可以讓CPU的運(yùn)行產(chǎn)生不同的結(jié)果,咱們所謄寫的代碼,最終以這樣的形式,讓CPU按步驟讓指定的引腳通斷電來運(yùn)行其不一樣的功能。

????需要注意,我們簡單的將CPU看作是一個(gè)有許多引腳的芯片,也可以將它看作是一個(gè)有一大堆switch鈕的設(shè)備,代碼最終編譯成的二進(jìn)制代碼成為了一個(gè)使能序列,CPU執(zhí)行某一次代碼的過程就可以視作它按著那個(gè)使能序列撥動(dòng)了指定的switch鈕。不需要將模型復(fù)雜化的考慮它的內(nèi)部構(gòu)造,如控制器或是運(yùn)算器等,因?yàn)槿绻皇菍⒅橄蟪蔀橐粋€(gè)撥下指定switch鈕就可以運(yùn)行指定功能的設(shè)備時(shí),它作為硬件的內(nèi)部構(gòu)造都是一個(gè)前文中所說的可預(yù)知的問題

????對于任何一個(gè)簡單的設(shè)備,芯片而言,它有輸入,就會(huì)有輸出,他的【輸入】如果是【數(shù)個(gè)輸入引腳上有電和無電的有規(guī)則組合】的話,【輸出】則自然而然就是【數(shù)個(gè)輸出引腳有電和無電的有規(guī)則組合】。請注意,這些被【】括起的所謂什么什么規(guī)則的組合,與使能組合、使能序列、通斷組合、通斷序列這些前面出現(xiàn)的名詞都是同義詞

????如果是學(xué)過數(shù)字電路的同學(xué),應(yīng)該能知道我所說的是一件很簡單就能理解的事。從原理上說,當(dāng)你想設(shè)計(jì)一個(gè)芯片【有怎樣的輸入就會(huì)產(chǎn)生有某種規(guī)律的輸出時(shí)】,都可以通過列真值表和卡諾圖等數(shù)學(xué)手段推導(dǎo)最終這些個(gè)輸入引腳應(yīng)該以什么樣的電氣方式和與或非門等門電路進(jìn)行連接并最終接到輸出引腳上。

????在電路和硬件上,一個(gè)芯片負(fù)責(zé)一個(gè)簡單的運(yùn)算功能,它的輸出完全可以作為輸入給到另一個(gè)芯片上,或是某一個(gè)輸出引腳直接借由繼電器原理(即某兩個(gè)觸點(diǎn)通電后能控制一個(gè)開關(guān)的通斷)控制某個(gè)高功率設(shè)備的通電。借由這樣幾乎是套娃的組合,每個(gè)芯片、硬件之間各個(gè)處理好自己的工作并將結(jié)果傳給下一個(gè)芯片、硬件,最終使一個(gè)復(fù)雜功能的設(shè)備就可以組合起來,而后來,我們將之稱呼為模塊。

????上面說了不少東西,是為了讓各位能夠理解,將CPU視作上述的硬件時(shí),它就會(huì)是一個(gè)雖然復(fù)雜但是可以理解其原理的模型了。

????現(xiàn)在我們把注意力拉回來,如果CPU得到了一個(gè)指令,這些指令的本質(zhì)是讓CPU這個(gè)芯片的特定引腳置為了ture。我們假設(shè),CPU按著某個(gè)指令將特定引腳設(shè)定為true后,它執(zhí)行了一個(gè)功能,這個(gè)功能是【將寄存器A的值寫入內(nèi)存地址B】。有些同學(xué)不用感到疑惑,因?yàn)榧拇嫫鰽和內(nèi)存地址B的具體信息,全被以輸入的形式囊括在了CPU執(zhí)行的那段機(jī)械碼里,指定引腳的通斷最終只能讓寄存器A和內(nèi)存地址B得到相應(yīng)的操作。

????計(jì)算機(jī)基礎(chǔ)里有一個(gè)應(yīng)該很多人都見過的存儲(chǔ)速度排名:
????寄存器 > cache > 內(nèi)存(主存) > 外設(shè)(如硬盤等) > 分布式存儲(chǔ)系統(tǒng)
????CPU可以很容易獲得寄存器A的值,因?yàn)榧拇嫫鬟@硬件就長在CPU上,但CPU想要將這個(gè)值寫在內(nèi)存里就會(huì)麻煩了。它需要借助總線來完成這個(gè)操作??梢哉f,CPU和所有它要控制的硬件,幾乎都是使用總線來連接的。也同時(shí)可以說,CPU的所有輸出操作,最后都會(huì)落實(shí)在總線上。我們到此為止就可以用一個(gè)簡單的模型來概括CPU的工作:
????它通過二進(jìn)制的指令獲得輸入引腳的通斷序列,在經(jīng)過一系列的內(nèi)部電路運(yùn)作之后,最終控制總線向其他設(shè)備輸出電信號(hào),而那些設(shè)備通過總線得到了信息后,在經(jīng)歷一部分自己的硬件需要進(jìn)行的操作后,還會(huì)返回電信號(hào)給CPU,自然而然也是通過總線。這不難理解,CPU通過總線相向內(nèi)存要某一個(gè)地址的數(shù)據(jù),內(nèi)存自然而然就得返回這個(gè)地址的數(shù)據(jù),這是一個(gè)標(biāo)準(zhǔn)的【讀操作】,不難想象,哪怕是【寫操作】,CPU也需要從這些設(shè)備中得到它們是否運(yùn)行成功。

????寫到這里,各位不覺得這似乎已經(jīng)是client和server之間的最基礎(chǔ)架構(gòu)了不是嗎?但在接著說之前,我們借由總線來聊一聊電線。

????在電學(xué)中,電線只有兩個(gè)用途:
????1、通電,或者說使能
????2、通信

????通電太常見了,我用兩根電線,給一個(gè)燈泡一正一副接在電源上,它亮了,因?yàn)槲医o它通電了,我給它使能了,大部分的電纜、電線基本都是這個(gè)。
????通信則是傳了一段電信號(hào),這段持續(xù)的電信號(hào)可能忽高忽低,可以被硬件識(shí)別成0或者1的序列,這些序列能承載一定的信息和內(nèi)容,并被硬件接受后放在某個(gè)存儲(chǔ)區(qū)或是緩存區(qū)里,這就是通信,像網(wǎng)線、串口線,基本都是用來通信的電線。

????那么,總線是什么線呢?它能是通電線或者使能線嗎?

? ? 總線當(dāng)然不是使能線,總線是通信線。

????畢竟,通信線能夠以更少的物理線路傳遞更多的信息。使能線的通斷終究只能承載0或者1的信息,當(dāng)CPU與諸多外設(shè)連接的時(shí)候,僅能承載真假兩個(gè)狀態(tài)信息的使能線在海量需要傳遞的信息面前是不夠用的。CPU的大小就那么大,需要吧使能線設(shè)計(jì)的多么纖細(xì),又或者需要多少使能線,才能構(gòu)筑出CPU與所有外設(shè)的連接。而如果是用使能線,CPU又需要在內(nèi)部額外設(shè)計(jì)多少電路結(jié)構(gòu)?這些是我的個(gè)人想法。



????文章謄寫至此還未將所討論內(nèi)容完全講述清楚,考慮到本文涉及的內(nèi)容可能既有難度,又難以完全的驗(yàn)證,而且內(nèi)容還十分的多且雜亂,所以我這里會(huì)先更新一部分,并最終通過文章修改的方式讓此篇專欄更新修改至最終版。

????文中的說法我仍然不能保證完全的正確,在文章發(fā)布和更新的期間,我會(huì)以各種方式來審查文章中的不嚴(yán)謹(jǐn)或是錯(cuò)誤的地方以即時(shí)更改,各位同好也可以在評(píng)論區(qū)中討論各位認(rèn)為有錯(cuò)誤的地方。當(dāng)錯(cuò)誤得到驗(yàn)證后我會(huì)更新文章,對于曾經(jīng)極有誤導(dǎo)性的內(nèi)容,我會(huì)標(biāo)注修改記錄,但煩請各位禮貌討論以及提意見。


通俗視角說系統(tǒng)(Operation System)的評(píng)論 (共 條)

分享到微博請遵守國家法律
蓬莱市| 阿鲁科尔沁旗| 大化| 临沂市| 大丰市| 凤山市| 邵武市| 锡林郭勒盟| 同仁县| 福贡县| 丹阳市| 阳西县| 牡丹江市| 万山特区| 四会市| 南充市| 雷山县| 夹江县| 承德县| 曲麻莱县| 舒兰市| 林甸县| 苏尼特左旗| 晋城| 三亚市| 柳州市| 开封市| 和顺县| 景泰县| 克什克腾旗| 乌鲁木齐县| 云霄县| 丹寨县| 济宁市| 得荣县| 蒙自县| 颍上县| 渝中区| 鄂伦春自治旗| 吴江市| 逊克县|