[C/C++] Process Programming - fork()

  • Unix Process Programming - fork()
  • Download: Process.c

    這裡介紹最基本的Unix Programming - fork(),基於現在的電腦都是多核心之下,我們可以透過fork()來將程式的效能提升到CPU的極限,考慮一個雙核心CPU,我們用C來解兩個簡單的方程式。

    • y=x^2+(4/3)x+4/9
    • y=x^2+4x+16

    我將方程式定義成如下的形式,這裡我使用指標函式來實做解equation的函式

    如果不使用process programming你可能會這樣寫:

    solveEqu(equation1,&ans,10);
    printf("Ans for equation 1: %.2f\n",ans);
    solveEqu(equation2,&ans,10);
    printf("Ans for equation 2: %.2f\n",ans);

    很直觀的就是先解完equation1,然後再解equation2,但是使用fork(),之後程式將不再是循序的執行,而是同步運行,核心程式如下:

    我使用switch去處理fork()的回傳值,但是實際上你可以直接使用if去判斷回傳值是否如下:

    • -1 : fail to create process
    • 0 : child process
    • >0 : parent process

    而這裡我將solveEqu(equation1,&ans,10);放在default裡,實際上parent process的程式碼可以直接拉到switch case之外(也就是程式碼 29之後),在這個小範例裡要還要注意的是18行的exit(0),目的是要終止child process,以及27行的wait(NULL),意思是parnet process要等待child process處理好才繼續往下做(如果parent跑的比child快的話),輸出參考如下:

    And for equation 1: -0.67
    Ans for equation 2:4.00

    這裡只有用一個child process,所以整體最大效能不會超過200%,同時你也可以知道這兩個equation所需的時間也不一樣,自然整個程式不可能提升到200%的peak performance。這時你可能也會思考一個問題,假設我要一次處理多個process,那我的parent process只使用wait(NULL)就可以知道我要等哪個process嗎?這裡你就需要將程式碼改寫成如下的形式:

    waitpid() 可以指定要等待的child process,詳細的使用方式你可以參考下面的網頁

    http://man.he.net/man2/waitpid

    撰寫Process的程式要注意的是每一個Process他們會有各自的變數,例如我們的child process跟parent process都要使用到ans這個變數時,實際上在process運行過程中,他們各自複製了一份ans的變數來做處理,所以process programming通常使用於各自獨立的工作去分工,頂多將解出來的值做合併,但是你無法得知哪一個process會先做完,所以在做process programming時必須很小心的去分析你要分離的工作會不會影響到程式執行的結果。

No comments:

Post a Comment

Orange - data analysis tool

Installation pip install orange3 Run orange python -m Orange.canvas