linux-創(chuàng)建第一個進(jìn)程

進(jìn)程是資源管理的最小單位统舀,線程是程序執(zhí)行的最小單位。進(jìn)程管理著資源(比如說CPU劳景,主存誉简,文件等),而將線程分配到某個CPU上執(zhí)行盟广。在操作系統(tǒng)設(shè)計上闷串,從進(jìn)程到線程,最主要目的是更好地支持多CPU系統(tǒng)和減小上下文切換的開銷衡蚂。

進(jìn)程的狀態(tài)

系統(tǒng)為了充分利用資源窿克,對進(jìn)程區(qū)分了不同的狀態(tài)骏庸,為“新建毛甲、運(yùn)行、阻塞具被、就緒和完成”:

  • 新建:進(jìn)程正在被創(chuàng)建
  • 運(yùn)行:進(jìn)程正在運(yùn)行
  • 阻塞:進(jìn)程正在等待某一事件發(fā)生
  • 就緒:系統(tǒng)正在等待CPU來執(zhí)行命令
  • 完成:進(jìn)程已經(jīng)結(jié)束玻募,系統(tǒng)正在回收資源

CPU按時間片分配給各個進(jìn)程使用,每個進(jìn)程都有自己的運(yùn)行環(huán)境以使得在CPU做進(jìn)程切換(上下文切換)時不會“忘記”該進(jìn)程已計算了一部分的“半成品”一姿。從DOS的概念講七咧,進(jìn)程的切換都是一次“DOS中斷”處理過程,包括三個層次
1)用戶數(shù)據(jù)的保存:包括正文段(TEXT)叮叹、數(shù)據(jù)段(DATA艾栋,BSS)、棧段(STACK)蛉顽、共享內(nèi)存段(SHARED MEMORY)的保存
2)寄存器數(shù)據(jù)的保存:包括PC(指向下一條指令地址)蝗砾,PSW(處理機(jī)狀態(tài)字),SP(棧指針)携冤,PCBP(進(jìn)程控制塊指針)悼粮,F(xiàn)P(指向棧中一個函數(shù)的local變量的首地址),AP(指向棧中函數(shù)調(diào)用的實參位置)曾棕,ISP(中斷棧指針)以及其他的通用寄存器等
3)系統(tǒng)層次的保存:包括proc扣猫,u,虛擬存儲空間管理表格翘地,中斷處理棧申尤。以便于該進(jìn)程再一次得到CPU時間片時能正常運(yùn)行癌幕。

常用的多進(jìn)程編程的系統(tǒng)調(diào)用

創(chuàng)建一個新的進(jìn)程
#include <unistd.h>
#include <sys/types.h>
pid_t fork();

調(diào)用產(chǎn)生一個新的進(jìn)程,叫“子進(jìn)程”昧穿,是調(diào)用進(jìn)程的一個復(fù)制品序芦。調(diào)用進(jìn)程叫“父進(jìn)程”,子進(jìn)程繼承了父進(jìn)程幾乎所有屬性粤咪。
子進(jìn)程是對父進(jìn)程的一個拷貝谚中。

進(jìn)程:

  • 代碼段(程序代碼)
  • 堆棧段(局部變量、函數(shù)返回地址寥枝、函數(shù)參數(shù))
  • 數(shù)據(jù)段(全局變量宪塔、常數(shù))

在linux中,系統(tǒng)調(diào)用fork后囊拜,內(nèi)核為完成系統(tǒng)調(diào)用fork要進(jìn)行幾步操作:

  1. 為新進(jìn)程在進(jìn)程表中分配一個表項某筐。系統(tǒng)對一個普通用戶可以同時運(yùn)行的進(jìn)程數(shù)是有限的,對超級用戶沒有該限制冠跷,但是不能超過進(jìn)程表的最大表項的數(shù)目南誊。
  2. 給子進(jìn)程一個唯一的進(jìn)程標(biāo)識號(PID)。該進(jìn)程標(biāo)識號其實就是該表項在進(jìn)程表中的索引蜜托。
  3. 復(fù)制一個父進(jìn)程的進(jìn)程表項的副本給子進(jìn)程抄囚。內(nèi)核初始化子進(jìn)程的進(jìn)程表項時,是從父進(jìn)程處拷貝的橄务。所以子進(jìn)程擁有與父進(jìn)程一樣的uid幔托、當(dāng)前目錄、當(dāng)前根蜂挪、用戶文件描述符等重挑。
  4. 把與父進(jìn)程相連的文件表和索引節(jié)點(diǎn)表的引用數(shù)加1.這些文件自動地與該子進(jìn)程相連。
  5. 內(nèi)核為子進(jìn)程創(chuàng)建用戶級上下文棠涮。內(nèi)核為子進(jìn)程的代碼段分配內(nèi)存谬哀,并復(fù)制父進(jìn)程的區(qū)內(nèi)容,生成的是進(jìn)程的靜態(tài)部分严肪。
  6. 生成進(jìn)程的動態(tài)部分史煎,然后對父進(jìn)程返回子進(jìn)程的pid,對子進(jìn)程返回0.

簡單說诬垂,fork()調(diào)用成功后劲室,分別返回兩個整數(shù)——對父進(jìn)程返回>0的整數(shù),對子進(jìn)程返回0.

舉個例子:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> // exit()
int main()
{
    pid_t pid; // 進(jìn)程號
    char *message;
    int n;

    printf("fork program starting\n");
    pid = fork(); // <==> pid_t fork(void) 包含在頭文件<sys/types.h>和<unistd.h>中
    switch(pid) // 進(jìn)程會根據(jù)pid不同结窘,有選擇地執(zhí)行各自的代碼
    {
        case -1:
            perror("fork failed");
            exit(1);
        case 0: // fork函數(shù)返回新進(jìn)程的pid很洋,新進(jìn)程為0(即子進(jìn)程)
            message = "This is the childprocess";
            n = 5;
            break;
        default:
            message = "This is the parentprocess";
            n = 3;
            break;
    }

    for(; n>0; n--){
        puts(message);;
        sleep(1);
    }
    exit(0);
}

執(zhí)行效果如下:


父進(jìn)程先于子進(jìn)程結(jié)束
父進(jìn)程先于子進(jìn)程結(jié)束

可以看到多了兩個由文件"process1_fork"創(chuàng)建的進(jìn)程

下面是這個程序在執(zhí)行過程中的示意圖:



父進(jìn)程和子進(jìn)程的執(zhí)行的代碼都和process1_fork.c中代碼一致,但是fork根據(jù)不同進(jìn)程返回不同的PID隧枫,其實父子進(jìn)程的實際有效代碼部分是不同的:

換句話說就是喉磁,進(jìn)程會根據(jù)PID的不同谓苟,有選擇地執(zhí)行各自的代碼。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末协怒,一起剝皮案震驚了整個濱河市涝焙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孕暇,老刑警劉巖仑撞,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妖滔,居然都是意外死亡隧哮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門座舍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沮翔,“玉大人,你說我怎么就攤上這事曲秉〔墒矗” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵承二,是天一觀的道長榆鼠。 經(jīng)常有香客問我,道長矢洲,這世上最難降的妖魔是什么璧眠? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮读虏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袁滥。我一直安慰自己盖桥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布题翻。 她就那樣靜靜地躺著揩徊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嵌赠。 梳的紋絲不亂的頭發(fā)上塑荒,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音姜挺,去河邊找鬼齿税。 笑死,一個胖子當(dāng)著我的面吹牛炊豪,可吹牛的內(nèi)容都是我干的凌箕。 我是一名探鬼主播拧篮,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牵舱!你這毒婦竟也來了串绩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤芜壁,失蹤者是張志新(化名)和其女友劉穎礁凡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體慧妄,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡把篓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腰涧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片韧掩。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窖铡,靈堂內(nèi)的尸體忽然破棺而出疗锐,到底是詐尸還是另有隱情,我是刑警寧澤费彼,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布滑臊,位于F島的核電站,受9級特大地震影響箍铲,放射性物質(zhì)發(fā)生泄漏雇卷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一颠猴、第九天 我趴在偏房一處隱蔽的房頂上張望关划。 院中可真熱鬧,春花似錦翘瓮、人聲如沸贮折。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽调榄。三九已至,卻和暖如春呵扛,著一層夾襖步出監(jiān)牢的瞬間每庆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工今穿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缤灵,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像凤价,于是被迫代替她去往敵國和親鸽斟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 又來到了一個老生常談的問題利诺,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢富蓄? 今天就這個問題開始,來談?wù)劜?..
    tangsl閱讀 4,088評論 0 23
  • Linux 進(jìn)程管理與程序開發(fā) 進(jìn)程是Linux事務(wù)管理的基本單元慢逾,所有的進(jìn)程均擁有自己獨(dú)立的處理環(huán)境和系統(tǒng)資源立倍,...
    JamesPeng閱讀 2,450評論 1 14
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,779評論 0 27
  • 故事一 有這樣一個兒子,他是個大款君珠,母親老了寝志,牙齒全壞掉了,于是他開車帶著母親去鑲牙策添,一進(jìn)牙科診所材部,醫(yī)生開始推銷他...
    Kayan阿嘉閱讀 525評論 1 26
  • 人們總說孩子是無憂無慮的,是單純的唯竹,小孩的想法也很簡單乐导。 如同對待蘋果的態(tài)度一樣,小孩子只會覺得這個蘋果好大浸颓,然后...
    范跳跳閱讀 392評論 0 2