Logo Studenta

UAH _Universidad de Alcalá de Henares_ _ Grado en Ingeniería Informática _ Ejercicios Sistemas Operativos _ Ejercicios

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

Ejercicios Examen Años Pasados/4_32755387694317668.rar 
Sistemas Operativos/ssoo/tema 3 ssoo/ApuntesTema3.txt.Programa
- Un programa es un archivo con instrucciones que no se ejecutan en ese momento.
- El programa es una entidad estatica, se le asignan los recurso al programa en ejecucion.
.Desarrollo de un programa
- La "Depuracion" sirve para encontrar errores en tiempo de ejecucion.
	(Buscar en Wikipedia los depuradores y sus 4 fases)
.Fases de desarrollo
- Biblioteca: conjunto de archivos orientados a una funcion. (Funciones matematicas, etc.)
	(Bibliotecas estaticas las referencias se asignan en el enlazado.) Saber como concepto
	(Bibliotecas dinamicas se asignan en la carga o ejecucion.) Saber como concepto
- Hasta el momento de ejecucion de un programa se manejan direcciones simbolicas no fisicas.
.Fases de desarrollo en UNIX
- "gcc" para compilar (gcc programa.c -o programa para darle el nombre "programa")
- "gdb" para depurar
- $ gdb "nombre ejecutable" (Sin comillas)
- Pasos del gcc:
	1º cpp -> Preprocesamiento
	2º comp -> Compilacion y optimizacion
	3º as -> Generacion de codigo objeto
	4º ld -> Enlace
- 1º fase: Coge directivas de los modulos, (Las que empiezan por '#' en el codigo), como "#include <stdio.h>".
Se ponen los "< >" cuando la libreria esta en la carpeta por defecto. Para coger el que yo quiera #include "asd.h" entre comillas.
Eso lo buscara en el directorio de trabajo y como segunda opcion en el directorio por defecto.
Para saber donde estan los archivos de cabecera de funciones como "printf" o "fork" hay que poner:
	man 3 printf
	man 2 fork
Con el numero especificas donde buscar el archivo dentro del man
- 2º fase: (gcc -E para parar en esta fase)
- 3º fase: (gcc -S para parar en esta fase) Es mas frecuente usarlo para saber que pasa a bajo nivel. (Ensamblador)
- 4º fase: (gcc -c para parar en esta fase)
- "-Wall" para sacar WARNINGS
	Ejemplo: gcc programa.c -Wall -o minishell
		(Esto compila el codigo en programa.c lo llama minishell y saca los WARNINGS)
- "-g" Si usamos el depurador despues debemos de meter el -g.
	(Introduce simbolos que necesita el depurador mas tarde)
- Si se para la compilacion en un punto luego se puede compilar desde ahi
	EJEMPLO: gcc programa.i -o minishell
- "-L" Buscar en el directorio que se indica
	EJEMPLO: gcc programa.c -Wall -L./ -ln -o minishell
- Se pueden mezclar en una compilacion varios archivos compilados a medias, detenidos endistintas fases.
	EJEMPLO: gcc archivo1.i archivo2.o archivo3.s -o archivo
.Formato de un ejecutable
- Numero magico: Identificador que permite determinar si el archivo es ejecutable
- CP(Contador de programa) inicial
- Tabla de secciones: informacion para poder ejecutar el resto del ejecutable
- En un ejecutable NO almacenamos las variables locales, ya que estas se crean dinamicamente (sus direcciones), en la PILA.
.Proceso
	...
.PCB(Bloque de control de procesos)
- Es una estructura de informacion de procesos.
- Contine todo lo que tiene que saber el SO sobre los procesos.
- En Linux el PCB se llama "task_struct".
- Una de las cosas que se guarda en el PCB es la informacion de un proceso cuando se rompe con una interrupcion para retomarlo cuando termine la rutina de la interrupcion.
.Diagrama de estados de un proceso en Linux
- Ejecucion: (TASK_RUNNING) (El "listo" que aparece aqui no es el mismo que hemos visto antes)
- Parado: (TASK_STOPPED) Esta asi cuando esta detenido por una señal(interrupcion software).
- Zombie: (TASK_ZOMBI) Esta asi cuando, cuando ha finalizado, a devuelto todos los recursos, etc. PERO! no se ha eliminado su PCB. El proceso padre es el que se encarga de eliminar el PCB.
	Los procesos ZOMBI hay que evitar tenerlos porque solo ocupan memoria.
- Espera: (TASK_UNINTERRUMPIBLE) Espera por un evento o recurso pero no despierta por ninguna señal.
- Listo: (TASK_INTERRUMPIBLE) Espera por un recurso, etc.
.Espacio de direccionamiento virtual de un proceso
- El SO se encarga de dar la sensacion de que la RAM disponible es mayor. Consigue esto gracias a uso del disco duro.
- Se ejecuta en la memoria RAM solo lo necesario en cuanto a procesos en ese momento, en vez de ejecutar toda la aplicacion en la memoria.
- La MMU traduce direcciones virtuales a fisicas.
.Ejecutable y Mapa de memoria de un proceso
- La pila se asocia al proceso en ejecucion no al ejecutable.
- Heap reserva memoria dinamica. Es memoria que se reserva para los "new" en Java por ejemplo.
- Objeto de memoria es una region de memoria en unejecutable.
- La informacion sobre la memoria que se reserva se extrae del ejecutable. En concreto del objeto de memoria correspondiente.
- La pila no tiene soporte es decir no se crea a partir de algo del ejecutable, depende del sistema.
- Tamaño de las regiones: pueden tener tamaño variable como "heap" y la "pila" o tamaño fijo.
- Se pueden compartir regiones de codigo.
	Ejemplo: dos usuarios de linux usando "vi" a la vez, solo hay una copia del codigo.
.Mapa de memoria de un proceso en UNIX
- Se crea el mapa de memoria mediante fork() y exe().
- fork() crea el proceso.
- exe() ejecuta el proceso.
- Mapa de memoria NO es memoria fisica. Lo crea el SO y lo lleva a memoria segun estan siendo inciciado.
- Contexto de usuario, todas las estructuras axecibles por el usuario y el SO en modo usuario.
- Contexto del nucleo, todas las extructuras axecibles por el nucleo del SO en modo supervisor.
 					
					
				SMILEIS TIME!
		| Contexto de usuario			Contexto nucleo |
----------------|-----------------------------|----------------------------|
Modo supervisor | :) | :) |
----------------|-----------------------------|----------------------------|
Modo usuario 	|	:)		 |		 D: |
----------------|-----------------------------|----------------------------|
- En el contexto de nucleo se encuentran las PCB.
.Mapa de memoria de un proceso en Linux
- En "Sistema(1Gb)" se ecnuentras las PCB
- ESTO NO ES FISICO, EL MAPA DE MEMORIA ES VIRTUAL.
.Servicios POSIX para gestion de procesos
- El servicio POSIX para obtener el identificador de un proceso es getpid()
.Sincronizacion de la ejecucion de un proceso o hilo
- Habra conflicto de sincronizacion cuando los procesos son cooperantes, es decir, dependen unos de otros.
- Como los procesos dependen de otros, un proceso va a depender de la salida de otro.
	(Se habla de procesos pero pueden ser hilos)
- En las soluciones a estos conflictos esta "Productor-Consumidor": Hay un productor que crea informacion y un consumidor que modifica la informacion creada por el productor.
	El "pipe" es un ejemplo de esto. Si la tuberia esta llena el productor no puede dar informacion. Si la tuberia esta vacia el consumidor no puede consumir.
	Por lo que se debe producir antes de consumir.
- Cuando dos procesos o hilos quieren actualizar una misma variable (compartidda) se produce conflictos luego hay que tomar medidas.
- Condicion de carrera: Dos procesos quieren hacer "a++" (modificar la variable), a bajo nivel esto es: - load R0, a
													- add R0, 1
													- store a, R0
	Suponemos que el P1 carga la variable 'a' en R0, hay una interrupcion por el otro proceso, R0 de P1 es 1 (a=1).
	El P2 cumple su funcion sin interrupcion entonces carga 'a' en R0 le suma 1 y la guarda, por lo que a = 2.
	El P1 recupera la ejecucion con R0 = 1 ya cargado, le suma 1 y lo guarda en 'a' como a = 2.
	En este caso la salida no era la esperada (a = 3), por lo que necesitamos un sistema que detenga un proceso hasta que acabe otro.
.Mecanismo de sincronizacion con semaforos
- Solo pueden hacer tres funciones: Inicializacion, Operacion P y Operacion V.
- Operacion P:	Si el semaforo es positivo se decrementa en uno y continua.
	 	Si el semaforo esta a 0, el proceso se bloquea en una lista de espera.	
- Operacion V:	Si el semaforo no tiene procesos
bloqueados se incremente una unidad.
		Si el semaforo tiene procesos bloqueados, despertara al primero que este en esa cola.
- Los mecanismos de sincronizacion deben de ser atomicos, el incremente y decremento del 'P' y 'V' se implementa con servicios atomicos en bajo nivel.
.Solucion consemaforos
(Seccion critica)
- P inicialmente esta a 1. Porque entra el primero pone P a 0 y el otro se encontrara P a 0 y quedara bloqueado.
- Hasta que el primero hace V suponiendo que P2 intenta entrar a la vez se bloquea y V lo desbloqueara. Si no V pondra el semaforo a 1 para que el siguiente proceso tenga P a 1.
(Productor-Consumidor)
- S1 debara ser 0. Asi si el proceso consumidor intenta ejecutarse no podra porque sera P(0). Si el consumidor no intenta entrar durante la ejecucion V pondra S1 a 1 y podra entrar P mas tarde.
.Ejemplo 1
- El hijo es una clonacion del padre por lo que las 'a' son distintas. Si ponemos dos printf despues no sabemos cual se ejecutara primero, solo sabemos que se ejecutara 3 y 4 o 4 y 3.
.Ejemplo 2
- Si el hijo se queda huerfano el init lo adopta y lo cierra por lo que nunca se quedaria zombi.
.Ejemplo 3
- Crea una estructura lineal O-O-O-O-O-O 
.Ejemplo 4
- Crea una estructura a lo ancho |-O
				 O-|-O
				 |-O
