進(jìn)程與線程
進(jìn)程
· 程序由指令和數(shù)據(jù)組成,數(shù)據(jù)要讀寫,就必須要將指令加載至CPU,數(shù)據(jù)加載至內(nèi)存,在指令運(yùn)行過程中還需要用到磁盤、網(wǎng)絡(luò)等設(shè)備,進(jìn)程就是用來加載指令、管理內(nèi)存、管理IO的
· 當(dāng)一個(gè)程序被運(yùn)行,從磁盤加載這個(gè)程序的代碼到內(nèi)存,這時(shí)就開啟了一個(gè)進(jìn)程
· 進(jìn)程就可以視作程序的一個(gè)實(shí)現(xiàn),根據(jù)程序的實(shí)現(xiàn)不同,大部分程序可以同時(shí)運(yùn)行多個(gè)實(shí)例進(jìn)程,有些程序只能啟動(dòng)一個(gè)實(shí)例進(jìn)程
線程
· 一個(gè)進(jìn)程之內(nèi)可分為一個(gè)或多個(gè)線程
· 一個(gè)線程就是一個(gè)指令流,將指令流中的一條條指令以一定的順序交給CPU執(zhí)行
· java中,線程作為最小調(diào)度單位,進(jìn)程作為資源分配的最小單位,在windows中進(jìn)程是不活動(dòng)的,只是作為線程的容器
二者對(duì)比
· 進(jìn)程基本上相互獨(dú)立,線程存在于進(jìn)程內(nèi),是進(jìn)程的一個(gè)子集
· 進(jìn)程擁有共享的資源,如內(nèi)存空間等,供其內(nèi)部的線程共享
· 進(jìn)程間通信較為復(fù)雜
· 同一臺(tái)計(jì)算機(jī)的進(jìn)程通信成為IPC(Inter-process communication)
· 不同計(jì)算機(jī)之間的進(jìn)程通信,需要通過網(wǎng)絡(luò),并遵守共同的協(xié)議,例如HTTP
· 線程通信可以通過共享進(jìn)程內(nèi)的內(nèi)存,例如多線程可以訪問同一個(gè)共享變量
· 線程更輕量,線程的上下文切換成本要比進(jìn)程的上下文切換低
并發(fā)與并行
· 單核CPU,在多個(gè)線程運(yùn)行時(shí),通過任務(wù)調(diào)度器會(huì)不斷的在不同線程之間來回切換,給人一種多個(gè)線程同時(shí)執(zhí)行的錯(cuò)覺,這種稱之為并發(fā)
· 對(duì)多核心CPU,每個(gè)核心都可以調(diào)度執(zhí)行不同的線程任務(wù),稱之為并行,這種時(shí)候常常出現(xiàn)并發(fā)與并行同時(shí)存在的情況,比如同一個(gè)核心在多個(gè)線程之間來回切換執(zhí)行(并發(fā)),不同核心同時(shí)處理不同線程任務(wù)(并行 )
同步與異步
· 同步--等待結(jié)果返回
· 異步--不需要等待結(jié)果返回