Operating Systems ááááºáááº
áá±áž áá¬á! áá»áœááºáá±á¬á·áºá¡ááŒááºá¡á á
áááºáááºá
á¬ážá
áá¬áá±á¬ááºážáá²á· á
á¬áá±áá
áºáá¯ááŒá
áºáá²á· OSTEP áá²á· áá±á¬ááºážáá«ážááœá±ááᯠáá¬áá¬ááŒááºáá¬ážáá²á· á¡áááºážáááºááœá±ááᯠááá·áºá¡á¬áá¯á¶á
áá¯ááºá
á±áá»ááºáá«áááºá á€á¡ááŒá±á¬ááºážá¡áá¬ááẠunix áá²á·ááá¯á·áá±á¬ áááºáááºááŸá¯á
áá
áºáá»á¬ážá áá¯ááºáá±á¬ááºááŸá¯ááᯠá¡áá±á¬áºáá±áž áááºáááºááŸáá¯ááºážááŸáá¯ááºáž ááœá±ážááœá±ážáá¬ážááŒá®ážá ááá¯ááá¯áááºááŸá¬á áá¯ááºáááºážá
ááºáá»á¬ážá á¡áá»áááºááá¬ážááœá²áá°áá»á¬ážá áááºááá¯áá®ááŸáá·áº áá±ááºáá® OS áá
áºáá¯á¡ááŒá
Ạáááºáá®ážáá¬ážááá·áº á¡ááŒá¬ážáá±á¬ á¡áá¬ážáá° á¡á
áááºá¡ááá¯ááºážáá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáá«áááºá áá
á¹á
ááºážá¡á¬ážáá¯á¶ážá áá°áááºážááᯠá€áá±áá¬ááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
á€á¡ááŒá±á¬ááºážá¡áá¬á¡ááœáẠáá¬ááºááœá²áááºážááᯠá€áá±áá¬ááœáẠááœá±á·ááá¯ááºáááº-
áá°áááºáž áá°áááºáž áá»áœááºá¯ááºá ááá¯ááºáá±ážááá¯ááºáᬠááá¯ááºáá»á±á¬áá®ááœá±ááŸá¯
á¡ááŒá¬ážá¡á áááºá¡ááá¯ááºážáá»á¬áž-
á¡ááá¯ááºáž 1- áááá«ááºáž á¡ááá¯ááºáž 2- Abstraction- áá¯ááºáááºážá áẠá¡ááá¯ááºáž 3- Process API ááᯠááááºáááºááŒááºážá
áá»áœááºá¯ááºá áá»ááºáááºááœááºáááºáž ááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
ááŸáá¯ážá
áẠá€áá±á¬ááŒá±á¬ááœá²á¡ááœáẠáá¬ááºááœá²áááºážáá
áºáᯠááŸááá«áááºá ááŒáá·áºááá¯ááº
áá¯ááºáááºážá áẠAPI
UNIX á áá áºááœáẠáá¯ááºáááºážá ááºáá áºáᯠáááºáá®ážááŒááºážá á¥ááá¬ááᯠááŒáá·áºááŒáá«á áá¯á·á á áá áºáá±á«áºááá¯ááŸá¯ ááŸá áºáá¯ááŒáá·áº ááŒá áºááœá¬ážáááºá á¡áá²áá»áááº() О exec().
Fork() ááᯠáá±á«áºáá«
fork() áá±á«áºááá¯ááŸá¯ááŒá¯áá¯ááºááá·áº áááá¯ááááºááᯠáá¯á¶ážáááºááŒáá·áºáá«á ááœááºáá»ááºááŒááºážáááááºáááºá¡á±á¬ááºáá«á¡ááá¯ááºážááŒá
áºáááá·áºáááºá
ááááŠážá
áœá¬á áá»áœááºá¯ááºááá¯á·ááẠmain() function ááá¯ááá·áºááœááºážááŒá®áž string ááᯠscreen ááá¯á· print áá¯ááºáá«á á
á¬ááŒá±á¬ááºážááœáẠáá°áááºážáá¯áá±á«áºáá±á¬ áá¯ááºáááºážá
ááºáááºááŸááºááŸá¯áá«ááŸááááºá PID ááá¯á·ááá¯áẠáá¯ááºáááºážá
ááºáááºááŸááºááŸá¯á áá¯ááºáááºážá
ááºáá
áºáá¯á¡á¬áž áááºááœáŸááºážáááºá¡ááœáẠá€á¡ááŸááºá¡áá¬ážááᯠUNIX ááœáẠá¡áá¯á¶ážááŒá¯áááºá áá±á¬áẠcommand á fork() ááᯠáá±á«áºáá«áááá·áºáááºá á€á¡áá»áááºááœáẠáá¯ááºáááºážá
ááºá á¡ááá¡áá»áá®ážáá«áž áááá¹áá°áá
áºáá¯ááᯠáááºáá®ážáá¬ážáááºá OS á¡ááœááºá áááºážááẠá
áá
áºáá±á«áºááœáẠáá¯ááºáá±á¬ááºáá±ááá·áº áá°áá®áá±á¬ áááá¯áááẠáááá¹áá° 2 áᯠááŸááá±áá¯á¶áá±á«áºááŒá®áž áááºážááẠáááºážááẠfork() áá¯ááºáá±á¬ááºáá»ááºá០ááœááºáá«áááºá á¡áá
áºáááºáá®ážáá¬ážáá±á¬ ááá±ážáá¯ááºáááºážá
áẠ(áááºážááá¯áááºáá®ážáá²á·áá±á¬ áááºááá¯ááºáááºážá
ááºááŸáá·áºá
ááºáá»ááºážá) main() áá¯ááºáá±á¬ááºáá»ááºá០á
áááºá áá¯ááºáá±á¬ááºáá±á¬á·ááẠááá¯ááºáá«á ááá±ážáá¯ááºáááºážá
ááºááẠááááá¯ááºáááºážá
ááºá áááá»áá±á¬áááá¹áá°ááá¯ááºááŒá±á¬ááºáž ááŸááºáá¬ážáá¬ážááá·áºáááºá á¡áá°ážáááŒáá·áºá áááºážáááá¯ááºááá¯ááºááááºá
á¬áá±áá¬á áááºážáááá¯ááºááá¯ááºááŸááºáá¯á¶áááºáá»á¬ážá áá¯ááºáá±á¬ááºááá¯ááºáá±á¬áááºážááœáŸááºáá»ááºáá»á¬ážá¡ááœáẠáááºážáááá¯ááºááá¯ááºááœáŸááºááŒáá»ááºááŸáá·áº á¡ááŒá¬ážá¡áá¬áá»á¬ážáá«ááŸááááºá ááá¯á·ááŒá±á¬áá·áº fork() function ááá¯áá±á«áºááá¯áá°áá¶ááŒááºááá¯á·áá±á¬áááºááá¯ážáááºááœá²ááŒá¬ážáááá·áºáááºá á¡áá°ážáááŒáá·áºá ááááá¯ááºáááºážá
á¥áºááẠááá±ážáá¯ááºáááºážá
ááºá PID áááºááá¯ážááᯠááŒááºáááºáááŸááááºááŒá
áºááŒá®ážá ááá±ážááẠ0 ááŸáá·áº áá®áá»áŸáá±á¬áááºááá¯ážááᯠáááºáá¶áááŸááááºááŒá
áºáááºá á€ááŒááºáá±ážááá·áºáá¯ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº áááºááẠáá¯ááºáááºážá
ááºáá»á¬ážááᯠáá®ážááŒá¬ážáá¯ááºáá±á¬ááºááá¯ááºááŒá®áž áááºážááá¯á·áá
áºáŠážá
á®ááᯠáááºážáááá¯ááºááá¯ááºá¡áá¯ááºá¡ááŒá
Ạáá¯ááºáá±á¬ááºááẠááœááºážá¡á¬ážáá±ážáááºááŒá
áºáááºá . ááá¯á·áá±á¬áºáááºáž á€á¡á
á®á¡á
ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠáááºážáá»ááºá
áœá¬ áááºááŸááºááá¬ážáá«á áá¯ááºáááºážá
áẠ2 áá¯ááᯠááá¯ááºážááŒá¬ážááŒá®ážáá±á¬ááºá OS ááẠáááºážááá¯á·ááᯠá
á±á¬áá·áºááŒáá·áºáááºááŸáá·áº áááºážááá¯á·á á¡áá¯ááºáá»á¬ážááᯠá
á®á
ááºááẠá
áááºáááºá single-core áááá¯áááºáá¬ááœáẠáá¯ááºáá±á¬ááºáá«á áá¯ááºáááºážá
ááºáá»á¬ážáá²á០áá
áºáá¯á á€á¡ááŒá±á¡áá±ááœáẠáááááẠáááºáááºá¡áá¯ááºáá¯ááºáááºááŒá
áºááŒá®ážá ááá¯á·áá±á¬áẠááá±ážáá¯ááºáááºážá
ááºááẠááááºážáá»á¯ááºááŸá¯ááᯠáááŸááááºááŒá
áºáááºá ááŒááºáááºá
áááºáá±á¬á¡áá«á á¡ááŒá±á¡áá± ááœá²ááŒá¬ážááá¯ááºáááºá
áá±á«áºááá¯ááŸá¯ á á±á¬áá·áºááá¯ááºážááŒááºáž()
á¡á±á¬ááºáá«á¡á
á®á¡á
ááºááᯠáá¯á¶ážáááºááŒáá·áºáá«á á€áááá¯ááááºááœáẠáá±á«áºááá¯ááŸá¯áá
áºáᯠááŸááá±ááŒááºážááŒá±á¬áá·áº ááŒá
áºáááºá á
á±á¬áá·áºáá«() ááááá¯ááºáááºážá
á¥áºááẠááá±ážáá¯ááºáááºážá
ááºááŒá®ážááŒá±á¬ááºááẠá¡ááŒá²á
á±á¬áá·áºááá¯ááºážáá±áááºááŒá
áºáá«áááºá á€ááá
á¹á
ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá»ááºááŸá¬ááŒááºáá±á«áºááœáẠáááºážááŒááºá
áœá¬áááºááŸááºáá¬ážáá±á¬ á
á¬áá¬ážá¡ááœááºááᯠáááŸááá«áááºá
exec() áá±á«áºááá¯áá«á
á
áááºáá±á«áºááŸá¯ááá¯á
ááºážá
á¬ážáá«á exec(). áá¯á¶ážáááŒá¬ážáá¬ážáá±á¬ áááá¯ááááºáá
áºáá¯ááᯠáá¯ááºáá±á¬ááºááá¯ááá·áºá¡áá« á€á
áá
áºáá±á«áºááá¯ááŸá¯ááẠá¡áá¯á¶ážáááºáá«áááºá á€ááœááºáá»áœááºá¯ááºááá¯á·áá±á«áºáá«áááºá execvp() á
áá¬ážáá¯á¶ážáá±ááœááºááŒááºážáááá¯ááááºááŒá
áºááá·áº wc áááá¯ááááºááᯠáá¯ááºáá±á¬ááºáááºá exec() ááá¯á· áá±á«áºááẠáá¬ááŒá
áºááá²á á€áá±á«áºááá¯ááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá±á¬ááá¯ááºáá¡áááºááŸáá·áº á¡áá»áá¯á·áá±á¬ááá·áºáááºáá»ááºáá»á¬ážááᯠá¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡ááŒá
Ạáá»á±á¬áºááŒááºáá¬ážáááºá ááá¯á·áá±á¬áẠဠexecutable file á០code ááŸáá·áº static data áá»á¬ážááᯠload áá¯ááºááŒá®áž code ááŸáá·áº áááºážá ááá¯ááºááá¯áẠsegment ááᯠoverwrite áá¯ááºááœá¬ážáá«áááºá stack ááŸáá·áº heap áá²á·ááá¯á·áá±á¬ áá»ááºááŸááá±á¬ memory á§áááá¬áá»á¬ážááᯠááŒááºáááºá
áááºáá«áááºá áááºážáá±á¬áẠOS ááẠáááá¯ááááºááᯠááá¯ážááŸááºážá
áœá¬áá¯ááºáá±á¬ááºááŒá®áž áááºážááᯠááŒááºážáá¯á¶ááŸá¯á¡á
á¯á¡áá±ážááá¯ááŒááºáááºážáááºá ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáááºážá
ááºá¡áá
áºááᯠááááºáá®ážáá²á·áá² áááºááŸááá¯ááºáá±á¬ááºáá±áá±á¬ áááá¯ááááºááᯠá¡ááŒá¬ážáá±á¬ áá¯ááºáá±á¬ááºáá±áá±á¬ áááá¯ááááºá¡ááŒá
ẠááŒá±á¬ááºážáá²áá
áºááá¯ááºáá«áááºá descendant ááœáẠexec() call ááá¯áá¯ááºáá±á¬ááºááŒá®ážáá±á¬ááºá áá°áááºážáááá¯ááááºááẠáá¯á¶ážááááºáááºááŒááºážáááŸáááá²á·ááá¯á· áá±á«áºáá¬áááºá
ဠstartup ááŸá¯ááºááœá±ážááŸá¯ááẠUnix shell á¡ááœáẠáá¯á¶ážááá¯á¶ááŸááºááŒá áºááŒá®áž ááᯠshell ááá¯áá±á«áºááá¯ááŒá®ážáá±á¬áẠcode ááᯠexecute áá¯ááºááœáá·áºáá±ážáááºá á¡áá²áá»áááº()áá¯ááºážáá±á«áºááá¯ááŸá¯áááá¯ááºáá®á exec(). ááá¯áá¯ááºáá¥ááá¬áá áºáá¯ááẠáááºážááá¯áá áááºáá® áááá¯ááááºá áááºááœáá·áºááŒááºážáááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº á¡ááœá¶áááºáááºážáá»ááºááᯠáá»áááºááŸáááŒááºážááŒá áºáááá·áºáááºá
á¡áá¶áœ - á¡áá¯á¶ážááŒá¯áá°áááá¯ááááºáá áºáá¯áá»áŸáá¬á áá°áááẠááá·áºá¡á¬áž ááááºá á¬ááá¯ááºážááá¯ááŒáááŒá®áž áááºážááœáẠáá áºá á¯á¶áá áºáá¯áá±ážááẠá¡ááá·áºá á±á¬áá·áºáá±áááºá á¡ááŒá±á¡áá±á¡áá»á¬ážá á¯ááœááºá á¡áááºá áááºááẠáááá¯ááááºáá áºáá¯áá¡áááºááᯠááá¯áá±áá¬ááœáẠáá±ážáá«áá shell ááẠáááºážááááºáá±áá¬ááá¯ááŸá¬ááœá±áááºááŒá áºááŒá®áž fork() method ááá¯áá±á«áºááá¯áᬠáá¯ááºáááºážá ááºá¡áá áºáá áºáá¯áááºáá®ážáááºá¡ááœáẠá¡áá»áá¯á·áá±á¬ exec() ááá¯áá±á«áºááá¯ááŒá®áž áááºážááá¯á¡áá¯á¶ážááŒá¯á á¡ááŒá®ážáááºáááºá á±á¬áá·áºááá¯ááºážáááºááŒá áºáááºá wait() áá±á«áºáá«á ááá±áž áá¯ááºáááºážá áẠááœááºááœá¬ážáá±á¬á¡áá«á shell ááẠwait() call á០ááŒááºáá¬ááŒá®áž prompt ááᯠáááºáᶠprint áá¯ááºááŒá®áž áá±á¬áẠcommand ááᯠááá·áºááœááºážááẠá á±á¬áá·áºáá«á
fork() & exec() ááœá²ááŒááºážááẠshell á¡á¬áž á¡á±á¬ááºáá«á¡áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá
á±áááºá á¥ááá¬-
wc ááá¯áẠ> new_fileá
á€á¥ááá¬ááœááºá wc áááá¯ááááºá output ááᯠááá¯ááºáá áºáá¯ááá¯á· ááŒááºááœáŸááºážáááºá ááá±á«áºáá® ááá±ážáá¯ááºáááºážá ááºááᯠáááºáá®ážááŒááºážááŒáá·áº áááºážááᯠshell áááŸáááá·áºáááºážáááºážááŸá¬ á¡ááœááºááá¯ážááŸááºážáá«áááºá exec()shell ááẠstandard output ááá¯ááááºááŒá®áž ááá¯ááºááá¯ááœáá·áºáááºá á¡áá áº_ááá¯ááºááá¯á·ááŒá±á¬áá·áºá áá±á¬ááºáááºáá¯ááºáá±á¬ááºáá±ááá·áº áááá¯ááááºá០á¡ááœááºá¡á¬ážáá¯á¶áž wc áá»ááºááŸá¬ááŒááºá¡á á¬áž ááá¯ááºáá áºáá¯ááá¯á· ááŒááºááœáŸááºážáá«áááºá
ááá¯ááºáá«áááºáá»á¬á pipe() call ááá¯á¡áá¯á¶ážááŒá¯ááá·áºááŒá¬ážáá¬ážáá»ááºááŸáá·áºá¡áá° á¡áá¬ážáá°áá¯á¶á
á¶ááŒáá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááŒáááºá á€ááá
á¹á
ááœááºá áá¯ááºáááºážá
ááºá á¡ááœááºá
á®ážááŒá±á¬ááºážááẠkernel ááŸá ááá¯ááºáááºážá
á®áá
áºáá¯ááá¯á· áá»áááºáááºáááºááŒá
áºááŒá®ážá áááºážááẠá¡ááŒá¬ážáá¯ááºáááºážá
ááºá input stream ááᯠáá»áááºáááºáááºááŒá
áºáááºá
source: www.habr.com