Sistemas Operativos/ssoo/tema 3 ssoo/EjercicioMayo2010.pdf
Sistemas Operativos Mayo 2010
Ejercicio de Sistemas Operativos
Parte Práctica
Problema 2
Responda a las siguientes preguntas relativas a los procesos y al API de llamadas al sistema
POSIX relacionadas con procesos.
1. Dado el siguiente programa:
10 #include <stdlib.h>
11 #include <stdio.h>
12
13 int total;
14
15 int calcula(int i) {
16 if (i <= 2) {
17 total = total - (i*100);
18 }
19 }
20
21 int main() {
22 int i ;
23 int pid;
24
25 total =0;
26
27 for (i=0; i < 6 ; i++) {
28 pid=fork ();
29 if (pid ==0) {
30 calcula(i);
31 sleep (1000);
32 }
33 }
34 sleep (10);
35 printf ("El�total�es� %d�\n",total );
36 }
Asumiendo que el tiempo que tarda cada proceso en ejecutar su código es prácticamente
despreciable, ¿se puede precisar qué valor mostraŕıa el mensaje en la ĺınea 35 en el instante
aproximado t = 10? ¿En qué instantes de tiempo aproximadamente finalizaŕıan cada uno
de los procesos presentes en el ejercicio? Razone la respuesta.
2. Considere ahora el siguiente programa:
10 #include <stdlib.h>
11 #include <stdio.h>
12 #include <unistd.h>
13
14 int main() {
15 int i ;
16 int pid;
17
18 for (i=0; i < 6 ; i++) {
19 pid=fork ();
20 if (pid ==0) {
21 execl("/bin/ps","ps","-o","pid ,ppid ,comm",(char *)0);
22 }
23 }
24 sleep (5);
25 printf("Fin�del�proceso� %i�\n",pid);
26 }
La ejecución de la orden ps -o pid,ppid,comm de la ĺınea 21 muestra por pantalla un
listado de todos los procesos lanzados por el usuario correspondiente. Dicho listado es una
tabla con tres columnas indicando el PID, PPID y COMMAND1 de cada uno de los procesos.
Sabiendo que se utiliza una shell bash para ejecutar el programa, que el PID de esa shell
es 7463, que los PID en este sistema se asignan de forma correlativa, que el primer PID
disponible es el 19602, y que no hay nadie más en el sistema creando procesos, ¿cuál seŕıa
la salida por pantalla del programa? Razone la respuesta.
Nota: Recuerde que en UNIX, tal y como está planteado el programa, los posibles procesos
hijo creados no terminarán hasta que no lo haga su padre.
1
COMMAND es el nombre del archivo que contiene el código a ejecutar
6
Sistemas Operativos/ssoo/tema 3 ssoo/EjercicioMayo2012.pdf
Sistemas Operativos Mayo 2012
Ejercicio de Sistemas Operativos
Parte Práctica
Ejercicios sobre procesos en Unix
En cierto sistema similar a UNIX, se ejecutan varias órdenes generando el resultado mostrado
a continuación:
user@host$ cat -n procesos.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6
7
8 int main () {
9 printf ("A => pid= %d - ppid= %d\n", getpid(), getppid ());
10 if (fork () !=0) {
11 sleep (1);
12 if (fork() !=0) {
13 wait (NULL);
14 wait (NULL);
15 printf ("B => pid= %d - ppid= %d\n", getpid(), getppid ());
16 exit (0);
17 } else {
18 sleep (2);
19 if (fork () ==0) {
20 wait (NULL);
21 sleep (8);
22 printf ("C => pid= %d - ppid= %d\n", getpid(), getppid ());
23 exit (0);
24 } else {
25 sleep (4);
26 printf ("D => pid= %d - ppid= %d\n", getpid(), getppid ());
27 exit (0);
28 }
29 }
30 } else {
31 wait (NULL);
32 sleep (16);
33 printf ("E => pid= %d - ppid= %d\n", getpid(), getppid ());
34 exit (0);
35 }
36 }
user@host$ gcc -Wall -o ejecutable procesos.c
user@host$ ./ ejecutable
A => pid =1000 - ppid =800
...
Teniendo en cuenta que la asignación de PIDs a los nuevos procesos se hace de forma se-
cuencial, que el tiempo de ejecución de las órdenes inmediatas es despreciable y que el primer
mensaje que muestra el programa nada más ejecutarse es el que aparece al final del listado
anterior, responda a las cuestiones siguientes:
1. Rellene la plantilla adjunta con el contenido de los mensajes que aparecen en pantalla. (5
puntos) RESPUESTA:
A ) pid = 1000� ppid = 800
B ) pid = 1000� ppid = 800
C ) pid = 1003� ppid = 1
D ) pid = 1002� ppid = 1000
E ) pid = 1001� ppid = 1000
7
Sistemas Operativos Mayo 2012
2. Rellene la plantilla adjunta con el instante de tiempo en que se muestran los mensajes por
pantalla. (5 puntos)
(10 puntos)
RESPUESTA:
Instante 0 ) Mensaje A
Instante 7 ) Mensaje D
Instante 11 ) Mensaje C
Instante 16 ) Mensaje E
Instante 16 ) Mensaje B
8
Sistemas Operativos/ssoo/tema 3 ssoo/examen_procesos_junio_2010.pdf
Sistemas Operativos Junio 2010
Ejercicio de Sistemas Operativos
Parte Práctica
Problema 1
Dado el siguiente programa:
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 int main()
6 {
7 int id1 , id2 , id3;
8
9 id1 = fork ();
10
11 if (id1 == 0)
12 {
13 sleep (4);
14 printf("Orden�1:� %d� %d\n", getpid(), getppid ());
15 exit (0);
16 }
17
18 else
19 {
20 id2 = fork ();
21 if ( id2 == 0)
22 {
23 id3 = fork ();
24 if (id3 == 0)
25 {
26 sleep (6);
27 printf("Orden�2:� %d� %d\n", getpid(), getppid ());
28 exit (0);
29 }
30 else
31 {
32 printf("Orden�3:� %d� %d\n", getpid(), getppid ());
33 sleep (10);
34 exit (0);
35 }
36 }
37 else
38 {
39 printf("Orden�4:� %d� %d\n", getpid(), getppid ());
40 exit (0);
41 }
42 }
43 }
Responda a las preguntas que a continuación se plantean relativas a su ejecución:
1. Represente un esquema de la jerarqúıa de procesos que se crea cuando se ejecuta el pro-
grama anterior. Indique la relación de parentesco entre procesos de la forma que se indica
en la figura 1, y especifique al lado de cada proceso la ĺınea de código cuya ejecución lo
crea.
Figura 2: Representación de la relación entre proceso padre y proceso hijo.
RESPUESTA:
2. Suponiendo que el PID de la shell que ejecuta el programa es 1967, que no se crean más
procesos que los implicados en la ejecución del programa del enunciado, que los PIDs en
9
Sistemas Operativos Junio 2010
!"#$%&
'()*&+& '()*&,&
'()*&-&
Línea 9 Línea 
20 
Línea 
23 
Figura 3: Jerarqúıa de procesos.
este sistema se asignan correlativamente, y que el primer PID disponible es 2890, indique
cuál seŕıa la salida por pantalla al ejecutarse el programa anterior2
RESPUESTA: Suponiendo que el tiempo de ejecución de las llamadas a fun-
ciones (excepto las invocaciones al servicio POSIX sleep()) es despreciable,
las ĺıneas que se obtendŕıan por pantalla seŕıan las siguientes:
Orden 4: 2890 1967
Orden 3: 2892 1
Orden 1: 2891 1
Orden 2: 2893 2892
3. Si añadiéramos en el código del programa una variable global i inicializada a 0 y susti-
tuyéramos cada ĺınea printf() por las ĺıneas siguientes:
i=i+1;
printf(‘‘Orden %d: %d %d’’, i, getpid(), getppid())
¿Qué valores de i saldŕıan en pantalla? Razone la respuesta.
RESPUESTA: Cada proceso que se crea tiene una copia propia del área de da-
tos globales del
proceso padre. Por lo tanto, el cambio realizado sólo originaŕıa
ĺıneas cuyo valor de i seŕıa siempre 1, que no es la secuencia que se generaŕıa
con la alternativa del código inicial
4. Se ha realizado independientemente un programa denominado MapaDeMemoria que se en-
carga de visualizar en pantalla el mapa de memoria actual del proceso que lo invoca. La
forma de ejecutar este programa es la siguiente:
$ MapaDeMemoria
Si el proceso que ejecuta la ĺınea 14 se tuviera que encargar, además, de ejecutar el pro-
grama MapaDeMemoria, ¿qué nuevas instrucciones habŕıa que añadir al código existente y
en qué lugar? Razone la respuesta.
RESPUESTA: Si tiene que ejecutar el nuevo programa, tenemos que utilizar
cualquier servicio POSIX de la familia exec, por ejemplo, execl. Además, se
2NOTAS:
En UNIX, si un proceso padre finaliza antes que sus procesos hijos, estos procesos son adoptados por el
proceso init ; a partir de ese instante, init es el nuevo proceso padre de estos procesos hijos.
Los servicios POSIX getpid() y getppid() devuelven el identificador del proceso, y el identificador del
proceso padre respectivamente.
10
Sistemas Operativos Junio 2010
debe invocar tras la ĺınea 14, porque después no se ejecutarán más sentencias
del código de este programa. Por lo tanto, en la ĺınea 15 se añadiŕıa lo siguiente:
execl("./MapaDeMemoria", "./MapaDeMemoria", NULL);
5. ¿Se podŕıa garantizar con el uso de las llamadas wait, exit, fork y exec que el orden de
aparición de las ĺıneas en pantalla fuera secuencial y ascendente (Orden1, Orden2, Orden3,
etc.)? Razone la respuesta y, en caso afirmativo, indique cómo.
RESPUESTA: Śı, ejecutando el proceso padre en la ĺınea 39, antes de la invocación a
printf():
wait(NULL);
wait(NULL);
De este modo, el proceso padre, que imprime Orden 4, espera a sus dos procesos hijos y,
además, para que el proceso creado al ejecutarse la ĺınea 20 esperase, a su vez, a su proceso
hijo, se añadiŕıa en la ĺınea 32, antes de la invocación a printf(), la siguiente ĺınea:
wait(NULL);
11
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/archivos_de_apoyo_ejercicio2.zip
ejecutar.h
pid_t ejecutar_orden(const char *orden, int *pbackgr);
void ejecutar_linea_ordenes(const char *orden);
__MACOSX/._ejecutar.h
entrada_minishell.c
#include "entrada_minishell.h"
void imprimir_prompt()
{
 printf("minishell> "); /* se imprime en pantalla una cadena sencilla que servirá de prompt: entrada de órdenes en la consola */
 fflush(stdout); /* vacía el buffer intermedio de salida y se envía el texto a la pantalla */
}
void eliminar_salto_linea(char *cad)
{
 int i, longitud;
 longitud=strlen(cad); /* cad es una cadena de caracteres con la orden leída.*/
 for(i=longitud-1; i>=0;i--) /* se busca el carácter de final de línea introducido por fgets y se sustituye por '\0' para indicar el final de orden */
 if (cad[i]=='\n') 
 {
 cad[i]=0;
 break;
 }
}
 
