CPU并不知道線程和進(jìn)程之類的概念 CPU只知道兩件事: 1、 從內(nèi)存中取出指令; 2、 執(zhí)行指令,然后再從內(nèi)存中取出下一條指令 寄存器 CPU從哪里取出指令呢?答案是寄存器,可以把寄存器簡單地理解為內(nèi)存,不過存取速度比內(nèi)存更快。寄存器中存放的是CPU將要執(zhí)行的下一條指令的地址。寄存器中的地址默認(rèn)是自動加1,遇到if和else時,這種順序執(zhí)行就被打破了。CPU在執(zhí)行這類指令時會根據(jù)計算結(jié)果來動態(tài)改變PC寄存器中的值,這樣CPU就可以正確地跳轉(zhuǎn)到需要執(zhí)行的指令了。 函數(shù) 指令形成的過程:程序代碼源文件à編譯器編譯à可執(zhí)行文件à磁盤à內(nèi)存àCPU指令。函數(shù)被編譯成功之后才會形成CPU執(zhí)行指令,只需要找到函數(shù)被編譯后形成的第一條指令,指令就可以按順序執(zhí)行下去。第一條指令就是函數(shù)的入口,也就是我們程序源代碼中常用的main()函數(shù) 進(jìn)程 如果想讓CPU執(zhí)行某個函數(shù),那么只需要把函數(shù)對應(yīng)的第一條機(jī)器執(zhí)行裝入PC寄存器就可以了,這樣即使沒有操作系統(tǒng)也可以讓CPU執(zhí)行程序。但是過程非常復(fù)雜: 1、 需要在內(nèi)存中找到一塊大小合適的區(qū)域裝入程序 2、 需要找到函數(shù)入口,設(shè)置好寄存器讓CPU開始執(zhí)行程序 機(jī)器指令需要加載到內(nèi)存中執(zhí)行,因此需要記錄下內(nèi)存的起始地址和長度;同時要找到函數(shù)的入口地址并寫道PC寄存器中。需要一個結(jié)構(gòu)體類型的數(shù)據(jù)結(jié)構(gòu)來記錄這些信息。該結(jié)構(gòu)體記錄的是程序在被加載到內(nèi)存中的運行狀態(tài),叫做進(jìn)程 線程 所謂進(jìn)程,無非就是內(nèi)存中的一段區(qū)域,這段區(qū)域中保存了CPU執(zhí)行機(jī)器指令以及函數(shù)運行時的堆棧信息,要想讓進(jìn)程運行,就把main函數(shù)的第一條機(jī)器指令地址寫入PC寄存器,這樣進(jìn)程就運行起來了。進(jìn)程的缺點在于只有一個入口函數(shù),也就是main函數(shù),因此進(jìn)程中的機(jī)器指令只能被一個CPU執(zhí)行。但是既然我們可以把main函數(shù)的第一條指令吸入PC寄存器,那么其他函數(shù)和main函數(shù)本質(zhì)上來說也沒有什么區(qū)別。可以把PC寄存器執(zhí)行main函數(shù),也可以把PC寄存器指向任何一個函數(shù)。當(dāng)把PC寄存器指向非main函數(shù)時,線程就誕生了。這樣一個進(jìn)程內(nèi)可以有多個入口函數(shù),也就是說屬于同一個進(jìn)程中的機(jī)器指令可以被多個CPU同時執(zhí)行。 |
|