免費可商用素材網(wǎng)站云浮seo
一、進程的創(chuàng)建和回收
一、進程的概念
1、進程!=程序
程序是靜態(tài)的,而進程是動態(tài)的?
2、進程和程序的區(qū)別
1)進程控制塊中包含進程的屬性
2)程序在磁盤里面,堆棧都是在內存中,程序運行起來都在內存中
3)進程的運行在內存(RAM)中,手機內存指的是運行內存64G,電腦內存指的是硬盤(ROM)
4)初始化的全局變量在數(shù)據(jù)段,沒有初始化的全局變量放在BSS中
代碼段存放可執(zhí)行文件,機器碼
5) static聲明的變量不在棧中,和全局變量放在一起
棧:參數(shù),返回值,局部變量
堆:malloc
6)一個進程會被分為不同的區(qū)域
7)進程控制塊(pcb):
PID、進程用戶、進程狀態(tài)、優(yōu)先級、文件描述符表
3、進程的類型
1)交互最常用,前臺運行,在shell下可以控制
2)批處理
3)守護進程,一直在后臺運行,不能用shell命令控制
4、進程的狀態(tài)
二、進程常用的命令
1、查看進程信息
1)ps當前狀態(tài)下的進程
2)ps -e當前狀態(tài)下Linux所有的進程
3)ps -elf Linux下進程的詳細信息
4)進程狀態(tài)
5)進程標志
6)ps下的目錄含義
PID:進程ID
CMD:進程的名稱
NI:進程優(yōu)先級
PRI:進程優(yōu)先級
SZ:占用內存
C:占用的CPU利用率
7)ps -elf|grep PID
查看某個進程
2、top實時查看進程信息
1)翻頁shift+'<'(前翻頁)或'>'(后翻頁)
2)top -p PID查看某個進程
3)ctrl+c退出
3、/proc查看進程的某個目錄
4、nice命令
越nice優(yōu)先級越低
?1)一般nice只能調高
2)只有root才能設置為負值
3)nice打開一個進程,設置優(yōu)先級
4)renice改變優(yōu)先級
5、
6、前臺和后臺的區(qū)別
1)當./test運行時:
ctrl+C:結束前臺運行
2)ctrl+Z:此時程序進入停止狀態(tài)
3)jobs查看后臺進程,這時進程已經(jīng)在后臺
4)bg將掛起的進程在后臺運行
5)fg+序號
進程又重新掛到前臺
7、ctrl+Z:把運行的前臺進程轉為后臺并停止
8、./test &進入后臺運行?
*三、創(chuàng)建子進程
(一)創(chuàng)建子進程
1、子進程的概念
在Linux下除了0號進程,其他的進程都是由別人創(chuàng)建的
2、創(chuàng)建子進程
讓我們的進程創(chuàng)建子進程
1)代碼
子進程B的代碼和A的代碼相同
但子進程B只執(zhí)行程序中fork函數(shù)之后的代碼
2)打印結果
父進程子進程分別打印
3)如何讓父子進程分別執(zhí)行
(二)父子進程
1、子進程只執(zhí)行fork之后的代碼
2、父子進程執(zhí)行順序是操作系統(tǒng)決定的
?3、父子進程的關系
(三)結束進程
4、若父進程先結束,被init進程收養(yǎng),子進程變成后臺進程
1)分別對父子進程加一個sleep
父子進程隨機
子父進程ID
2)kill掉父進程
子進程的父進程變成了2107,也就是init
子進程變成后臺進程
5、如果子進程先結束,父進程沒有來得及回收,子進程變成僵尸進程
kill掉父進程
此時kill掉父進程,子進程消失
四、子進程進階
1、孫進程
子進程也進行了for循環(huán)?
解決辦法:子進程執(zhí)行結束break
五、進程的退出
exit會刷新緩沖流-庫函數(shù)-<stdlib.h>
_exit不會刷新緩沖流-系統(tǒng)調用-<unistd.h>
1、main函數(shù)return會隱式調用exit
兩個結果相同,其他函數(shù)return只是返回上一級
2、exit:
兩個結果相同
3、_exit:沒有刷新流緩沖區(qū)
六、進程的回收
*(一)wait-回收并查看子進程的情況
1、status和結束返回2的進程不同
2、16進制打印200不是2
3、用宏來取得進程的返回值
4、父進程對子進程的回收
1)不回收
2)回收
僵尸進程:子進程結束,但是沒有被父進程回收
*(二)waitpid
1、
2、指定pid
3、WNOHANG不阻塞,直接執(zhí)行,如果當前子進程還未結束,則會出錯
出錯:
修正:休眠2秒,等子進程結束
二、exec函數(shù)族
一、exec函數(shù)族的執(zhí)行過程
1、父進程的父進程是shell
2、函數(shù)族-有很多個函數(shù)
3、通過調用exec函數(shù)族執(zhí)行某個程序
4、調用exec函數(shù)族進程當前內容被指定的程序替換
5、相當于父子進程執(zhí)行不同程序
二、execl函數(shù)和execlp函數(shù)
1、execl-需要寫全部路徑
相當于命令“l(fā)s -a -l”
2、execlp-不需要寫全部路徑
執(zhí)行效果和execl相同
三、execv函數(shù)和execvp函數(shù)
1、execv-全部路徑-將命令定義成數(shù)組
2、execvp-不需要全部路徑-數(shù)組
四、system函數(shù)
1、system的實現(xiàn)
五、exec函數(shù)族特點
1、exec函數(shù)族-進程當前內容被指定內容替換,exec函數(shù)以后的程序沒有被執(zhí)行
2、第0個參數(shù)不使用但是要寫
3、父子進程執(zhí)行不同程序
三、GDB調試
一、GDB調試多進程程序
1、想要用GDB調試,編譯加-g
gcc -g -o 文件名
2、進入gdb調試:gdb 可執(zhí)行文件
3、quit 退出
4、start開始調試
5、n進入下一步
6、默認跟蹤父進程
1)set follow-
顯示可以跟蹤的進程
2)set follow-fork-mode
可以繼續(xù)選擇跟蹤父子進程
3)跟蹤孩子
set follow-fork-mode child
4)同時調試父子進程
調試子進程,同時可以切換父進程
5)切換調試的進程
查看可以運行的進程
從進程5切換到了進程1
7、調試多進程
四、守護進程
一、守護進程的概念
1、守護進程是后臺進程,始終后臺運行
2、守護進程獨立于終端
3、
1)進程組:
2)會話:一個終端界面可以理解成一個會話
3)控制終端-就是終端
4、
5、守護進程是孤兒進程
6、守護進程的創(chuàng)建
1)創(chuàng)建子進程,然后令子進程變成孤兒進程,被init收養(yǎng),變成后臺進程
此時子進程已經(jīng)被init收養(yǎng)
2)創(chuàng)建會話-setsid
稱為新的會話組長
自己當家做主人了?
3)改變工作目錄-不被之前的父進程目錄局限
4)重設掩碼-創(chuàng)建文件權限(不是必須的)
5)關閉打開的文件描述符?
關閉文件描述符后,不會在打印到屏幕
守護進程不能在屏幕上打印東西,不能接收鍵盤的輸入
7、nohup ./test.c &:將前臺進程轉為后臺進程
沒有寫守護進程變成后臺的方法
二、守護進程的實現(xiàn)
五、線程的創(chuàng)建和參數(shù)傳遞
一、線程的基本特點
1、線程共享相同的地址空間
共享全局變量
2、線程是在windows下創(chuàng)建的,被Linux引用,Linux不分線程和進程
3、線程的特點
4、線程共享資源
常用:靜態(tài)數(shù)據(jù)、文件描述符、工作目錄
5、? 線程的私有資源
常用:錯誤號、堆棧
二、使用pthread庫函數(shù)創(chuàng)建線程
線程不是通過Linux內核實現(xiàn),而是由線程庫來實現(xiàn)
2、創(chuàng)建線程
三、常見編譯錯誤及處理方法
鏈接錯誤
四、線程的運行特點
1、線程創(chuàng)建需要時間,如果主進程退出,線程不能得到執(zhí)行,馬上退出
主進程退出,創(chuàng)建的線程也會退出
2、sleep 1秒,線程創(chuàng)建成功
五、線程id的獲取
1、線程的退出
2、pthread_exit()函數(shù)-常用于清理線程
3、打印tid
1)主函數(shù)中,直接獲取
2)pthread_self()函數(shù)-函數(shù)中獲得自己的id
4、打印pid
**六、線程的參數(shù)傳遞
1、通過地址傳遞參數(shù),注意類型轉換
void定義下的arg是任意類型,直接轉換成Int類型
2、也可以值傳遞-可能會報警,需要程序員自己保證數(shù)據(jù)長度正確
3、建立多個線程
七、段錯誤的原因及處理方法
六、線程的回收及內存演示
一、pthread_join與pthread_exit
相當于進程中的wait函數(shù)
1、pthread_join主函數(shù)對線程的回收-阻塞函數(shù),線程沒有回收則等待
2、pthread_exit 線程結束函數(shù)
二、常見的編譯錯誤
三、pthread_join函數(shù)特點
1、一個缺點,如果是單線程回收方便,循環(huán)創(chuàng)建多線程,如果最開始的線程沒有結束,pthread_join也會阻塞
四、線程分離pthread_detach
1、線程主動與主控線程斷開關系,自己可以回收,不需要pthread_join
2、pthread_detach使用
在主函數(shù)中:
不阻塞
在線程函數(shù)中:
3、線程屬性分離
4、回收線程的三種方式
1)pthread_join(局限)
2)pthread_detach
3)創(chuàng)建線程時分離屬性
五、線程回收內存演示
查看內存命令: top -p 進程號
線程回收前
等待線程回收后
七、線程的取消和清理
一、pthread_cancel與線程取消點
1、查看線程-L大寫
ps -eLf |grep detach
2、殺掉線程
1)必須有取消點-阻塞
2)gdb命令:bt-打印調用棧
二、GDB調試段錯誤
三、pthread_testcancel手動設置取消點
1、線程取消需要取消點
2、如果不確定有沒有取消點,可以手動設置一個取消點
四、 pthread_setcancelstate設置取消屬性
1、取消取消點
2、恢復其他地方取消點
3、主函數(shù)中的sleep
4、
五、線程清理
1、如果線程申請了一塊內存,但線程因為阻塞被取消,則會造成內存泄露
2、線程清理是在線程異常退出之后,進行清理
3、線程的清理函數(shù)本質上是宏定義,必須成對使用
push-pop
4、
return可以結束線程,但是不能出發(fā)清理函數(shù)
5、可以cancel自己
兩種情況:
1)到取消點取消,取消點之前可以取消
2)立即取消
八、**互斥鎖/讀寫鎖/死鎖
一、互斥鎖的概念和使用
(一)臨界資源
1、臨界資源是只允許一個資源訪問的任務,互斥資源
2、外設、磁盤都是臨界資源
3、臨界區(qū)是訪問臨界資源的代碼
(二)互斥機制
1、動態(tài)初始化創(chuàng)建
2、靜態(tài)方式創(chuàng)建
3、鎖的銷毀
4、互斥鎖的使用
5、申請鎖
1)兩個函數(shù)的區(qū)別
6、釋放鎖
*(三)互斥鎖
1、創(chuàng)建兩個線程,打印字符到文件中
主函數(shù):
1.txt:兩個線程隨機打印,亂序
2、使用靜態(tài)方式定義互斥鎖
1)初始化互斥鎖
2)添加互斥鎖
3)添加了互斥鎖之后的1.txt
4)如果線程執(zhí)行多個任務,例如多個文件的寫操作,需要定義多個互斥鎖
二、讀寫鎖概念和使用
1、讀寫鎖-提高線程的讀寫速度-可同時讀
2、防止讀的時候有線程寫入
3、同一時刻只有一個線程可以獲得寫鎖,同一時刻可以有多個線程獲得讀鎖
4、代碼
1)在主函數(shù)中定義讀寫鎖
2)結構體變量聲明
3)加鎖
4)結果與互斥鎖相同
結論:讀寫鎖與互斥鎖結果相近
5、讀寫鎖-只讀
讀寫鎖比互斥鎖好的地方是,讀寫鎖可以允許寫的時候讀
三、死鎖的避免
1、死鎖的概念
2、死鎖都是在一把鎖的情況下
3、代碼
1)設置兩把鎖,兩個線程同時調用兩個資源
2)解決辦法
延長休眠時間
1、使用一把鎖,鎖越少越好
2、獲得1,2的先后順序相同
九、條件變量的使用及注意事項