void leer_linea_ordenes(char *buf)
{
 
 memset(buf, 0, sizeof(buf));
 fgets(buf, BUFSIZ-1, stdin); /* fgets almacena la orden leída introduciendo también el carácter de fin de línea introducido */
 buf[BUFSIZ-1]=0; /* se almacena el carácter de fin de cadena al final de buf porque va a ser tratada por eliminar_salto_linea como cadena */
 eliminar_salto_linea(buf); 
}
__MACOSX/._entrada_minishell.c
internas.h
#ifndef INTERNAS_H
#define INTERNAS_H
struct tipointerna
{
 char *nombre;
 void (*func)(const char *);
};
int ord_interna(const char *);
#endif
libmemoria.c
#include "libmemoria.h"
#include "stdlib.h"
//#include "malloc.h"
void free_argumentos(char **args)
{
 int i=0;
 while(args[i])
 free(args[i++]);
 free(args);
}
__MACOSX/._libmemoria.c
libmemoria.h
void free_argumentos(char **args);
minishell.h
#ifndef MINISHELL_H
#define MINISHELL_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#endif
void imprimir_prompt();
void eliminar_salto_linea(char *cad);
void leer_linea_ordenes(char *buf);
__MACOSX/._minishell.h
parser.h
enum TEstado {
 INICIO_ARG, ARG
};
 
char ** parser_orden (const char *orden, int *indentrada, int *indsalida, int *background);
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/ejecutar.c#include "minishell.h"
#include "parser.h"
#include "ejecutar.h"
#include "libmemoria.h"
pid_t ejecutar_orden (const char *orden, int *pbackgr)
{
	char **args;
	pid_t pid;
	int indice_entrada=-1,indice_salida=-1;
	if ((args=parser_orden (orden,&indice_entrada,&indice_salida,pbackgr)==NULL)) 			{
			printf ("vacio");			
			return -1;
		}
	
	
	printf ("ejecutar");
	
printf ("ejecutar2");
	free_argumentos(args);
}
void ejecutar_linea_ordenes (const char *orden)
{
	pid_t pid;
	int backgr=0;
	pid=ejecutar_orden(orden,&backgr);
}
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/ejecutar.hpid_t ejecutar_orden(const char *orden, int *pbackgr);
void ejecutar_linea_ordenes(const char *orden);
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/entrada_minishell.c#include "entrada_minishell.h"
#include <stdio.h>
#include <string.h>
void imprimir_prompt()
{
 printf("minishell> "); /* se imprime en pantalla una cadena sencilla que servirá de prompt: entrada de órdenes en la consola */
 fflush(stdout); /* vacía el buffer intermedio de salida y se envía el texto a la pantalla */
}
void eliminar_salto_linea(char *cad)
{
 int i, longitud;
 longitud=strlen(cad); /* cad es una cadena de caracteres con la orden leída.*/
 for(i=longitud-1; i>=0;i--) /* se busca el carácter de final de línea introducido por fgets y se sustituye por '\0' para indicar el final de orden */
 if (cad[i]=='\n') 
 {
 cad[i]=0;
 break;
 }
}
 
void leer_linea_ordenes(char *buf)
{
 
 memset(buf, 0, sizeof(buf));
 fgets(buf, BUFSIZ-1, stdin); /* fgets almacena la orden leída introduciendo también el carácter de fin de línea introducido */
 buf[BUFSIZ-1]=0; /* se almacena el carácter de fin de cadena al final de buf porque va a ser tratada por eliminar_salto_linea como cadena */
 eliminar_salto_linea(buf); 
}
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/entrada_minishell.hvoid imprimir_prompt();
void eliminar_salto_linea(char *cad);
void leer_linea_ordenes(char *buf);
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/internas.h#ifndef INTERNAS_H
#define INTERNAS_H
struct tipointerna
{
 char *nombre;
 void (*func)(const char *);
};
int ord_interna(const char *);
#endif
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/libmemoria.c#include "libmemoria.h"
#include "stdlib.h"
#include "malloc.h"
void free_argumentos(char **args)
{
 int i=0;
 while(args[i])
 free(args[i++]);
 free(args);
}
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/libmemoria.h
void free_argumentos(char **args);
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/libshell.a
internas.o
parser.o
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/minishell.c#include "minishell.h"
#include "internas.h"
#include "ejecutar.h"
#include <string.h>
int main (int argc, char *argv[])
{
	char buf [BUFSIZ];
	while (1)
	{
		imprimir_prompt();
		leer_linea_ordenes(buf);
		printf ("%s \n",buf);
		if (strcmp(buf,"exit")==0) 
		{
			break;		
		}
		else
		{
			if (ord_interna(buf)!=1)
			{ 
				printf ("orden externa");
				ejecutar_linea_ordenes (buf);
			}
			
			printf ("minishell \n");
		}
	}
	return 0;
}
			
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/minishell.h#ifndef MINISHELL_H
#define MINISHELL_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include
<errno.h>
#include <unistd.h>
#include <string.h>
#endif
void imprimir_prompt();
void eliminar_salto_linea(char *cad);
void leer_linea_ordenes(char *buf);
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/minishell.zip
test
prueba
parser.h
enum TEstado {
 INICIO_ARG, ARG
};
 
char ** parser_orden (const char *orden, int *indentrada, int *indsalida, int *background);
minishell.h
#ifndef MINISHELL_H
#define MINISHELL_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#endif
void imprimir_prompt();
void eliminar_salto_linea(char *cad);
void leer_linea_ordenes(char *buf);
minishell.c
#include "minishell.h"
#include "internas.h"
#include "ejecutar.h"
#include <string.h>
int main (int argc, char *argv[])
{
	char buf [BUFSIZ];
	while (1)
	{
		imprimir_prompt();
		leer_linea_ordenes(buf);
		printf ("%s \n",buf);
		if (strcmp(buf,"exit")==0) 
		{
			break;		
		}
		else
		{
			if (ord_interna(buf)!=1)
			{ 
				printf ("orden externa");
				ejecutar_linea_ordenes (buf);
			}
			
			printf ("minishell \n");
		}
	}
	return 0;
}
			
libshell.a
internas.o
parser.o
libmemoria.h
void free_argumentos(char **args);
libmemoria.c
#include "libmemoria.h"
#include "stdlib.h"
#include "malloc.h"
void free_argumentos(char **args)
{
 int i=0;
 while(args[i])
 free(args[i++]);
 free(args);
}
internas.h
#ifndef INTERNAS_H
#define INTERNAS_H
struct tipointerna
{
 char *nombre;
 void (*func)(const char *);
};
int ord_interna(const char *);
#endif
entrada_minishell.h
void imprimir_prompt();
void eliminar_salto_linea(char *cad);
void leer_linea_ordenes(char *buf);
entrada_minishell.c
#include "entrada_minishell.h"
#include <stdio.h>
#include <string.h>
void imprimir_prompt()
{
 printf("minishell> "); /* se imprime en pantalla una cadena sencilla que servirá de prompt: entrada de órdenes en la consola */
 fflush(stdout); /* vacía el buffer intermedio de salida y se envía el texto a la pantalla */
}
void eliminar_salto_linea(char *cad)
{
 int i, longitud;
 longitud=strlen(cad); /* cad es una cadena de caracteres con la orden leída.*/
 for(i=longitud-1; i>=0;i--) /* se busca el carácter de final de línea introducido por fgets y se sustituye por '\0' para indicar el final de orden */
 if (cad[i]=='\n') 
 {
 cad[i]=0;
 break;
 }
}
 
void leer_linea_ordenes(char *buf)
{
 
 memset(buf, 0, sizeof(buf));
 fgets(buf, BUFSIZ-1, stdin); /* fgets almacena la orden leída introduciendo también el carácter de fin de línea introducido */
 buf[BUFSIZ-1]=0; /* se almacena el carácter de fin de cadena al final de buf porque va a ser tratada por eliminar_salto_linea como cadena */
 eliminar_salto_linea(buf); 
}
ejecutar.h
pid_t ejecutar_orden(const char *orden, int *pbackgr);
void ejecutar_linea_ordenes(const char *orden);
ejecutar.c
#include "minishell.h"
#include "parser.h"
#include "ejecutar.h"
#include "libmemoria.h"
pid_t ejecutar_orden (const char *orden, int *pbackgr)
{
	char **args;
	pid_t pid;
	int indice_entrada=-1,indice_salida=-1;
	if ((args=parser_orden (orden,&indice_entrada,&indice_salida,pbackgr)==NULL)) 			{
			printf ("vacio");			
			return -1;
		}
	
	
	printf ("ejecutar");
	
printf ("ejecutar2");
	free_argumentos(args);
}
void ejecutar_linea_ordenes (const char *orden)
{
	pid_t pid;
	int backgr=0;
	pid=ejecutar_orden(orden,&backgr);
}
archivos_de_apoyo_ejercicio2.zip
ejecutar.h
pid_t ejecutar_orden(const char *orden, int *pbackgr);
void ejecutar_linea_ordenes(const char *orden);
__MACOSX/._ejecutar.h
entrada_minishell.c
#include "entrada_minishell.h"
void imprimir_prompt()
{
 printf("minishell> "); /* se imprime en pantalla una cadena sencilla que servirá de prompt: entrada de órdenes en la consola */
 fflush(stdout); /* vacía el buffer intermedio de salida y se envía el texto a la pantalla */
}
void eliminar_salto_linea(char *cad)
{
 int i, longitud;
 longitud=strlen(cad); /* cad es una cadena de caracteres con la orden leída.*/
 for(i=longitud-1; i>=0;i--) /* se busca el carácter de final de línea introducido por fgets y se sustituye por '\0' para indicar el final de orden */
 if (cad[i]=='\n') 
 {
 cad[i]=0;
 break;
 }
}
 
