Pages

Friday, October 8, 2010

Process බෝ කරන fork()

මේ දවස් වල සෑහෙන ගැටලු ආපු දෙයක්නේ මේ fork(). ඊළග සතියේ දෙන Bonus Assignment එකට ආයෙ fork() එනවලු. ඒක නිසා fork() ගැන පොඩ්ඩක් ලියන්නම්. මෙන්න මේ විදියට පටන් ගන්නම් Process බෝ කරන fork() ගැන. 

fork() කියන්නේ System Call එකක්. ඒකත් හරි කතාවනේ. දැන් ඊළගට System Call කියන්නේ මොකක්ද කියන එක ප්‍රශ්නේ. System Call එකක් කියන්නේ තවත් එක් function එකක්. යම් කිසි program එකක අපි මේ function නැත්තම් System Calls, යොදාගන්නේ Operating System එකේ service එකක් ලබා ගන්න. ඉතින් ඔය විදියට System Calls ගොඩක් තියනවා. එකක් තමා fork. Linux වල වගේ නම් man fork කියලා terminal එකක ගැහුවම fork() ගැන man page එක පෙන්වනවා මේ පහළ තියන රූපයේ වගේ. අනිත් System Calls ගැන විස්තරත් මේ විදියට බලාගන්න පුළුවන්. ඉතින් මේ fork() වලට පොඩි පෙර ගමනක්.



fork() කියන System call එක භාවිතා කරන්නේ අළුතින් process නිර්මාණය කිරීම සඳහා. fork(), System call එක කිසිම argument එකක් ලබාගන්නේ නැහැ. ඒත් ඒ System Call එක execute වීමෙන් පස්සේ process ID එකක් return කරනවා. fork වලින් කරන්නේ අළුත් process එකක් නිර්මාණය කරන එක කියලා කලින්ම කිව්වනේ. ඒ process එක හඳුන්වන්නේ child process එක කියලා. fork() function එක call කලෙත් යම්කිසි process එකකින්නේ.  ඒ process එක හඳුන්වන්නේ parent process එක කියලා. fork() කියලා program එක තුල function එක call වුණ තැන සිට තියන සියලුම instructions, child process එකෙන් හා parent process එකෙන් කියන දෙකෙන්ම execute වෙනවා. ඒක නිසා අපිට සිද්ධ වෙනවා fork() execute වීමෙන් පසු parent සහ child processes වෙන වෙනම හඳුනගන්න. අන්න ඒකට තමයි fork() call කිරීමෙන් පසු return වෙන value එක අපිට පාවිච්චි කරන්න වෙන්නේ. ඇත්තටම බැලුවොත් fork() එක්ක සෙල්ලම සිද්ධ වෙන්නේ මේ return value එක එක්ක තමා...

මේ return value එකට ලැබෙන අගය  ගැන කොටස් තුනකින් කියන්නම්. මේ return value එක ඍණ අගයක් නම්, එයින් කියැවෙන්නේ child process එක නිර්මාණය වීම අසාර්ථකයි කියන එකයි. fork() function එක execute වීමෙන් පසු, අළුතින් සැකසුනු process එකට, ඒ කියන්නේ child process එකට බින්දුව (Zero) කියන value එක return කරනවා. ඒ වගේම fork() function එක execute වීමෙන් පසු එම parent process එකට ධන අගයක්(Positive Value) return කරනවා. එලෙස return කරන ධන අගය, අදාල parent process එකෙන් නිර්මාණය කරන ලද child process එකේ Process ID එක වේ. මේ return value එක ගැනත් සටහනක් තියමු. මේ  return value එක, sys/types.h කියන header file එකේ define කරල තියන pid_t කියන type එකට අයිති එකක්. මේ process id එක කියවගන්න (retrieve) කරගන්න getpid() කියන function එක පාවිච්චි කරන්න පුළුවන්. fork() එක්ක program ලියනවා කියන්නේ මේ  return value, process id එක්ක කරන සෙල්ලම තමා....

මෙතන ඉඳන් කතාව පටන් ගමු උදාහරණයක් එක්කම. මේ පහත තියන උදාහරණය ඇසුරින් තමයි විස්තරයම වෙන්නේ. හරිම සරල එකක්. මේ උදාහරණය බාගන්න ඕනි නම් මෙතන ක්ලික් කරන්න. මෙන්න උදාහරණය.....


මුල ඉදන්ම විස්තරේ පටන් ගන්නම්කෝ. sys/types.h නම් header file එක include කළ හේතුව ඉහතින් විස්තර කලානේ. ඒ වගේම unistd.h කියන header file එකත් include කරලා තියනවා. fork() function එක declare කරලා තියෙන්නේ unistd.h කියන header file එකත් එක්ක. ඊටපස්සේ main method එක යටතේ 8 වෙනි පේලියේ pid_t නම් ඉහත විස්තර කරන ලද type එකට අදාලව pid ලෙස variable එකක් හදාගෙන තියනවා. fork() function එක call කිරීමෙන් පසු return වෙන value එක ලබාගන්නේ මෙම pid නම් variable එකයි. එම variable එකේ අගය මත child හා parent වෙන් කෙරෙන ආකාරය ගැන කලින් දක්වලා තිබුනනේ. මේකෙ loop එකක් යොදාගෙන සිදු කර ඇත්තේ වැඩි වාර ගණනක් processes, run කරවීමයි. වැඩි වාර ගණනක් run කරවූ විට context switching ක්‍රියාව සිදුවීම නිසා child හා parent processes මාරුවෙන් මාරුවට සිදුවන අයුරු පැහැදිලිව බලාගන්න පුළුවන්. ඉතින් මේ උදාහරණය බොහොම සරල එකක්. ඒක බාගෙන run කරලා බලන්න. වැඩේ ඒ හැටි අමාරු නැහැ. තව උදාහරණයක් දෙන්නම්. ටිකක් ප්‍රායෝගික පැත්තක් තියන එකක්. ඕනි නම් කියන්නකෝ. ඔන්න ඔහොමයි fork()..... :)

10 comments:

  1. තව තවත් ලියන්න ශක්තිය ලැබේවා !!!!!!!!!!!

    ReplyDelete
  2. getpid() වගේ getppid() කියලා එකකුත් තියනවා... getpid() කියන එක තේරුණා නම් getppid() ගැන හොයලා බලන්න. ඒකට තමා සිංහලෙන් කියන්නේ Self Study කියලා.... :P

    ReplyDelete
  3. එළ මචන්.. ගොඩක් වටිනවා..
    අර ppid කියන්නේ මොකක් හරි process එකක parent process එකේ process id එකනේ නේද?

    ReplyDelete
  4. @Sanj

    ඔව් ඔව්...

    ඒක තමා...... :)

    ReplyDelete
  5. නියමයි මචන්...මේ එක්කම pipe වගේ එවා ගැනත්නත් ටිකක් ලියපන් වැඩේ දිගටම කරගෙන පලයන් ....

    ReplyDelete
  6. @Nuwan

    බලමුකෝ... උත්සහ කරමු අපි
    Thanks for the comment

    ReplyDelete
  7. ගොඩක් වටින ලිපියක්!!!

    ReplyDelete

ඔබගේ අදහස් පවසන්න ...
මට ඒව මසුරන් වටිනවා ....