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