1.進程
定義: Unix標準的定義為“一個其中運行著一個或者多個線程的地址空間和這些線程所需要的系統(tǒng)資源”。也可以看作是正在運行的程序怯邪。
PID:每一個進程都有一個唯一的數字編號员咽,稱為進程標識PID。
進程表:存儲進程信息的數據結構灯帮,包括PID召调、進程的狀態(tài)、命令字符串和一些其他信息创葡≌闾撸可以用“ps -ef”查看進程相關的信息。
父灿渴、子進程:每一個進程都是由父進程啟動的成黄,被父進程啟動的進程稱為子進程。Linux系統(tǒng)啟動時會運行系統(tǒng)的第一個進程——init進程逻杖,PID為1.
進程狀態(tài)
進程的啟動方式:
- 在一個程序的內部啟動另一個程序,從而啟動新進程
```
int system(const char *string)//運行以字符串參數的形式傳遞的命令思瘟,并等待該命令的完成
```
- 替換進程映像
int execl(const char *path,const char *arg0,...,(char *)0)//將當前進程替換為一個新進程荸百,新進程啟動后,原進程不再運行
...exec系列函數
- 復制進程映像
pid_t fork(void);//調用后滨攻,新進程將繼續(xù)執(zhí)行(原進程也繼續(xù)原型)够话;關鍵在于判斷fork的返回值,若為0則為子進程光绕,-1則失敗女嘲,其它則為父進程
僵尸進程:子進程終止時,它與父進程之間的關聯(lián)還繼續(xù)保持诞帐,直到父進程正常終止或者調用wait欣尼;因此,當子進程終止時停蕉,代表子進程的表項不會立刻釋放愕鼓,仍然存在于系統(tǒng)中,此時它將稱為僵尸進程慧起。
2.線程
線程: 在一個程序中的多個執(zhí)行線路叫做線程菇晃。準確的說就是:進程內部的一個控制序列。
線程的優(yōu)點:
- 讓程序看起來同時執(zhí)行多個事情
- 改善程序的性能
- 對資源的需求小于進程
線程的缺點:
- 編寫多線程程序需要非常細心的設計
- 多線程程序的調試要比單線程困難的多
- 在單處理器上蚓挤,多線程不一定比單線程運行的快
線程相關函數:
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占用座云。進程占用內存多,進程間切換復雜付材;創(chuàng)建朦拖、切換等的開銷比較小
- 編程、調試厌衔。多進程間編程璧帝、調試簡單;線程比較復雜
- 可靠性富寿。進程間影響較小睬隶,但是一個線程可能導致整個進程掛掉