十、線程尺及gdb調試多線程
一、線程池的概念
1、一般線程創(chuàng)建使用完都會被回收
2、線程的創(chuàng)建和銷毀>線程的執(zhí)行,時間不劃算
3、線程池的結構
1)任務隊列
2)線程池工作線程
二、線程池的實現(xiàn)
三、線程的GDB調試
1、主函數(shù)
2、設置斷點 b
3、run運行程序
4、info thread查看線程
5、切換線程
6、下一步next
7、執(zhí)行完一個線程后再次查看,線程消失
8、
9、設置線程鎖
設置之后,除了選定的線程,其他不執(zhí)行
10、切換到第3個,第6行斷電
十一、有名管道和無名管道
一、無名管道基礎
(一)進程間通信方式
**(面試題)1、進程間通信的方式
1)無名管道-親緣進程
2)有名管道
*3)信號
4)共享內存
5)套接字-網(wǎng)絡-進程間通信
進程-進程/主機-主機
開銷最大
6)古老
(二)無名管道的特點
1、概念
相當于共享內存,通過管道傳遞消息
2、特點
1)只能父子或兄弟
2)單工通訊-固定讀端和寫端
2)創(chuàng)建兩個文件描述符
3、無名管道的創(chuàng)建
單工通信-每個進程fd[0]和fd[1]只能用一個
(三)無名管道的創(chuàng)建
父子進程間的通信:
只有讀操作之后才能打印buf
二、無名管道進階
1、父進程創(chuàng)建了無名管道
2、子進程進程描述符相同
3、關閉管道
父子進程都可以關閉讀寫管道,無論這一段是讀還是寫
4、在同一個進程自己讀和自己寫是進行不了的
子進程之間相互通信:
5、管道可以用于大于兩個進程的共享
6、可以兩個子進程讀/寫,父進程寫/讀
7、無名管道的讀寫特性
管道大小是64K
三、有名管道概念和使用
(一)有名管道的特點
1、通過文件系統(tǒng),但是文件不是放在磁盤,放在內存中,通過文件IO
2、有名管道的特點
(二)有名管道的創(chuàng)建
1、有名管道的創(chuàng)建
路徑不能是Linux和wins共享目錄
2、直接創(chuàng)建在根目錄下
(三)有名管道的讀寫
1、寫進程代碼:
2、讀進程代碼:
讀寫結果:
四、有名管道的注意事項
1、不能使用讀寫方式打開文件
2、文件可以創(chuàng)建在根目錄下,但是不能創(chuàng)建在共享目錄下
3、默認情況下只寫O_RDWR和只讀O_RDONLY參數(shù)是阻塞的,加了第二個參數(shù),不會阻塞,沒有內容可讀,直接退出
一個參數(shù)阻塞:
兩個參數(shù):
讀文件:沒有內容直接報錯
有內容讀內容
寫文件:打開失敗