線程創(chuàng)建之前
1.系統(tǒng)為線程分配并初始化一個(gè)線程內(nèi)核對(duì)象;
2.系統(tǒng)為每個(gè)線程保留1MB的地址空間(按需提交)用于線程用戶模式堆棧;
3.系統(tǒng)為線程分配12KB(左右)的地址空間用于線程的內(nèi)核模式堆棧。
線程創(chuàng)建之后
4.Windows調(diào)用當(dāng)前進(jìn)程中的每個(gè)DLL都有的一個(gè)函數(shù),用來通知進(jìn)程中的所有DLL,操作系統(tǒng)創(chuàng)建了一個(gè)新的線程。
銷毀一個(gè)線程時(shí)
5.當(dāng)前進(jìn)程中的所有DLL都要接收一個(gè)關(guān)于該線程即將"死亡"的通知;
6.線程的內(nèi)核對(duì)象及創(chuàng)建時(shí)系統(tǒng)分配的堆棧需要釋放。
如果某臺(tái)計(jì)算機(jī)只有一個(gè)CPU的話,則在某一時(shí)刻只有一個(gè)線程可以運(yùn)行。
Windows必須跟蹤記錄線程對(duì)象,而且不停地跟蹤記錄每個(gè)線程對(duì)象。
Windows必須決定CPU下一個(gè)次(每隔約20毫秒)調(diào)度那一個(gè)線程使其運(yùn)行。
上下文切換(Context switch):Windows使CPU停止執(zhí)行一個(gè)線程的代碼,而開始執(zhí)行另一個(gè)線程的代碼的現(xiàn)象,我們稱之為上下文切換。
上下文切換的開銷:
1.進(jìn)入內(nèi)核模式;
2.將CPU的寄存器保存到當(dāng)前正在執(zhí)行的線程的內(nèi)核對(duì)象中。
注明:X86架構(gòu)下CPU寄存器占了大約700字節(jié)(Byte)的空間,X64架構(gòu)下CPU寄存器大約占了1024(Byte)的空間,IA64架構(gòu)下CPU寄存器占了大約2500Byte的空間。
3.需要一個(gè)自旋鎖(spin lock),確定下一次調(diào)度那一個(gè)線程,然后再釋放該自旋鎖。
如果下一次調(diào)度的線程屬于同一個(gè)進(jìn)程,哪么此處開銷更大,因?yàn)镺S必須先切換虛擬地址空間。
4.把即將要運(yùn)行的線程的內(nèi)核對(duì)象的地址加載到CPU寄存器中。
5.退出內(nèi)核模式。
以上都是純粹的開銷,導(dǎo)致Windows和應(yīng)用程序的執(zhí)行速度比在單線程系統(tǒng)上的執(zhí)行速度慢。
綜上所述:應(yīng)盡量限制線程的使用。
多線程的帶來的好處:
1.健壯性。
此線程的錯(cuò)誤不會(huì)影響彼線程。
2.可擴(kuò)展性。
多個(gè)CPU情況下,可充分發(fā)揮多個(gè)CPU的優(yōu)勢(shì)。