procesos - Inicio - Universidad Pontificia Bolivariana

Anuncio
PROCESOS
Sistemas Distribuidos
Alvaro Ospina Sanjuan
Universidad Pontificia Bolivariana
Medellín 2010
Proceso

Abstracción de un programa en ejecución

Consiste en los siguientes elementos:

Contexto del programa (status del programa)

Directorio de trabajo

Archivos y directorios
derecho el programa

Credenciales o derechos de acceso del programa

Cantidad de memoria y otros recursos del sistema
asignados
sobre
los
cuales
tiene
Proceso

Abstracción de un programa en ejecución

Entidad activa

Actividad de la CPU


Sistemas procesamiento por lotes

Sistemas tiempo compartido

Sistemas monousuario
Conformado por:

Código del programa

Pila

Datos
jobs
tasks
program
Estados de un Proceso
1
EN
EJECUCI
ÓN
BLOQUEA
DO
4
3
2
1. Se bloquea en espera de datos
2. Los datos están disponibles
3. Se asigna a la CPU por el fijador del kernel
4. Se le quita la CPU
LISTO
Implantación

Tabla de procesos: Observarla en linux con
“??”

Demonios: Procesos creados por el SO para ejecución permanente.
En linux terminan en “d”
Atributos de un proceso:
• Todos los procesos tiene un PID o Process ID, porque?

• El PID es único
• Todo los procesos tiene un proceso padre que es el proceso
que lo inició
– Excepto el proceso 0 el cual es iniciado por el kernel
– Init es el proceso 1 , PPID es 0
– Pid y ppid son numeros mayores e iguales a 0.
Llamadas para Procesos en C
(linux)

pid_t fork(void): Crea un proceso, donde el hijo es copia
exacta del padre. La función retorna al proceso hijo “0” y
al proceso padre el pid del hijo.

int execv(const char *path, char * argv[]): Reemplaza
la imagen de un proceso.

pid_t wait( int * stat_loc): Suspende al padre hasta que
llegue el hijo o una señal.

void _exit( int *status): Termina el proceso y lo envía
donde el padre.
Ejercicios de procesos

Ejercicio 1

Ejercicio 2

Ejercicio 3

Ejercicio 4
Ejercicio 1
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void){
printf("\nSoy el proceso: %d\n", getpid());
printf("Mi proceso padre es: %d\n", getppid());
printf("Y mi propietario es: %d\n\n", getuid());
_exit(0);
}
Ejercicio 2
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main (void){
pid_t childpid;
int status;
childpid = fork();
if (childpid == -1) {
perror("Ha fallado el fork");
_exit(1);
} else if (childpid == 0)
fprintf(stderr,"Soy el hijo con pid = %d y mi papa es %d\n", getpid(),getppid());
else if (wait(&status) != childpid)
fprintf(stderr, "Algo sacó al padre del wait\n");
else
fprintf(stderr, "Soy el padre con pid = %d y el pid del hijo es = %d\n",getpid(), childpid);
_exit(0);
}
Ejercicio 3
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
pid_t childpid;
int status;
if ((childpid = fork()) == -1) {
perror("Error en el fork");
_exit(1);
} else if (childpid == 0) {
/* código del hijo */
if (execl("/bin/ls", "ls", NULL) < 0) {
perror("Ha fallado la ejecución de ls");
_exit(1);
}
} else wait(&status); /* código del padre */
_exit(0);
}
Ejercicio 4
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
int main (void){
pid_t childpid;
int status;
if ((childpid = fork()) == -1) {
perror("Ha fallado fork");
_exit(1);
} else if (childpid == 0){
fprintf(stderr, "Soy el hijo con pid = %d\n", getpid()); sleep(5);
} else{
sleep(3);
fprintf(stderr, "Soy el padre con pid = %d y mi hijo tiene el pid = %d\n",getpid(), childpid);
wait(&status);
}
_exit(0);
}
Descargar