當我們討論一個功能是用軟體實現還是用硬體實現時,我們究竟關注的是什麼?

最近在自學操作系統,裡面很多地方都提到了一個功能是通過軟體(OS)實現,還是通過硬體實現,比如在TLB miss時的處理,既可以通過硬體通過page walk的方式進行處理,也可以通過操作系統控制陷入內核態通過軟體進行處理,如Operating Systems_Three Easy Pieces一書中提到的:

我的問題是,硬體處理TLB miss時依賴於具體的指令,這些指令是不是可以看成一種「軟體」?而軟體處理時最終編譯後執行不也是通過指令去查詢頁基址寄存器然後查詢頁表,最終更新TLB麽,也是依賴於頁基址寄存器這個硬體,看上去只不過是包裝了一層操作系統的外衣?

那麼硬體處理和軟體處理的本質區別在哪裡呢?

另外關於功能的軟硬體實現,我還有一個自己的想法,是不是硬體實現和具體的指令架構有關,硬體的設計要和微指令集相匹配,一個特定的硬體相當於一個固定的「指令」,而軟體實現不依賴於具體的指令集架構,換句話說,軟體實現可以將各種基本的指令自由組合來模擬實現各種複雜的功能,只要一個指令集是圖靈完備的,不考慮效率的情況下,可以通過軟體代碼模擬實現所有通過硬體實現的操作,而不依賴於指令集的硬體具體實現方式?不知道這種想法有沒有道理,還請大家指正。


先舉一個極端的例子。我們都知道「加法」和「乘法」肯定是用硬體實現的。這不廢話么?可是你平時聽到過有人強調這點嗎?沒有。因為「加法」和「乘法」的應用非常普遍。普遍應用的東西,你做 CPU 的不去直接實現是不是傻?分分鐘被競爭對手干屁。

有了「加法」和「乘法」你就可以組合了。比如說 a * a + b。咦,你突然說了,做硬體的,能不能給我的 a * a + b 做個硬體電路,肯定快啊。做硬體的說,你 tm 誰啊?要我給你的破公式做硬體電路。

可是有沒有做硬體的同意的時候呢?有啊,比如

a * b + c * d + e * f,

數學家說了這個東西用處多,叫 dot product of (a, c, e) and (b, d, f)。做硬體的就在「加法」和「乘法」之外單獨做一套更快電路。可是和「加法」和「乘法」不同,還是很多人用不到 dot product,所以做硬體的就沒能和做語言的商量好,沒能把 dot product 做成 higher level language 的一部分那麼好用。

有一部分人不好好學習,該用 dot product 的時候就用「加法」和「乘法」湊合一下。

還有一部分人,知道怎麼用 dot product。可是自己寫演算法的時候,不知道把本來可以寫成 dot product 的部分寫出來,而是把演算法寫成了根本沒用 dot product 的形式。

結果那些會把演算法寫成 dot product,又會調用硬體 dot product 的人就跳出來說了,我這個演算法是「硬體實現」的。


實際上關注的是Latency和Throughput。


先說觀點,從題主只看結果的角度這是沒有區別的。也就是我有一個TLB MISS的問題,現在有兩種解決方案,不管哪種看成黑盒最後的邏輯輸出都是一樣的,在不考慮效費比、速度這些因素的情況下還真沒有區別。

而題主確認這個問題後肯定會提出下一個問題,根據題主的提法可知題主是偏軟的。那麼題主後續問題的觀點我就沒法同意了。因為一切軟體都是以硬體為基礎的,現在AI出現了那麼多邏輯映射到硬體應用,在不考慮效率的前提下完全可以不用軟體。

之所以有軟硬體的分家是為了工業化。圖靈的時代圖靈自己既是軟體工程師又是硬體工程師,自己設計的機器自己編程。要是照這樣發展下去現在的程序猿們得回家去進化智力了。

題主看見的是軟硬體交界處可以採用兩種方式實現的問題。軟體的問題硬體無法全部替代,硬體不具備普適性很難進行通用計算。同樣硬體也幫軟體屏蔽了很多物理上的約束,比如漏電流、emc、指令時序。不要因為看看操作系統這種處於軟硬體交界處的問題就認為誰可以替代誰!


我認為「硬體實現」應該分兩種,一種是設計了專門的硬體電路,如乘法器/除法器之類的。另一種就是加入了指令集,或者說是「固件」以後的實現,FPGA就可以算屬於這個層面的。

你的想法就類似於用FPGA去代替CPU。

事實上固化得越底層,可以說性能就越高,這就是通常說FPGA比ASIC慢的原因。ASIC把硬體電路確定了,FPGA卻需要在一堆通用的邏輯門上組裝一個運算單元。而CPU,既沒有專用的電路,又沒法像FPGA一樣直接控制底層的邏輯門,所以只能在現有的指令集上做組裝,效率就又低了一層。

