首先要明白進程是什么:
關於進程的定義有很多,一個經典的定義是一個執行中程序的實例,進程是程序的動態表現。 一個程序進行起來后,會使用很多資源,比如使用寄存器,內存,文件等。每當切換進程時,必須要考慮保存當前進程的狀態。狀態包括存放在內存中的程序的代碼和數據,它的棧、通用目的寄存器的內容、程序計數器、環境變量以及打開的文件描述符的集合,這個狀態叫做上下文(Context)。可見,想要切換進程,保存的狀態還不少。
其次就要了解線程是什么:
線程存在於進程中,一個進程可以有一個或多個線程。線程是運行在進程上下文中的邏輯流,簡單說,線程可以理解為一個方法(Java)或函數(C),這個線程可以獨立完成一項任務。同樣線程有自己的上下文,包括唯一的整數線程ID, 棧、棧指針、程序計數器、通用目的寄存器和條件碼。可以理解為線程上下文是進程上下文的子集。
由於保存線程的上下文明顯比進程的上下文小,因此系統切換線程時,必然開銷更小。
內容來自CSAPP chapter 8 & 12