您好,登錄后才能下訂單哦!
進程
線程
通信(本機,網(wǎng)絡)
進程的屬性和概念:
進程和程序之間的區(qū)別是什么:
1進程是動態(tài)的
2程序是靜態(tài)的
readelf -a 名字 讀取該程序的所有內(nèi)容
file a.out 查看該文件的信息
mmu 內(nèi)存管理單元 是在內(nèi)核里面
MMU管理內(nèi)存大小 一個文件,先映射到4個G虛擬內(nèi)存里面,最后存到真實內(nèi)存里面。
線程是程序執(zhí)行和資源管理的最小單位
進程不僅包括程序的指令和數(shù)據(jù),而且包括程序計數(shù)器值,CPU的所有寄存器以及存儲。。。。
進程號PID。
交互進程: 該類進程是由SHELL控制和運行的,交互進程既可以在前臺運行,也可以在后臺運行。
ps -elf 看運行狀態(tài)。
CPU在某一時刻,只能運行一個進程
時間片,將CPU的運行時間切成一份一份的,每一份就是一個進程執(zhí)行的時間t1,時間到,則換一個進程執(zhí)行。
CPU分為內(nèi)核模式和用戶模式
4個G空間,3G空間為用戶空間,,1G空間為內(nèi)核空間。
內(nèi)核執(zhí)行代碼權限比較高。
內(nèi)核模式:特權模式,內(nèi)核模式的代碼可以無限制的訪問所有處理器指令集以及全部內(nèi)存和空間。
用戶模式:訪問資源受限,部分代碼不可以執(zhí)行。
用戶模式靠系統(tǒng)調(diào)用,來獲得權限。
man手冊很重要,一定要掌握怎么用
man 2 系統(tǒng)調(diào)用
用戶模式的代碼允許發(fā)生缺頁,內(nèi)核模式的代碼則不允許。
int 0x80 系統(tǒng)中斷。
ps -l 只顯示跟當前終端信息。
pstree 樹進程
pstree -p顯示進程號
大括號括起來的是線程
top 動態(tài)顯示系統(tǒng)中的進程
renice調(diào)整正在運行的程序優(yōu)先級
renice -20 PID 將優(yōu)先級調(diào)高 (-20~19)只能調(diào)整這么大,稍微調(diào)整,不能無限制調(diào)整優(yōu)先級
nice -20 ./a.out 調(diào)整優(yōu)先級
nice -n -20 ./process/basic/a.out
按用戶指定的優(yōu)先級運行進程
kill -l 所有信號。 kill結束進程
SIGALRM14 鬧鐘信號
9,19號信號,終止進程。。18號信號SIGCONT暫停信號
17信號SIGCHLD 子進程結束的時候會發(fā)這個給父進程
jobs 查看后臺運行程序 直接輸入jobs
./a.out & 放后臺運行
bg把已暫停的進程恢復到后臺運行
fg 將后臺運行的進程放到前臺。
進程創(chuàng)建 fork()
fork() 創(chuàng)建一個新的進程,復制一個調(diào)用進程,這個新的進程是一個子進程,
拷貝了父進程空間,如果成功,父進程會得到子進程的ID號,并且子進程會返回0
追蹤 CTRL +]
反追中 CTRL +t
getpid()獲取當前進程的id, getppid()獲取父進程的id。
子進程可以獲取父進程ID。
fork() .一次調(diào)用,兩次返回,在父進程中返回子進程的編號,子進程中返回0
創(chuàng)建子進程之后,,子進程和父進程一樣擁有CPU,先后運行順序不確定。
fork()創(chuàng)建子進程之后,兩個進程都會從FORK后面的第一條匯編代碼執(zhí)行
fork()執(zhí)行后,執(zhí)行賦值語句,然后執(zhí)行判斷語句。
AT定時命令。
{
at 15:34
at> ls ~/ >dev/pts/1
at> ls -l > /dev/pts/1
at> echo"hello at" >/dev/pts/1
atq查看當前任務
atrm 34取消任務
}
crontab定時任務
{
sudo vi /etc/crontab
在這里面輸入。
{周期的執(zhí)行任務
怎么取消任務。。
,可以進去注釋掉。
}
當創(chuàng)建一個進程的時候,內(nèi)核里面會創(chuàng)建一個結構體 task_struct{} //linux.2.6.35/include/linux.c 1100
這個結構體描述了進程的所有信息。
但子進程的代碼不在這里,在4G空間里面 。進程return后 4G空間會刪掉。。內(nèi)核里面的結構體卻不會沒有釋放掉。,但因為4G內(nèi)存已經(jīng)不存在了,所以這個結構體代表的進程就是僵尸進程。
當父進程結束的時候,子進程的僵尸進程也會釋放掉。
寫時復制技術。
4G虛擬內(nèi)存全部映射了,,實際內(nèi)存中只有改動了的數(shù)據(jù)才會拷貝。
vfork()
子進程一定先運行。進程結束后要加exit(0);
vfork()的子進程完完全全的共享父進程的物理空間。父進程創(chuàng)建子進程后,保證創(chuàng)建的子進程一定會先運行,運行結束,父進程再運行。子進程結束一定要調(diào)用_exit或者exec函數(shù)族。否則結果未知。
因為共享同一個物理空間,所以子進程修改的參數(shù),就是父進程的參數(shù),它倆用的是同一個參數(shù)。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。