話題一:緩存思想算法
咱們常常說,要想讓程序快,就得多利用緩存,有一句話說的好,緩存爲王!
數組
從計算機硬件上看,咱們知道有內存,CPU裏面有寄存器/一級/二級/三級緩存,那麼CPU裏面爲何要這些東西呢?瀏覽器
程序是運行在內存之上的,CPU是負責計算處理數據的,想想:緩存
方案一:每一次CPU計算數據都是從內存裏面取,計算完畢後,在寫入內存服務器
方案二:將CPU須要計算處理的數據從內存先加載進一級、二級、三級緩存,那麼意味着之後CPU進行計算將從本身的緩存中拿去,而不用每次從內存中取,這樣會節省不少時間!網絡
那麼什麼是緩存思想呢,胖哥說的好,其實就是「就近原則」,只要咱們須要處理的數據離的近,那麼就計算的快!多線程
話題二:處理指令的方法ide
咱們在移動鼠標,敲打鍵盤的時候,都會發出指令,那麼計算機是如何處理這麼密集的指令的呢?
編碼
方法一:計算機能夠每隔一段時間去掃描各個部件,看看有沒有指令須要處理。
spa
這種方法的弊端是,當掃描到的時候,可能指令早就發出了,也就是「晚了」。
方法二:以下圖所示
首先來講,咱們不知道設備何時發出指令,也不知道發出指令的頻繁度,而CPU又是一個高速處理指令的部件,那麼怎麼辦呢?
讓發出的指令,進入一個指令緩衝區內,CPU從指令緩衝區內拿指令進行執行,這樣起到了一個平衡的做用,並且發揮CPU的高效性!【其實這就是所謂的「中斷」模型】
可見,不只僅緩存能夠提升程序的運行速度,利用緩衝區的思想對於一些系統也是一個不錯的IDEA!
想想,咱們常常在JAVA IO的過程當中使用BUFFER,和上面的思想不是相似的嗎?
話題三:多個CPU
計算機從原先的一個CPU,弄到如今有不少個CPU,這是爲何呢?
有一堆貨物,若是多我的一塊兒來搬,會比一我的搬,要快的多!但是,人多了,是會有矛盾的,是須要複雜的算法進行管理的;而一我的,隨便怎麼弄!
設想一下,若是來了一個指令,多個CPU一塊兒來爭奪這個指令,都想去執行這個指令,怎麼辦?
既然有多個CPU,那麼爲何不指定一個「老大」,出現矛盾時,就聽「老大」的,這是一種實現調度的方式。
話題四:如何CACHE?
有一個CACHE LINE的概念,說的就是將一段連續的內存空間CACHE住!
好比,咱們有一個一維數組,那麼顯然,若是一次性將數組元素CACHE到緩存中,會有利於程序的高效性,反之,若是每一次訪問數組元素都是從內存中加載的話,必然效率不高。
話題五:多核CPU與多線程
咱們知道在JAVA代碼中,可使用synchronized來進行鎖的控制,其實是指定了一塊臨界區,在這塊臨界區內,無論有多少個CPU,只要有一個線程進入了,那麼其餘線程都必須等待,其實是將其餘線程放入到了一個阻塞隊列中,一旦臨界區內的線程離開了,那麼阻塞隊列中的線程被激活。
在咱們的系統中,是否是線程越多越好呢?
咱們但願CPU是真正的在幹活,而不是在多個線程上進行「上下文切換」。
若是咱們的系統是CPU密集型,也便是大多都是計算任務,應該配置和CPU個數相關的線程數量;若是是IO密集型,其實並不佔用太多CPU(阻塞IO的話),所以能夠經過提供數目較多的線程來達到提升CPU的使用率。
話題六:隨機讀寫和順序讀寫
在計算機領域,常常聽到上面的概念,那麼到底什麼是「隨機」/「順序」讀寫呢?
咱們的數據是存儲在硬盤上的,而機械式的硬盤,是須要尋道尋址的,也就是必須先轉動磁頭到相應位置後,在進行讀寫。若是,咱們的IO次數較多,並且都仍是些小IO的話,勢必形成磁頭一下子在A處讀寫,一會又到B處讀寫,這就是所謂的「隨機」的概念。
能夠看得出,隨機讀寫,會有大量的時間花費在尋道尋址上,那麼什麼是順序讀寫呢?
若是有10條數據須要寫入,那麼不要先寫第一條,寫完了,在寫第二條,而是一次性批量的寫入!將屢次小IO合併成大的IO,批量的,一次性寫入,這就是「順序」的概念。
感悟:咱們在JAVA IO操做時,老是說數據先寫入BUFFER,等緩衝區滿後,在FLUSH,其實就是將隨機讀寫變成順序讀寫,從而節省IO時間!
話題七:網絡IO中的一些思考
字節流 VS 字符流
在網絡IO中,傳輸的是字節流,也就是計算機所能識別的01數字,而對於咱們而言,字符是可視化的,友好的,所以會在字節流的基礎上進行包裝!
接收方如何知道編碼?接收方如何知道結束?
若是A給B發送一串信息S,在網絡中會將S弄成字節流D,B拿到後如何知道是什麼呢?B又如何知道何時發送結束了呢?
首先來說,S到D的過程,會利用到字符集,其實就是一個映射表,它告訴了多少個字節的數據會轉化成可視化的字符數據;B拿到字節數據後,同理,利用映射表將其轉化成字符數據。
可見,若是編碼的過程和解碼的過程採用同一的字符集的話,就不會出現「亂碼」問題了。
那麼,B如何知道A的編碼是什麼呢?
能夠A,B在寫代碼前,商量好字符集,或者採用一種更加「智能」的方式:
想想,瀏覽器和服務器在利用HTTP協議進行通訊時,是否是有不少paramName=Value的數據,若是A在發送數據的時候,同時給數據打一個「標籤」,明確的告訴B編碼是什麼,B收到數據後,先看「標籤」,明確了字符集,在進行操做,這樣一來,B就能夠自動識別A發送數據的字符集了。
A在給B發送數據,那麼B又如何知道何時數據結束了呢?
若是A write了一行數據,而且以\n結束,若是B收到了一行數據,還讀到了\n,那麼就意味着本次數據讀完了。也就是writeLine()/readLine()是須要結束標記的!
那麼除告終束標記外,還能夠怎樣呢?
若是A在發送數據前,先告訴B,我要發送N大小的數據,那麼B天然接收到N大小的數據後就知道該結束了!