不卡AV在线|网页在线观看无码高清|亚洲国产亚洲国产|国产伦精品一区二区三区免费视频

學習啦 > 學習電腦 > 操作系統(tǒng) > 操作系統(tǒng)基礎知識 > Linux操作系統(tǒng)的進程和線程的詳解

Linux操作系統(tǒng)的進程和線程的詳解

時間: 佳洲1085 分享

Linux操作系統(tǒng)的進程和線程的詳解

  Linux操作系統(tǒng)中進程和線程是一對經常搞混概念的名詞術語,下面由學習啦小編為大家整理了Linux操作系統(tǒng)的進程和線程詳解的相關知識,希望對大家有幫助!

  Linux操作系統(tǒng)的進程和線程的詳解一、進程和線程的定義

  首先我們先要弄清楚二者的定義, 究竟什么是進程, 什么又是線程?

  根據 wikipedia process 中的定義, 進程是一個計算機程序的實例,由一個或者多個線程組成.

  同樣在 wikipedia thread 中對線程的定義是: 線程的執(zhí)行是由計算機的fork操作來將一個程序生成一個或者多個并發(fā)的運行任務.

  在單核的計算機中, 線程并非 真正并行 的, 而是 分時的并發(fā)。

  也就是說多個線程無需等待另一個線程的完成,而只需要等待CPU的時間片.

  在多核的計算機中,多個線程可以真正的并行,也就是同時執(zhí)行,同時獲得CPU時間片.

  同樣, 在現(xiàn)代計算機中, 通常都是 分時操作系統(tǒng) (time sharing), 也就是不同的進程通過時間片來獲得CPU的控制權, 來執(zhí)行自己的代碼. 同樣,單核的系統(tǒng)進程也只能是并發(fā)的, 而多核的系統(tǒng)可以達到并行.

  Linux操作系統(tǒng)的進程和線程的詳解二、進程和線程的聯(lián)系

  二者的關系可以簡單的一句話概括為, 通常, 一個進程可以包括多個線程, 一個線程只能屬于一個進程.

  一個進程可以生成多個線程,而這些線程之前共享地址空間和相應的資源, 在線程切換時, 并沒有太多的開銷.

  進程和線程在共享地址空間和資源的區(qū)別.

  那么, 對于同樣一個應用,我們可以選擇 進程 來實現(xiàn), 也可以選擇 線程 來實現(xiàn), 那么二者有什么區(qū)別呢? 我們應該如何選擇呢?

  Linux操作系統(tǒng)的進程和線程的詳解三、進程和線程的區(qū)別

  從本質上說,二者只是在 是否共享地址空間,及共享多少地址空間 上是有差別的,而至于其它的區(qū)別也都是 因為這個本質區(qū)別來引起的. 下面逐一地進行簡單的說明.

  關于共享地址空間

  傳統(tǒng)意義上, 進程之間是不共享地址空間的, 而線程是共享著進程的地址空間.

  但是在Linux中, 會有不同, 請參考下面 特定操作系統(tǒng)的進程和線程 部分的詳細說明.

  安全性

  因為進程之前是不共享資源和地址空間的,所以不會存在太多的安全問題(相比于線程).

  而由于多個線程共享著相同的地址空間和資源,所以會存在線程之間有可能會惡意修改或者獲取非授權數據的可能.

  這也就是為什么近期, chrome和IE8相繼開始使用多進程來替代之前的多線程(不同的tab之間).

  健壯性

  由于多個線程共享同一個進程的地址空間和相關的資源, 所以當一個線程出現(xiàn)crash,那么可能會導致相應的地址空間和資源 會出現(xiàn)問題,從而導致其它的線程也crash. 這個也很好理解,一個簡單的大家可能都經歷過的就是IE7吧, 當一個tab突然崩潰時,所有的tab都會崩潰,這時通常IE要重啟(重啟進程,重新生成線程).

  而多進程則不存在這個問題, 因為不同的地址空間和資源, 當一個進程崩潰時, 并不會影響到其它進程. 同樣,如果你用過chrome,如果一個tab崩潰了(chrome那搞笑的提示信息), 我們只需要關掉這個tab即可,并 不會影響到其它的tab.

  性能

  進程的安全性,健壯性是建立在獨立的地址空間和獨立的資源的條件下的, 所以進程的 啟動, 關閉, 切換 相比于線程會有更多的開銷. 而這種開銷的差別在Windows下更加顯著, 請參考下面 特定操作系統(tǒng)的進程和線程部分的詳細說明.

  Linux操作系統(tǒng)的進程和線程的詳解四、特定操作系統(tǒng)的進程和線程

  進程和線程是依賴于特定的操作系統(tǒng)的, 譬如Windows和Linux在實現(xiàn)進程和線程就有很大的差異, 這一部分主要說明 Windows和Linux下進程和線程的一些特定的特征.

  Windows

  通常做過Windows多任務系統(tǒng)開發(fā)的程序員肯定會知道, Windows中的進程比線程有很大的開銷, 要一定堅持使用線程, 那么為什么呢?

  這里有個討論可供參考: Why is creating a new process more expensive on Windows than Linux?

  簡單總結下, 原因:

  這是Windows的設計的理念所致(多用戶和并行的要求不高的特性)

  在創(chuàng)建進程時,會有相當的系統(tǒng)調用

  Linux

  讓我們回到本文的摘要部分的引入, 我的室友提出的對于我而言 聞所未聞 的新觀點.

  那么, 在Linux下 進程和線程真的沒有本質區(qū)別嗎?

  首先大家可以參考這個帖子, Threads vs Processes in Linux.

  下面內容摘自 Threads vs Processes in Linux.

  Linux uses a 1-1 threading model, with (to the kernel) no distinction between processes and threads -- everything is simply a runnable task. * On Linux, the system call clone clones a task, with a configurable level of sharing, among which are: CLONE_FILES: share the same file descriptor table (instead of creating a copy) CLONE_PARENT: don't set up a parent-child relationship between the new task and the old (otherwise, child's getppid() = parent's getpid()) CLONE_VM: share the same memory space (instead of creating a COW copy) fork() calls clone(least sharing) and pthread_create() calls clone(most sharing). ** forking costs a tiny bit more than pthread_createing because of copying tables and creating COW mappings for memory, but the Linux kernel developers have tried (and succeeded) at minimizing those costs. Switching between tasks, if they share the same memory space and various tables, will be a tiny bit cheaper than if they aren't shared, because the data may already be loaded in cache. However, switching tasks is still very fast even if nothing is shared -- this is something else that Linux kernel developers try to ensure (and succeed at ensuring). In fact, if you are on a multi-processor system, not sharing may actually be a performance boon: if each task is running on a different processor, synchronizing shared memory is expensive.

  上面其實已經講得很清楚了,

  對于內核而言, 進程和線程是 沒有區(qū)別的

  在用戶的角度而言,區(qū)別在于如何創(chuàng)建(clone), 如果使用是 least shared ,那么就類似于進程的創(chuàng)建(最少共享)

  如果使用的是 most sharing 那么就類似于線程的創(chuàng)建(最多共享)

  由于Linux內核開發(fā)人員的努力和優(yōu)化, 創(chuàng)建, 切換, 關閉 進程和線程之前的開銷差異已經十分的小了

3637770