void leer_linea_ordenes(char *buf)
{
 
 memset(buf, 0, sizeof(buf));
 fgets(buf, BUFSIZ-1, stdin); /* fgets almacena la orden leída introduciendo también el carácter de fin de línea introducido */
 buf[BUFSIZ-1]=0; /* se almacena el carácter de fin de cadena al final de buf porque va a ser tratada por eliminar_salto_linea como cadena */
 eliminar_salto_linea(buf); 
}
__MACOSX/._entrada_minishell.c
internas.h
#ifndef INTERNAS_H
#define INTERNAS_H
struct tipointerna
{
 char *nombre;
 void (*func)(const char *);
};
int ord_interna(const char *);
#endif
libmemoria.c
#include "libmemoria.h"
#include "stdlib.h"
//#include "malloc.h"
void free_argumentos(char **args)
{
 int i=0;
 while(args[i])
 free(args[i++]);
 free(args);
}
__MACOSX/._libmemoria.c
libmemoria.h
void free_argumentos(char **args);
minishell.h
#ifndef MINISHELL_H
#define MINISHELL_H
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#endif
void imprimir_prompt();
void eliminar_salto_linea(char *cad);
void leer_linea_ordenes(char *buf);
__MACOSX/._minishell.h
parser.h
enum TEstado {
 INICIO_ARG, ARG
};
 
char ** parser_orden (const char *orden, int *indentrada, int *indsalida, int *background);
__MACOSX/._ejecutar.h
__MACOSX/._entrada_minishell.c
__MACOSX/._libmemoria.c
__MACOSX/._minishell.h
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/parser.henum TEstado {
 INICIO_ARG, ARG
};
 
char ** parser_orden (const char *orden, int *indentrada, int *indsalida, int *background);
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/prueba
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/test
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/__MACOSX/._ejecutar.h
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/__MACOSX/._entrada_minishell.c
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/__MACOSX/._libmemoria.c
Sistemas Operativos/ssoo/tema 3 ssoo/minishell.1/__MACOSX/._minishell.h
Sistemas Operativos/ssoo/tema 3 ssoo/procesos.pdf
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Procesos e Hilos
Departamento de Automática
Universidad de Alcalá
Sistemas Operativos Procesos e Hilos 1 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Índice
1 Programa
Concepto de programa
Fases de desarrollo de un programa
Formato de un ejecutable
2 Procesos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
3 Servicios POSIX para gestión de procesos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
4 Hilos
Objetivo, concepto y características
Implementación y programación
Hilos vs. procesos
Ejemplo de programación con hilos
5 Sincronización de Procesos/Hilos
Motivos
Sincronización con semáforos
Sistemas Operativos Procesos e Hilos 2 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Concepto y características de un programa
Programa
Un programa
es una colección de instrucciones y de datos
almacenados en un archivo ordinario.
Características de un programa
Residen en dispositivos de almacenamiento permanente.
Generalmente, para ser ejecutados deben residir en MP.
Entidad estática.
Sistemas Operativos Procesos e Hilos 3 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Fases de desarrollo de un programa
Ciclo de desarrollo
1 Edición.
2 Compilación.
3 Ejecución.
4 Depuración.
Sistemas Operativos Procesos e Hilos 4 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Fases de desarrollo de un programa
Generación de un ejecutable
Sistemas Operativos Procesos e Hilos 5 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Fases de desarrollo de un programa en UNIX
vi, vim, emacs, gedit, etc. cc (gcc), make, ar, 
etc.
$ vi enteros.c $ gcc enteros.c –o enteros
gdb, ddd
$ gdb enteros
Edición Compilación Depuración
vi, vim, emacs, gedit, etc.vi, vim, emacs, gedit, etc. cc (gcc), make, ar, 
etc.
cc (gcc), make, ar, 
etc.
$ vi enteros.c $ gcc enteros.c –o enteros
gdb, ddd
$ gdb enteros
Edición Compilación Depuración
Sistemas Operativos Procesos e Hilos 6 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Fases de desarrollo de un programa en UNIX
Compilación
cppcpp ldldcompcomp
programa.c programa.i programa.s programa.o a.out
Preprocesamiento Compilación
y optimización
Generación
de código objeto
Enlace
gcc
asascppcpp ldldcompcomp
programa.c programa.i programa.s programa.o a.out
Preprocesamiento Compilación
y optimización
Generación
de código objeto
Enlace
gcc
asas
La orden gcc tiene opciones para generar los archivos
intermedios (-E, -S, -c).
Otras opciones de gcc: -o, -Wall, -g, etc.
Sistemas Operativos Procesos e Hilos 7 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Fases de desarrollo de un programa en UNIX
Ejemplo 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int imprimir = 1;
char *nomprog;
int main(int argc,
char *argv[])
{
int i;
int *ptr;
nomprog = argv[0];
printf("Núm. de args = %d", argc);
printf("Nombre del prog.: %s\n",
nomprog);
for (i=1; i <argc; i++)
{
ptr = malloc(strlen(argv[i])+1);
strcpy(ptr, argv[i]);
if (imprimir) printf("%s\n", ptr);
free(ptr);
}
return 0;
} /* fin main */
Sistemas Operativos Procesos e Hilos 8 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Fases de desarrollo de un programa en UNIX
Compilación de varios módulos
stdio.h math.h arch1.h 
cpp comp as 
st	
  arch1.c 
st	
  
st	
  
Editor 
 vi 
arch2.c 
arch3.c 
arch1.o 
arch2.o 
arch3.o 
Enlazador 
 ld 
gcc 
Archivos de 
cabecera 
archej 
Bibliotecas libc.a libm.a 
Sistemas Operativos Procesos e Hilos 9 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características de un programa
Fases de desarrollo de un programa
Formato de un ejecutable
Formato de un ejecutable
´
Número mágico
CP inicial
Tabla de secciones
Código
Datos iniciados
Tabla de símbolos
Archivo ejecutable
Código 1000 3000
Datos inic. 4000 1000
Datos sin inic. - 100
T. Símbolos 7000 1000
0
1000
4000
7000
C
a
b
e
c
e
ra
C
a
b
e
c
e
ra
S
e
c
c
io
n
e
s
S
e
c
c
io
n
e
s
Desplaz. Tam.
´
Número mágico
CP inicial
Tabla de secciones
Código
Datos iniciados
Tabla de símbolos
Archivo ejecutable
Código 1000 3000
Datos inic. 4000 1000
Datos sin inic. - 100
T. Símbolos 7000 1000
0
1000
4000
7000
C
a
b
e
c
e
ra
C
a
b
e
c
e
ra
S
e
c
c
io
n
e
s
S
e
c
c
io
n
e
s
Desplaz. Tam.
⇒ Formatos: ELF, EXE, COM, etc.
Sistemas Operativos Procesos e Hilos 10 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Proceso
Concepto de proceso
Un proceso es un programa en ejecución.
Características de un proceso
Entidad dinámica.
Los procesos se componen de: código, datos, pila, heap, etc.
El sistema operativo le asigna recursos: CPU, memoria,
archivos, etc.
El sistema operativo controla su ejecución.
El sistema operativo lleva la contabilidad de todos los
procesos existentes en el sistema.
⇒ Varios procesos pueden ejecutar el mismo programa.
⇒ Un proceso puede derivar de otro proceso.Sistemas Operativos Procesos e Hilos 11 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Procesos en UNIX
Cada proceso tiene un identificador único denominado PID.
Los procesos forman una jerarquía de procesos cuya raíz es el
proceso init.
init es el primer proceso que arranca en UNIX.
Su PID es 1.
La función principal de init es arrancar distintos procesos, por
ejemplo, login.
El PPID de un proceso es el PID de su proceso padre.
Sistemas Operativos Procesos e Hilos 12 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Bloque de control de proceso (PCB)
Concepto
El PCB es una estructura de datos con información de un proceso.
El PCB contiene información referente a:
Estado actual del proceso.
Identificación unívoca del proceso.
Prioridad del proceso.
Puntero a la zona de memoria asignada.
Punteros a los recursos asociados.
Área de salvaguarda de registros.
Un puntero al siguiente PCB, formando una lista enlazada.
⇒ En Linux, el PCB se denomina task_struct
Sistemas Operativos Procesos e Hilos 13 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Diagrama de estados de un proceso en Linux
Sistemas Operativos Procesos e Hilos 14 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Espacio de direccionamiento virtual de un proceso
Memoria
física
Código
Espacio de direccionamiento
virtual de la
aplicación A
Espacio de direccionamiento
real
MMUMMU
AA
BB
CC
DD
EE
FF
GG AA
BB
CC
EE
CódigoAA
BB
CC
DD
EE
FF
GG
AA
Tabla de
traducción
de A
Tabla de
traducción
de B
MMUMMU
Memoria
física
Código
virtual de la
aplicación A
Espacio de direccionamiento
real
MMUMMU
AA
BB
CC
DD
EE
FF
GG AA
BB
CC
EE
CódigoAA
BB
CC
DD
EE
FF
GG
AA
Tabla de
traducción
de A
Tabla de
traducción
de B
MMUMMU
Espacio de direccionamiento
virtual de la
aplicación B
Espacio de direccionamiento
virtual de la
aplicación 
Memoria
física
Código
Espacio de direccionamiento
virtual de la
aplicación A
Espacio de direccionamiento
real
MMUMMU
AA
BB
CC
DD
EE
FF
GG
AA
BB
CC
EE
CódigoAA
BB
CC
DD
EE
FF
GG
AA
Tabla de
traducción
de A
Tabla de
traducción
de B
MMUMMU
Memoria
física
Código
virtual de la
aplicación A
Espacio de direccionamiento
real
MMUMMU
AA
BB
CC
DD
EE
FF
GG AA
BB
CC
EE
CódigoAA
BB
CC
DD
EE
FF
GG
AA
Tabla de
traducción
de A
Tabla de
traducción
de B
MMUMMU
Espacio de direccionamiento
virtual de la
aplicación B
Espacio de direccionamiento
virtual de la
aplicación 
Sistemas Operativos Procesos e Hilos 15 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Ejecutable y Mapa de memoria de un proceso
´
Código
Datos iniciados
Datos no iniciados
Heap
Archivo X proyectado
Zona compartida
Código biblioteca dinámica Z
Datos biblioteca dinámica Z
Pila de hilo 1
Pila 
´
Código
Datos iniciados
Datos no iniciados
Heap
Archivo X proyectado
Zona compartida
Código biblioteca dinámica Z
Datos biblioteca dinámica Z
Pila de hilo 1
Pila 
´
Número mágico
CP inicial
Tabla de secciones
Código
Datos iniciados
Tabla de símbolos
´
Número mágico
CP inicial
Tabla de secciones
Código
Datos iniciados
Tabla de símbolos
Archivo ejecutable
0
1000
4000
7000
C
a
b
e
c
e
ra
C
a
b
e
c
e
ra
S
e
c
c
io
n
e
s
S
e
c
c
io
n
e
s
2000
5000
6000
Mapa de memoria
P
o
s
ib
le
s
 r
