2013年12月20日 星期五

[JAVA] Program,Progress,Thread

  • Program:
    一群程式碼的集合,用以解決特定的問題。在物件導向中相當於類別(Class)。
  • Process:
    由Program所產生的執行個體,一個Program可以同時執行多次產生多個Process。在物件導向中相當於Object。
而 Process又由 Memory Space 和一個以上的 Thread 所組成,其中:

  • Memory Space:相當於Object的variable,不同Process的Memory Space也不同,彼此看不到其他Process的Memory Space。
  • 一個以上的Thread:
    Thread代表從某個起始點開始(例如main),到目前為止所有函數的呼叫路徑,以及這些呼叫路徑上所用到的區域變數。
當然程式的執行狀態,除了紀錄在主記憶體外,CPU內部的暫存器(如Program Counter, Stack Pointer, Program Status Word等)也需要一起紀錄。所以Thread又由下面兩項組成:

  • Stack:紀錄函數呼叫路徑,以及這些函數所用到的區域變數。
  • 目前CPU的狀態。
因此 Thread 的重點如下,一個Process可以有多個Thread。同一Process內的Thread使用相同的Memory Space,但這些Thread各自擁有其Stack。換句話說,Thread能透過reference存取到相同的Object,但是local variable卻是各自獨立的。作業系統會根據Thread的優先權以及已經用掉的CPU時間在不同的Thread作切換,以讓各個Thread都有機會執行。

總之Thread 執行緒常被定義為一個輕量的(Lightweight) Process,可用來處理 request,
然而雖然是輕量,但在產生 Thread 時仍會有 overhead,此時若 request 量太大,
又沒有善加管理這些 Thread 的話,就會拖累整體系統的效能。
為了解決這種類型的效能問題,所以就有了 Thread Pool 的概念產生。

Thread Pool 的概念如同其名,就是一個 Thread 的 Pool,
其中有固定或變動量的 Thread,當 request 進來時,若有閒置的 Thread 就執行,
若沒有的話,可能產生新的 Thread 或把 request 放入 queue 中等待被執行,
當一條 Thread 執行完工作而 queue 中仍有 request 在等待時,
此 Thread 應該要被分發新的 request 並處理。

由以上幾行,我們可以看出 Thread Pool 的工作有:

  1. 管控 Thread 的產生與回收
  2. 分發 Thread 處理 request
  3. 處理 request 的 queue 

沒有留言: