Ampliación de denuncia del Fiscal Federal por medicamentos en La Rioja
Sistema operativo
1. Republica Bolivariana de Venezuela Ministerio del Poder Popular para la Educación Superior Instituto Universitario de Tecnología Juan Pablo Pérez Alfonzo Iutepal Puerto cabello – Edo. Carabobo Sistema Operativo Bachilleres: Coello, Jhoan Lugo Yonaike Valero Elvis Pérez Luis Profesora: Maricela,Manterrano Enero 2011
2. Concurrencia Dos o más procesos decimos que son concurrentes, paralelos, o que se ejecutan concurrentemente, cuando son procesados al mismo tiempo, es decir, que para ejecutar uno de ellos, no hace falta que se haya ejecutado otro. La concurrencia comprende un gran número de cuestiones de diseño, incluyendo la comunicación entre procesos, comparación y competencia por los recursos, sincronización de la ejecución de varios procesos y asignación del tiempo de procesador a los procesos y es fundamental para que existan diseños como Multiprogramación.
3. Procesos de Concurrentes. En un sistema multiprogramado con un único procesador, los procesos se intercalan en el tiempo para dar la apariencia de ejecución simultánea. Cuando dos o más procesos se encuentran activos de forma simultánea (aunque esto no implica, que su ejecución física sea simultánea), se dice que son Concurrentes. Esta situación puede representarse como se observa en la siguiente gráfica: En la gráfica anterior puede verse que los procesos P1 y P2 son concurrentes, mientras que P2 y P3 no lo son.
4.
5. Acelera los cálculos, dividiendo una tarea en procesos que se ejecutan de forma paralela.
6. Posibilita el uso interactivo a múltiples usuarios que trabajan de forma simultánea desde varios terminales.
7.
8. Dependientes: Estos trabajan de forma conjunta en alguna actividad, por lo que deben ser capaces de comunicarse e interactuar entre ellos, para ello se crean se crean mecanismos de comunicación y coordinación entre ellos.
9.
10.
11.
12.
13.
14. Se verifica al siguiente cliente cercano al límite y así sucesivamente.
21. Los procesos mantienen los recursos mientras piden y esperan por otros recursos adicionales, pero no pueden apropiarse de un proceso que mantenga esos recursos.
38. En la última columna se tienen los recursos disponibles que da el sistema, los que se pueden utilizar con todos los procesos. Hay 3 del A, 3 del B y 2 del C. El algoritmo del banquero trata de asegurar qué proceso tiene un “estado seguro” es decir, se requiere alcanzar el máximo requerido entre los que estén en Asignados y los que se encuentren en Disponibles. Ejemplo: El proceso 0 no está en estado seguro. Si se suman Asignados + Disponibles para cada uno de los recursos A, B y C, realmente no se alcanzan los Máximos Requeridos. Entonces se va al proceso 1 y se trata de hacer lo mismo, sumar Asignados + Disponibles. Allí sí se tiene un ESTADO SEGURO, A con 5, B con 3 y C con 2, y como se alcanza a llenar los Máximos, ese proceso se ejecuta. Una vez que el proceso se ejecutó, entonces se procede a SUMAR los recursos asignados del proceso anterior a los disponibles. Hay que recordar que el proceso al terminar de ejecutarse libera todos sus recursos, por lo tanto pasan tanto los de tipo A, B y C a sumarse con los disponibles 3-3-2 y se tendrán nuevos DISPONIBLES que repartir, siendo ahora éstos 5-3-2
39. Con estos se pasa al proceso P2 y así sucesivamente. Y el algoritmo es como sigue: (El algoritmo principal es el de asignación de recursos)
40.
41.
42.
43.
44. Permitir a un máximo de N threads acceder a un recurso, inicializando el semáforo en N
45.
46. const int n /* número de procesos */ variable semáforo s; /* declaración de la variable semáforo de valor entero*/ Inicia (s,1) /* Inicializa un semáforo con nombre s con valor 1 */ void P (int i) { while (cierto) { P(s) /* En semáforos binarios, lo correcto es poner un P(s) antes de entrar en la sección crítica, para restringir el uso de esta región del código*/ /* SECCIÓN CRÍTICA */ V(s) /* Tras la sección crítica, volvemos a poner el semáforo a 1 para que otro proceso pueda usarla */ /* RESTO DEL CÓDIGO */ } } int main() { Comenzar-procesos(P(1), P(2),...,P(n)); }
50. La implementación del monitor garantiza la exclusión mutua• mediante semáforos o algún otro mecanismo • o implícitamente en los lenguajes concurrentes
51. Un monitor tiene cuatro componentes: inicialización, datos privados, procedimientos del monitor y cola de entrada. Inicialización: contiene el código a ser ejecutado cuando el monitor es creado Datos privados: contiene los procedimientos privados, que sólo pueden ser usados desde dentro del monitor y no son visibles desde fuera Procedimientos del monitor: son los procedimientos que pueden ser llamados desde fuera del monitor. Cola de entrada: contiene a los hilos que han llamado a algún procedimiento del monitor pero no han podido adquirir permiso para ejecutarlos aún. Funcionamiento del monitor Cada uno de los objetos del sistema operativo contiene una serie de contadores que permiten conocer el estado de actividad del objeto. Para algunos de estos objetos, los contadores deben ser activados antes de ejecutar el monitor del sistema. Ejemplos de objetos que podemos monitorizar son las unidades de disco físicas, los procesadores, la memoria física, la memoria caché, y otros componentes, que incluyen los componentes del sistema de red. Incluso algunas aplicaciones como servidores SQL y otros pueden añadir sus propios tipos de objetos y contadores.
54. Mutex es la abreviatura de “mutual exclusión”, es decir, exclusión mutua. Las variables Mutex son la forma más común de implementar la sincronización de threads y de proteger datos compartidos cuando acontecen multitud de escrituras sobre esos datos compartidos. Una variable Mutex actúa como un candado protegiendo los datos o recursos. El concepto básico de Mutex en Pthreads es que sólo un thread puede cerrar el candado en un determinado instante. Incluso si varios threads intentan cerrar el mismo candado sólo uno saldrá victorioso. Ningún otro thread podrá poseer ese Mutex hasta que el que lo cerró lo abra. Es decir, con esto conseguimos que los threads se turnen para acceder a datos protegidos o compartidos.
55. Los Mutex pueden ser usados para prevenir “condiciones de carrera”. Este es un ejemplo de una “condición de carrera” en una transacción de un banco. Una típica secuencia en el uso de un Mutex es: 1. Crear e inicializar la variable Mutex. 2. Varios threads intentan bloquear el Mutex. 3. Sólo uno lo hace y es el poseedor del Mutex. 4. El poseedor del Mutex realiza un conjunto de acciones. 5. El poseedor del Mutex desbloquea el Mutex. 6. Otro thread toma el Mutex y repite el proceso. 7. Finalmente el Mutex es destruido. Cuando varios threads compiten por un Mutex, los perdedores se bloquean hasta que el ganador desbloquea el Mutex.
57. Paginación Simple Es una técnica de manejo de memoria, en la cual el espacio de memoria se divide en secciones físicas de igual tamaño, denominadas marcos de página. Los programas se dividen en unidades lógicas, denominadas páginas, que tienen el mismo tamaño que los marcos de páginas. De esta forma, se puede cargar una página de información en cualquier marco de página. Las páginas sirven como unidad de almacenamiento de información y de transferencia entre memoria principal y memoria auxiliar o secundaria. Cada marco se identifica por la dirección de marco, que esta en la posición física de la primera palabra en el marco de página.
58. Paginación simple con este método la memoria principal se divide en muchos marcos pequeños de igual tamaño. Cada proceso se divide en páginas de igual tamaño; los procesos más pequeños requieren menos páginas, procesos mayores requieren mas espacio de memoria. Cuando un proceso se trae a la memoria todas sus páginas se cargan en los marcos disponibles y se establece una tabla de páginas, facilitando la localización de las referencias o direcciones que se le asignaron a estas y se evita, la fragmentación tanto interna como externa.
59. Segmentación Paginada Paginación y segmentación son técnicas diferentes, cada una de las cuales busca brindar las ventajas enunciadas anteriormente. Para la segmentación se necesita que estén cargadas en memoria, áreas de tamaños variables. Si se requiere cargar un segmento en memoria; que antes estuvo en ella y fue removido a memoria secundaria; se necesita encontrar una región de la memoria lo suficientemente grande para contenerlo, lo cual no es siempre factible; en cambio "recargar" una pagina implica solo encontrar un merco de pagina disponible. A nivel de paginación, si quiere referenciar en forma cíclicas n paginas, estas deberán ser cargadas una a una generándose varias interrupciones por fallas de paginas; bajo segmentación, esta pagina podría conformar un solo segmento, ocurriendo una sola interrupción, por falla de segmento
60.
61.
62. Algoritmo de Paginación FIFO El algoritmo de sustitución de páginas de primera que entra, primera que sale (FIFO) Otro algoritmo de paginación con bajo gasto extra es el algoritmo FIFO (primera que entra, primera que sale). Para ilustrar su funcionamiento, consideremos un supermercado que tiene suficientes anaqueles para exhibir exactamente k productos distintos. Un día, alguna compañía introduce un nuevo alimento: yogurt orgánico liofilizado instantáneo que puede reconstituirse en un homo de microondas. Su éxito es inmediato, así que nuestro supermercado finito tiene que deshacerse de un producto viejo para poder tener el nuevo en exhibición. Una modificación sencilla de FIFO que evita el problema de desalojar una página muy utilizada consiste en inspeccionar el bit R de la página más vieja. Si es O, sabremos que la página, además de ser vieja, no ha sido utilizada recientemente, así que la reemplazamos de inmediato. Si el bit R es 1, se apaga el bit, se coloca la página al final de la lista de páginas, y se actualiza su tiempo de carga como si acabara de ser traída a la memoria. Luego continúa la búsqueda.
63. Algoritmo de Paginación LRU El algoritmo de sustitución de páginas menos recientemente usadas (LRU) Una buena aproximación al algoritmo óptimo se basa en la observación de que las páginas que han usado mucho en las últimas instrucciones probablemente se usarán mucho en las siguientes. Por otro lado, las páginas que hace mucho no se usan probablemente seguirán sin usarse durante largo tiempo. Esta idea sugiere un algoritmo factible: cuando ocurra una falla de página, se desalojará la página que haya estado más tiempo sin usarse. Esta estrategia se denomina paginación LRN (menos recientemente utilizada). Aunque LRU es factible en teoría, no es barato. Si queremos implementar LRU plenamente, necesitamos mantener una lista enlazada de todas las páginas que están en la memoria, con la página más recientemente utilizada al frente y la menos recientemente utilizada al final
64. Algoritmo de Paginación Optimo El mejor algoritmo de reemplazo de páginas posible es fácil de describir pero imposible de implementar. En el momento en que ocurre una falla de páginas, algún conjunto de páginas está en la memoria. A una de estas páginas se hará referencia en la siguiente instrucción (la página que contiene esa instrucción). Otras páginas podrían no necesitarse sino hasta 10, 100 o tal vez 1000 instrucciones después. Cada página puede rotularse con el número de instrucciones que se ejecutarán antes de que se haga referencia a esa página. El algoritmo de reemplazo de páginas óptimo simplemente dice que se debe eliminar la página que tenga el rótulo más alto. Si una página no se va a usar sino hasta después de 8 millones de instrucciones y otra página no se usará sino hasta después de 6 millones de instrucciones, el desalojo de la primera postergará la falla de página que la traerá de nuevo a la memoria lo más lejos hacia el futuro que es posible. Las computadoras, al igual que las personas, tratan de aplazar los sucesos desagradables el mayor tiempo que se puede