{"id":2284,"date":"2020-10-14T15:14:17","date_gmt":"2020-10-14T20:14:17","guid":{"rendered":"https:\/\/naps.com.mx\/blog\/?p=2284"},"modified":"2021-12-05T10:15:57","modified_gmt":"2021-12-05T16:15:57","slug":"administracion-de-procesos-en-sistemas","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/administracion-de-procesos-en-sistemas\/","title":{"rendered":"Entendiendo administraci\u00f3n de procesos en Sistemas Operativos"},"content":{"rendered":"<p>Aprenderemos m\u00e1s sobre la administraci\u00f3n de procesos en <a href=\"https:\/\/naps.com.mx\/blog\/introduccion-a-los-sistemas-operativos\/\">Sistemas Operativos<\/a>. Hablamos de procesos, hilos, regiones cr\u00edticas, mutex y sem\u00e1foros.<\/p>\n<p><!--more--><\/p>\n<h2>Administraci\u00f3n de procesos<\/h2>\n<h2>\u00bfQu\u00e9 es un proceso?<\/h2>\n<p>Un proceso es la \u00abimagen en memoria de un programa\u00bb (Wolf, 2014). Un proceso es una entidad <strong>activa<\/strong> que emplea un programa (lista de instrucciones) para definir c\u00f3mo actuar\u00e1 el sistema.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-programas.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2291\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-programas.png\" alt=\"administracion de procesos programas\" width=\"1368\" height=\"840\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-programas.png 1368w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-programas-300x184.png 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-programas-768x472.png 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-programas-1024x629.png 1024w\" sizes=\"auto, (max-width: 1368px) 100vw, 1368px\" \/><\/a><\/p>\n<h2>Estados de un proceso<\/h2>\n<p>Un proceso pasa por diferentes estados:<\/p>\n<p><strong>Nuevo<\/strong>.\u00a0Cuando se crean las estructuras y recursos que utilizar\u00e1 un proceso.<\/p>\n<p><strong>Listo<\/strong>. Cuando est\u00e1 listo para iniciar, pero a\u00fan no tiene asignado un procesador.<\/p>\n<p><strong>En ejecuci\u00f3n<\/strong>. Cuando sus instrucciones est\u00e1n siendo ejecutadas por un procesador.<\/p>\n<p><strong>Bloqueado<\/strong>. Si est\u00e1 esperando que algo ocurra a fin de poder continuar su ejecuci\u00f3n.<\/p>\n<p><strong>Terminado<\/strong>. Cuando el proceso termin\u00f3 de ejecutarse y se est\u00e1 a la espera de que el sistema operativo limpie las estructuras que utiliz\u00f3.<\/p>\n<div id=\"attachment_2292\" style=\"width: 610px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-estados.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2292\" class=\"wp-image-2292 size-full\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-estados.jpg\" alt=\"administracion de procesos estados\" width=\"600\" height=\"201\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-estados.jpg 600w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-estados-300x101.jpg 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-2292\" class=\"wp-caption-text\">Administraci\u00f3n de procesos: Estados de un proceso<\/p><\/div>\n<h2>Procesos vs Hilos<\/h2>\n<p>Debido a la complejidad que conlleva el manejo de procesos, se dise\u00f1\u00f3 una soluci\u00f3n que involucra el uso de procesos ligeros tambi\u00e9n conocidos como <strong>hilos de ejecuci\u00f3n<\/strong>.<\/p>\n<p>\u00bfQu\u00e9 diferencia hay? En el caso de los procesos, el sistema operativo se encarga de ofrecerle cierta exclusividad sobre la computadora. Por otra parte, los hilos de un proceso comparten un solo espacio de direccionamiento (memoria), archivos y dispositivos.<\/p>\n<p>La programaci\u00f3n de hilos puede hacerse sin involucrar al sistema operativo, por lo que incluso un sistema operativo que no maneje multiprocesamiento, puede crear procesos que manejen multitarea interna.<\/p>\n<div id=\"attachment_2294\" style=\"width: 292px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilos.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2294\" class=\"wp-image-2294 size-full\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilos.png\" alt=\"administracion de procesos hilos\" width=\"282\" height=\"394\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilos.png 282w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilos-215x300.png 215w\" sizes=\"auto, (max-width: 282px) 100vw, 282px\" \/><\/a><p id=\"caption-attachment-2294\" class=\"wp-caption-text\">Administraci\u00f3n de procesos: Un proceso con tres hilos<\/p><\/div>\n<h2>C\u00f3mo trabajan los hilos<\/h2>\n<p>Los hilos pueden trabajar siguiendo alguno de \u00e9stos patrones:<\/p>\n<h3>Jefe \/ Trabajador<\/h3>\n<p>Existe un hilo jefe que recopila las tareas y se las encarga a hilos trabajadores. Un ejemplo de \u00e9sto es un servidor web, que tiene un hilo que est\u00e1 escuchando las peticiones, y cuando ocurre una, le asigna la tarea a otro hilo, permiti\u00e9ndose como jefe permanecer atento a cualquier otra petici\u00f3n.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administraci\u00f3n-de-procesos-hilo-jefe.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2296\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administraci\u00f3n-de-procesos-hilo-jefe.png\" alt=\"administraci\u00f3n de procesos hilo jefe\" width=\"318\" height=\"350\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administraci\u00f3n-de-procesos-hilo-jefe.png 536w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administraci\u00f3n-de-procesos-hilo-jefe-273x300.png 273w\" sizes=\"auto, (max-width: 318px) 100vw, 318px\" \/><\/a><\/p>\n<h3>Equipo de trabajo<\/h3>\n<p>Un conjunto de hilos id\u00e9nticos realizan la misma tarea sobre conjuntos diferentes de datos. Este modelo es empleado, por ejemplo, para realizar c\u00e1lculos matem\u00e1ticos complejos.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-equipo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2297\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-equipo.png\" alt=\"administracion de procesos hilo equipo\" width=\"283\" height=\"330\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-equipo.png 724w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-equipo-258x300.png 258w\" sizes=\"auto, (max-width: 283px) 100vw, 283px\" \/><\/a><\/p>\n<h3>L\u00ednea de ensamblado<\/h3>\n<p>Una tarea larga es dividida en diferentes pasos. Cada hilo se enfoca en un solo paso y cuando termina le pasa los datos al siguiente hilo.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-linea.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2298\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-linea.png\" alt=\"administracion de procesos hilo linea\" width=\"854\" height=\"208\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-linea.png 854w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-linea-300x73.png 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-hilo-linea-768x187.png 768w\" sizes=\"auto, (max-width: 854px) 100vw, 854px\" \/><\/a><\/p>\n<h2>El problema: la concurrencia<\/h2>\n<p>El manejo de hilos en multitarea requiere conocimiento de los problemas de concurrencia que pudieran surgir. Esto ocurre principalmente cuando dos procesos comparten informaci\u00f3n o dependen uno del otro.<\/p>\n<h2>Ejemplo: El problema del jard\u00edn ornamental<\/h2>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/torniquete.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2305\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/torniquete.jpg\" alt=\"\" width=\"230\" height=\"150\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/torniquete.jpg 750w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/torniquete-300x196.jpg 300w\" sizes=\"auto, (max-width: 230px) 100vw, 230px\" \/><\/a><\/p>\n<p>Piense en un hermoso jard\u00edn al que muchos visitantes desean visitar. Para entrar a \u00e9l, se requiere que los visitantes pasen por uno de dos torniquetes. Se desea llevar un conteo general de los visitantes que pasan por los torniquetes. Un programa que hiciese esto ser\u00eda as\u00ed (pseudoc\u00f3digo):<\/p>\n<div>\n<pre class=\"lang:c decode:true\">int cuenta; \r\nproceso torniquete1() {\r\n    int i;\r\n\r\n\tfor(i=0;i&lt;20;i++) {\r\n\t\tcuenta = cuenta + 1;\r\n\t}\r\n}\r\n\r\nproceso torniquete2() {\r\n    int i;\r\n\r\n\tfor(i=0;i&lt;20;i++) {\r\n\t\tcuenta = cuenta + 1;\r\n\t}\r\n}\r\n\r\ncuenta = 0;\r\nconcurrentemente { \r\n    torniquete1();\r\n    torniquete2();\r\n}\r\n\/* Esperar a que ambos finalicen *\/\r\n\r\nprint(\"Cuenta: %d\\n\", cuenta);\r\n<\/pre>\n<p>Ahora bien, la instrucci\u00f3n<\/p>\n<\/div>\n<div class=\"page\" title=\"Page 52\">\n<div class=\"layoutArea\">\n<div class=\"column\">\n<p><em><strong>cuenta = cuenta + 1;<\/strong><\/em><\/p>\n<p>internamente realiza tres operaciones:<\/p>\n<ul>\n<li>Leer el valor actual de cuenta<\/li>\n<li>Incrementar cuenta<\/li>\n<li>Guardar el nuevo valor de cuenta<\/li>\n<\/ul>\n<p>Como los procesos ocurren concurrentemente, puede darse el siguiente conjunto de operaciones:<\/p>\n<p>Torniquete1: Leer<\/p>\n<p>Torniquete1: Incrementar<\/p>\n<p>Torniquete2: Leer<\/p>\n<p>Torniquete2: Incrementar<\/p>\n<p>Torniquete1: Escribir<\/p>\n<p>Torniquete2: Escribir<\/p>\n<p>De modo que ambos leyeron el mismo valor (por ejemplo, 1), y ambos escribieron el nuevo valor de 2. (Aunque el resultado deber\u00eda ser 3, pues cada uno increment\u00f3 en uno el valor &#8216;anterior&#8217;).<\/p>\n<\/div>\n<p>Podemos observar que la instrucci\u00f3n que genera el problema es:<\/p>\n<p><em><strong>cuenta=cuenta+1<\/strong><\/em><\/p>\n<p>A esa parte del c\u00f3digo se le conoce como <strong>Regi\u00f3n Cr\u00edtica<\/strong>.<\/p>\n<h2>Regi\u00f3n Cr\u00edtica<\/h2>\n<p>\u00bfQu\u00e9 es una regi\u00f3n cr\u00edtica? Una regi\u00f3n cr\u00edtica es el \u00e1rea de c\u00f3digo que debe ser protegida de accesos simult\u00e1neos, pues en ella se realizan modificaciones de datos compartidos.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-region-critica.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2302\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-region-critica.jpg\" alt=\"administracion de procesos region critica\" width=\"246\" height=\"310\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-region-critica.jpg 572w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-region-critica-238x300.jpg 238w\" sizes=\"auto, (max-width: 246px) 100vw, 246px\" \/><\/a><\/p>\n<div class=\"column\">\u00a0Una soluci\u00f3n al problema del jard\u00edn ornamental es el <strong>algoritmo de Peterson<\/strong>.<\/div>\n<\/div>\n<\/div>\n<div><\/div>\n<div>\u00c9ste algoritmo utiliza <strong>banderas<\/strong> para indicar qu\u00e9 proceso puede entrar a la regi\u00f3n cr\u00edtica. Pero agrega un <strong>turno<\/strong> para desempatar en caso de que ambos busquen entrar a la vez. Si un proceso detecta que el otro intent\u00f3 entrar, lo deja pasar.<\/div>\n<div>Pseudoc\u00f3digo:<\/div>\n<pre class=\"lang:c decode:true \">int b1, b2;  \/\/ Uso de banderas para decidir qui\u00e9n entra\r\nint turno;\t \/\/ Turno para desempatar\r\n\/* Proceso 1: *\/ \r\nb1=1;\r\nquien=2;\r\nif ( b2 &amp;&amp; (quien==2)) { \r\n\tesperar();\r\n}\r\ncuenta = cuenta + 1;  \/\/ Secci\u00f3n cr\u00edtica\r\nb1=0;\r\n\r\n\/* Proceso 2: *\/ \r\nb2=1;\r\nquien=1;\r\nif ( b1 &amp;&amp; quien==1) { \r\n\tesperar();\r\n}\r\ncuenta = cuenta + 1; \/\/ Secci\u00f3n cr\u00edtica\r\nb1=0;<\/pre>\n<p>\u00c9ste algoritmo tiene el problema de la <strong>espera activa<\/strong>.<\/p>\n<p>\u00bfQu\u00e9 es la <strong>espera activa<\/strong>? \u00c9sta situaci\u00f3n ocurre cuando un proceso est\u00e1 consumiendo tiempo del procesador y lo \u00fanico que hace es esperar a que otro proceso cambie una bandera. En algunas ocasiones hacer algo as\u00ed afecta el desempe\u00f1o global.<\/p>\n<p>Una alternativa para evitar la espera activa es el uso de <strong>mutex<\/strong>.<\/p>\n<h2>Mutex<\/h2>\n<p>\u00bfQu\u00e9 es mutex? Esa palabra proviene del t\u00e9rmino en ingl\u00e9s Mutual Exclusi\u00f3n, que podr\u00eda traducirse como <strong>Exclusi\u00f3n Mutua<\/strong>. Una exclusi\u00f3n mutua es una forma de conseguir que cierta parte del c\u00f3digo se ejecute como si fuera <strong>at\u00f3mica<\/strong>. (Una operaci\u00f3n at\u00f3mica ocurre cuando el sistema garantiza que ejecutar\u00e1 la operaci\u00f3n como una sola unidad, o bien fallar\u00e1 sin resultados parciales. No es que evite retirar el flujo de ejecuci\u00f3n en medio de la operaci\u00f3n, sino que a\u00fan si retirara el flujo, la operaci\u00f3n no caer\u00e1 en un resultado inconsistente).<\/p>\n<p>Los mutex permiten su uso a trav\u00e9s de una variable conocida como <strong>sem\u00e1foro<\/strong>.<\/p>\n<p>\u00bfQu\u00e9 es un <strong>sem\u00e1foro<\/strong>? Una variable de tipo entera que debe ser inicializada con un n\u00famero, se puede decrementar para bloquearse en espera (wait o acquire), o se puede incrementar, despertando hilos en espera (release).<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-mutex.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2300\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-mutex.png\" alt=\"administracion de procesos mutex\" width=\"370\" height=\"122\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-mutex.png 370w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/10\/administracion-de-procesos-mutex-300x99.png 300w\" sizes=\"auto, (max-width: 370px) 100vw, 370px\" \/><\/a><\/p>\n<p>\u00c9stos fueron algunos de los principales conceptos que se requiere conocer para entender c\u00f3mo el sistema operativo realiza la administraci\u00f3n de procesos.<\/p>\n<h3>Referencias<\/h3>\n<ol>\n<li>Wolf (2014). Sistemas operativos. Proyecto LaTIn.<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<p>Reconocimiento por uso de ilustraciones:<\/p>\n<ol>\n<li>Estados de un proceso. Im\u00e1gen tomada de\u00a0https:\/\/www.tutorialspoint.com\/operating_system\/os_processes.htm<\/li>\n<li>Hilos. Im\u00e1gen tomada de\u00a0https:\/\/www.tutorialspoint.com\/operating_system\/os_multi_threading.htm<\/li>\n<li>Mutex. Imagen tomada de\u00a0https:\/\/www.keil.com\/pack\/doc\/cmsis\/RTOS\/html\/group__CMSIS__RTOS__MutexMgmt.html<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<h2>Te puede interesar:<\/h2>\n<p><iframe loading=\"lazy\" width=\"751\" height=\"422\" src=\"https:\/\/www.youtube.com\/embed\/gExUhQb0CNA\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aprenderemos m\u00e1s sobre la administraci\u00f3n de procesos en Sistemas Operativos. Hablamos de procesos, hilos, regiones cr\u00edticas, mutex y sem\u00e1foros.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[43],"tags":[317,318,312],"class_list":["post-2284","post","type-post","status-publish","format-standard","hentry","category-sistemas-operativos","tag-administracion-de-procesos","tag-hilos","tag-sistemas-operativos"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=2284"}],"version-history":[{"count":14,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2284\/revisions"}],"predecessor-version":[{"id":2306,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/2284\/revisions\/2306"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=2284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=2284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=2284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}