e
g
io
n
e
s
 c
re
a
d
a
s
 e
n
 
ti
e
m
p
o
 d
e
 e
je
c
u
c
ió
n
´
Código
Datos iniciados
Datos no iniciados
Heap
Archivo X proyectado
Zona compartida
Código biblioteca dinámica Z
Datos biblioteca dinámica Z
Pila de hilo 1
Pila 
´
Código
Datos iniciados
Datos no iniciados
Heap
Archivo X proyectado
Zona compartida
Código biblioteca dinámica Z
Datos biblioteca dinámica Z
Pila de hilo 1
Pila 
´
Número mágico
CP inicial
Tabla de secciones
Código
Datos iniciados
Tabla de símbolos
´
Número mágico
CP inicial
Tabla de secciones
Código
Datos iniciados
Tabla de símbolos
Archivo ejecutable
0
1000
4000
7000
C
a
b
e
c
e
ra
C
a
b
e
c
e
ra
S
e
c
c
io
n
e
s
S
e
c
c
io
n
e
s
2000
5000
6000
Mapa de memoria
P
o
s
ib
le
s
 r
e
g
io
n
e
s
 c
re
a
d
a
s
 e
n
 
ti
e
m
p
o
 d
e
 e
je
c
u
c
ió
n
⇒ Propiedades de la región: Soporte (archivo/anónimo),
compartición, protección, y tamaño.
Sistemas Operativos Procesos e Hilos 16 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Mapa de memoria de un proceso en UNIX
Contexto de usuario Contexto del núcleo
Datos del núcleoTexto (código)
Datos iniciados de
sólo lectura
Datos iniciados de
lectura-escritura
Datos no iniciados
Área dinámica (heap)
Pila
Contexto de usuario Contexto del núcleo
Datos del núcleoTexto (código)
Datos iniciados de
sólo lectura
Datos iniciados de
lectura-escritura
Datos no iniciados
Área dinámica (heap)
Pila
Texto (código)
Datos iniciados de
sólo lectura
Datos iniciados de
lectura-escritura
Datos no iniciados
Área dinámica (heap)
Pila
⇒ ¿Qué contendrá cada región del mapa en el caso del ejemplo 1?
⇒ ¿Qué relación existe entre el contexto del proceso y del núcleo con
el modo de ejecución?Sistemas Operativos Procesos e Hilos 17 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Mapa de memoria de un proceso en Linux
Cabecera
0x40000000
Código (Text)
Datos (Data)
Datos no iniciados (BSS)
start_code
end_code
end_data
end_bss
Bibliotecas
compartidas
Cabecera
0x80000000
Código (Text)
Sistema (1 Gb)
Datos no iniciados (BSS)
start_code
end_code
end_data
end_bss
Programa
Información para carga dinámica
0xBFFFFFB
Argumentos
Variables de entorno
Archivo del programa
arg_start
env_start
Puntero a los argumentos 
y variables de entorno
start_stack
Datos (Data)
0x00000000
0x40000000
0xFFFFFFFF
0x3FFFFFFF
Usuario (3 Gb) P
R
O
Y
E
C
C
IÓ
N
P
R
O
Y
E
C
C
IÓ
N
Cabecera
0x40000000
Código (Text)
Datos (Data)
Datos no iniciados (BSS)
start_code
end_code
end_data
end_bss
Bibliotecas
compartidas
Cabecera
0x80000000
Código (Text)
Sistema (1 Gb)
Datos no iniciados (BSS)
start_code
end_code
end_data
end_bss
Programa
Información para carga dinámica
0xBFFFFFB
Argumentos
Variables de entorno
Archivo del programa
arg_start
env_start
Puntero a los argumentos 
y variables de entorno
start_stack
Datos (Data)
0x00000000
0x40000000
0xFFFFFFFF
0x3FFFFFFF
Usuario (3 Gb) P
R
O
Y
E
C
C
IÓ
N
P
R
O
Y
E
C
C
IÓ
N
Sistemas Operativos Procesos e Hilos 18 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Concepto y características
Bloque de control de proceso
Estados de un proceso
Mapa de memoria de un proceso
Mapa de memoria de un proceso en Windows
Usuario (2 Gb)
Código .EXE
Pilas de cada thread
Heap
Código .DLL
Sistema (2 Gb)
Ejecutivo, kernel, HAL,
drivers, pilas del núcleo
para cada hilo
Win32K.sys
0x00000000
0x80000000
0xFFFFFFFF
0x7FFFFFFF
Tabla de páginas
Cache del sistema 
de archivos
Usuario (2 Gb)
Código .EXE
Pilas de cada thread
Heap
Código .DLL
Sistema (2 Gb)
Ejecutivo, kernel, HAL,
drivers, pilas del núcleo
para cada hilo
Win32K.sys
0x00000000
0x80000000
0xFFFFFFFF
0x7FFFFFFF
Tabla de páginas
Cache del sistema 
de archivos
Sistemas Operativos Procesos e Hilos 19 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Servicios POSIX para gestión de procesos
Uso de los servicios POSIX para gestión de procesos
Creación de procesos
Ejecución de un programa
Finalización de procesos
Identificación de procesos
Gestión del entorno de procesos
Sistemas Operativos Procesos e Hilos 20 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Creación de un proceso
Esquema
Imagen Imagen 
de PAde PA
fork()
Mapa de memoria
Mapa de memoria Lista de PCB’s
Imagen Imagen 
de PAde PA
Imagen Imagen 
de PBde PB Secciones compartidas: 
código o zonas de memoria
PCBPCBPAPA
Lista de PCB’s
PCBPCBPAPA PCBPCBPBPB
PID PID
Imagen Imagen 
de PAde PA
fork()
Mapa de memoria
Mapa de memoria Lista de PCB’s
Imagen Imagen 
de PAde PA
Imagen Imagen 
de PBde PB Secciones compartidas: 
código o zonas de memoria
PCBPCBPAPA
Lista de PCB’s
PCBPCBPAPA PCBPCBPBPB
PID PID
Sistemas Operativos Procesos e Hilos 21 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Creación de un proceso
Servicio POSIX
Prototipo
pid_t fork();
Descripción
Crea una copia (proceso hijo) del proceso que la invoca
(proceso padre)
Devuelve
Si la llamada se ejecuta correctamente:
⇒ Al padre: el pid del proceso hijo
⇒ Al hijo: 0
En caso contrario: -1 y en la variable global errno el código
del error
Sistemas Operativos Procesos e Hilos 22 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Creación de un proceso
Ejemplo
#include <sys/types.h>
#include <stdio.h>
int main(void)
{
pid_t id;
id = fork();
if(id == -1) {
perror(”Error en el fork");
exit(1);
}
if (id == 0) {
while (1) printf("Hola:
soy el hijo\n");
}
else {
while (1) printf("Hola: soy el padre\n");
}
}
Sistemas Operativos Procesos e Hilos 23 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Ejecución de un programa
Esquema
Imagen Imagen 
de PAde PA
exec()
Mapa de memoria
Mapa de memoria Lista de PCB’s
PCBPCBPAPA
Lista de PCB’s
PCBPCBPAPA
Imagen Imagen 
de PAde PA
Biblioteca del
sistema
Ejecutable
Cargador
Imagen Imagen 
de PAde PA
exec()
Mapa de memoria
Mapa de memoria Lista de PCB’s
PCBPCBPAPA
Lista de PCB’s
PCBPCBPAPA
Imagen Imagen 
de PAde PA
Biblioteca del
sistema
Ejecutable
Cargador
Sistemas Operativos Procesos e Hilos 24 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Ejecución de un programa
Servicio POSIX
Prototipo
int execl (const char *path, const char *arg, ...);
int execlp (const char *file, const char *arg, ...);
int execv (const char *path, char const *argv[]);
int execvp (const char *file, char const *argv[]);
int exccve (const char *path, char *argv[], char *
const envp[]);
Descripción
Reemplazan la imagen del proceso actual por la imagen de un
proceso a partir de un archivo ejecutable
Devuelve
Si hay error: -1 y en la variable global errno el código del
error Sistemas Operativos Procesos e Hilos 25 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Ejecución de un programa
Ejemplo
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t id;
char *args[3];
args[0] = "ps";
args[1] = ”-l";
args[2] = NULL;
if (execvp(args[0], args) < 0) {
perror(”Error en execvp");
exit(-1);
}
}
Sistemas Operativos Procesos e Hilos 26 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Finalización de un proceso
Servicio POSIX
Prototipo
void exit(int status);
Descripción
Termina la ejecución de un proceso. El proceso da una
indicación de cómo finalizó mediante status
Cuando un proceso termina, sus hijos no mueren y suelen ser
adoptados por el proceso init
El valor de status es retornado al proceso padre (¡si existe!)
Sistemas Operativos Procesos e Hilos 27 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Espera por la finalización de un proceso
Servicio POSIX
Prototipo
pid_t wait(int *status);
pid_t waitpid(pid_t pid, int *status, int options);
Descripción
o Permiten que un proceso espere por la finalización de un
proceso hijo y obtenga información sobre su estado de
terminación en status
Devuelve
El identificador del proceso hijo cuya ejecución finalizó
⇒ ¿Cómo ejecuta una orden la shell?
Sistemas Operativos Procesos e Hilos 28 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Espera por la finalización de un proceso
Ejemplo 1/2
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
pid_t id;
int estado;
id = fork();
if (id == -1) {
perror(”Error en el fork");
exit(-1);
}
Sistemas Operativos Procesos e Hilos 29 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Creación de un proceso
Ejecución de un programa
Finalización de un proceso
Espera por la finalización de un proceso
Espera por la finalización de un proceso hijo
Ejemplo 2/2
if (id == 0) {
printf("Soy el hijo\n");
sleep(5);
printf("Hijo: despierta y finaliza\n");
exit(0);
} else {
printf("Soy el padre y espero ... \n");
wait(&estado);
printf("Padre: el hijo terminó con estado = %\n", estado);
exit(0);
}
} /* Fin de main */
Sistemas Operativos Procesos e Hilos 30 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Objetivo, concepto y características
Implementación y programación
Hilos vs. procesos
Ejemplo de programación con hilos
Hilos
Objetivo
Compartir recursos entre procesos cooperantes de forma cómoda
Concepto
Hilos = proceso ligero = threads = lightweight process (LWP)
= Unidad fundamental de uso del procesador.
Básicamente se compone de un CP, una serie de registros y
un área de pila
Un hilo pertenece a otra entidad conocida como tarea (task),
y sólo a una.
El código, los datos y los recursos son propiedad de la tarea a
la que pertenece el hilo.
Sistemas Operativos Procesos e Hilos 31 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Objetivo, concepto y características
Implementación y programación
Hilos vs. procesos
Ejemplo de programación con hilos
Hilos
Características
Cada hilo comparte con los otros hilos cooperantes: código,
datos y recursos del SO
Una tarea sin hilos no tiene capacidad de ejecución
Los threads son muy adecuados para sistemas distribuidos y
sistemas multiprocesador
Un proceso tradicional (proceso pesado) se compone de una
tarea con un hilo de ejecución
TareaProceso P
Procesos ligerosProceso clásico = proceso pesado
TareaProceso P
Procesos ligerosProceso clásico = proceso pesado
Sistemas Operativos Procesos e Hilos 32 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Objetivo, concepto y características
Implementación y programación
Hilos vs. procesos
Ejemplo de programación con hilos
Hilos
Implementación y programación
Los hilos pueden ser implementados en espacio de usuario o
soportados por el núcleo como llamadas al sistema
La programación con hilos debe hacerse cuidadosamente;
pueden producirse errores de sincronización
La mayoría de los SS.OO. modernos soportan threads (OS/2,
Mach, W2K, Chorus, Linux, etc.)
¿Cómo programar con hilos?: Bibliotecas estándar DCE
Threads, POSIX Threads, Sun threads, etc.
Sistemas Operativos Procesos e Hilos 33 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Objetivo, concepto y características
Implementación y programación
Hilos vs. procesos
Ejemplo de programación con hilos
Hilos vs. procesos
Los hilos se crean y se destruyen más rápidamente que los
procesos
El tiempo de conmutación entre hilos de la misma tarea es
más rápida que la conmutación entre procesos
Todos los hilos de una tarea comparten memoria ⇒ Menor
sobrecarga de comunicaciones
Un proceso tradicional (proceso pesado) se compone de una
tarea con un hilo de ejecución
Sistemas Operativos Procesos e Hilos 34 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
Objetivo, concepto y características
Implementación y programación
Hilos vs. procesos
Ejemplo de programación con hilos
Ejemplo de programación con hilos
#include <pthread.h>
void * Hilo (void *arg) {
printf(" %s", "Soy el hilo ->");
printf(" %d\n", arg);
pthread_exit(0);
} /* Fin de Hilo */
main()
{
pthread_t hilo1, hilo2;
int i = 1;
pthread_create(&hilo1, NULL, Hilo, &i);
i++;
pthread_create(&hilo2, NULL, Hilo, &i);
sleep(30);
printf("Finaliza el hilo principal\n");
}
Sistemas Operativos Procesos e Hilos 35 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
¿Por qué es necesario?
Sincronización con semáforos
Sincronización de la ejecución de un proceso o hilo
Con frecuencia los procesos deben coordinarse entre si porque
cooperan para lograr un fin o compiten por algún recurso.
Razones para sincronizar la ejecución de los procesos
Es necesario compartir recursos en exclusión mútua.
Un proceso debe esperar hasta que otro le envíe la información
que necesita para continuar (detener su ejecución).
Varios procesos quieren escribir a la vez en la misma posición
de memoria (condiciones de carrera).
Un proceso no puede detener por si mismo su ejecución. Tampoco
puede alterar la ejecución de otro. Es necesaria la intervención del
núcleo.
Sistemas Operativos Procesos e Hilos 36 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
¿Por qué es necesario?
Sincronización con semáforos
Mecanismo de sincronización con semáforos
Los semáforos son objetos proporcionados por el núcleo y se
comparten por todos los procesos participantes en la sincronización.
Operaciones sobre los semáforos.
Operación P(semaforo):
Si el semáforo tiene valor positivo, se decrementa en una
unidad.
Si el semáforo es cero, el proceso que invoca la llamada
queda bloqueado en una lista de espera.
Operación V(semaforo):
Si el semáforo no tiene procesos bloqueados a la espera, se
incrementa en una unidad.
Si el semáforo tiene procesos bloqueados, se despierta al
primero de ellos.
Sistemas Operativos Procesos e Hilos 37 / 39
Programa
Procesos
Servicios POSIX para gestión de procesos
Hilos
Sincronización de Procesos/Hilos
¿Por qué es necesario?
Sincronización con semáforos
Solución a algunos problemas típicos con semáforos
Sección crítica
(condiciones de carrera)
P1
...
P(S1);
a++;
V(S1);
...
P2
...
P(S1);
a++;
V(S1);
...
Productor-Consumidor
Básico
Pproductor
...
datos=crear();
V(S1);
...
Pconsumidor
...
P(S1);
consumir(datos);
...
¿Afecta el valor al que estén inicializados los semáforos?
Sistemas Operativos Procesos e Hilos 38 / 39
Referencias bibliográficas I
[Sánchez, 2005] S. Sánchez Prieto.
Sistemas Operativos.
Servicio de Publicaciones de la UA, 2005.
[Márquez, 2004] Francisco M. Márquez.
UNIX. Programación Avanzada.
Ed. Ra-Ma, 2004.
[Tanenbaum, 2009] A. Tanenbaum.
Sistemas Operativos Modernos.
Ed. Pearson Education, 2009.
[Stallings, 1999] W. Stallings.
Organización y arquitectura de Computadores.
Ed. Prentice Hall, 1999.
Sistemas Operativos Procesos e Hilos 39 / 39
	Programa
	Concepto de programa
	Fases de desarrollo de un programa
	Formato de un ejecutable
	Procesos
	Concepto y características
	Bloque de control de proceso
	Estados de un proceso
	Mapa de memoria de un proceso
	Servicios POSIX para gestión de procesos
	Creación de un proceso
	Ejecución de un programa
	Finalización de un proceso
	Espera por la finalización de un proceso
	Hilos
	Objetivo, concepto y características
	Implementación y programación
	Hilos vs. procesos
	Ejemplo de programación con hilos
	Sincronización de Procesos/Hilos
	Motivos
	Sincronización con semáforos
	Apéndice
Sistemas Operativos/ssoo/tema 3 ssoo/test3/1.jpg
Sistemas Operativos/ssoo/tema 3 ssoo/test3/2.jpg
Sistemas Operativos/ssoo/tema 3 ssoo/test3/3.jpg
Sistemas Operativos/ssoo/tema 3 ssoo/test3/4.jpg
Sistemas Operativos/ssoo/tema 3 ssoo/test3/5.jpg
Sistemas Operativos/ssoo/tema 3 ssoo/test3/Pantallazo.png
Sistemas Operativos/ssoo/Tema 4 ssoo/ApuntesTema4.txt.Concepto de planificacion (I)
- El objetivo es aumentar el rendimiento y maximizar el uso de la CPU.
.Scheduler y dispatcher
- El Scheduler se encarga de elegir el siguiente proceso.
- El Dispatcher conmuta los trabajos, se encarga de el intercambio de control de ejecucion. (Interrupciones, etc.).
- Esto es frecuente por lo que es necesario que se acelere este proceso, gracias al hardware el Dispatcher hace las operaciones mas rapido.
- El Dispatcher guarda la forma de acceder a las diferentes regiones de memoria de un proceso.
- Hay llamadas bloqueantes(Espera de un recurso, espera por un semaforo) y no bloqueantes(fork etc.).
- Cuando hay una interrupcion el dispatcher puede dar paso al proceso interrumpido, por ejemplo al hacer un fork se crea un hijo pero el padre se sigue ejecutando.
- Hay mas planificadores que el scheduler(Este es a corto plazo).
- A largo plazo controla el grado de multiprogramacion ya que se encarga de cargar los procesos en memoria, actualmente nosotros somos los que cargamos los procesos.
- Planificacion a corto plazo (Scheduler) de los procesos que hay en la cola de preparados decide cual se tiene que ejecutar. Si no hay ninguno en cola se ejecuta un proceso null, que no hace nada que consuma recursos, solo espera a que llegue ottro proceso.
- Planificador a medio plazo, se encarga de administrar la solicitud de memoria dinamica cuando se supera la memoria que esta disponible fisicamente. De memoria a disco swapout al reves swapin, mete o saca procesos. Cuando la memoria llega al limite suele quitar bloqueado o los que mas CPU hayan usado recientemente.
- La desalojacion es temporal. Y tendra que hacer un swapin para volver a la ejecucion. Los candidatos son los que estan en listo para ejecutarse.
- Con el swapin y swapout puede producir vapuleos que es el continuo swapin y swapout al mismo proceso. 
.Criterios de evaluacion
- En que nos basamos para decidir la bondad de un planificador, nos basaremos en una serie de objetivos.
- Criterios de trato justo y equidad, todos los procesos tienen que llegar a ejecutarse en algun momento en la CPU. Ademas todos los procesos deben tener las mismas oportunidades de ejecutarse.
- El uso del procesador queremos que sea alto, osea que este el mayor tiempo posible ejecutandose un proceso en la CPU.
- El grado de sobrecarga, queremos que el planificador use el minimo de recursos posibles.
- Rendimiento (througput) numero de trabajos completados por unidad de tiempo. Este criterio no es muy fiable, pero a veces se tiene en cuenta.
- Tiempo de estancia (o de retorno), es el tiempo desde que se lanza un proceso hasta que termina, teniendo en cuenta las colas etc.
- Tiempo de espera, es el tiempo de espera en CUALQUIER cola y el tiempo de espera por recursos tambien. Que este bloqueado o listo etc.
- Tiempo de respuesta, desde que se realiza una peticion hasta que se obtiene una respuesta.
- En los sistemas interactivos se valora mas que los tiempos de esperas sean bajos, para que el usuario se sienta atendido.
.Algoritmos de planificacion
- Algoritmo sin requisa, el proceso se segui ejecutando hasta que finalice o hasta que se haga una entrada o salida.
	Entre ellos: · FIFO
		 · Algoritmos con prioridad sin requisa:
				- SJF
							 
- Los algoritmos con requisa intentan evitar el monopolio de uso de la CPU.
- Entre ellos estan: · Algoritmos con prioridad y con requisa: 
				- SJF con requisa
		 · Round robin
		 · Colas multinivel
		 · Colas multinivel realimentadas
.Algoritmos de planificacion (FIFO)
- FIFO: First In First Out.
- La cola de listos se maneja como una cola FIFO
- Ventajas: Facil de programar.
- Desventajas: como es sin requisa puede haber monopolio. Un proceso mal programado entra en bucle infinito y acapara toda la CPU.
- Dependiendo del tipo de proceso que llegue este algoritmo funcionara mejor o peor.
- Efecto convoy: como se ejecuta con estas caracteristicas sucede que los procesos interactivos (alto uso de entrada y salida) se ven perjudicados por los de alto uso de CPU. Por lo que no se hace uso optimo de los recursos de entrada y salida.
- Diagramas de Gant, es un esquema temporal de la gesiton de los procesos.
	No representamos la ejecucion del dispatcher.
	Tiempo medio de estancia, se suman las u.t en las que se ha cambiado de proceso y se divide entre el numero de trabajos.
	 _______________________________________________________________
	|_____________T1________________________|__ T2___|_____T3_______|
	0					12 15		21
	
	t = (12+15+21)/3 = 16 u.t.
	 ______________________________________________________
	|___T2___|_____T3_______|_____________T1_______________|
0	 3		9			 21
	t =(3+9+21)/3 = 11 u.t.
.Algoritmo con prioridades
- Se suelen basar las prioridades en recursos internos.
- Los procesos pueden morir de inanicion, es decir no pueda ejecutarse.
.SJF
- Es un algoritmo sin requisa.
- El primero el mas corto.
- Se le asigna la CPU cuya duracion de la siguiente rafaga sea mas corta.
- El inconveniente es que un proceso no se sabe cual es la duracion de la siguente rafaga, solo se puede predecir en funcion de la historia pasada.
- Un proceso de rafagas cortas en el futuro sigue siendo de rafagas cortas.
- Sigue siendo sin requisa por lo que sigue habiendo monopolio.
- No existe efecto convoy y se minimizan los tiempos de respuesta.
- Para predecir se usa una formula (Mirar diapositiva)
- Se predice la duracion de la siguiente rafaga segun la rafaga actual.
- Alfa se toma como 1/2 normalmente.
.Planificacion con requisa
- La requisa consiste en, si llega un proceso que la duracion de la siguiente rafaga es mas corta que lo que le queda al proceso actual, se le da prioridad.
.Round-robin
- Limitar el uso de la CPU por el proceso que se esta ejecutando a un maximo que se da por la interrupcion de reloj (Quantum) provoca una interrupcion que se aprovecha para desalojar el proceso.
- Pretende repartir el tiempo de CPU entre todos los procesos.
- Se maneja la cola de listos como circular, se asigna la CPU al primero y cuando termine el Quantum se pone al final.
- Si el proceso no ocupa todo el quantum desaloja voluntariamente la CPU.
.Colas multinivel
- Los procesos se clasifican en colas por orden de prioridad.
- Hay un algoritmo que decide que cola se ejecutara.
.Colas multinivel realimentada
- Es igual que el multinivel, pero existe un algoritmo para aumentar y disminuir la prioridad de las colas.
- Se suele añadir una cola con la prioridad mas alta para tareas del sistema la cual no puede variar la prioridad.
- Normalmente los hilos se colocan en la cola de mayor prioridad.
- Los procesos tienen que hacercarse al Quantum de la cola lo maximo posible, si el proceso cede la ejecucion demasiado pronto se le sube a una cola de mayor prioridad, si pasa lo contrario y sobrepasa el Quantum de la cola se le baja a una cola de menor prioridad.
- Se priorizan los procesos interactivos.
- Si el cociente (uso de CPU)/(Uso E/S) es bajo es candidato a ser ascendido por ser mas interactivo.
.Planificacion en W2K(Generalidades)
- Windows trata de beneficiar las acciones interactivas.
- Lo que habra en la cola de listos seran hilos que son los mas interactivos.
- Se ejecuta lo que este en la cola de listos.
- (Los numero 16 - 31 y 1 - 15 son numeros de cola con diferentes Quantum cada uno, a mayor numero mas prioridad, en UNIX es al reves).
.Quantum
- Se habla de unidades logicas (u.l.)
- Un tick es una interrupcion de reloj, el Quantum de mide en una cantidad de tick. En cada tick de reloj se resta 3 u.l. al Quantum.
- La version Professional tiene que ser mas interactivo pero tiene menos rendimiento que la version servidor.
.Ejecucion del planificador
- Finalizacion de Quantum, cesion involuntaria.
- El hilo pasa a espera, cesion voluntaria.
- El hilo finaliza la ejecucion, cesion voluntaria.
.Ajuste de prioridad
- Decay -> offset (-)
- Boost -> offset (+)
.Planificacion en UNIX
- Tiene round-robin.
- Beneficia las tareas interactivas. O que tienen poco uso de CPU.
- Aqui hablaremos de procesos no de hilos.
- Tiene 32 colas, la prioridad mas alta en valor no es la mas alta. Menos numero mayor prioridad. Prioridad 30 es mas prioritario que 100.
- Los procesos tienen varias prioridades, se divide la prioridad entre cuatro y se asigna a una cola. 0/4 cola 0, 3/4 cola 0, 4/4 cola 1...
	Dentro de las colas no hay prioridad va por round-robin.
- Se ejecuta el proceso que este en la primera cola y en la primera posicion.
- Se requisa un proceso por expulsion si llega uno con prioridad mayor.(Cesion involuntaria)
- Cuando expira el quantum tambien se produce cesionm involuntaria.
.Colas
- Proc es el equivalente a la task_struct.
- Colas con round-robin de prioridades dinamicas.
.Calculo de prioridades
- Cuanto mas tiempo se ejecuta un proceso va aumentando su valor de prioridad, lo que disminuye su prioridad.
- 
Sistemas Operativos/ssoo/Tema 4 ssoo/EjerciciosPlanificacion.pdf
Ejercicio 1 
El algoritmo de planificación de un sistema operativo es SJF. Considérese la siguiente 
tabla en la que se representan cinco trabajos diferentes así como sus duraciones 
respectivas: 
Trabajo T0 T1 T2 T3 T4 
t0 0 2 5 16 18
CPU 12 6 9 5 2
A partir de esta tabla, representar el estado de cada trabajo (listo, ejecución) en cada 
instante de tiempo, calculando los tiempos medios de estancia de los trabajos. 
Considere el caso a) algoritmo SJF sin requisa y el caso b) algoritmo SJF sin requisa. 
El tiempo invertido en la planificación y el cambio de contexto es despreciable. 
T0
T1 
T2
T3 
T4
CPU 
Ejercicio 2 
Considérese la siguiente tabla en la que se representan 3 procesos planificados según 
FIFO (FCFS) : 
Trabajo P0 P1 P2 
t0 0 2 5
ráfaga CPU 7 1 1 
Operación E/S 4 2 2 
Cada trabajo requiere 3 ráfagas de CPU y 2 de E/S para su finalización. Todas las 
operaciones de E/S se realizan sobre el mismo dispositivo. Las solicitudes de entradas 
salida también se planifican según el algoritmo FIFO. 
a) Representar el estado de cada trabajo (Listo, Ejecución y Bloqueado) en cada instante
de tiempo, calculando los tiempos medios de estancia de los trabajos y el porcentaje de 
utilización de la CPU y del dispositivo de E/S. Considérese que el tiempo invertido en 
la planificación y el cambio de contexto es despreciable. 
P0
P1 
P2
CPU 
E/S 
b) Realizar el mismo estudio pero considerando que cada proceso trabaja sobre un
dispositivo de E/S distinto. 
P0
P1 
P2
CPU 
c) Realizar de nuevo el mismo estudio pero considerando que el computador cuenta con
2 CPUs y que cada proceso trabaja sobre un dispositivo de E/S distinto. 
P0
P1 
P2
CPU0
CPU1
E/S0 
E/S1 
E/S2 
E/S0 
E/S1 
E/S2 
Solución ejercicio 1 (sin requisa)
t = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
T0
T1
T2
T3
T4
Uso CPU
Leyenda:
Ejecución
Listo
t estacia medio = (12 + 16 + 29 + 9 + 2) / 5 = 13,6 u.t.
% uso CPU = 34 / 34 = 100%
Solución ejercicio 1 (con requisa)
t = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
T0 2/12
T1
T2
T3 1/5
T4
Uso CPU T3
Leyenda:
Ejecución
Listo
t estacia medio = (34 + 6 + 12 + 8 + 2) / 5 = 12,4 u.t.
% uso CPU = 34 / 34 = 100%
T0 T1 T4 T3 T2
T0T4T0 T1 T2 T3
Solución ejercicio 2.a)
t = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
P0
P1 (1) (1) (1) (1) (1) (1)
P2 (1) (1) (1) (1) (1) (1) (1) (1)
Uso CPU P1 P2 P1 P2 P0 P1
Uso E/S
Leyenda:
Ejecución
Listo
Bloqueado (1) El proceso permanece bloqueado hasta que el dispositivo de E/S está disponible.
t estacia medio = (29 + (30 - 2) + (31 - 5)) / 3 = 27,67 u.t.
% uso CPU = 27 / 31 = 87,1%
% uso E/S = 16 / 31 = 51,61%
Solución ejercicio 2.b)
t = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
P0
P1
P2
Uso CPU P1 P2 P1 P2 P1 P2
Uso E/S0
Uso E/S1
Uso E/S2
Leyenda:
Ejecución
Listo
Bloqueado
t estacia medio = (29 + (20 - 2) + (22 - 5)) / 3 = 21,33 u.t.
% uso CPU = 27 / 29 = 93,1%
% uso E/S0 = 8 / 29 = 27,59%
% uso E/S1 = 4 / 29 = 13,79%
% uso E/S2 = 4 / 29 = 13,79%
P2
P0 P0 P0
P0 P0 P0
P0 P1 P2 P0 P1
P0 P0
P2
P1
P2
P1
Solución ejercicio 2.c)
t = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
P0
P1
P2
Uso CPU0
Uso CPU1 P1 P2 P1 P2 P1 P2
Uso E/S0
Uso E/S1
Uso E/S2
Leyenda:
Ejecución
Listo
Bloqueado
t estacia medio = (29 + (10 - 2) + (12 - 5)) / 3 = 14,67 u.t.
% uso CPU0 = 21 / 29 = 72,41%
% uso CPU1 = 6 / 29 = 20,69%
% uso
E/S0 = 8 / 29 = 27,59%
% uso E/S1 = 4 / 29 = 13,79%
% uso E/S2 = 4 / 29 = 13,79%
P0
P0 P0
P0 P0
P2
P1
P2
P1
	EjerciciosPlanificacion
	SolEjerciciosPlanificacion1
	SolEjerciciosPlanificacion2
