Breve Introducción a los Sistemas Operativos
algunas de las tareas que los sistemas operativos hacen son:
-
Administrar la memoria.
-
Persistencia de datos, mantener la información del objeto de una forma permanente (guardarla), pero también debe de poder recuperarse dicha información para que pueda ser utilizada nuevamente.
-
La planificación de los procesos y los hilos, (cuando deben cerrarse, que recursos necesitan, cerrar los programas de una manera eficiente, etc).
-
Dar una interfaz a los usuarios para poder interactuar con las aplicaciones y recursos del hardware.
pero que pasa cuando ejecutamos un programa?
Cuando abrimos un programa este ejecuta instrucciones, hoy en día los programas son muy complejos que implican la ejecución de millones de instrucciones cada segundo, después el procesador obtiene instrucciones desde la memoria, las descifra y las ejecuta dependiendo de las instrucciones que tiene y repite ese proceso hasta que el programa finaliza o es cerrado por el usuario.
kernel - el corazón de los sistemas operativos
Como se puede ver en la definición de los sistemas operativos, estos son una colección de programas de software que permiten interactuar con los recursos, el kernel dentro de un sistema operativo es el que se encarga de permitir la interacción entre las aplicaciones, las impresoras, el teclado, el mouse etc. con el sistema operativo, asigna memoria, divide los recursos de la computadora de acuerdo a los programas además de dar un seguimiento al sistema de archivos.
Los drivers ayudan a los kernels a reconocer el hardware, son usados como manual de instrucciones que le permiten al kernel manejar distintos tipos de periféricos de entrada.
si expandemos un poco mas nuestra definición , no todos los drivers son hechos por las compañías que crean los periféricos, además no todos los drivers se comunican directamente con el periférico , ya que muchas veces estos funcionas como capas donde cada capa cubre una tarea, como los drivers de filtrado , estos se dedican a observar y almacenar información acerca de las peticiones de entrada y salida del dispositivo para verificar que el funcionamiento sea el adecuado, los drivers de funcionalidad por otro lado si se comunican directamente con los periféricos.
Uno de los principales tareas de los sistemas operativos actuales es permitir que múltiples procesos al mismo tiempo ocurran, como escuchar música mientras vemos alguna página de internet y descargamos un archivo, hoy en día las unidades de procesamiento central, mejor conocidas como CPU (central proccesor unit en inglés) tienen dentro de ellas múltiples cores que no son más que pequeños cpus dentro de la misma CPU, cada núcleo contiene múltiples hilos estos hilos se encargan de ejecutar las tareas individuales.
funcionamiento del kernel, los hilos y los núcleos.
digamos que compramos un procesador para una computadora y elegimos uno que contiene 8 núcleos con 16 hilos, este sería un procesador bastante potente y podríamos ejecutar muchas tareas al mismo tiempo más de los que necesitaríamos para llevar a cabo tareas de ofimática básica.
como recordatorio cada núcleo significa que tenemos una unidad de procesamiento, los 16 hilos nos permitirían ejecutar dos procesos en cada núcleo osea dividir la potencia de cada uno de esos 8 procesadores en dos.
en la antigüedad los procesadores eran de un solo núcleo y un solo hilo, funcionaban de manera mucho más simple en comparación con los CPUs modernos con múltiples núcleos y múltiples hilos. por ejemplo, Si intentabas abrir una página web mientras escribías un documento, el núcleo alternaría entre las instrucciones del navegador y las del procesador de texto, lo que resultaría en una experiencia menos fluida y posiblemente en un mayor tiempo de respuesta para ambas tareas haciendo muchas veces que la computadora tomara mucho tiempo de respuesta incluso que la tuvieras que apagar si querías una reacción de la computadora sin esperar tanto tiempo.
pero como interactúan con el kernel?
el kernel tiene la función de orquestador ósea el administra tanto los núcleos como los hilos en la unidad central de procesamiento, cuando encendemos una computadora este arranca desde la memoria ram y el kernel se almacena ahí (recordemos que la RAM es una memoria volátil por lo cual el kernel no se queda almacenado ahí cuando apagamos el computador).
cuando el kernel carga el CPU comienza a ejecutar las instrucciones del kernel, después de ello es ahí donde el kernel y los drivers entran en acción y establece configuraciones básicas, después de ello el kernel verifica la lista de aplicaciones de inicio configuradas como OneDrive y el Windows Defender(haciendo referencia a un usuario que utiliza un sistema operativo Windows reciente) después de cargar las aplicaciones predeterminadas de inicio, El kernel asigna recursos como CPU y memoria a las aplicaciones.
Una vez que las aplicaciones de inicio se han cargado y ejecutado, están listas para interactuar con el usuario, las aplicaciones que inicias manualmente como el navegador o alguna aplicación de ofimática funcionan de la misma manera, pero sin precargarse antes de iniciar sesión en el equipo.
los programas y su interacción con los hilos y los núcleos Juan es un arquitecto y ocupa programas como AutoCAD (es un programa de diseño y modelado de para superficies, objetos al que se pueden agregar texturas y luces) al abrir la aplicación, esta se divide en múltiples procesos para actuar de una manera más eficiente y cargar más rápido diferentes partes de la aplicación, pero no es tan sencillo como suena. aquí el programa de juan tiene varias retos, el paralelismo y la concurrencia de una manera eficiente para que los errores en el programa sean mínimos y el usuario no tenga problemas al ejecutarlo El paralelismo se refiere ejecutar múltiples subprocesos del programa para mejorar el rendimiento y la concurrencia a hacer algo de una manera habitual o algo ejecutar tareas en intervalos de tiempo la concurrencia generalmente incluye compartir recursos, esto se logra al sincronizar los eventos ya que si no lo hacemos de esa manera el programa final que usa el usuario no se ejecutaría de manera normal o realmente no se ejecutaría, para no alárganos mucho los programas logran esto de una manera eficiente por métodos existentes en los lenguajes de programación en los que fueron creados , como en java existe la clase Thread para manejarlos y metodos como wait() y notify() que funcionan como banderas para que se comuniquen los hilos se puedan comunicar entre ellos
para más información de programación multihilo en java ingresa a este enlace Thread (Java SE 20 & JDK 20) (oracle.com)
procesos
para finalizar hablaremos de los procesos, su estructura y como se determina su funcionamiento
los procesos no solo comparten los hilos que se encuentran en los núcleos de la unidad central de procesamiento, también comparten la memoria del sistema, el sistema operativo se encarga que los múltiples procesos que corran al mismo tiempo no interfieran en la memoria de otro proceso al mismo tiempo, a cada proceso se le asigna una parte de la memoria, y también se les permite hacer solicitudes de lectura y escritura mas conocidas como llamadas al sistema (system calls).
los procesos dividen la memoria que tienen asignada en tres partes, una parte almacena el código, otra almacena el call stack yo otra parte se encarga del heap, la parte del código es la parte del proceso que contiene las instrucciones ejecutables del programa. Es la secuencia de instrucciones en lenguaje de máquina que el procesador ejecuta. por otro lado el callstack Rastrea el flujo de ejecución del programa al registrar las llamadas a funciones que estan en el codigo ademas Almacena información relacionada con las funciones como las direcciones de retorno y las variables locales, la ultima parte es el heap este se utiliza para gestionar la memoria que se solicita y libera de manera dinámica durante la vida útil del programa.
En lenguajes de programación como C o C++, la asignación y liberación de memoria en el heap se realiza mediante funciones como malloc(), calloc(), realloc() y free(). En lenguajes como Python, JavaScript o Java, la asignación y liberación de memoria en el heap generalmente se maneja a través del sistema de gestión de memoria del lenguaje.
hay que tomar en cuenta que los procesos no pueden acceder a la memoria asignada de otro proceso o del sistema operativo, por otro lado cuando se guardan datos como leer o escribir archivos en el disco duro, El sistema operativo utiliza controladores de dispositivo para comunicarse con los dispositivos de almacenamiento. Estos controladores manejan la interfaz entre el sistema operativo y los dispositivos físicos, en esta operacion el heap no se ve afectado por otro lado para acceder a datos almacenados de manera permanente en perifericos de memoria persistente como las usb, SD, SSD y Discos Duros estos generalmente almacenan como archivos y configuraciones. La interacción con el almacenamiento persistente suele involucrar operaciones de entrada y salida controladas por el sistema operativo. La coordinación entre el almacenamiento volátil el cual es la memoria y persistente es fundamental para el funcionamiento coherente de los procesos.
los procesos muestran el siguiente ciclo de vida
-
proceso creado
-
proceso en espera
-
proceso en funcionamiento
-
proceso bloqueado
-
proceso finalizado
el proceso de espera generalmente el proceso espera por una llamada del sistema para reanudarse, algunas de estas llamadas incluyen la lectura de archivos, estas bloquean el proceso hasta que finalice la lectura del archivo, se bloquea debido a que tiene interacciones con periféricos de almacenamiento persistente son más lentos y generalmente necesita de esos archivos para seguir con el consumo del proceso, otra manera en la cual se bloquea un proceso es al conectar un periférico
comunicación entre procesos
los procesos necesitan comunicarse entre si muchas veces esto lo hacen por medio del IPC(Inter-Process Communication en inglés) que se traduce como Comunicación entre Procesos esto se refiere a los mecanismos y técnicas utilizados por los procesos en un sistema operativo para intercambiar información, compartir recursos y cooperar entre sí. En otras palabras, IPC se trata de cómo los procesos se comunican y colaboran en un sistema multitarea o multiproceso.
IPC permite a los procesos comunicarse y coordinarse entre sí. Algunas razones comunes para que los procesos necesiten comunicarse son para evitar problemas como condiciones donde múltiples procesos acceden a los mismos recursos de manera simultánea. a veces pueden necesitar intercambiar datos o información para realizar tareas colaborativas también necesitan comunicarse para enviar mensajes o señales para la coordinación o notificación de eventos y Los procesos pueden compartir recursos, como archivos o conexiones de red, a través de mecanismos de IPC.
Algunos ejemplos de mecanismos de IPC incluyen:
-
Pipes: Unidireccionales o bidireccionales, permiten la transferencia de datos entre procesos.
-
Colas de Mensajes: Permite a los procesos enviar y recibir mensajes en forma de cola.
-
Memoria Compartida: Permite que varios procesos compartan una región de memoria.
-
Signals: Se utilizan para la sincronización y el control de acceso a recursos compartidos.
-
Sockets: Utilizados para la comunicación a través de la red o en la misma máquina.
sistemas de archivos
los sistemas operativos proveen de una capa de sistemas de archivos hecha para los dispositivos de almacenamiento persistentes que permite a los procesos el acceso a a la lectura y escritura de datos el área de almacenamiento de cada unidad persistente como los discos duros, o USB están divididos por particiones , generalmente por una sola aunque muchas veces los usuarios finales de estas pueden crear más particiones, los archivos generados tienen un identificador único dentro de cada partición además esto también se aplica para los directorios de archivos (folders) creados en cada partición.
