Nicolás Aguirre Espinosa
1010124299
Actividad 4
1. Investigue en Internet un diagrama de transición de estados a dos niveles
explicando cada transición de estado mostrada.
2. Que significa PCB y que información contiene.
Bloque de control o process control block (PCB) contiene información como:
Estado
Program Counter
Registro de CPU
Información para planificación
Información para administración de memoria
Información de I/O
Estadísticas y otros
3. Que es cambio de contexto y en que se traduce.
Se refiere a cuando el sistema operativo entrega a la CPU a un nuevo proceso,
debe guardar el estado del proceso ejecutando, y cargar al estado del nuevo
proceso. El es estado de un proceso comprende el PC, y los registros de la CPU.
Algunos procesadores tienen instrucciones especiales para guardar todos lo
registros de una vez. Otros tienen varios conjuntos de registros, de manera que un
cambio de contexto se hace simplemente cambiando el puntero al conjunto actual
de registros.
4. Investigue en Internet un diagrama de procesos en unix que explique
la creación procesos.
5. Que es cambio de contexto.
Se refiere a cuando el sistema operativo entrega a la CPU a un nuevo proceso,
debe guardar el estado del proceso ejecutando, y cargar al estado del nuevo
proceso. El es estado de un proceso comprende el PC, y los registros de la CPU.
Algunos procesadores tienen instrucciones especiales para guardar todos lo
registros de una vez. Otros tienen varios conjuntos de registros, de manera que un
cambio de contexto se hace simplemente cambiando el puntero al conjunto actual
de registros.
6. Explique la creación de procesos haciendo uso de la jerarquía de
procesos en unix.
Cuando se carga el sistema operativo, se inicializa un proceso init para cada
terminal, que se encarga de solicitar nombre y clave. Cuando un usuario entra,
para cada terminal, que se encarga de solicitar nombre y clave. Cuando un
usuario entra, login determina que Shell le corresponde al usuario, y crea otro
proceso para ejecutar esa Shell. A su vez, la Shell crea más procesos según los
comando que ejecute el usuario, generadose así todo un árbol de procesos según
los comandos que ejecute el usuario, generándose así todo un árbol de proceso:
proceso tiene cero o más hijos, y exactamente un padre.
7. Investigue en Internet las nativas en posix para crear y eliminar
procesos con ejemplos.
En general, en sistemas operativos y lenguajes de programación, se llama
bifurcación o fork a la creación de un subproceso copia del proceso que llama a la
función. El subproceso creado, o “proceso hijo”, proviene del proceso originario, o
“proceso padre”. Los procesos resultantes son idénticos, salvo que tienen distinto
número de proceso (PID)15. En UNIX otra forma de crear subprocesos es utilizar
tuberías o pipes, las cuáles son esenciales para la comunicación inter-procesos,
por ejemplo:
El listado siguiente (ejemplo-fork.c) es un ejemplo de uso de fork que controla qué
tipo de proceso es el que ejecuta el código utilizando el valor devuelto por la
función, así como otras funciones POSIX para obtener información de los
procesos
Un ejemplo de llamada a este código sería:
En este ejemplo el proceso padre no queda bloqueado esperando al hijo, prueba a poner un
valor menor de espera (sleep) para el padre que para el hijo:
Si quisiéramos que el proceso padre esperase a que el proceso (o los procesos) hijos
terminasen, debemos utilizar la función wait18. El valor devuelto por la función wait es el
PID del proceso hijo que se está esperando que termine, si se le ha pasado un PID como
argumento. Si sólo se le pasa &status, wait() espera a que terminen todos los procesos hijos
y devuelve el PID del último proceso en terminar. Un ejemplo:
En ocasiones puede interesar ejecutar un programa distinto, no diferentes partes de él, y se
quiere iniciar este segundo proceso diferente desde el programa principal. La familia de
funciones exec() permiten iniciar un programa dentro de otro programa. En lugar de crear
una copia del proceso, como fork(), exec() provoca el reemplazo total del programa que
llama a la función por el programa llamado. Por ese motivo se suele utilizar exec() junto
con fork(), de forma que sea un proceso hijo el que cree el nuevo proceso para que el
proceso padre no sea destruido. Podemos ver este mecanismo en el siguiente código de
ejemplo:
8. Describa el problema productor / consumidor y las formas de programar
su solución con sus inconvenientes.
Problema:
¿Cómo coordinamos a los productores y consumidores, para que los
productores no produzcan más ítems de los que se pueden almacenar en el
momento, y los consumidores no adquieran más ítems de los que hay
disponibles?.
Solución:
Desde el punto de vista de la programación concurrente la solución a este
problema se plantea a través de herramientas de sincronización. La primera
solución y la más sencilla es implementar bodegas que sean excluyentes,
es decir si un consumidor o productor se encuentra haciendo de la bodega,
nadie más pueda hacerlo, indicando este estado con cualquier tipo de señal
o aviso, implementado a través de semáforos binarios.
La anterior solución aunque es funcional y completamente viable, no es del
todo acertada, luego de profundizar en el enfoque de la programación
concurrente se destaca que tiene fallos muy probables, debido a que puedo
agregar más actores a este ambiente, y si solo uno de estos no aplica la
metodología del semáforo de manera acertada la información se
corromperá, además de contener un bloque de código igual en todos los
consumidores y productores. Para solucionar esto se plantea una solución
a través de un monitor el cual se encargará de revisar los procesos de
compra y producción, eliminando así el código clonado, además de
organizar los procesos desde el objeto de las bodegas en sí.
9. Cuál es el inconveniente de usar hebras desde los programas y no desde
el sistema operativo.
Es que si una de las hebras hace una llamada bloqueante, el sistema operativo
bloquea todo el proceso, aún cuando haya otras hebras listas para ejecutar.
10. Cuál es el uso natural de las hebras con ejemplos.
El caso productor- consumidor y el otro es el uso en los servidores.
Ejemplo.
Servidor de archivos, que recibe solicitudes para leer y escribir archivos en un
disco. Para mejorar el rendimiento, el servidor mantiene un caché con los datos
más recientemente usados, en la eventualidad que reciba algún requerimiento
para leer esos datos, no es necesario acceder al disco. Cuando se recibe una
solicitud, se le asigna o un thread para que la atienda. Si ese thread se bloquea
porque tuvo que acceder al disco, otros threads pueden seguir atendiendo
otras solicitudes. La clave es que el buffer debe ser compartido por todos los
threads, lo que no podría hacerse si se usa un proceso para cada solicitud.
En la próxima clase debe estar preparado para socializar estos temas.