什麼是進程。
進程:進程是電腦中的程式關於某資料集合上的一次運行活動,是系統進行資源分派和調度的基本單位,是作業系統結構的基礎。
簡單點說:進程就是正在執行的程式。就是包換環境切換的程式執行時間總和 = CPU載入上下文+CPU執行+CPU儲存上下文。
進程的所有資訊被放到進程式控制制塊中(PCB),並由它維護管理相關資訊。
在Linux中,這叫做task_struct。
task_struct是Linux核心的一種資料結構,它會被裝載到RAM裡並且包含著進程的資訊。
每個進程都把它的資訊放在 task_struct 這個資料結構裡。可以在include/linux/sched.h 裡找到它。
task_struct 包含了這些內容:
標示符 : 描述本進程的唯一標.示符,用來區別其他進程。
狀態 :任務狀態,結束代碼,退出訊號等。
優先順序 :相對於其他進程的優先順序。
程式計數器:程式中即將被執行的下一條指令的地址。
記憶體指標:包括程式碼和進程相關資料的指標,還有和其他進程共用的記憶體塊的指標
上下文資料:進程執行時處理器的寄存器中的資料。
I/O狀態資訊:包括顯.示的I/O請求,分配給進程的I/O裝置和被進程使.用的檔案清單。
記賬資訊:可能包括處理器時間總和,使用的時鐘數總和,時間限制,記帳號等。 什麼叫線程。
線程(tcb),有時被稱為輕量級進程,是程式執行流的最小單元。
線程是進程中的一個實體,是被系統獨立調度和指派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共用進程所擁有的全部資源。
一個線程可以建立和撤消另一個線程,同一進程中的多個線程之間可以並發執行。
每一個程式都至少有一個線程,若程式只有一個線程,那就是程式本身。
線程是在進程地址空間內啟動並執行,強調的是資源共用。(多個線程共用一份地址空間)。
在Linux下並無真正的的線程,是用進程來類比線程的
一個地址空間內部多個線程共用一下資源和環境:
1.檔案描述符表
2.每種訊號的處理方式
3.當前工作環境
4.使用者id與組id
但是有些資源是每個線程各有一份的
1.線程id
2.上下文,包括各種寄存器的值,程式計數器和指標。
3.棧空間
4.訊號屏蔽字
5.優先調度級 進程與線程的區別。
進程和線程的主要差別在於它們是不同的作業系統資源管理方式。
1.是否會相互影響:進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響。而線程只是一個進程中的不同執行路徑。
2.健壯性:線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程式要比多線程的程式健壯。
3.效率:進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共用某些變數的並行作業,只能用線程,不能用進程。並且進程在執行過程中擁有獨立的記憶體單元,而多個線程又共用記憶體,從而極大地提高了程式的運行效率。
4.一個程式至少有一個進程,一個進程至少有一個線程.
5.進程是分配資源的基本單位,線程是調度資源的基本單位。