TABLE OF CONTENTS
Para escuchar mientras estudiás
https://www.youtube-nocookie.com/embed/videoseries?si=dc7uX9RA-yEDuJUN&list=PL3-JwdAGpAsZj84ppJSXGIC8A-Y7mVsL2
Q: ¿Cuáles son los pasos que deben llevarse a cabo para realizar un cambio de contexto?
A: Primero se guarda el estado del proceso a desalojar en su PCB y luego se restaura el estado del proceso que reanudará su ejecución [3.2.3 Context Switch (Silberschatz)]
void Ke_context_switch(PCB* pcb_0, PCB* pcb_1) {
pcb_0.STAT = KE_READY;
pcb_0.R0 = r0;
pcb_0.R1 = r1;
...
pcb_0.R15 = r15;
pcb_0.CPU_TIME += ke_current_user_time();
ke_reset_current_user_time();
ret();
set_current_process(pcb_1.P_ID);
r0 = pcb_1.R0;
r1 = pcb_1.R1;
...
r15 = pcb_1.R15;
return;
}
void main() {
printf("Soy Abraham!\\n");
pid = fork();
if (pid == 0) {
soyHomero();
} else {
wait_for_child(pid);
}
exit(0);
}
void soyHomero() {
printf("Soy Homero\\n");
bart = fork();
if (bart == 0) {
printf("Soy Bart\\n");
exit(0);
}
wait_for_child(bart);
lisa = fork();
if (lisa == 0) {
printf("Soy Lisa\\n");
exit(0);
}
wait_for_child(lisa);
maggie = fork();
if (maggie == 0) {
printf("Soy Maggie\\n");
exit(0);
}
wait_for_child(maggie);
exit(0);
}
Q: ¿Qué esta pasando con dato
?
A: El proceso padre tendrá la variable dato=0
, ya que solo se modifica si pid==0
. El proceso hijo modificará la variable dato y tendrá la variable dato=3
.
void handler() {
printf("pong %d\\n", getpid());
}
void rutina_hijo() {
signal(1, handler)
while(1){}
}
int main() {
bool seguir = true;
pid_t hijo = fork();
if(hijo==0){
rutina_hijo();
}
while(seguir){
for(int i=0;i<3;i++){
printf("ping %\\n", getpid());
sleep(1);
kill(1,hijo)
}
//Se pregunta si desea continuar o terminar la ejecución
seguir = scanf();
}
kill(9,hijo);
return 0;
}