面試突擊(二)——理解計算機編程技術複雜性的根源

       編程到底難在哪裏呢?編程語言的語法複雜?業務邏輯複雜?可能都存在吧!不過就我自身的感覺是編寫多線程高併發相關的代碼,以及編寫網絡通訊的代碼是比較複雜的,學習過c/c++不過我主要使用java編程,猜想管理系統內存直接和OS打交道的部分也應該是比較複雜的。若是沒有多線程高併發編程,也不須要編寫多進程之間通訊的編程,我想編程可能就會輕鬆許多了。那問題來了,爲啥會有進程、線程的存在呢?我認爲計算機編程技術的複雜性的根源就在於這三個字——速度差java

       一樣話不讀多少,先上一個圖看一下!c++

 

 

從上圖中咱們能感覺到CPU和數據存儲設備的速度差是多麼的懸殊,人類在各個方面對於性能的追求老是孜孜不倦的,由於更快表明着更強或者能更早的獲取到機會爭取到利益。數據庫

計算機核心的功能在於計算,最先是人肉輸入信息讓計算機來計算,不過人和計算機在速度上比,人絕對是智障。固然,人腦也是極易輸入錯誤的,因此,就將相應的輸入程序及數據先寫好放到硬盤,到時候計算器直接從硬盤上讀取就好了,不過硬盤太慢了CPU難以忍受,因此,爲了更快的讀取速度,就加上了內存,但是內存相對CPU仍是慢的不行,後來又加上了L1/L2/L3三級緩存,這樣總算是基本遇上CPU的速度了。解決了速度匹配的問題,可是引入了其餘的問題,好比:內存及緩存空間比較小,所需數據比較多,命中不到仍是須要從磁盤一級一級的把數據倒騰過來,計算的數據也一樣須要一層層的在寫回磁盤。磁盤——內存——L3——L2——L1——CPU之間仍是存在速度差的,存在速度差就又快又慢就存在等待,存在等待就存在乾的快的有空閒。爲了避免讓CPU空閒,因而產生了多進程,不過多進程的上下文切換過重了,因而又有了線程,線程間是共享進程的公共內存空間的,多個線程對同一塊內存地址均可以有寫操做,因而就產生了多線程並不是編程致使數據不一致性的問題。爲了解決這個問題有引入了鎖機制以及內存操做的管理模型,這樣下來本來簡單的編程就變得複雜了起來。編程

我認爲單機編程的複雜性就在這裏了,引發這個複雜性的根源就是——數據存儲設備運輸數據到計算設備的速度差致使的。若是仔細來好好分析,幾乎全部的技術,都在是千方百計絞盡腦汁的在經過各類方法來解決這個問題的。好比:數據庫的索引,內存數據庫,零拷貝,線程池,單例模式,異步編程,事件驅動模型,日誌追加寫,數據先放入內存在一級一級的放入對應的緩存等等。緩存

相關文章
相關標籤/搜索