首先不要太過糾結(jié)于線程和進程,因為對于linux操作系統(tǒng)而言,進程和線程的最大的區(qū)別就是對資源共享
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
一. 如何區(qū)分
我們可以通過兩個方面:
- 調(diào)度、執(zhí)行的基本單位:每個進程都有自己的運行狀態(tài)(state)、優(yōu)先級、寄存器等,是OS調(diào)度的基本單位。
- 資源所有權(quán):包括程序(program text)、數(shù)據(jù)(data )、文件(open file)等資源。一個進程擁有對這些資源的所有權(quán),OS則提供保護功能,避免不同進程之間的資源沖突。
傳統(tǒng)上我們認為,線程是最小的調(diào)度單元,而進程是最小的資源分配單元!
即:
- 進程是資源的容器,必須包含一個或多個線程。
- 內(nèi)核調(diào)度的基本單位是線程、而非進程。
- 同一進程下的各個線程共享部分資源,但線程間私有棧等不共享
這樣的好處是:
1. 創(chuàng)建、銷毀、切換(看操作系統(tǒng))的thread比process快很多
2. 由于共享地址空間,線程通信比進程通信高效得多
二.如何選擇(從邏輯概念上理解,不談具體的操作系統(tǒng))
多進程:
優(yōu)點:不互相影響,更安全
缺點:數(shù)據(jù)不共享,進程通訊較為麻煩,創(chuàng)建慢(網(wǎng)上查的,未能親自驗證)
多線程:
優(yōu)點:創(chuàng)建速度快,數(shù)據(jù)共享
缺點:線程間相互影響,需要同步鎖等操作
簡而言之:
對于java而言,你基本不用考慮,果斷用多線程吧!(哈哈)
三.問題
1.一個進程產(chǎn)生的線程可以跑在多個核上嗎?
類似的問題還有 java線程可以在運行在多個cpu核上嗎?
這類問題,歸根結(jié)底,其實想問的是,操作系統(tǒng)的調(diào)度面對線程還是進程!
這里我們可以明確 操作系統(tǒng)的調(diào)度是面對線程(概念上)!
但是有個前提,這個線程被放到操作系統(tǒng)調(diào)度器上
這里我們必須知道操作系統(tǒng)把線程分成兩類:用戶線程和內(nèi)存線程
簡單說下二者應(yīng)用上的區(qū)別:
用戶線程:創(chuàng)建快,無法被打斷,無法利用多核并行,即同一進程下的各個用戶級線程無法同時運行在多個cpu上(因為內(nèi)核根本不知道有用戶線程這東西)
內(nèi)核線程:創(chuàng)建慢,可以被打斷,可以利用多核并行,是操作系統(tǒng)最小的調(diào)度單位
所以我們可以得出結(jié)論:如果創(chuàng)建的是內(nèi)核線程,那么理論上可以利用多核并行,但是如果是用戶線程,那么只能并發(fā)!
2.linux的線程和進程
//TODO,等有時間看完操作系統(tǒng)在回過頭來學習linux系統(tǒng)的時候再說