多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别
當(dāng)面臨這些問(wèn)題的時(shí)候,有兩個(gè)關(guān)鍵詞無(wú)法繞開(kāi),那就是并行和并發(fā)。
首先,要先了解幾個(gè)概念:
1、進(jìn)程是程序的一次執(zhí)行。
2、進(jìn)程是資源分配的基本單位。
3、一個(gè)進(jìn)程可以包括多個(gè)線程。
4、在單CPU計(jì)算機(jī)中,有一個(gè)資源是無(wú)法被多個(gè)程序并行使用的:CPU。
5、操作系統(tǒng)調(diào)度器:拆分CPU為一段段時(shí)間的運(yùn)行片,輪流分配給不同的程序。
6、操作系統(tǒng)內(nèi)存管理模塊:管理物理內(nèi)存、虛擬內(nèi)存相關(guān)的事務(wù)。
由于CPU同時(shí)刻只能執(zhí)行一個(gè)進(jìn)程,如果我們不加以控制的話,一個(gè)進(jìn)程可能使用CPU直到運(yùn)行結(jié)束,于是出現(xiàn)了操作系統(tǒng)調(diào)度器,而進(jìn)程也成為了調(diào)度單位。
進(jìn)程的運(yùn)行不僅僅需要CPU,還需要很多其他資源,如內(nèi)存啊,顯卡啊,GPS啊,磁盤啊等等,統(tǒng)稱為程序的執(zhí)行環(huán)境,也就是程序上下文。
在這里就出現(xiàn)了并發(fā)的概念,調(diào)度器切換CPU給不同進(jìn)程使用的速度非常快,于是在使用者看來(lái)程序是在同時(shí)運(yùn)行,這就是并發(fā),而實(shí)際上CPU在同一時(shí)刻只在運(yùn)行一個(gè)進(jìn)程。并發(fā)只是給人的假現(xiàn)象 ,原因就是由于cpu工作很快,不斷地loop感覺(jué)是同時(shí)發(fā)生,實(shí)際都是單個(gè)執(zhí)行的。
CPU進(jìn)程無(wú)法同時(shí)刻共享,但是出現(xiàn)一定要共享CPU的需求呢?此時(shí)線程的概念就出現(xiàn)了。線程被包含在進(jìn)程當(dāng)中,進(jìn)程的不同線程間共享CPU和程序上下文。(共享進(jìn)程分配到的資源)
單CPU進(jìn)行進(jìn)程調(diào)度的時(shí)候,需要讀取上下文+執(zhí)行程序+保存上下文,即進(jìn)程切換。
如果這個(gè)CPU是單核的話,那么在進(jìn)程中的不同線程為了使用CPU核心,則會(huì)進(jìn)行線程切換,但是由于共享了程序執(zhí)行環(huán)境,這個(gè)線程切換比進(jìn)程切換開(kāi)銷少了很多。在這里依然是并發(fā),唯一核心同時(shí)刻只能執(zhí)行一個(gè)線程。
????????出現(xiàn)線程的原因就是由于進(jìn)程切換需要大量的資源切換,線程卻還資源是共享的,切換速度很快,占用資源小,線程內(nèi)容是隱私的,存儲(chǔ)一些上下文信息,以及堆棧信息,占用內(nèi)存很小,切換很快,同一進(jìn)程不同線程切換共享進(jìn)程資源,切換迅速。
如果這個(gè)CPU是多核的話,那么進(jìn)程中的不同線程可以使用不同核心,真正的并行出現(xiàn)了。多核才是并行,單核只能說(shuō)是并發(fā),假并行
線程是CPU調(diào)度和分配的基本單位,一定要和?進(jìn)程是操作系統(tǒng)進(jìn)行資源分配(包括cpu、內(nèi)存、磁盤IO等)的最小單位?區(qū)別清楚。有句話說(shuō)CPU只能看到線程,可以這么理解,假設(shè)我是CPU,我閉著眼,操作系統(tǒng)調(diào)度器將一個(gè)進(jìn)程分配給我之后,我拿到進(jìn)程睜開(kāi)眼,我看到的是什么?我看到的是進(jìn)程中的很多線程,那么我現(xiàn)在能調(diào)度和分配的是什么?進(jìn)程?不行,因?yàn)槲铱床坏狡渌M(jìn)程,何來(lái)調(diào)度分配,只能調(diào)度我看到的那些線程,如果我是4核的話,把線程ABCD分配到核心1234,其他的線程依然要等待分配,至于等待多久,如何分配,暫不在本文討論范圍。于是線程是CPU調(diào)度和分配的基本單位。
最后說(shuō)一下操作系統(tǒng)內(nèi)存管理模塊這里做的事:在這之前,程序員需要為每個(gè)程序安排運(yùn)行的空間,這里的空間指的是內(nèi)存的物理地址,但是這么的問(wèn)題就是,每個(gè)程序都要協(xié)商如何使用同一內(nèi)存的不同空間,而且程序員還要關(guān)心底層內(nèi)存分配問(wèn)題。解決辦法就是,提出進(jìn)程的概念,每個(gè)進(jìn)程用一樣的虛擬地址空間,CPU上增加了MMU模塊負(fù)責(zé)轉(zhuǎn)換虛擬地址和物理地址,虛擬地址經(jīng)過(guò)操作系統(tǒng)和MMU之后,虛擬地址會(huì)映射到不同的物理地址,不同的進(jìn)程就能獲得各自獨(dú)立的物理內(nèi)存空間。
另外在有的操作系統(tǒng)里,進(jìn)程不是調(diào)度單位,線程是最基本的調(diào)度單位,調(diào)度器只調(diào)度線程,不調(diào)度進(jìn)程,如VxWorks。
總結(jié):
1、單CPU中進(jìn)程只能是并發(fā),多CPU計(jì)算機(jī)中進(jìn)程可以并行。
2、單CPU單核中線程只能并發(fā),單CPU多核中線程可以并行。
3、無(wú)論是并發(fā)還是并行,使用者來(lái)看,看到的是多進(jìn)程,多線程。
根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是任務(wù)調(diào)度和執(zhí)行的基本單位
在開(kāi)銷方面:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷;線程可以看做輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程之間切換的開(kāi)銷小。
所處環(huán)境:在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)進(jìn)程(程序);而在同一個(gè)進(jìn)程(程序)中有多個(gè)線程同時(shí)執(zhí)行(通過(guò)CPU調(diào)度,在每個(gè)時(shí)間片中只有一個(gè)線程執(zhí)行)
內(nèi)存分配方面:系統(tǒng)在運(yùn)行的時(shí)候會(huì)為每個(gè)進(jìn)程分配不同的內(nèi)存空間;而對(duì)線程而言,除了CPU外,系統(tǒng)不會(huì)為線程分配內(nèi)存(線程所使用的資源來(lái)自其所屬進(jìn)程的資源),線程組之間只能共享資源。
包含關(guān)系:沒(méi)有線程的進(jìn)程可以看做是單線程的,如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的,而是多條線(線程)共同完成的;線程是進(jìn)程的一部分,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程。
?————————————————?
版權(quán)聲明:本文為CSDN博主「mengxuepingwxhn」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38998213/article/details/87688929
總結(jié)
以上是生活随笔為你收集整理的多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 让猎头雨天送伞--大话猎头
- 下一篇: 程序人生感悟