Sistemas Operativos/ssoo/Tema 4 ssoo/EjPlanifSem.pdf
 
 1 
Un sistema operativo tiene una planificación basada en prioridades dinámicas (sin requisa), 15 es la 
máxima y 0 la mínima, con las siguientes características: 
§ Existe una cola para cada nivel de prioridad. 
§ Dentro de cada cola se utiliza planificación round-robin con q = 3 u.t. 
§ Los hilos heredan, como prioridad inicial, la prioridad base de la tarea a la que pertenecen. 
§ La prioridad base de la tarea T1 es 1, la de la tarea T2 es 2 y la de la tarea T3 es 3. 
§ Cuando se agota un quantum, se resta 3 a la prioridad actual y el proceso se coloca al final de la 
cola de su nivel de prioridad. 
§ Cuando se pasa del estado bloqueado al de preparado, se suma 2 a la prioridad actual. 
§ Siempre que un hilo obtenga la CPU, se reinicia su quantum. 
§ Se supone que las tareas del sistema consumen 0 u.t. de CPU. 
A este sistema llegan 3 tareas con el siguiente código: 
Tarea T1 Tarea T2 Tarea T3 
Hilo 1 Hilo 2 Hilo a Hilo b Hilo α 
ráfaga_cpu(1); 
leer_E/S(4); 
P(smf1); 
ráfaga_cpu(7); 
V(smf1); 
ráfaga_cpu(1); 
P(smf2); 
ráfaga_cpu(2); 
P(smf3); 
ráfaga_cpu(2); 
leer_E/S(2); 
ráfaga_cpu(1); 
ráfaga_cpu(2); 
leer_E/S(2); 
P(smf2); 
ráfaga_cpu(2); 
P(smf3); 
ráfaga_cpu(2); 
V(smf4); 
ráfaga_cpu(2); 
P(smf4); 
ráfaga_cpu(3); 
V(smf3); 
ráfaga_cpu(1); 
ráfaga_cpu(1); 
leer_E/S(4); 
P(smf4); 
ráfaga_cpu(2); 
V(smf2); 
ráfaga_cpu(2); 
 
