開門見山:我對進程、線程、事務的理解是,它們都是一個執行者。雖然在java的api里面定義了Executor類,不過我們現在談論的執行者的概念與java語言沒有關系,注意區分不要混淆。
在現代操作系統中,進程的概念特別重要,各種操作系統教材都會花不少筆墨來講解這個概念,然而書中的定義往往很不直觀甚至冗長,它們時常給出這樣的描述,“操作系統資源調度的基本單位”,我不是說這樣的描述有錯,而是說這樣的描述不直觀,如果我們這樣來描述:“進程是一個執行者,它負責執行被代碼定義了的過程”,或者更簡潔的表述為:“進程是負責執行代碼的執行者”。是不是就更容易理解了呢?
程序員在編譯好一段代碼之后,下一步是要讓CPU來執行這些代碼,不過等等,這樣說雖然准確,但其實掩蓋了重要的進程創建過程。實際上是進程(線程)來執行這些代碼,操作系統首先要創建一個進程,然后告訴這個進程,它需要去執行這一段代碼,當進程獲得CPU資源后,再利用CPU去執行那些代碼。同一段代碼可以被很多進程執行,同一個進程也可以跳轉到各處執行不同的代碼。我們常常將代碼進行分類,也就是常說的模塊化,不同的模塊可以被同一個進程執行,同一個模塊也可以被不同的進程執行。
線程也是執行者,它與進程的區別就是,創建每個線程之前都必須事先有一個進程與它關聯,而線程可以訪問它關聯着的進程所占有的資源。線程與進程的關系是工廠模式的一個實例,進程是線程的制造者,而被制造出的線程必須與它的制造者關聯。
DBMS中的事務也被視為執行者,它根據SQL所定義的過程,執行特定的可執行代碼,並且需要滿足過程執行前后數據的正確性。當然《數據庫系統概念》這本書里對事務的描述是,“事務是由查詢和更新語句的序列組成”[1],或者是“事務是訪問並可能更新數據項的一個程序執行單元”[2],書中把事務看作是代碼的集合,也就是說把執行者和代碼等同起來了,這一個定義我不甚贊同。
如果用現代面向對象的觀點來看待這些對象,那么它們的類圖如下。當然最后還要提醒的是,這里討論的東西和java沒有關系。
線程作為執行者,它們能否執行當然要靠操作系統是否准許它執行,因為只有占用了cpu他才能執行。在事件編程中,我們可以這樣理解,一個阻塞的線程監聽某個事件,然后執行這個事件綁定的代碼。
[1]http://book.douban.com/subject/10548379/
[2]http://book.douban.com/subject/10548379/