Beruflich Dokumente
Kultur Dokumente
DanielHagimont(INPT)
ThankstoNolDePalma,FabienneBoyerand
ArnaudLegrand(UJF)
Process
Aprocessisaninstanceofarunningprogram
Eg:gcc,sh,firefox...
Createdbythesystemorbyanapplication
Createdbyaparentprocess
Uniquelyidendified(PID)
Correspondtotwounits:
Executionunit
Sequentialcontrolflow(executeaflowofinstructions)
Addressingunit
Eachprocesshasitsownaddressspace
Isolation
Concurent processes
MultipleprocessescanincreaseCPUutilization
Overlaponeprocess'scomputationwithanother'swait
(Wait for input)
emacs
gcc
Multipleprocessescanreducelatency
RunningAthenBrequires100secsforBtocomplete
80s
20s
RunningAandBconcurentlyimprovestheaverage
responsetime
A
B
10s
Execution context
Aprocessischaracterizedbyitscontext
Process'currentstate
Memoryimage
Codeoftherunningprogram
Staticanddynamicdata
Register'sstate
Programcounter(PC),Stackpointer(SP)...
Listofopenfiles
EnvironmentVariables
Tobesavedwhentheprocessisswitchedoff
Toberestoredwhentheprocessisswitchedon
Running mode
Usermode
Accessrestrictedtoprocessownadressspace
Limitedinstructionset
Supervisormode
Fullmemoryaccess
Fullaccesstotheinstructionset
Interrupt,trap
Asynchronousevent
Illegalinstruction
Systemcallrequest
Process Lifecycle
new
terminated
admitted
elected
ready
running
pre-empted
IO or event wait
IO or event completion
waiting
exit
Whichprocessshouldthekernelrun?
If0runnable,runawatchdog,if1runnable,runit
Ifnrunnable,makeschedulingdecision
Processqueues
Readyqueue(readyprocesses)
Devicequeue(ProcesswaitingforIO)
BlockedQueue(Processwaitingforanevent)
...
OSmigratesprocessesacrossqueues
Holdaprocessexecutioncontext
PCB(ProcessControlBlock):
DatarequiredbytheOSto
manageprocess
Processtables:
PCB[MAXPROCESSES]
Process ID
User ID
Registers
Address space
Open files
Ready / blocked
OS
Process P1
Interruption / trap / IO
Save ctxt P0
Load ctxt P1
Ready
Running
Interruption / trap
Ready
Running
Save ctxt P1
Load ctxt P0
Ready / blocked
ThescheduleristheOS'spartthatmanagesCPU
allocation
Criteria/SchedulingAlgorithm
Fair(nostarvation)
Minimizethewaitingtimeforprocesses
Maximizetheefficiency(numberofjobsperunit
oftime)
Nonpreemptivescheduler
FCFS(FirstComeFirstServed)
Fair,maximizeefficiency
Preemptivescheduler
SJF(ShortestJobFirst)
Prioritytoshortesttask
Requiretoknowtheexecutiontime(modelestimatedfrom
previousexecution)
Unfairbutoptimalintermofresponsetime
RoundRobin(fixedquantum)
EachprocessusisaffectedaCPUquantum(10100ms)before
preemption
Efficient(unlessthequantumistoosmall),fair/response
time(unlessthequantumtoolong)
Roundrobinwithdynamicpriority
Apriorityassociatedwitheachprocess
Onereadyqueueperprioritylevel
Decreasepriorityforlongtasks(preventstarvation)
Roundrobinwithvariablequantum
Nthschedulingreceives2N1quantum(reducecontextswitches)
24
3
3
Let'stheseprocessescomeinthisorder:P1,P2,P3
P1
0
P2
24
P3
27
ResponsetimeofP1=24;P2=27;P3=30
Meantime:(24+27+30)/3=27
30
Let'stheseprocessescomeinthisorder:P2,P3,P1.
P2
0
P3
3
P1
6
Responsetime:P1=30;P2=3;P3=6
Meantime:(30+3+6)/3=13
Betterthantheprecedentcase
Scheduleshortprocessesbefore
30
Shortest-Job-First (SJF)
Associatewitheachprocessitsexecutiontime
Twopossibilities:
NonpreemptiveWhenaCPUisallocatedtoa
process,itcannotbepreempted
Preemptiveifanewprocesscomeswitha
shorterexecutiontimethantherunningone,this
lastprocessispreempted
(ShortestRemainingTimeFirstSRTF)
SJFisoptimal/meanresponsetime
SJF(nonpreemptive)
P1
0
P3
7
P2
8
P4
12
16
Meanresponsetime=(7+8+12+16)/4=10,75
SJF(preemptive)
P1
0
P2
P3
P2
P4
P1
11
Meanresponsetime=(16+7+5+11)/4=8,25
16
EfficiencyandmeanresponseworsethanSJF
P1
0
P2
20
P3
37
P4
57
P1
77
P3
97
117
P4
P1
121 134
P3
P3
154 162
Thesetofreadyprocessestoobigtofitin
memory
Partoftheseprocessesareswappedouttodisk.
Thisincreasestheiractivationtime
Theelectedprocessisalwayschoosenfromthose
thatareinmemory
Inparallel,anotherschedulingalgorithmisused
tomanagethemigrationofreadyprocess
betweendiskandmemory
Swap out
admitted
blocked
ready disk
new
swap in
swap
out
End I/O...
running
ready RAM
elected
interrupted
end
terminated
intfork(void);
Createsanewprocessthatisanexactcopyofthecurrentone
ReturnstheprocessIDofthenewprocessintheparent
Returns0inchild
intwaitpid(intpid,...);
pidtheprocesstowaitfor,or1forany
Returnspidofresumingprocessor1onerror
Hierarchyofprocesses
runthepstreepcommand
voidexit(intstatus);
Currentprocessstops
status:returnedtowaitpid(shifted)
Byconvention,statusof0issuccess
intkill(intpid,intsig);
Sendssignalsigtoprocesspid
SIGTERMmostcommonvalue,killsprocessbydefault(but
applicationcancatchitforcleanup)
SIGKILLstronger,killsprocessalways
Whenaparentprocessterminatesbeforeitschild,2options:
Cascadingtermination(VMS)
Reparenttheorphan(UNIX)
intexecve(constchar*prog,constchar**argv,char
**envp;)
progfullpathnameofprogramtorun
argvargumentvectorthatgetspassedtomain
envpenvironmentvariables,e.g.,PATH,HOME
Generallycalledthroughawrapperfunctions
intexecvp(char*prog,char**argv);
SearchPATHforprog,usecurrentenvironment
TheforksystemcallcreatesacopyofthePCB
Openedfilesandmemorymappedfilesarethussimilar
Openfilesarethusopenedbybothfatherandchild.They
shouldbothclosethefiles.
Thepagesofmanyreadonlymemorysegmentsareshared
(text,r/odata)
Manyothersarelazilycopied(copyonwrite)
Theexecsystemcallreplacestheaddressspace,the
registers,theprogramcounterbythoseoftheprogramto
exec.
Butopenedfilesareinherited
Why fork
Mostcallstoforkfollowedbyexecvp
Realwinissimplicityofinterface
Tonsofthingsyoumightwanttodotochild
Forkrequiresnoargumentsatall
Withoutfork,requiretonsofdifferentoptions
Example:WindowsCreateProcesssystemcall
Bool CreateProcess(
LPCTSTR IpApplicationName, //pointer to a name to executable module
LPTSTR IpCommandLine, // pointer to a command line string
LPSECURITYATTRIBUTES lpProcessAttributes, //process security attr
LPSECURITYATTRIBUTES lpThreadAttributes, // thread security attr
BOOL bInheritHandles, //creation flag
DWORD dwCreationFlags, // creation flags
LPVOID IpEnvironnement, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to crrent directory name
LPSTARTUPINFO lpStartupInfo, //pointer to STARTUPINFO
LPPROCESSINFORMATION lpProcessInformaton // pointer to PROCESSINFORMATION );
Fork example
Processcreation
Donebycloninganexistingprocess
Duplicatetheprocess
Fork()systemcall
Return0tothechildprocess
Returnthechild'spidtothefather
Return1iferror
#include <unistd.h>
pid_t fork(void);
r = fork();
if (r==-1) /* error */
else if (r==0) /* child's code */
else
/* father's code */
Fork example
Howmanyprocessesarecreated?
fork();
fork();
fork();
Whatarethepossibledifferenttraces?
int i = 0;
switch((j=fork()) {
case -1 : perror(fork); break;
case 0 : i++; printf(child I :%d,i); break;
default : printf(father I :%d,i);
}
Exec example
Reminder:mainfunctiondefinition
intmain(intargc,char*argv[]);
Execvpcall
Replacestheprocess'smemoryimage
intexecvp(constchar*file,constchar*argv[]);
file:filenametoload
argv:processparameters
execvpcallsmain(argc,argv)intheprocessto
launch
Exec example
char*argv[3];
argv[0]=ls;
argv[1]=al;
argv[2]=0;
execvp(ls,argv);
Father/child synchronization
Thefatherprocesswaitsforthecompletionof
oneofitschild
pid_twait(int*status):
Thefatherwaitsforthecompletionofoneofits
child
pid_t:deadchild'spidor1ifnochild
status:informationonthechild'sdeath
pid_twaitpid(pid_tpid,int*status,intoption);
Waitforaspecificchild'sdeath
Option:nonblockingseeman
Wait example
#include <sys/types.h>
#include <sys/wait.h>
main(){
int spid, status;
switch(spid = fork()){
case -1 : perror(); exit(-1);
case 0 : // child's code
break;
default : // the father wait for this child's terminaison
if (waitpid(spid,&status,0)==-1) {perror();exit(-1);}
}
}
Example: minishell
#include <stdio.h>
#include <stdlib.h>
pid_t pid;
char *av[2];
char cmd[20];
void doexec() {
if (execvp(av[0],av)==-1)
perror ("execvp failed");
exit(0);
}
intmain(){
for(;;){
printf(">");
scanf("%s",cmd);
av[0]=cmd;
av[1]=NULL;
switch(pid=fork()){
case1:perror("fork");break;
case0:
doexec();
default:
if(waitpid(pid,NULL,0)==1)
perror("waitpidfailed");
}
}
}
I/O redirection
Afileisaddressedthroughadescriptor
0,1et2correspondtostandardinput,standardoutput,and
standarderror
Thefiledescriptornumberisreturnedbytheopensystem
call
Basicoperation
intopen(constchar*pathname,intflags);
O_RDONLY,O_WRONLY,O_RDWR
intcreat(constchar*pathname,mode_tmode);
intclose(intfd)
ssize_tread(intfd,void*buf,size_tcount);
ssize_twrite(intfd,void*buf,size_tcount);
I/O redirection
Descriptorduplication
dup(intoldfd);dup2(intoldfd,intnewfd);
UsedtoredirectstandardI/O
#include <stdio.h>
#include <unistd.h>
int f;
/* redirect std input */
dup2(f,STDIN_FILENO);
close(f);
Independentprocesscannotaffectorbeaffectedbythe
executionofanotherprocess
Cooperatingprocesscanaffectorbeaffectedbythe
executionofanotherprocess.Advantages:
Informationsharing
Computationspeedup
Modularity
Convenience
Process Interaction
Howcanprocessesinteractinrealtime?
Throughfilesbutitsnotreallyrealtime.
Throughasynchronoussignalsoralerts
Bysharingaregionofphysicalmemory
Bypassingmessagesthroughthekernel/network
Process A
Process A
shared
Process B
2
kernel
Process B
kernel
1
2
Pipe
Communicationmechanismbetweenprocesses
Fifostructure
Limitedcapacity
Producer/consumersynchronization
0
pipe
intpipe(intfds[2]);
Returnstwofiledescriptorsinfds[0]andfds[1]
Writestofds[1]willbereadonfds[0]
Returns0onsuccess,1onerror
Operationsonpipes
read/write/closeaswithfiles
Whenfds[1]closed,read(fds[0])returns0bytes(EOF)
Whenfds[0]closed,write(fds[1]):killprocesswithSIGPIPE
Pipe example
voiddoexec(void){
child
intpipefds[2];
pipe(pipefds);
1
switch(fork()){
case1:perror("fork");exit(1);
case0:
dup2(pipefds[1],1);
close(pipefds[0]);close(pipefds[1]);
execvp(...);
break;
default:
dup2(pipefds[0],0);
close(pipefds[0]);close(pipefds[1]);
break;
}
/*...*/
}
father
0
pipe
AprocessmaysendaSIGSTOP,SIGTERM,SIGKILL
signaltosuspend(CTRLZ),terminateorkillaprocess
usingthekillfunction:
intkill(intpid,intsig);
Alotofsignalsseemanpages
Somesignalscannotbeblocked(SIGSTOPandSIGKILL)
Uponreceptionofasignal,agivenhandleriscalled.
Thishandlercanbeobtainedandmodifiedusingthe
signalfunction:
typedefvoid(*sighandler_t)(int);//handler
sighandler_tsignal(intsignum,sighandler_thandler);//set
ahandler
Signal example
void handler(int signal_num) {
printf("Signal %d => ", signal_num);
switch (signal_num) {
case SIGTSTP:
printf("pause\n");
break;
case SIGINT:
case SIGTERM:
printf("End of the program\n");
exit(0);
break;
}
}
int main(void) {
signal(SIGTSTP, handler);
/* if control-Z */
signal(SIGINT, handler);
/* if control-C */
signal(SIGTERM, handler);
/* if kill process */
while (1) {
sleep(1);
printf(".\n");
}
printf("end");
exit(0);
}
Signalhandlingisvulnerabletoraceconditions:anothersignal(evenofthe
sametype)canbedeliveredtotheprocessduringexecutionofthesignal
handlingroutine.
Thesigprocmask()callcanbeusedtoblockandunblockdeliveryofsignals.
Aprocesscancreate/useasharedmemorysegmentusing:
intshmget(key_tkey,size_tsize,intshmflg);
Thereturnedvalueidentifiesthesegmentandiscalledtheshmid
Thekeyisusedsothatprocessindeedgetthesamesegment.
Theownerofasharedmemorysegmentcancontrolaccessrights
withshmctl()
Oncecreated,asharedsegmentshouldbeattachedtoaprocess
addressspaceusing
void*shmat(intshmid,constvoid*shmaddr,intshmflg);
Itcanbedetachedusingintshmdt(constvoid*shmaddr);
Canalsobedonewiththemmapfunction
Example
int shmid;
void *shm;
key_t key = 1234;
/* Get the segment */
if ((shmid = shmget(key, 10, 0666))< 0) {
perror("shmget failed");
exit(1);
}
/* Attach the segment */
if ((shm = shmat(shmid, NULL, 0)) == (void *) -1) {
perror("shmat failed");
exit(1);
}
Message queue
Creationofamessagequeue
Controlofthemessagequeue
intmsgsnd(intmsqid,constvoid*msgp,size_tmsgsz,intmsgflg);
Receptionofamessage
intmsgctl(intmsqid,intcmd,structmsqid_ds*buf);
Emissionofamessage
intmsgget(key_tkey,intmsgflg);
intmsgrcv(intmsqid,void*msgp,size_tmsgsz,longmsgtyp,int
msgflg);
Example
int msgid;
key_t key = 1234;
char buffer[1024];
struct msgbuff msg;
/* get the queue */
if ((msgid = msgget(key, 0666)) < 0) {
perror("msgget failedt");
exit(1);
}
/* receive a message */
if ((msgrcv(msgid, (void *)&msg,
1024,0,0)) == -1) {
perror("msgsnd failed");
exit(1);
}
strcpy(buffer, msg.mtext);
Socket
Asocketisdefinedasanendpointforcommunication
Usedforremotecommunication
BasicmessagepassingAPI
IdentifiedbyanIPaddressandport
Thesocket161.25.19.8:1625referstoport1625onhost
161.25.19.8
Communicationbetweenapairofsocketsand
bidirectionnal
=>secondpartofTeachingUnit(networking)
Process
Unixprocess:heavy
Context:largedatastructure(includesanaddress
space)
Protectedaddressspace
Addressspacenotaccessiblefromanotherprocess
Sharing/communication
Atcreationtime(fork)
Viasharedmemorysegments
Viamessages(queues,sockets)
Communicationiscostly
Threads
Lightweightprocess
Asharedcontext:addressspace,openfiles
Aprivatecontext:stack,registers
Fastercommunicationwithinthesameaddressspace
Lightweightcontext
Messageexchange,sharedmemeory,synchronization
Usefulforconcurrent/parallelapplications
Easier
Moreefficient
Multicoreprocessors
Single-threaded vs multi-threaded
processes
A.Sylberschatz
User-level Threads
Implementedinauserlevellibrary
UnmodifiedKernel
Threadsandthreadschedulerruninthesameuserprocess
th1
Examples:POSIXPthreads,MachCthreads,Solaristhreads
th2
th1
th2
th1
Thread manager
Thread manager
Process B
Process A
Noyau
Parallelism()
Efficiency(+)
Norealparallelismbetweenthethreadswithinaprocess
Quickcontextswitch
Blockingsystemcall()
Theprocessisblockedinthekernel
Allthreadareblockeduntilthesystemcall(I/O)is
terminated
Threadmanagedbythekernel
Threadcreationasasystemcall
Whenathreadisblocked,theprocessorisallocatedtoanother
threadbythekernel
th1
Processus A
Examples:WindowsNT/2000,Solaris,Tru64UNIX,Linux
th2
th1
th1
th2
Processus B
Thread manager
Kernel
Blockingsystemcall(+)
RealParallelism(+)
WhenathreadisblockedduetoanSVCcall,threadsinthe
sameprocessarenot
NthreadsinthesameprocesscanrunonKprocessors
(multicore)
Efficiency()
Moreexpensivecontextswitch/userlevelthreads
Everymanagementoperationgoesthroughtthekernel
Requiremorememory
intpthread_create(pthread_t*thread,constpthread_attr_t*attr,
void*(*start_routine)(void*),void*arg);
pthread_tpthread_self(void);
Waitsforcompletionofathread
intpthread_yield(void);
Terminatesthecurrentthread
intpthread_join(pthread_tthr,void**status);
Compare2threadids
voidpthread_exit(void*status);
Returnsidofthecurrentthread
intpthread_equal(pthread_tthr1,pthread_tthr2);
Createsathread
Relinquishtheprocessor
Pluslotsofsupportforsynchronization[nextlecture]
return 0;
Fork(), exec()
Whathappensifonethreadofaprogramcallsfork()?
Doesthenewprocessduplicateallthreads?Oris
thenewprocesssinglethreaded?
SomeUNIXsystemshavechosentohavetwo
versionsoffork()
Whathappensifonethreadofaprogramcallsexec()?
Generally,thenewprogramreplacetheentire
process,includingallthreads.
Pthreads
https://computing.llnl.gov/tutorials/pthreads/
OperatingSystemConcepts,8thEdition,
AbrahamSilberschatz,PeterB.Galvin,Greg
Gagne
http://osbook.com/
Chapters3,4&5
ModernOperatingSystems,AndrewTanenbaum
http://www.cs.vu.nl/~ast/books/mos2/
Chapter2(2.1&2.2)