Se supone que: 
§ En el instante t = 0, llegan los hilos: Hilo 1, Hilo a e Hilo α. El resto de los hilos llegan en el 
instante t = 1. 
§ La función ráfaga_cpu(n) indica una ráfaga de CPU de n unidades de tiempo. 
§ La función leer_E/S(n) indica que el dispositivo de E/S se va a usar n unidades de tiempo. 
§ El dispositivo de E/S es compartido y el manejador gestiona una cola FIFO de peticiones. 
§ Los semáforos son bloqueantes y están iniciados a 1. 
§ Las operaciones P y V consumen 1 u.t. de CPU. 
§ Los semáforos disponen de una cola FIFO en la que permanecen los trabajos, hasta que una 
operación V los despierte. 
§ Suponga que las operaciones P o V ocurren antes que la finalización de un quantum. 
Sabiendo que los hilos están soportados por el núcleo del sistema operativo: 
1. Dibuje el diagrama de ocupación de la CPU, indicando la prioridad de los hilos en cada momento 
y el estado de los semáforos implicados. 
2. Indique el tiempo de retorno, para cada hilo. El tiempo medio de retorno, el porcentaje de uso de 
CPU y del dispositivo de E/S. 
3. ¿Funciona el algoritmo de planificación correctamente? ¿se podría modificar el algoritmo para 
mejorar la eficiencia de uso de CPU? 
 
 2 
 
