因為自己還在出差中,沒時間深入學習,最近工作裡又有對一些技術的思考,所以這裡記錄下來,等回去有時間可以按照這個思路進行學習,這裡主要起到備忘的作用。
1.執行緒難學難在我們沒有理解作業系統裡的執行緒設計機制,最近我學習了兩個關於執行緒設計的原理,一個是分時系統裡執行緒是按照時間片進行執行的,可是多執行緒裡大部分執行緒都不能在一個時間片裡全部執行完畢,那麼時間片就要輪換,這裡其實還有個問題就是存放執行緒的佇列是如何設計的,輪換執行緒時候它有何種演算法。當作業系統是單核時候也許理解這些很容易,那麼當作業系統是多核時候,問題來了,作業系統又是如何在多核環境下排程執行緒的呢?而且現在的伺服器基本都是多核的,這個問題需要好好研究下。
2.程式執行都是記憶體和CPU共同作用的結果,執行緒安全問題就是一個執行緒執行完時間片之後,其實它並沒有結束,而是休眠起來等待下一次的排程,這個時候記憶體的資料是被處理一部分或者說這些資料還沒算完,如果說另外一個執行緒再去操作了這些資料就有可能導致記憶體資料發生變化,從而導致最終結果出錯,這就是執行緒安全問題,所以一般執行緒安全問題的解決方案就是給資料上鎖,這個鎖只會被一個執行緒擁有,那麼當時間片輪換時候,其他執行緒碰到這個加鎖的資料就會停止操作。所以在java裡鎖都是設定在Object物件上,也就是鎖都是加在資料上。現在的jdk裡對資料加鎖更加細粒度話,這個細粒度是何種原理設計的,這個需要好好研究。
3.原子操作就是指不會被時間片打斷的操作,換個說法就是CPU在一個時間片下一定要執行完畢的操作,其本質就是CPU裡一個不可分割的運算元,基礎資料型別的操作往往都是原子操作例如int的加減乘除,但是java現在把很多複雜物件也做成這樣了,這個問題就需要我回去細細分析,這些物件的原子類到底是CPU擁有的複雜演算法了?還是講鎖直接封裝在了物件上了。
4.多核程式設計裡有一點是可以肯定的,那就是多個核心的CPU是可以並行處理的,所以多核CPU才有真正的並行操作,但是問題來了,CPU可以多核,記憶體可不是多核啊,那麼這個時候給記憶體資料加鎖,以及原子操作會有何種變化。單核系統的並行操作是一個偽並行,但是多核的並行有可能是真並行,那麼這個時候真正並行的記憶體訪問同一份資料就會有問題,這個細節我現在實在不清楚,需要抽時間好好研究下。此外我們編寫程式有的物件是專門儲存資料,其實演算法例如迴圈,分支也是會被儲存在記憶體裡,告訴CPU該如何計算,那麼這些不同型別的儲存資料到底在記憶體裡該如何分配了,它們到底是何種型別,這個就需要我進一步研究jvm的記憶體模型,自己能提出這個問題很重要,我能感受到這個問題也就說明我不再是糊里糊塗的去看jvm的相關知識了。
5.聽朋友說一些高階的CPU還有超執行緒技術,可以模擬單核真併發,這個也需要研究下。
6.關於執行緒排程機制,單核下或許我並不想深究這個問題,但是多核下的排程呢?如果我們不能理解多核排程,那麼寫出優秀的多核多執行緒會有什麼隱患呢?
7.關於IO的問題,IO,記憶體和CPU這三者的效率相比,IO實在慢的太多,當程式需要很高效率,同時又是IO密集型操作,那麼處理IO,記憶體和CPU關係就會顯得尤為重要,我最近發現IO難學其實和執行緒難學是一直的,要理解深入IO就的深入瞭解作業系統的IO操作原理,例如IO多路複用,selector,poll,epoll,我最近想抽點時間先查閱下相關資料。
以上都是備忘之需。最後聊下現在心情,壞心情:實在討厭出差,特別是到現在還不知道啥時候能回家的出差,每次都覺得下星期能回,現在感覺估計11月都回不了了,等以後有機會一定找個不出差或者少出差的工作。
好心情:每天都要看看新聞,希望武漢越來越好,最近發現武漢房子買的越來越好,這就說明很多外來人口來武漢,我想如果武漢能保持這樣勢頭,武漢的未來一定不錯,武漢不錯,我這樣的大頭百姓也會有更多機會了。