進(jìn)程 · 全家

      網(wǎng)友投稿 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 pid_t fork(void);

      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 #include pid_t getpid(void); //獲取進(jìn)程ID pid_t getppid(void); //獲取父進(jìn)程ID

      1

      2

      3

      4

      5

      6

      #include #include uid_t getuid(void);//返回實(shí)際用戶(hù)ID uid_t geteuid(void);//返回有效用戶(hù)ID

      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 int execve(const char *path,char *const argv[],char *const envp[]);//這個(gè)是真正的系統(tǒng)調(diào)用 //以下的函數(shù)最后都是調(diào)用這個(gè)函數(shù) int execl(const char *path,char *const argv,···); int execlp(const char *file,char *const argv,···); int execle(const char *path,char *const argv,···· ,char *const envp[]); int execv(const char *path,char *const argv[]); int execvp(const char *file,char *const argv,);

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      #include #include #include #include int main(void) { pid_t pid; if((pid = fork()) < 0) { perror("fork"); exit(1); } else if(pid == 0) { /* child */ execl("/bin/ls", "ls", "-l", "-a",NULL); } else { printf("parent, child id = %d.\n",pid); } return 0; }

      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 #include pid_t wait(int *status); //這里的status為一個(gè)整形指針,是該子進(jìn)程的返回狀態(tài)。若該指針不為空,則可以通過(guò)該指針獲取子進(jìn)程退出時(shí)的狀態(tài)。 pid_t waitpid(pid_t pid,int *status,int options); // pid是進(jìn)程號(hào) /* <-1 回收指定進(jìn)程組內(nèi)的任意子進(jìn)程 -1 回收任意子進(jìn)程 0 回收和當(dāng)前waitpid調(diào)用一個(gè)組的所有子進(jìn)程 >0 回收指定ID的子進(jìn)程 */ //options: /* WNOHANG:強(qiáng)制回收,不阻塞。 WUNTRANCED:一般用上面那個(gè) */

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      進(jìn)程 · 全家桶

      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 #include #include int main() { pid_t pid; pid = fork(); if(pid == 0) { //打?。?getpid();//進(jìn)程ID getpgid(0);//組ID getsid(0);//會(huì)話ID sleep(10); setsid();//子進(jìn)程設(shè)為會(huì)話組長(zhǎng) //子進(jìn)程非組長(zhǎng)進(jìn)程,故其成為新會(huì)話首進(jìn)程,且成為組長(zhǎng)進(jìn)程。 //該進(jìn)程ID即為會(huì)話進(jìn)程ID //再打印一遍 getpid();//進(jìn)程ID getpgid(0);//組ID getsid(0);//會(huì)話ID } }

      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)容。

      上一篇:【AI前沿動(dòng)態(tài)】Pytorch 1.2.0 來(lái)了!
      下一篇:WPS表格數(shù)據(jù)怎么以雷達(dá)圖形式顯示?
      相關(guān)文章
      亚洲AV无码乱码在线观看| 亚洲AV无码XXX麻豆艾秋| 国产精品亚洲综合专区片高清久久久| 亚洲偷自拍另类图片二区| 亚洲乱人伦精品图片| 久久精品国产亚洲AV电影| 亚洲国产精品自在线一区二区 | 久久精品国产69国产精品亚洲| 一本色道久久综合亚洲精品高清| 综合偷自拍亚洲乱中文字幕| 欧洲亚洲国产精华液| 亚洲AV香蕉一区区二区三区| 在线观看国产一区亚洲bd| 亚洲AV无码之日韩精品| 亚洲国产天堂久久综合| 亚洲色婷婷综合开心网| 亚洲人成网站在线观看播放| 久久精品国产精品亚洲色婷婷| 亚洲色图在线观看| 亚洲明星合成图综合区在线| 亚洲乱码在线播放| 亚洲中文字幕无码一去台湾 | 亚洲成a人片在线观看日本| 久久精品国产精品亚洲蜜月| 久久精品蜜芽亚洲国产AV| 亚洲狠狠狠一区二区三区| 亚洲国产成人久久三区| 亚洲人成人网毛片在线播放| 亚洲精品无码av片| 亚洲国产成人久久综合区| 最新国产AV无码专区亚洲| 久久综合图区亚洲综合图区| 亚洲欧洲日产专区| 亚洲中文字幕精品久久| 成人婷婷网色偷偷亚洲男人的天堂 | 久久亚洲精品11p| 亚洲色偷拍区另类无码专区| 亚洲精品无码永久中文字幕| 亚洲国产天堂在线观看| 亚洲国产成人99精品激情在线| 亚洲精品乱码久久久久久V|