Sistemas operativos: tres piezas sencillas. Parte 1: Introducción (traducción)

Introducción a los Sistemas Operativos

¡Hola, Habr! Me gustaría llamar su atención sobre una serie de artículos, traducciones de una literatura interesante en mi opinión: OSTEP. Este material analiza con bastante profundidad el trabajo de los sistemas operativos similares a Unix, es decir, el trabajo con procesos, varios programadores, memoria y otros componentes similares que conforman un sistema operativo moderno. Puedes ver el original de todos los materiales aquí aquí. Tenga en cuenta que la traducción se hizo de manera poco profesional (con bastante libertad), pero espero haber conservado el significado general.

El trabajo de laboratorio sobre este tema se puede encontrar aquí:
- original: páginas.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- mi adaptación personal: github.com/bykvaadm/OS/tree/master/ostep

También puedes ver mi canal en telegrama =)

Operación del programa

¿Qué sucede cuando se ejecuta un programa? Un programa en ejecución hace una cosa simple: ejecuta instrucciones. Cada segundo, el procesador recupera millones e incluso posiblemente miles de millones de instrucciones de la RAM, a su vez las decodifica (por ejemplo, reconoce a qué tipo pertenecen estas instrucciones) y las ejecuta. Esto podría ser sumar dos números, acceder a la memoria, verificar una condición, saltar a una función, etc. Después de la ejecución de una instrucción, el procesador procede a la ejecución de otra. Y así, instrucción tras instrucción, se ejecutan hasta que finaliza el programa.
Este ejemplo, naturalmente, se considera simplificado; de hecho, para acelerar el procesador, el hardware moderno le permite ejecutar instrucciones fuera de turno, calcular posibles resultados, ejecutar instrucciones simultáneamente y trucos similares.

Modelo de computación de Von Neumann

La forma simplificada de trabajo descrita por nosotros es similar al modelo de cálculo de Von Neumann. Von Neumann es uno de los pioneros de los sistemas informáticos, también es uno de los autores de la teoría de juegos.. Mientras se ejecuta el programa, tienen lugar muchos otros eventos, muchos otros procesos y la lógica de terceros funcionan, cuyo objetivo principal es simplificar el lanzamiento, la operación y el mantenimiento del sistema.
Hay un conjunto de software que es responsable de hacer que los programas sean fáciles de ejecutar (o incluso permitir que varios programas se ejecuten al mismo tiempo), que permite que los programas compartan la misma memoria y se comuniquen con diferentes dispositivos. Dicho conjunto de software (software) se denomina esencialmente sistema operativo y sus tareas incluyen monitorear que el sistema funcione de manera correcta y eficiente, así como garantizar la facilidad de administración de este sistema.

Sistema operativo

Un sistema operativo, abreviado como SO, es un conjunto de programas interrelacionados diseñados para administrar los recursos de la computadora y organizar la interacción del usuario con una computadora..
El sistema operativo logra su eficacia en primer lugar, a través de la técnica más importante: la técnica virtualización. El sistema operativo interactúa con un recurso físico (procesador, memoria, disco, etc.) y lo transforma en una forma de sí mismo más general, más poderosa y más fácil de usar. Por lo tanto, para una comprensión general, puede comparar aproximadamente el sistema operativo con una máquina virtual.
Para permitir que los usuarios den comandos al sistema operativo y, por lo tanto, utilicen las capacidades de la máquina virtual (como ejecutar un programa, asignar memoria, acceder a un archivo, etc.), el sistema operativo proporciona una interfaz llamada API (interfaz de programación de aplicaciones) y al que se pueden realizar llamadas (call). Un sistema operativo típico permite realizar cientos de llamadas al sistema.
Finalmente, dado que la virtualización permite que se ejecuten múltiples programas (compartiendo así la CPU), y simultáneamente accedan a sus instrucciones y datos (compartiendo así la memoria) y accediendo a los discos (compartiendo así los dispositivos de E/S), el sistema operativo también se denomina administrador de recursos. Cada procesador, disco y memoria es un recurso del sistema, por lo que uno de los roles del sistema operativo pasa a ser la tarea de administrar estos recursos, haciéndolo de manera eficiente, honesta o viceversa, dependiendo de la tarea para la cual este sistema operativo esta diseñado.

virtualización de CPU

Considere el siguiente programa:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Sistemas operativos: tres piezas sencillas. Parte 1: Introducción (traducción)

No realiza ninguna acción especial, de hecho, todo lo que hace es llamar a una función. girar(), cuya tarea es recorrer la verificación de tiempo y regresar después de que haya pasado un segundo. Por lo tanto, repite indefinidamente la cadena que el usuario pasó como argumento.
Ejecutemos este programa y pasémosle el carácter "A" como argumento. El resultado no es particularmente interesante: el sistema simplemente ejecuta un programa que muestra periódicamente el carácter "A".
Ahora probemos la opción cuando se están ejecutando muchas instancias del mismo programa, pero emitiendo letras diferentes para que quede más claro. En este caso, el resultado será algo diferente. A pesar de que tenemos un procesador, el programa se ejecuta simultáneamente. ¿Cómo sucede? Pero resulta que el sistema operativo, no sin la ayuda de las capacidades del hardware, crea una ilusión. La ilusión de que el sistema tiene múltiples procesadores virtuales, convirtiendo un solo procesador físico en un número teóricamente infinito y, por lo tanto, permitiendo que aparentemente los programas se ejecuten simultáneamente. Esta ilusión se llama virtualización de CPU.
Esta imagen plantea muchas preguntas, por ejemplo, si se quieren ejecutar varios programas al mismo tiempo, ¿cuál se iniciará? Las "políticas" del sistema operativo son responsables de esta pregunta. Las políticas se usan en muchos lugares del sistema operativo y responden preguntas como esta, y son los mecanismos básicos que implementa el sistema operativo. De ahí el papel del sistema operativo como administrador de recursos.

