View
7
Download
0
Category
Preview:
Citation preview
COMP530:OperatingSystems
Processes
DonPorter
PortionscourtesyEmmettWitchel
1
COMP530:OperatingSystems
App
Whatisaprocess?
2-2
Hardware
Libraries
Kernel
User
Super-visor
App
Libraries
Daemon
Libraries
SystemCallTable(350—1200)
Intuitively,oneofthese
COMP530:OperatingSystems
Whatisaprocess?• Aprocessisaprogramduringexecution.
– Program=staticfile(image)– Process=executingprogram=program+executionstate.
• Aprocessisthebasicunitofexecutioninanoperatingsystem– Eachprocesshasanumber,itsprocessidentifier(pid).
• Differentprocessesmayrundifferentinstancesofthesameprogram– E.g.,myjavac andyourjavac processboth runtheJavacompiler
• Ataminimum,processexecutionrequiresfollowingresources:– Memory tocontaintheprogramcodeanddata– AsetofCPUregisterstosupportexecution
3
COMP530:OperatingSystems
• Wewriteaprogramine.g.,Java.• Acompilerturnsthatprogramintoaninstructionlist.• TheCPUinterpretstheinstructionlist(whichismoreagraphofbasic
blocks).
void X (int b) {
if(b == 1) {
…
int main() {
int a = 2;X(a);
}
Programtoprocess
COMP530:OperatingSystems
void X (int b) {
if(b == 1) {
…
int main() {
int a = 2;X(a);
}
Whatyouwrote:
void X (int b) {
if(b == 1) {
…
int main() {
int a = 2;X(a);
} Code
main; a = 2X; b = 2
Heap
Stack
ProcessinmemoryWhatisinmemory:
Data
COMP530:OperatingSystems
Wheretoprocessescomefrom?• WhenItype‘./a.out’,thebinaryruns,right?
– Reallyonlytrueforstaticbinaries(moreonthislater)
• Inrealityaloader setsuptheprogram– Usuallyauser-levelprogram– Canalsobein-kernel,orsplitbetweenboth
6
COMP530:OperatingSystems
Wheretoprocessescomefrom?• Inordertorunaprogram,theloader:
– readsandinterpretstheexecutablefile– setsuptheprocess’smemorytocontainthecode&datafrom
executable– pushes“argc”,“argv” onthestack– setstheCPUregistersproperly&calls“_start()”
• Programstartsrunningat_start()_start(args) {
initialize_java();ret = main(args);exit(ret)
}
“process” isnowrunning;nolongerthinkof“program”
• Whenmain()returns,OScalls“exit()”whichdestroystheprocessandreturnsallresources
7WhatbookkeepingdoestheOSneedforprocesses?
COMP530:OperatingSystems
• A process has code.– OS must track program counter (code location).
• A process has a stack.– OS must track stack pointer.
• OS stores state of processes’ computation in a process control block (PCB).– E.g., each process has an identifier (process identifier,
or PID)• Data (program instructions, stack & heap) resides
in memory, metadata is in PCB (which is a kernel data structure in memory)
Keepingtrackofaprocess
COMP530:OperatingSystems
ContextSwitching• TheOSperiodicallyswitchesexecutionfromoneprocesstoanother
• Calleda contextswitch,becausetheOSsavesoneexecutioncontextandloadsanother
COMP530:OperatingSystems
Whatcausescontextswitches?• WaitingforI/O(disk,network,etc.)
– MightaswellusetheCPUforsomethinguseful– Calledablockedstate
• Timerinterrupt(preemptivemultitasking)– Evenifaprocessisbusy,weneedtobefairtootherprograms
• Voluntaryyielding(cooperativemultitasking)• Afewothers
– Synchronization,IPC,etc.
COMP530:OperatingSystems
Processlifecycle• Processesarealwayseither:
– Executing– Waitingtoexecute, or– Blockedwaitingforanevent tooccur
11
RunningReady
Blocked
Start Done
COMP530:OperatingSystems
Operating System
“SystemSoftware”
User Process 1
User Program 2User Process 2
User Process n
...Process 1 Process 2OS I/O
Device
k: read()
k+1:
startIO()
endio{ interrupt
main{
main{
}
read{
}
}
schedule()
Memory
savestate schedule()
restorestate
savestate
Processcontexts
COMP530:OperatingSystems
1. Ready2. Running3. Blocked4. Zombie5. Exited
WhenaprocessiswaitingforI/O,whatisitsstate?
COMP530:OperatingSystems
CPUScheduling• Problemofchoosingwhichprocesstorunnext
– Andforhowlonguntilthenextprocessruns
• Whybother?– Improveperformance:amortizecontextswitchingcosts– Improveuserexperience:e.g.,lowlatencykeystrokes– Priorities:favor“important”workoverbackgroundwork– Fairness
14Wewillcovertechniqueslater
COMP530:OperatingSystems
Whendoesschedulinghappen?• Whenaprocessblocks• WhenadeviceinterruptstheCPUtoindicateaneventoccurred(possiblyun-blockingaprocess)
• WhenaprocessyieldstheCPU
• Preemptivescheduling:SettingatimertointerrupttheCPUaftersometime– PlacesanupperboundonhowlongaCPU-boundprocesscanrunwithoutgivinganotherprocessaturn
• Non-preemptivescheduling:ProcessesmustexplicitlyyieldtheCPU
15
COMP530:OperatingSystems
• OS uses PCBs to represent a process• Every resource is represented with a queue• OS puts PCB on an appropriate queue.
– Ready to run queue.– Blocked for IO queue (Queue per device).– Zombie queue.
• When CPU becomes available, choose from ready to run queue
• When an event occurs, remove waiting process from blocked queue, move to ready queue.
Schedulingprocesses
COMP530:OperatingSystems
Consider a Web server:get network message (URL) from clientfetch URL data from diskcompose responsesend response
How well does this web server perform?With many incoming requests?
That access data all over the disk?
Whyusemultipleprocessesinoneapp?
AsingleprocesscannotoverlapCPUandI/O
COMP530:OperatingSystems
Consider a Web serverget network message (URL) from clientcreate child process, send it URL
Childfetch URL data from diskcompose responsesend response
NowthechildcanblockonI/O,parentkeepsworkingDifferentchildrencanblockonreadingdifferentfiles
Howdoesserverknowifchildsucceededorfailed?
Whyusemultipleprocessesinoneapp?
COMP530:OperatingSystems
• Aftertheprogramfinishesexecution,itcallsexit()• Thissystemcall:
– takesthe“result” of theprogramasanargument– closesallopen files,connections, etc.– deallocates memory– deallocates mostoftheOSstructuressupporting theprocess– checksifparentisalive:
v Ifso,itholdstheresultvalueuntilparentrequestsit;inthiscase,processdoesnotreallydie,but itentersthezombie/defunct state
v Ifnot,itdeallocates alldatastructures,theprocessisdead
• Processterminationistheultimategarbagecollection
Orderlytermination:exit()
Webserverex:Childusesexitcodeforsuccess/failure
COMP530:OperatingSystems
• Childreturnsavaluetoparentviaexit()• Theparentreceivesthisvaluewithwait()
• Specifically,wait():– Blockstheparentuntil childfinishes(needawaitqueue)– Whenachildcallsexit(), theOSunblocks theparentandreturns thevalue
passedbyexit()asaresultof thewait()call(alongwiththepid ofthechild)– Iftherearenochildrenalive,wait()returnsimmediately
Thewait()systemcall
COMP530:OperatingSystems
Zombies!!!
21
• Aparentcanwaitindefinitelytocallwait()• TheOStostoretheexitcodeforafinishedchilduntiltheparentcallswait()
• Hack:KeepPCBfordeadprocessesarounduntil:– Parentcallswait(),or– Parentexit()s(don’tneedtowait()ongrandkids)
• Andthatisazombie(donestate)– Willnotbescheduledagain
COMP530:OperatingSystems
Wheredoprocessescomefrom?(redux)• Parent/childmodel• Anexistingprogramhastospawnanewone
– MostOSes haveaspecial‘init’programthatlaunchessystemservices,logondaemons,etc.
– Whenyoulogin(viaaterminalorssh),theloginprogramspawnsyourshell
COMP530:OperatingSystems
Approach1:WindowsCreateProcess• InWindows,whenyoucreateanewprocess,youspecifytheprogram– Andcanoptionallyallowthechildtoinheritsomeresources(e.g.,anopenfilehandle)
COMP530:OperatingSystems
Approach2:Unixfork/exec()• InUnix,aparentmakesacopy ofitselfusingfork()
– Childinheritseverything,runssameprogram– Onlydifferenceisthereturnvaluefromfork()
• Childgets0;parentgetschildpid
• Aseparateexec()systemcallloadsanewprogram– Likegettingabraintransplant
• Someprograms,likeourwebserverexample,fork()clones(withoutcallingexec()).– Commoncaseisprobablyfork+exec
COMP530:OperatingSystems
• The exec() call allows a process to “load” a different program and start execution at main (actually _start).
• It allows a process to specify the number of arguments (argc) and the string argument array (argv).
• If the call is successful– it is the same process …– but it runs a different program !!
• Code, stack & heap is overwritten– Sometimes memory mapped files are preserved.
• Exec does not return!
Programloading:exec()
COMP530:OperatingSystems
In the parent process:main()…int rv =fork(); // create a childif(0 == rv) { // child continues here
exec_status = exec(“calc”, argc, argv0, argv1, …);printf(“Something is horribly wrong\n”); exit(exec_status);
} else { // parent continues hereprintf(“Shall I be mother?”);…child_status = wait(rv);
}
Exec should not return
fork()+exec()example
COMP530:OperatingSystems
pid = 127open files = “.history”last_cpu = 0
pid = 128open files = “.history”last_cpu = 0
int rv = fork();if(rv == 0) {close(“.history”);exec(“/bin/calc”);} else {wait(rv);
int rv = fork();if(rv == 0) {close(“.history”);exec(“/bin/calc”);} else {wait(rv);
Process Control Blocks (PCBs)
OSUSER
int rv = fork();if(rv == 0) {close(“.history”);exec(“/bin/calc”);} else {wait(rv);
int rvc_main(){irvq = 7;do_init();ln = get_input();exec_in(ln);
pid = 128open files = last_cpu = 0
int rv = fork();if(rv == 0) {close(“.history”);exec(“/bin/calc”);} else {wait(rv);
Ashellforksandexecsacalculator
COMP530:OperatingSystems
pid = 127open files = “.history”last_cpu = 0
pid = 128open files = “.history”last_cpu = 0
int shell_main() {int a = 2;… Code
main; a = 2
Heap
Stack
0xFC0933CA
int shell_main() {int a = 2;… Code
main; a = 2
Heap
Stack
0xFC0933CA
int calc_main() {int q = 7;… Code
Heap
Stack
0x43178050
pid = 128open files =last_cpu = 0
OSUSER
Process Control Blocks (PCBs)
Ashellforksandthenexecsacalculator
COMP530:OperatingSystems
Whyseparatefork&exec?• Keyissue:Inheritance offiledescriptors,environment,etc.– Or,makingtheshellwork
• Rememberhowtheshellcandoredirection?– ./warmup <testinput.txt– Filehandle0(stdin)isopenedtoreadtestinput.txt
• Theparent(shell)openstestinput.txt beforefork()– Thechild(warmup)inheritsthisopenfilehandle
• Evenafterexec()
29
COMP530:OperatingSystems
• Decoupling fork and exec lets you do anything to the child’s process environment without adding it to the CreateProcess API.
int rv = fork(); // create a childIf(0 == rv) { // child continues here
// Do anything (unmap memory, close net connections…)exec(“program”, argc, argv0, argv1, …);
}fork() creates a child process that inherits:Ø identical copy of all parent’s variables & memoryØ identical copy of all parent’s CPU registers (except one)
Parent and child execute at the same point after fork() returns:Ø by convention, for the child, fork() returns 0Ø by convention, for the parent, fork() returns the pid of the child
Theconvenienceofseparatefork/exec
COMP530:OperatingSystems
TheCreateProcess alternative• Windowsdoesallowyoutocreateaprocessthatisinitiallysuspended– Youcanalsochangememoryandhandlesofanotherprocess
– Andthenunblockit
• Somewhatisomorphic– Butabitcumbersome– Andpronetosecurityissues(loadingthreadsandlibrariesinanotherapp!)
31
COMP530:OperatingSystems
• Simple implementation of fork():– allocate memory for the child process– copy parent’s memory and CPU registers to child’s– Expensive !!
• In 99% of the time, we call exec() after calling fork()– the memory copying during fork() operation is useless– the child process will likely close the open files & connections– overhead is therefore high
Atwhatcost,fork()?
Anyideastoimprovethis?
COMP530:OperatingSystems
Protool:vfork• Ifyouknowyouaregoingtocallexec()almostimmediately:
– CreateanewPCB,stack,registerstate– Butnotanewcopyofthefullmemory
• YoucanchangeOSstateandcallexecsafely• Youcannot:
– Returnfromthefunctionthatcalledfork()– Touchtheheap– Probablyotherstuff
• Whydoesitimproveperformance?Avoidscopies
• Unfortunateexampleofimplementationinfluenceoninterface– CurrentLinux&BSD4.4haveitforbackwardscompatibility
33
COMP530:OperatingSystems
Copy-on-writefork(preview)• Idea:writeprotecteverythinginmemoryafterafork()– Detectandcopyonlywhatyoutouch,untiltheexec()– Afterexec(),removewriteprotectionfromchildmemory
• Commoncase:execquickly– Someoverheadtosettingcopy-on-write,butcheaperthancopyingeverything
• Uncommoncase:forkneverexecs– Eventuallycopyeverything
• Wewillseemoreaboutthislater…
34
COMP530:OperatingSystems
OSmustincludecallstoenablespecialcontrolofaprocess:
• Prioritymanipulation:– nice(),whichspecifiesbaseprocesspriority (initialpriority)– InUNIX,processprioritydecaysastheprocessconsumesCPU
• Debuggingsupport:– ptrace(),allowsaprocesstobeputundercontrolofanotherprocess– Theotherprocesscansetbreakpoints, examineregisters,etc.
• Alarmsandtime:– Sleepputsaprocessonatimerqueuewaitingforsomenumberofseconds,
supporting analarmfunctionality
Processcontrol
COMP530:OperatingSystems
while(! EOF) {read inputhandle regular expressionsint rv = fork(); // create a childif(rv == 0) { // child continues here
exec(“program”, argc, argv0, argv1, …);}else { // parent continues here…}
Translates<CTRL-C>tothekill()systemcallwithSIGKILL
Translates<CTRL-Z>tothekill()systemcallwithSIGSTOP
Allowsinput-output redirections,pipes,andalotofotherstuffthatwewillseelater
Tyingitalltogether:TheUnixshell
COMP530:OperatingSystems
Summary• Understandwhataprocessis• Thehigh-levelideaofcontextswitchingandprocessstates
• Howaprocessiscreated• ProsandconsofdifferentcreationAPIs
– Intuitionofcopy-on-writeforkandvfork
Recommended