無(wú)法鏈接到云端(無(wú)法從云端服務(wù)器載入)
652
2025-03-31
文章目錄
初見(jiàn)進(jìn)程,先查一下戶(hù)口
①進(jìn)程環(huán)境
②進(jìn)程狀態(tài)
③進(jìn)程原語(yǔ)
3.1、fork
進(jìn)程的產(chǎn)生方式:
3.2、exec族
3.3、wait/waitpid
來(lái)個(gè)聯(lián)系方式吧,進(jìn)程間通信
進(jìn)程間同步
家庭關(guān)系如何?(進(jìn)程間關(guān)系)
①進(jìn)程組
②會(huì)話
守護(hù)者
程序、進(jìn)程與線程的區(qū)分
初見(jiàn)進(jìn)程,先查一下戶(hù)口
別吃驚我為什么能有個(gè)圈圈的①,專(zhuān)用符號(hào)嘿嘿。
進(jìn)程控制塊PCB:就是進(jìn)程在操作系統(tǒng)中的“戶(hù)口”,具體實(shí)現(xiàn)是 task_struct數(shù)據(jù)結(jié)構(gòu): 1.狀態(tài)信息,例如這個(gè)進(jìn)程處于可執(zhí)行狀態(tài),休眠,掛起等。 2.性質(zhì),由于unix有很多變種,進(jìn)程有自己獨(dú)特的性質(zhì)。 3.資源,資源的鏈接比如內(nèi)存,還有資源的限制和權(quán)限等。 4.組織,例如按照家族關(guān)系建立起來(lái)的樹(shù)(父進(jìn)程,子進(jìn)程等)。
1
2
3
4
5
6
7
8
9
10
運(yùn)行狀態(tài)R(TASK_RUNNING) 可中斷睡眠狀態(tài)S(TASK_INTERRUPTIBLE) 不可中斷睡眠狀態(tài)D(TASK_UNINTERRUPTIBLE) 暫停狀態(tài)T(TASK_STOPPED或TASK_TRACED) 僵死狀態(tài)Z(EXIT_ZOMBIE) 退出狀態(tài)X(EXIT_DEAD)
1
2
3
4
5
6
7
8
9
10
11
以上兩部分,了解即可
#include
1
2
3
4
功能:子進(jìn)程復(fù)制父進(jìn)程中的0~3g空間和PCB,但I(xiàn)D號(hào)不同。
fork調(diào)用一次返回兩次
父進(jìn)程中返回子進(jìn)程id (就是大于0的意思)
子進(jìn)程返回0
讀時(shí)共享寫(xiě)時(shí)復(fù)制,可保高效
與之相關(guān)函數(shù):
#include
1
2
3
4
5
6
#include
1
2
3
4
5
6
進(jìn)程的產(chǎn)生有多種方式,但是追本溯源是相通的。
(1)復(fù)制父進(jìn)程的系統(tǒng)環(huán)境(放心,只要是你開(kāi)的進(jìn)程,肯定有父進(jìn)程) (2)在內(nèi)核中建立進(jìn)程結(jié)構(gòu) (3)將結(jié)構(gòu)插入到進(jìn)程列表,便于維護(hù) (4)分配資源給該進(jìn)程 (5)復(fù)制父進(jìn)程的內(nèi)存映射消息 (6)管理文件描述符和鏈接點(diǎn) (7)通知父進(jìn)程
1
2
3
4
5
6
7
下面是一張進(jìn)程列表的圖,命令:pstree。
可以看到init是所有進(jìn)程的父進(jìn)程,其他進(jìn)程都是有init進(jìn)程直接或間接fork出來(lái)的。
為什么需要exec函數(shù)?
fork子進(jìn)程是為了執(zhí)行新程序(fork創(chuàng)建了子進(jìn)程后,子進(jìn)程和父進(jìn)程同時(shí)被OS調(diào)度執(zhí)行,因此子進(jìn)程可以單獨(dú)的執(zhí)行一個(gè)程序,這個(gè)程序宏觀上將會(huì)和父進(jìn)程程序同時(shí)進(jìn)行)
可以直接在子進(jìn)程的if中寫(xiě)入新程序打代碼。但這樣不夠靈活,因?yàn)槲覀冎荒馨炎舆M(jìn)程程序的源代碼貼過(guò)來(lái)執(zhí)行(必須知道源代碼,而且源代碼太長(zhǎng)了也不好控制)
使用exec族函數(shù)運(yùn)行新的可執(zhí)行程序。exec族函數(shù)可以直接把一個(gè)編譯好的可執(zhí)行程序直接加載運(yùn)行。
有了exec族函數(shù)后,典型打父子進(jìn)程程序是這樣的:子進(jìn)程需要運(yùn)行的程序被單獨(dú)編寫(xiě)、單獨(dú)編譯鏈接成一個(gè)可執(zhí)行程序(hello)。主進(jìn)程為父進(jìn)程,fork創(chuàng)建了子進(jìn)程后在子進(jìn)程中exec來(lái)執(zhí)行hello,達(dá)到父子進(jìn)程分別做不同程序同時(shí)(宏觀上)運(yùn)行的效果。
在我的印象中,我有一篇博客專(zhuān)門(mén)講解exec族,就那么一找,還真有:exec族
代碼貼這兒,可以進(jìn)那篇看更詳細(xì),也可以在這里看:
#include
1
2
3
4
5
6
7
8
9
10
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
這里幾個(gè)概念:
僵尸進(jìn)程:子進(jìn)程退出,父進(jìn)程沒(méi)有及時(shí)回收,子進(jìn)程成為僵尸進(jìn)程
孤兒進(jìn)程:父進(jìn)程退出,而子進(jìn)程沒(méi)有退出,子進(jìn)程成為孤兒進(jìn)程
init進(jìn)程:1號(hào)進(jìn)程,負(fù)責(zé)收留孤兒進(jìn)程,成為他們的父進(jìn)程
有5種方式終止進(jìn)程: (1)main返回 (2)調(diào)用exit (3)調(diào)用_exit (4)調(diào)用abort(給自己發(fā)送異常終止信號(hào)) (5)由一個(gè)信號(hào)終止
1
2
3
4
5
6
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
來(lái)個(gè)聯(lián)系方式吧,進(jìn)程間通信
常用的通信方式有:管道、消息隊(duì)列、共享內(nèi)存、文件空間映射。
管道:兩個(gè)進(jìn)程間通信,最古老的通信方式了。
消息隊(duì)列:在內(nèi)核中建立一個(gè)鏈表,發(fā)送方按照一定標(biāo)識(shí)將數(shù)據(jù)發(fā)送到內(nèi)核中,內(nèi)核將其放入鏈表。
()接收方發(fā)送請(qǐng)求后,內(nèi)核按照標(biāo)識(shí)取出消息。
()消息隊(duì)列是一種完全異步的通信方式。
共享內(nèi)存:共享內(nèi)存是將內(nèi)存中的一段地址,在多個(gè)進(jìn)程間共享。多個(gè)進(jìn)程通過(guò)掛載在自己名下的地址直接對(duì)共享內(nèi)存進(jìn)行操作。
文件空間映射:mmap函數(shù)用來(lái)將文件或設(shè)備空間映射到內(nèi)存中,可以通過(guò)對(duì)映射后的內(nèi)存空間操作來(lái)獲得與操作文件一致的效果。
這塊如果要展開(kāi)的話,篇幅會(huì)很長(zhǎng),很長(zhǎng),所以我做了一個(gè)目錄表:
想要進(jìn)程的聯(lián)系方式?點(diǎn)這里
進(jìn)程間同步的方法主要有system信號(hào)量和進(jìn)程間鎖,信號(hào)量我會(huì)在后面的文章再行整理,進(jìn)程間鎖嘛,
進(jìn)程間鎖
家庭關(guān)系如何?(進(jìn)程間關(guān)系)
一個(gè)或多個(gè)進(jìn)程組成的集合,進(jìn)程組的組ID是一個(gè)正整數(shù)。
//獲取當(dāng)前進(jìn)程組組ID pid_t getpgid(pid_t pid); pid_t getpgrp(void);
1
2
3
4
5
幾個(gè)概念:
組長(zhǎng)進(jìn)程:進(jìn)程ID號(hào)等于組ID。
組長(zhǎng)進(jìn)程可以創(chuàng)建一個(gè)進(jìn)程組,創(chuàng)建該進(jìn)程組中的進(jìn)程。
只要進(jìn)程中有一個(gè)進(jìn)程存在,進(jìn)程組就存在,與組長(zhǎng)進(jìn)程是否終止無(wú)關(guān)。
進(jìn)程組生存期:進(jìn)程組創(chuàng)建到最后一個(gè)進(jìn)程離開(kāi)(終止或轉(zhuǎn)移到另一個(gè)進(jìn)程組)
//一個(gè)進(jìn)程可以為自己或子進(jìn)程設(shè)置進(jìn)程組ID int setpgid(pid_t pid,pid_t pgid); //非root進(jìn)程只能改變自己創(chuàng)建的子進(jìn)程,或有權(quán)限操作的進(jìn)程
1
2
3
4
5
pid_t setsid(void);
1
1、調(diào)用進(jìn)程不能是進(jìn)程組組長(zhǎng),該進(jìn)程變成新會(huì)話的首進(jìn)程。
2、該進(jìn)程成為一個(gè)新進(jìn)程組的組長(zhǎng)進(jìn)程。
3、需要有root權(quán)限(ubunt不需要)
4、新會(huì)話丟棄原有控制終端,該會(huì)話沒(méi)有控制終端。
5、建立新會(huì)話時(shí),先用fork,然后父進(jìn)程終止,子進(jìn)程調(diào)用 。
pid_t getsid(pid_t pid);
1
用于查看當(dāng)前進(jìn)程的會(huì)話ID
注意點(diǎn):組長(zhǎng)進(jìn)程不能成為新會(huì)話首進(jìn)程,新會(huì)話首進(jìn)程必定成為組長(zhǎng)進(jìn)程。
來(lái)串偽代碼:
#include
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
守護(hù)者
守護(hù)進(jìn)程
這篇我還想留著呢,所以就貼個(gè)鏈接吧,刪了怪可惜的。
程序、進(jìn)程與線程的區(qū)分
這個(gè)問(wèn)題老師問(wèn)過(guò)我,當(dāng)時(shí)我沒(méi)答上來(lái)。
(1)進(jìn)程是動(dòng)態(tài)的,程序是靜態(tài)的。 (2)一個(gè)進(jìn)程只能對(duì)應(yīng)一個(gè)程序,而一個(gè)程序可以對(duì)應(yīng)多個(gè)進(jìn)程。
1
2
從操作系統(tǒng)方面來(lái)看,進(jìn)程代表的是操作系統(tǒng)分配的內(nèi)存、CPU時(shí)間片等資源的基本單位,是為正在運(yùn)行的程序準(zhǔn)備的運(yùn)行環(huán)境。
任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。