進程與線程

3.多線程/進程&并發
3.1 每個線程都有一個棧,保存自己的局部變量,多線程上鎖保護全局變量和靜態變量(存在.bss段)
3.2 CPU:運算核心(Core)和控制核心(ControlUnit) 寄存器在其中,操作數據比內存快(速度:寄

存器>cache>RAM>ROM)
http://www.cnblogs.com/Mushrooms/p/5151593.html
同步異步 信號量與互斥鎖

不斷捕捉信號:while(-1 != pause());

進程:一個正在內存中運行的有生老病死的程序(動態)

為什么需要進程:多任務【協同父進程處理多任務】,例:1秒刷一張圖片
ps-進程狀態[ps -ef查看系統當前正在運行進程信息]

1.創建

①pid_t fork(void);創建子進程的時候會復制它老爸所有的資源;返回0:子進程,大于0 父進程, 小于0 失敗;一次調用,兩次返回;
②vfork共享父(代碼段 數據段)資源,無法用sleep干預,照樣是子進程先執行;
執行注意:
先分出父進程(未參與創建子進程代碼)代碼和子進程(創建及后續)代碼;先運行父進程代碼再運行子進程代碼;子不能復制父親代碼和父親獨有代碼;
tips:創建子進程過程中使用sleep函數可讓父進程掛起,使子進程有足夠時間去執行

2.獲取進程ID

當前getpid();父getppid();//輸出時需要轉換為int型

3.退出

①exit();//退出刷新IO緩存區 exit(0)是正常退出其他都不是
②_exit();//退出不刷新IO緩存區
③return 0;//回到調用函數
exit(0);//退出進程,用處:出錯直接退出程序

4.回收

如果父進程沒有主動回收子進程,會變成孤兒進程,最終會被1號進程init【祖進程】回收
①wait();//阻塞父進程直到子進程退出然后回收子進程,成功返回子進程id,失敗-1;參數stat_loc是指宏函數去獲取的進程信息;
②waitpid();//返回值和參數補充


微信截圖_20170405143125.png

5.進程間通信方式:

1.有、無名管道
①有:int mkfifo(const char *pathname, mode_t mode);動生成一個管道文件用于進程間的通信,純粹linux環境,無血緣要求,創建前判斷有無,【前面沒刪點后面不能操作】;只寫模式下只有內容被取后才能取消阻塞(讀寫權限的話對方無法獲取內容);
system干掉卡住的進程,access()判斷文件是否存在;
②無:int pipe(int fildes[2]);臨時存放數據,讀端和寫端是固定的,具有血緣關系(父子和兄弟之間)的進程通信,沒有名字(看不到);
2.共享內存,消息隊列,信號量
①共享(申請,映射,刪除)效率最高:key值手寫或ftok生成,size為1024整數倍;
查看:ipcs -m
3.信號
4.unix域套接字(網絡編程)
5.套接字(網絡編程)

線程:

取消
優先級
屬性
線程間同步互斥:互斥鎖 條件變量 信號量

互斥鎖:上鎖了會怎樣:一般會把訪問共享內存這段代碼放在上鎖程序之后。
互斥鎖特點小結(鎖不使用屬性):
1.誰上誰解;
2.先上不阻塞,后上都阻塞;
第3個特點:加個延時控制
4.不能重復執行(上了要解,不解就上的話就阻塞)

條件變量:配合互斥鎖使用,不可單獨
1.pthread_cond_init destroy
2.喚醒pthread_cond_broadcast(所有阻塞在這個線程上的)signal(某個) 阻塞pthread_cond_wait

線程池
4.13總結:1.對沒用過的東西,理解功能后嘗試驗證/實踐,反復這個過程

pthread_cond_wait();//阻塞的,解開互斥鎖并讓當前線程阻塞在條件變量上
//阻塞并解鎖
pthread_cond_signal();//喚醒阻塞在cond條件變量上的某個線程,解除對線程的阻塞,然后馬上上鎖
//喚醒(解除阻塞)并上鎖 基于cond條件變量

使用注意事項:
1.干單一事情,不要指派復雜任務;
2.一發一收(線程)
3.線程目的:幫助實現小任務

使用線程與進程都有哪些坑

exec函數族與system

一旦執行了exec函數代碼,后面的就不執行

進程的狀態

就緒:還沒有獲取到CPU的使用權;
CPU通過調度算法,將使用權給了進程,那么進程就自動進入到了執行態;

5.進程與線程區別
對于一些要求同時進行并且又要共享某些變量的并發操作,只能用線程,不能用進程。

從邏輯角度來看,多線程的意義在于一個應用程序中,有多個執行部分可以同時執行。但操作系統并沒有將多個線程看做多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。

線程執行開銷小,但不利于資源的管理和保護;而進程正相反。同時,線程適合于在SMP機器上運行,而進程則可以跨機器遷移。

線程(默認情況不可分離)退出自己回收(分離屬性),不需要主線程(主線程的話需要調用pthread_join去回收線程)
太抽象:

線程是輕量級的進程
線程是系統調度的最小單位
線程:線程是把系統分配給進程的資源拿了一部分用于支持自己的運行
線程是在進程中創建的---》創建線程的那個進程稱作主線程
被創建的線程稱作子線程

1.定義
進程是具有一定獨立功能的程序關于某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位.
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源.
2.關系
一個線程可以創建和撤銷另一個線程;同一個進程中的多個線程之間可以并發執行.
相對進程而言,線程是一個更加接近于執行體的概念,它可以與同進程中的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容