進(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)程,有些程序只能啟動一個(gè)實(shí)例進(jìn)程
線程
· 一個(gè)進(jìn)程之內(nèi)可分為一個(gè)或多個(gè)線程
· 一個(gè)線程就是一個(gè)指令流建车,將指令流中的一條條指令以一定的順序交給CPU執(zhí)行
· java中扩借,線程作為最小調(diào)度單位,進(jìn)程作為資源分配的最小單位缤至,在windows中進(jìn)程是不活動的潮罪,只是作為線程的容器
二者對比
· 進(jìn)程基本上相互獨(dú)立,線程存在于進(jìn)程內(nèi),是進(jìn)程的一個(gè)子集
· 進(jìn)程擁有共享的資源嫉到,如內(nèi)存空間等沃暗,供其內(nèi)部的線程共享
· 進(jìn)程間通信較為復(fù)雜
· 同一臺計(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)度器會不斷的在不同線程之間來回切換疫赎,給人一種多個(gè)線程同時(shí)執(zhí)行的錯(cuò)覺盛撑,這種稱之為并發(fā)
· 對多核心CPU,每個(gè)核心都可以調(diào)度執(zhí)行不同的線程任務(wù)虚缎,稱之為并行撵彻,這種時(shí)候常常出現(xiàn)并發(fā)與并行同時(shí)存在的情況,比如同一個(gè)核心在多個(gè)線程之間來回切換執(zhí)行(并發(fā))实牡,不同核心同時(shí)處理不同線程任務(wù)(并行 )
同步與異步
· 同步--等待結(jié)果返回
· 異步--不需要等待結(jié)果返回