CPU中的線程和操作系統(OS)中的線程即不同,在調度的時候又有些關聯。
CPU中的線程,我們叫它們Thread,和OS中的線程的名字一樣。它來自同步多線程(SMT,Simultaneous Multi-threading)的概念。我們現在在Intel的CPU上看到它,實際上這並不是Intel的發明創造。它最早起源於學術圈,在硬件上IBM實現也比Intel早。最早Intel使用了這種技術時候就叫做SMT,但后面改叫做HT (Hyper Threading),可能是這樣更清楚(畢竟最多兩個thread,比IBM怪物要少),更朗朗上口吧。
我們現在看到CPU,很多都支持HT,經常看到的2C4T的意思就是2核4線程(core,Thread)。1個內核中的thread是對稱的和對等的,在軟件上沒有任何區別,BIOS也只有通過一些特殊手段才能區分。實際上,2C4T中的4個thread調度起來沒有本質區別,它們都有自己單獨的身份證號碼:APIC ID。調度起來只要知道別人的APIC ID,就用自己的Local APIC寄存器發出兩個IPI(Inter-Processor Interrupts)就好了,那個被指明的倒霉蛋就莫名其妙的開始被調度去指定的地址執行指令了(盡管是實模式)。當然也可以廣播IPI讓所有別的thread都去執行指定任務。更多相關內容見:
實際上CPU中Thead有多少,操作系統並不自己探測,是BIOS通過ACPI報告給OS的,那么BIOS是怎么知道有多少個Thread呢?就是通過廣播IPI讓各個thread自己來簽到的,是不是很簡單?
操作系統中的Thread
OS中的Thread有自己的棧空間,和同一進程中的其他線程共享地址空間等等,這些基本知識因為廣為人所知,這里就不羅嗦了。
此Thread非彼Thread
操作系統中的進程可以很多,進程中的線程就更多了,常常有幾十個上百個。而CPU的Thread就那么固定幾個,是稀缺資源。兩者都叫Thread是因為
他們都是調度的基本單位,軟件操作系統調度的基本單位是OS的Thread,硬件的調度基本單位是CPU中的Thread。操作系統負責把它產生的軟Thread調度到CPU中的硬Thread中去。一軟一硬,干活不累!
操作系統中的進程和線程的區別
進程(有時候也稱做任務)
進程是指一個程序運行的實例,一個程序可以多次運行 產生多個進程,進程與進程之間數據空間是互相獨立的,進程A崩潰了完全不會影響到進程B,所以現在很多瀏覽器都采用多進程的方式來實現,打開一個網頁對應fork()一個進程來執行。
fork() 詳細講解:https://blog.csdn.net/u013851082/article/details/76902046
1. 每個進程擁有完全不同的虛擬地址空間,操作系統內核通Address Translation技術映射到物理地址空間(X86處理器體系架構采用段表+頁表進行映射,頁表有2級和4級之分,32位系統采用2級頁表,64位系統采用4級頁表),這讓進程有一種幻覺即獨占整個內存空間。進程是程序在執行過程中分配和管理資源的基本單位。進程程序集 里面存放了一個程序的入口點。
一個在內存中運行的應用程序。每個進程都有自己獨立的一塊內存空間,一個進程可以有多個線程,比如在Windows系統中,一個運行的xx.exe就是一個進程。
線程是CPU調度和分派的基本單位,它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。
多線程程序只要有一個線程死掉,整個進程也死掉了 這是為什么?
四核即代表着該CPU具有四個“CPU”,八線程則意味着每個CPU存有兩個邏輯線程,總共有八個線程。每個單位時間內,一個 CPU 只能處理一個線程(操作系統:thread)。
