程式設計師的自我修養

2021-10-25 18:31:32 字數 2312 閱讀 7207

mmu(記憶體管理單元)將虛擬記憶體對映到物理記憶體上

執行緒排程:不斷在處理器上切換不同執行緒的行為稱為執行緒排程

執行緒同樣擁有至少三種狀態:

執行就緒

等待處於執行中線程擁有一段可以執行的時間,這段時間稱為時間片(time slice),當時間片用盡的時候,該程序將進入就緒狀態。

windows中原子操作的api

interlockedexchange //原子地交換兩個值

interlockeddecrement //原子地減少乙個值

interlockedincrement //原子地增加乙個值

interlockedxor //原子地進行異或操作

cpu亂序可能引發的問題:

單例模式中的雙檢鎖

volatile t* pinst = null;

t*getinstance()

unlock()

;}return pinst;

}

這樣的**,拋開邏輯是完全沒有問題的,但實際上存在隱藏問題,問題的**就是cpu的亂序執行導致的

c++裡的new包含兩個步驟:

1) 分配記憶體

2) 呼叫建構函式

所以這裡的pinst = new t;包含了三個步驟

1) 分配記憶體

2) 在記憶體的位置上呼叫建構函式

3) 將記憶體的位址賦值給pinst

在這三個步驟中2和3是可以顛倒的。也就是說pinst已經分配好記憶體了,並且也賦值給了pinst,但是這個時候建構函式還沒有執行完畢,就有另乙個執行緒呼叫了,這時就會返回到建構函式沒有執行完畢的pinst物件以提供給使用者使用。這時候程式會不會崩潰就取決於這個類的設計如何了。

為了解決這個問題,可以使用cpu提供的一條指令,barrier()

volatile t* pinst = null;

t*getinstance()

unlock()

;}return pinst;

}

由於barrier的存在,物件的構造一定在barrier執行之前完成,因為當pinst被賦值時,返回的物件總是已經構造完成的。

預編譯:

gcc -e hello.c -o hello.i

編譯gcc -s hello.i -o hello.s

彙編gcc -c hello.s -o hello.o

在預編譯階段做了什麼?

1、處理所有的預編譯指令 #if #elif #else #endif #define #include

2、刪除所有的注釋

3、新增行號和檔名標識,以便與編譯器能夠提示錯誤或者警告的行號

4、保留所有的#pragma編譯器指令

編譯器過程就是把預處理完的檔案進行一系列語法分析、語義分析及優化後生產相應的彙編**檔案。

彙編器是把彙編**轉換成機器之一執行的指令,每乙個彙編語句幾乎都對應一條機器指令。

編譯器做了什麼?

最直接的描述編譯器就是將高階語言最終翻譯成機器語言的乙個工具。

編譯過程一般可以分為6步:

掃瞄、語法分析、語義分析、源**優化、**生成、目標**優化

掃瞄器語法分析器:對掃瞄器產生的記號進行語法分析,產生語法樹

語義分析器

原始碼級優化器

模組間依靠符號來通訊類似於拼圖版,定義符號的模組多出一塊區域,引用該符號的模組剛好少了那一塊區域,兩者一拼接,剛好完美組合。這個模組的拼接過程就是鏈結(linking)

靜態鏈結過程就是將每個模組的源**檔案經過編譯器編譯成目標檔案(object file一般擴充套件名為.o或.obj),目標檔案和庫(library)一起鏈結形成最終可執行檔案。

庫其實就是一組目標檔案的包,就是一些最常用的**編譯成目標檔案後打包存放。

編譯器編譯源**後生成的檔案叫做目標檔案。目標檔案從結構上講,它是已經編譯後的可執行檔案格式,只是還沒有經過鏈結的過程,其中可能有些符號或有些位址還沒有被調整。其實它本身就是按照可執行檔案格式儲存的,只是跟真正的可執行檔案在結構上稍有不同。

目標檔案的格式:

windows下的pe(portable executable)

linux下的elf(executable linkable format)

目標檔案就是源**編譯後但未進行鏈結的那些中間檔案(windows的.obj和linux下的.o),它跟可執行檔案的內容與結構很相似,所以一般跟可執行檔案格式一起採用一種格式儲存。

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

對合作夥伴的尊重與包容 每個人的水平必然是不相同,大家各有擅長,並且在不斷進步中。所以遇到同事或者合作的友商犯了比較低階 對你來說可能是 的錯誤是很正常的事情,我們更多的是應該給與尊重與包容,而不是嘲笑或者消極對待。在不斷的鼓勵同事和合作夥伴之後,能感受到大家對我的信賴,特別是和友商的合作變得非常的...