多執行緒vs多程序
1.程序
定義: Unix標準的定義為“一個其中執行著一個或者多個執行緒的地址空間和這些執行緒所需要的系統資源”。也可以看作是正在執行的程式。
PID:每一個程序都有一個唯一的數字編號,稱為程序標識PID。
程序表:儲存程序資訊的資料結構,包括PID、程序的狀態、命令字串和一些其他資訊。可以用“ps -ef”檢視程序相關的資訊。
父、子程序:每一個程序都是由父程序啟動的,被父程序啟動的程序稱為子程序。Linux系統啟動時會執行系統的第一個程序——init程序,PID為1.

程序狀態
程序的啟動方式:
- 在一個程式的內部啟動另一個程式,從而啟動新程序
`` int system(const char *string)//執行以字串引數的形式傳遞的命令,並等待該命令的完成 ```
- 替換程序映像
int execl(const char *path,const char *arg0,...,(char *)0)//將當前程序替換為一個新程序,新程序啟動後,原程序不再執行 ...exec系列函式
- 複製程序映像
pid_t fork(void);//呼叫後,新程序將繼續執行(原程序也繼續原型);關鍵在於判斷fork的返回值,若為0則為子程序,-1則失敗,其它則為父程序
殭屍程序:子程序終止時,它與父程序之間的關聯還繼續保持,直到父程序正常終止或者呼叫wait;因此,當子程序終止時,代表子程序的表項不會立刻釋放,仍然存在於系統中,此時它將稱為殭屍程序。
2.執行緒
執行緒: 在一個程式中的多個執行線路叫做執行緒。準確的說就是:程序內部的一個控制序列。
執行緒的優點:
- 讓程式看起來同時執行多個事情
- 改善程式的效能
- 對資源的需求小於程序
執行緒的缺點:
- 編寫多執行緒程式需要非常細心的設計
- 多執行緒程式的除錯要比單執行緒困難的多
- 在單處理器上,多執行緒不一定比單執行緒執行的快
執行緒相關函式:
pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *),void *arg); int pthread_join(pthread_t thread, void **retval); void pthread_exit(void *retval); int pthread_attr_init (pthread_attr_t *attr); int pthread_attr_destroy (pthread_attr_t *attr); ...
執行緒同步:
- 訊號量
sem_init、sem_wait、sem_post、sem_destroy - 互斥量
pthread_mutex_init、pthread_mutex_lock、pthread_mutex_unlock、pthread_mutex_destroy
3.對比分析
- 資料共享、同步。程序間的記憶體是獨立的,資料共享複雜,需要用IPC,但是同步簡單;執行緒間共享程序的記憶體空間,資料共享簡單,但是同步複雜。
- 記憶體、CPU佔用。程序佔用記憶體多,程序間切換複雜;建立、切換等的開銷比較小
- 程式設計、除錯。多程序間程式設計、除錯簡單;執行緒比較複雜
- 可靠性。程序間影響較小,但是一個執行緒可能導致整個程序掛掉