• <output id="aynwq"><form id="aynwq"><code id="aynwq"></code></form></output>

    <mark id="aynwq"><option id="aynwq"></option></mark>
  • <mark id="aynwq"><option id="aynwq"></option></mark><label id="aynwq"><dl id="aynwq"></dl></label>
  • 學習啦 > 學習電腦 > 操作系統 > 操作系統基礎知識 > Linux操作系統的進程和線程的詳解

    Linux操作系統的進程和線程的詳解

    時間: 佳洲1085 分享

    Linux操作系統的進程和線程的詳解

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

      Linux操作系統的進程和線程的詳解一、進程和線程的定義

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

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

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

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

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

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

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

      Linux操作系統的進程和線程的詳解二、進程和線程的聯系

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

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

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

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

      Linux操作系統的進程和線程的詳解三、進程和線程的區別

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

      關于共享地址空間

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

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

      安全性

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

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

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

      健壯性

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

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

      性能

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

      Linux操作系統的進程和線程的詳解四、特定操作系統的進程和線程

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

      Windows

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

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

      簡單總結下, 原因:

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

      在創建進程時,會有相當的系統調用

      Linux

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

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

      首先大家可以參考這個帖子, 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.

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

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

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

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

      由于Linux內核開發人員的努力和優化, 創建, 切換, 關閉 進程和線程之前的開銷差異已經十分的小了

    3637770 主站蜘蛛池模板: 国产成人精品午夜视频'| 91国高清视频| 中文字幕不卡免费视频| 久久成人免费大片| 久热这里只精品99国产6_99| 亚洲乱码中文字幕小综合| 亚洲国产美女福利直播秀一区二区| 亚洲综合无码一区二区三区| 免费国产真实迷j在线观看| 北条麻妃在线观看视频| 午夜福利啪啪片| 免费福利在线播放| 国产高清在线a视频大全| 国内精品卡1卡2卡区别| 国产肉体xxxx裸体137大胆| 国产精品高清尿小便嘘嘘| 国产精品成人一区二区三区| 国产精品后入内射日本在线观看| 国产精品国产三级国产a| 国产男女猛烈无遮档免费视频网站 | 免费国内精品久久久久影院| 可以直接看的毛片| 免费扒开女人下面使劲桶| 人人妻人人澡人人爽人人dvd| 俺去啦在线视频| 伊人久久波多野结衣中文字幕| 亚洲精品国产v片在线观看| 亚洲精品成人片在线播放 | 国产一精品一aⅴ一免费| 另类专区另类专区亚洲| 俄罗斯激情女同互慰在线| 亚洲精品国产成人| 亚洲国产成人va在线观看| 久久精品国产久精国产一老狼 | 欧美日韩福利视频一区二区三区| 欧美黄色片免费观看| 校服白袜男生被捆绑微博新闻| 最近免费中文字幕大全高清片| 日韩一区二紧身裤| 成人在线免费看片| 好爽好紧好大的免费视频国产|