Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
main() {
int i;
};
La lista de descriptores
Memoria
Texto
Datos globales
Texto: código ejecutable
Datos globales: inicializados y Heap
no inicializados
Heap: memoria dinámica
Stack de usuario: usado para
paso de parámetros en llamados
a funciones y variables locales
Stack usuario
Intel Task State Segment (TSS)
struct tss_struct {
unsigned short back_link,__blh;
unsigned long esp0;
unsigned short ss0,__ss0h;
unsigned long esp1;
unsigned short
unsigned long
ss1,__ss1h;
esp2;
EAX, ECX, EDX, EBX:
unsigned short
unsigned long
ss2,__ss2h;
__cr3;
registros propósito general
unsigned long
unsigned long
eip;
eflags; EFLAS: registros de status
unsigned long eax,ecx,edx,ebx;
unsigned long
unsigned long
esp;
ebp;
CS: Code segment
unsigned long
unsigned long
esi;
edi; DS: Data segment
unsigned short es, __esh;
unsigned short
unsigned short
cs, __csh;
ss, __ssh;
SS: Stack segment
unsigned short
unsigned short
ds, __dsh;
fs, __fsh; ES, FS, FS: otros Data segment
unsigned short gs, __gsh;
unsigned short ldt, __ldth;
unsigned short trace, bitmap;
unsigned long io_bitmap[IO_BITMAP_SIZE+1];
};
Proceso
Despachar
Entrar Termino
Nuevo No corriendo Corriendo Salir
Time-out
Evento Esperar
ocurre evento
Bloqueado
Modelo de 5 estados
Proceso A
Proceso B
Proceso C
Dispatcher
0 2 4 6 8 10 12 14 16 18
Uso de múltiples colas de espera
Despachar
Entrar Termino
Nuevo No corriendo Corriendo Salir
Time-out
Activar Evento
Esperar
ocurre
evento
Suspendido Bloqueado
Suspender
Modelo de estados con dos estados suspendidos
Bloqueado: proceso en
memoria principal y
esperando por un evento
Nuevo
Bloqueado/Suspendido: Suspender
Admitir Admitir
Suspender
por un evento Time-out
Evento Evento
para ejecución en
cuanto se cargue en
memoria principal
Cambio de contexto (process switch)
Código Estado
R Runnable (TASK RUNNING)
S Sleeping (TAKS INTERRUPTABLE)
D Sleeping (TASK UNINTERRUPTABLE)
T Stopped (TASK STOPPED).
Z Zombie (TASK ZOMBIE).
l Multi-thread
s Session leader
< Alta prioridad
N Baja prioridad
Creación de procesos en Unix
pid_t fork(void);
main()
{
int pid;
if ( (pid = fork()) == -1) {
printf("No se pudo crear hijo\n");
exit(-1);
}
if (pid == 0) { // soy el hijo
printf("Soy el hijo y mi pid = %d\n", getpid());
printf("Hijo: el pid de mi padre es = %d\n", getppid());
exit(0);
}
else { // soy el padre
printf("Soy el padre y mi pid = %d\n", getpid());
printf("Padre: el pid de mi hijo es %d\n", pid);
printf("Padre: el pid de mi padre es %d\n", getppid());
exit(0);
}
}
Ejemplo 2 de fork()
Identificadores
environ "HOME=/home/batman"
"PATH=/bin:/usr/bin"
"SHELL=/bin/bash"
"USER=batman"
"PWD=/home/batman/lab1"
NULL
Layout de un proceso Linux en memoria
$ cat /proc/self/maps
001c2000-001c3000 r-xp 001c2000 00:00 0 [vdso]
002b8000-002d1000 r-xp 00000000 08:01 66950 /lib/ld-2.5.so
002d1000-002d2000 r-xp 00019000 08:01 66950 /lib/ld-2.5.so
002d2000-002d3000 rwxp 0001a000 08:01 66950 /lib/ld-2.5.so
00c87000-00dc4000 r-xp 00000000 08:01 67366 /lib/i686/nosegneg/libc-2.5.so
00dc4000-00dc6000 r-xp 0013d000 08:01 67366 /lib/i686/nosegneg/libc-2.5.so
00dc6000-00dc7000 rwxp 0013f000 08:01 67366 /lib/i686/nosegneg/libc-2.5.so
00dc7000-00dca000 rwxp 00dc7000 00:00 0
08048000-0804d000 r-xp 00000000 08:01 7294713 /bin/cat
0804d000-0804e000 rw-p 00004000 08:01 7294713 /bin/cat
0987f000-098a0000 rw-p 0987f000 00:00 0
b7db6000-b7fb6000 r--p 00000000 08:01 7264522 /usr/lib/locale/locale-archive
b7fb6000-b7fb7000 rw-p b7fb6000 00:00 0
b7fcf000-b7fd0000 rw-p b7fcf000 00:00 0
bfaf8000-bfb0d000 rw-p bfaf8000 00:00 0 [stack]
$ size /bin/cat
text data bss dec hex filename
18431 1036 0 19467 4c0b /bin/cat
Familia exec()
int execve(const char *filename, char *const argv [], char *const
Para recordar:
”l” : lista uno a uno los argumentos
”v” : entrega un vector con los argumentos
”p” : usa el PATH definido en el medio ambiente del proceso para
encontrar el ejecutable
”e” : asigna un environment, es decir medio ambiente
Ejemplo de execve()
#include <sys/types.h>
#include <unistd.h>
main()
{
int pid;
if ( (pid = fork()) == -1) {
printf("No se pudo crear hijo\n");
exit(-1);
}
if (pid == 0) { // soy el hijo
if (execlp("ls", "ls", "/home/rannou", 0) == -1) {
printf("no se pudo hacer exec\n");
exit(-1);
}
printf("bye");
}
// soy el padre
wait(pid);
printf("mi hijo finalizo\n");
exit(0);
}