Apellidos, Nombre: ________________________________________________________ 
 
 
 
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
sm
f1
sm
f2
sm
f3
sm
f4
T1
H
ilo
 1
P
rio
rid
ad
H
ilo
 2
P
rio
rid
ad
T2
H
ilo
 a
P
rio
rid
ad
H
ilo
 b
P
rio
rid
ad
T3
H
ilo
 α
P
rio
rid
ad
U
so
 C
P
U
U
so
 d
is
p.
 E
/S
U
til
ic
e 
la
 s
ig
ui
en
te
 le
ye
nd
a 
pa
ra
 re
al
iz
ar
 la
 re
pr
es
en
ta
ci
ón
 g
rá
fic
a:
H
ilo
 e
n 
ej
ec
uc
ió
n
H
ilo
 p
re
pa
ra
do
H
ilo
 b
lo
qu
ea
do
 
 3 
SOLUCIÓN EJERCICIO 1: 
 
 
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
sm
f1
1
0
1
sm
f2
1
0
1
0
sm
f3
1
0
1
0
sm
f4
1
0
1
0
T1
H
ilo
 1
1/
1
P
V
P
rio
rid
ad
1
3
0
0
H
ilo
 2
1/
1
P
sm
f2
P
P
1/
1
P
rio
rid
ad
1
3
0
2
T2
H
ilo
 a
P
P
V
P
rio
rid
ad
2
4
1
0
H
ilo
 b
P
V
1/
1
P
rio
rid
ad
2
0
0
T3
H
ilo
 α
P
sm
f4
P
V
P
rio
rid
ad
3
5
7
4
U
so
 C
P
U
H
α
H
α
H
1
H
a
H
2
U
so
 E
/S
H
ilo
 e
n 
ej
ec
uc
ió
n
H
ilo
 p
re
pa
ra
do
H
ilo
 b
lo
qu
ea
do
H
2
H
a
2/
2
2/
2
E
/S7/
7
H
1
H
b
H
2
H
1
2/
2
2/
2
2/
2
H
2
H
a
H
a
H
b
H
α
H
1
5/
7
E
/S
E
/S
E
/S
2/
7
2/
2
H
a
H
1
H
b
H
α
H
2
3/
3
2/
2
2/
2
 
 4 
Tiempos de retorno 
Hilo 1 43 u.t. 
Hilo 2 44 – 1 = 43 u.t. 
Hilo a 23 u.t. 
Hilo b 37 – 1 = 36 u.t. 
Hilo α 29 u.t. 
Tiempo medio de retorno: 34,8 u.t. 
 
% Uso CPU = 44 / 44 = 100 % % Uso E/S = 12 / 44 = 27,27 % 
 
Sistemas Operativos/ssoo/Tema 4 ssoo/ejPlaniWindows.pdf
Ejercicio de la Parte IV
Se pretende diseñar el planificador de procesador para el nuevo sistema operativo VenanciOS.
Para ello se ha pensado en un algoritmo expulsivo con prioridades dinámicas comprendidas
entre 0 y 31, en las que los números bajos indican prioridad baja y lo altos prioridad alta.
Los procesos parten siempre de una prioridad fija de valor 15. Si se agota su quantum, su
prioridad disminuye en una unidad (como mı́nimo hasta valor 0) y si el proceso no lo agota
y es expulsado, se mantiene con la misma prioridad. Si el proceso se duerme a la espera de
un recurso, al despertarse incrementa su prioridad (boosting), dependiendo del tipo de recurso,
acorde con la tabla siguiente:
Recurso Incremento de prioridad
R1 1
R2 2
R3 3
R4 4
Caracteŕısticas de la planificación:
El incremento de prioridad se aplica a la prioridad con la que el proceso se durmió.
Si dos o más procesos se bloquean en el mismo recurso, éstos serán atendidos en orden
FIFO.
El sistema utiliza un valor de quantum de 2 unidades de tiempo.
Un proceso que pasa al estado de listo después de una espera, se encola al final de la cola
correspondiente a su prioridad.
Un proceso que agota su quantum, se encola al final de la cola correspondiente a su prio-
ridad.
Un proceso que es requisado por otro de mayor prioridad es encolado a la cabeza de la
cola correspondiente a su prioridad.
Cuando un proceso requisado se reanuda, se le vuelve a asignar un quantum completo.
La tabla siguiente muestra las ráfagas de CPU de los distintos trabajos aśı como el tiempo
de acceso a cada dispositivo:
Proceso CPU E/S CPU E/S CPU
P1 5 4R4 3 5R1 1
P2 1 6R2 7 14R2 1
P3 6 7R2 5 10R2 1
P4 1 12R1 3 6R1 3
Se debe suponer que todos los trabajos llegan en el instante de tiempo 0, en el orden P1, P2,
P3 y P4.
Se pide:
Dibuje en la gráfica adjunta qué trabajo se ejecuta en cada momento, aśı como su prioridad.
Muestre en la misma gráfica por qué recurso espera cada proceso en cada instante.
¿Cuál es el primer instante de tiempo en que se desencadena por primera vez los siguientes
escenarios?
• Finalización del quantum.
Examen de Arquitectura de Computadores Enero 2012
• Requisa después de una E/S.
• Boosting.
• Decremento de prioridad.
• Espera después de una E/S.
2
Sistemas Operativos/ssoo/Tema 4 ssoo/examen_extraordinario.pdf
Examen de Sistemas Operativos
Grados de Ingenieŕıa en Informática e
Ingenieŕıa de Computadores
16 de mayo de 2013
Normas
No se puede utilizar ningún tipo de documentación durante todo el examen.
Este ejercicio consta de dos partes independientes:
• Test de evaluación continua de la unidad 4:
◦ 10 preguntas tipo test (+1/respuesta acertada).
◦ Esta parte supondrá un 7,5 % de la calificación de la asignatura.
◦ Cada pregunta no contestada no puntúa.
◦ Se dispondrá de 20 minutos para esta parte.
◦ Se contestará a esta parte en la plantilla de respuestas incluida en este cuadernillo.
Sólo se entregará dicha plantilla de respuestas, que debe ser por lo tanto arrancada
del cuadernillo. No olvidar consignar en la plantilla el nombre, apellidos y DNI
del alumno.
• Ejercicio práctico de la evaluación continua:
◦ Esta parte supondrá un 40 % de la calificación de la asignatura.
◦ Cada uno de los dos ejercicios tiene el mismo valor.
◦ Se dispondrá de 2 horas para realizar este examen.
◦ Se contestará a cada problema por

Continuar navegando