CPU是通用處理器,所以做一些專門的任務時比不過專門設計的單元,但好處就是靈活啊,我可以動態改變自己的實現。

回到你的問題,答案當然是可以。而且越是在硬體上固化,就越不"靈活",所以適當地把任務往上一層移交是有道理的。

軟體處理TLB miss,哪怕再優化,依舊要按照指令集來,理論效率上是比不過硬體處理的,因為硬體實現甚至可以省去很多解碼/調度環節。但是如果你的設計和硬體處理不相容,或者需要更豐富的操作,那很明顯就得用軟體實現了。

用軟體去模擬指令集操作,自然是可以做到的,比如MC里拿紅石搭「CPU」算不算?

再舉個例子的話就是「模擬器」,比如一個安卓模擬器,用二進位翻譯而不是硬體虛擬化去模擬arm的CPU,但結果也很明顯——效率的確是低。

有些CPU號稱能在更底層進行二進位轉換,兼容其它指令集,這樣的性能就會好一些(大概可以算作一種固定的FPGA?),但依舊比不上純硬體設定好的。


簡單來說,依賴於電子電路、或者燒進固件里的無法簡單修改的內容的實現叫做硬體實現,依賴載入到內存中的、可以通過升級操作系統等方法改變的內容的實現叫做軟體實現。也可以說,硬體廠商負責的叫做硬體實現,軟體廠商負責的叫做軟體實現,這樣是不是也能清楚點。

說白了是需要一個在硬體廠商和軟體廠商之間的界面,這個界面劃分在哪裡的問題。這和軟體中的模塊劃分之類本質上來說是一樣的。硬體實現和軟體實現有不同的特性,硬體實現不受體系架構的限制,不與軟體部分衝突,但是要佔用額外硬體資源;軟體實現則需要硬體提供相應的介面,需要考慮和其他軟體部分的協同,但是實現起來很靈活,可以節約大量的硬體資源。


硬體處理TLB miss時依賴於具體的指令,這些指令是不是可以看成一種「軟體」?

這些指令的專用程度越高,就越「硬體」,反之就越「軟體」。


問::我有個單片機,我寫了個C語言程序燒進去,用來對串口數據進行一些處理。請問這是軟體解決還是硬體解決?

答:我特么管你是軟體還是硬體,不能解決問題就不給你錢。


如果說硬體是不可變更的編碼,軟體是可變更的編碼,那Fpga算硬體還是軟體呢?

軟體和硬體的區別一部分是在抽象層次上的。比如你寫了一個fc的模擬器,你用軟體模擬了一個硬體的抽象層次,對於fc的程序來講,你寫的軟體對它而言就是硬體了。

硬體一般可以用狀態機去描述,軟體如果用狀態機去描述就太複雜了。這兩者之間肯定有一些中間狀態。

個人建議可以翻翻數字設計和計算機體系結構這本書看看。

對於一個確定演算法而言,軟體是時間和人力成本,硬體是晶元面積,發熱和製造成本,Trade-off。


1,這個世界上不存在「不考慮效率」的事

2,硬體工程師和軟體工程師是學的是不同專業擁有不同的思考模式——哪怕玩的是fpga


有些演算法很容易用硬體電路高效實現,用通用CPU就很慢。

什麼叫用硬體實現,就是這個功能有硬體電路支持,在速度吞吐能耗上面能吊打純軟體實現。

否則就是逗你玩的。


計算機實際上就是"計算機".


對於軟體來說沒什麼區別,但當遇到實際問題時會考慮。硬體有了某種功能,軟體就不用去做了。用硬體省時間省內存省功耗,但硬體的缺點是不夠靈活,可能會過時。

晶元商為了提高競爭力才肯這麼干。

所以說晶元商為了某個通用的(一定是通用的,儘可能能賣更多)功能在晶元內實現,可以提高競爭力。

比如說某單片機廠覺得物聯網的應用市場會爆發,通訊中用的AES加密會使用的非常多。他們經過衡量覺得有必要投入這個成本,那麼他們就會去集成到晶元里。


成本與實現的難度


推薦閱讀:

有哪些不錯的大型項目代碼瀏覽工具?
怎樣做到C語言和Python能夠均衡的一起學習?
程序員如何形成自己的編碼風格?
新手請教python問題,就是說像map,zip,filter這些函數都返回單次迭代器。?
像我這種程序員還有必要繼續做下去嗎?

TAG:操作系統 | 編程 | 計算機 | 硬體 | 計算機科學 |