virtualización de memoria

Ahora echemos un vistazo a la memoria. El modelo físico de la memoria en los sistemas modernos se representa como una matriz de bytes.. Para leer de la memoria, debe especificar direccion de celularpara acceder a ella. Para escribir o actualizar datos, también debe especificar los datos y la dirección de la celda donde escribirlos.
Se accede a la memoria constantemente durante la ejecución del programa. Un programa almacena toda su estructura de datos en la memoria y accede a ella mediante la ejecución de varias instrucciones. Las instrucciones, por su parte, también se almacenan en la memoria, por lo que también se accede a ella para cada solicitud de la siguiente instrucción.

llamada malloc()

Considere el siguiente programa, que asigna una región de memoria usando la llamada malloc () (https://youtu.be/jnlKRnoT1m0):

Sistemas operativos: tres piezas sencillas. Parte 1: Introducción (traducción)

El programa hace varias cosas. Primero, asigna algo de memoria (línea 7), luego imprime la dirección de la celda asignada (línea 9), escribe cero en la primera ranura de la memoria asignada. A continuación, el programa entra en un bucle en el que incrementa el valor almacenado en la memoria en la dirección de la variable "p". También imprime la identificación del proceso de sí mismo. El ID del proceso es único para cada proceso en ejecución.. Habiendo lanzado varias copias, nos topamos con un resultado interesante: en el primer caso, si no hace nada y solo ejecuta varias copias, las direcciones serán diferentes. ¡Pero esto no cae bajo nuestra teoría! Correcto, ya que las distribuciones modernas tienen la aleatorización de memoria habilitada de forma predeterminada. Si lo apaga, obtenemos el resultado esperado: las direcciones de memoria de dos programas que se ejecutan simultáneamente coincidirán.

Sistemas operativos: tres piezas sencillas. Parte 1: Introducción (traducción)

Como resultado, resulta que dos programas independientes funcionan con sus propios espacios de direcciones privados, que a su vez son mapeados por el sistema operativo en la memoria física.. Por lo tanto, el uso de direcciones de memoria dentro de un programa no afectará a otros de ninguna manera, y parece que cada programa tiene su propia pieza de memoria física, totalmente asignada a él. La realidad, sin embargo, es que la memoria física es un recurso compartido administrado por el sistema operativo.

Coherencia

Otro de los temas importantes dentro de los sistemas operativos es: consistencia. Este término se usa cuando se habla de problemas en el sistema que pueden ocurrir al trabajar con muchas cosas al mismo tiempo dentro de un mismo programa. Los problemas de coherencia surgen incluso dentro del propio sistema operativo. En los ejemplos anteriores de virtualización de memoria y procesador, nos dimos cuenta de que el sistema operativo administra muchas cosas al mismo tiempo: inicia el primer proceso, luego el segundo, y así sucesivamente. Al final resultó que, este comportamiento puede conducir a algunos problemas. Entonces, por ejemplo, los programas modernos de subprocesos múltiples experimentan tales dificultades.

Considere el siguiente programa:

Sistemas operativos: tres piezas sencillas. Parte 1: Introducción (traducción)

El programa en la función principal crea dos hilos usando la llamada pthread_create(). En este ejemplo, se puede pensar en un subproceso como una función que se ejecuta en el mismo espacio de memoria junto con otras funciones, con más de una función ejecutándose claramente al mismo tiempo. En este ejemplo, cada subproceso inicia y ejecuta la función trabajador() que a su vez simplemente incrementa la variable,.

Ejecutemos este programa con un argumento de 1000. Como habrás adivinado, el resultado debería ser 2000 porque cada subproceso incrementó la variable 1000 veces. Sin embargo, no todo es tan simple. Intentemos ejecutar el programa con un orden de magnitud de más repeticiones.

Sistemas operativos: tres piezas sencillas. Parte 1: Introducción (traducción)

Al ingresar un número, por ejemplo, 100000, esperamos ver el resultado como el número 200000. Sin embargo, si ejecutamos el número 100000 varias veces, no solo no veremos la respuesta correcta, sino que también obtendremos diferentes respuestas incorrectas. La respuesta radica en el hecho de que para aumentar el número, se requieren tres operaciones: extraer el número de la memoria, incrementar y luego volver a escribir el número. Dado que todas estas instrucciones no se ejecutan atómicamente (todas al mismo tiempo), pueden suceder cosas extrañas como esta. Este problema se llama en programación condición de carrera. Cuando fuerzas desconocidas en un momento desconocido pueden afectar el desempeño de cualquiera de sus operaciones.

Fuente: habr.com

Añadir un comentario