TABLE OF CONTENTS

Para escuchar mientras estudiás

https://www.youtube-nocookie.com/embed/videoseries?si=dc7uX9RA-yEDuJUN&list=PL3-JwdAGpAsZj84ppJSXGIC8A-Y7mVsL2

Práctica 1: Procesos y API del SO

practica1.pdf

Ejercicio 1

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)]

Ejercicio 2

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;
}

Ejercicio 4

Untitled

Ejercicio 5

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);
}

Ejercicio 8

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.

Ejercicio 9

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;
}