{"id":155,"date":"2009-08-22T13:46:54","date_gmt":"2009-08-22T18:46:54","guid":{"rendered":"http:\/\/blog.espol.edu.ec\/nena\/?p=155"},"modified":"2009-08-22T13:46:54","modified_gmt":"2009-08-22T18:46:54","slug":"memoria-virtual","status":"publish","type":"post","link":"https:\/\/blog.espol.edu.ec\/nena\/2009\/08\/22\/memoria-virtual\/","title":{"rendered":"Memoria Virtual"},"content":{"rendered":"<p style=\"text-align: justify\"><span style=\"color: #000080\">La <strong>memoria virtual<\/strong> es una t\u00e9cnica que permite al <\/span><a title=\"Software\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Software\"><span style=\"color: #000080\">software<\/span><\/a><span style=\"color: #000080\"> usar m\u00e1s memoria principal que la que realmente posee el ordenador. La mayor\u00eda de los ordenadores tienen cuatro tipos de memoria: registros en la <\/span><a class=\"mw-redirect\" title=\"CPU\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/CPU\"><span style=\"color: #000080\">CPU<\/span><\/a><span style=\"color: #000080\">, la <\/span><a class=\"mw-redirect\" title=\"Memoria cache\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Memoria_cache\"><span style=\"color: #000080\">memoria cach\u00e9<\/span><\/a><span style=\"color: #000080\"> (tanto dentro como fuera del CPU), la memoria f\u00edsica (generalmente en forma de <\/span><a title=\"Memoria de acceso aleatorio\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Memoria_de_acceso_aleatorio\"><span style=\"color: #000080\">RAM<\/span><\/a><span style=\"color: #000080\">, donde la CPU puede escribir y leer directa y razonablemente r\u00e1pido) y el disco duro que es mucho m\u00e1s lento, pero tambi\u00e9n m\u00e1s grande y barato.<\/span><\/p>\n<p><span style=\"color: #000080\"><!--more--><\/span><\/p>\n<p><span style=\"color: #000080\">Muchas aplicaciones requieren el acceso a m\u00e1s informaci\u00f3n (c\u00f3digo y datos) que la que se puede mantener en memoria f\u00edsica. Esto es as\u00ed sobre todo cuando el sistema operativo permite m\u00faltiples procesos y aplicaciones ejecut\u00e1ndose simult\u00e1neamente. Una soluci\u00f3n al problema de necesitar mayor cantidad de memoria de la que se posee consiste en que las aplicaciones mantengan parte de su informaci\u00f3n en disco, movi\u00e9ndola a la memoria principal cuando sea necesario. Hay varias formas de hacer esto. Una opci\u00f3n es que la aplicaci\u00f3n misma sea responsable de decidir qu\u00e9 informaci\u00f3n ser\u00e1 guardada en cada sitio (segmentaci\u00f3n), y de traerla y llevarla. La desventaja de esto, adem\u00e1s de la dificultad en el dise\u00f1o e implementaci\u00f3n del programa, es que es muy probable que los intereses sobre la memoria de dos o varios programas generen conflictos entre s\u00ed: cada programador podr\u00eda realizar su dise\u00f1o teniendo en cuenta que es el \u00fanico programa ejecut\u00e1ndose en el sistema. La alternativa es usar memoria virtual, donde la combinaci\u00f3n entre <\/span><a title=\"Hardware\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Hardware\"><span style=\"color: #000080\">hardware<\/span><\/a><span style=\"color: #000080\"> especial y el <\/span><a title=\"Sistema operativo\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Sistema_operativo\"><span style=\"color: #000080\">sistema operativo<\/span><\/a><span style=\"color: #000080\"> hace uso de la memoria principal y la secundaria para hacer parecer que el ordenador tiene mucha m\u00e1s memoria principal (RAM) que la que realmente posee. Este m\u00e9todo es invisible a los procesos. La cantidad de memoria m\u00e1xima que se puede hacer ver que hay tiene que ver con las caracter\u00edsticas del procesador. Por ejemplo, en un sistema de 32 bits, el m\u00e1ximo es 2<sup>32<\/sup>, lo que da 4096 Megabytes (4 Gigabytes). Todo esto hace el trabajo del programador de aplicaciones mucho m\u00e1s f\u00e1cil, al poder ignorar completamente la necesidad de mover datos entre los distintos espacios de memoria.<\/span><\/p>\n<p style=\"text-align: center\"><span style=\"color: #000080\"><a href=\"http:\/\/images.google.com.ec\/imgres?imgurl=http:\/\/www.vinagreasesino.com\/imagenes\/recomendado\/ares.jpg&amp;imgrefurl=http:\/\/www.vinagreasesino.com\/&amp;usg=__EZz8KQH2oSuMEujmnc7kZa1R1rE=&amp;h=290&amp;w=500&amp;sz=42&amp;hl=es&amp;start=17&amp;um=1&amp;tbnid=Jbpbw6HwUkiMwM:&amp;tbnh=75&amp;tbnw=130&amp;prev=\/images%3Fq%3Dprogramas%2Bvirtuales%2Bwikipedia%26hl%3Des%26sa%3DN%26um%3D1\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" style=\"border: 1px solid\" src=\"http:\/\/tbn3.google.com\/images?q=tbn:Jbpbw6HwUkiMwM:http:\/\/www.vinagreasesino.com\/imagenes\/recomendado\/ares.jpg\" alt=\"\" width=\"130\" height=\"75\" \/><\/a><\/span><\/p>\n<p><span style=\"color: #000080\">Aunque la memoria virtual podr\u00eda estar implementada por el <\/span><a title=\"Software\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Software\"><span style=\"color: #000080\">software<\/span><\/a><span style=\"color: #000080\"> del sistema operativo, en la pr\u00e1ctica casi siempre se usa una combinaci\u00f3n de hardware y software, dado el esfuerzo extra que implicar\u00eda para el procesador.<\/span><\/p>\n<p><a class=\"image\" title=\"C\u00f3mo la memoria virtual se mapea a la memoria f\u00edsica\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Archivo:Virtual_address_space_and_physical_address_space_relationship.svg\"><span style=\"color: #000080\"><img loading=\"lazy\" decoding=\"async\" class=\"thumbimage\" src=\"http:\/\/upload.wikimedia.org\/wikipedia\/commons\/thumb\/3\/32\/Virtual_address_space_and_physical_address_space_relationship.svg\/300px-Virtual_address_space_and_physical_address_space_relationship.svg.png\" alt=\"\" width=\"300\" height=\"306\" \/><\/span><\/a><\/p>\n<p><span style=\"color: #ff0000\"><span style=\"text-decoration: underline\"><span class=\"mw-headline\">Operaci\u00f3n b\u00e1sica<\/span> <\/span><\/span><\/p>\n<p><span style=\"color: #000080\">Cuando se usa Memoria Virtual, o cuando una direcci\u00f3n es le\u00edda o escrita por la CPU, una parte del hardware dentro de la computadora traduce las direcciones de memoria generadas por el software (direcciones virtuales) en:<\/span><\/p>\n<ul>\n<li><span style=\"color: #000080\">la direcci\u00f3n real de memoria (la direcci\u00f3n de memoria f\u00edsica), o <\/span><\/li>\n<li><span style=\"color: #000080\">una indicaci\u00f3n de que la direcci\u00f3n de memoria deseada no se encuentra en memoria principal (llamado excepci\u00f3n de memoria virtual) <\/span><\/li>\n<\/ul>\n<p><span style=\"color: #000080\">En el primer caso, la referencia a la memoria es completada, como si la memoria virtual no hubiera estado involucrada: el software accede donde deb\u00eda y sigue ejecutando normalmente. En el segundo caso, el sistema operativo es invocado para manejar la situaci\u00f3n y permitir que el programa siga ejecutando o aborte seg\u00fan sea el caso. La memoria virtual es una t\u00e9cnica para proporcionar la simulaci\u00f3n de un espacio de memoria mucho mayor que la memoria f\u00edsica de una m\u00e1quina. Esta \"ilusi\u00f3n\" permite que los programas se ejecuten sin tener en cuenta el tama\u00f1o exacto de la memoria f\u00edsica.<\/span><\/p>\n<p><span style=\"color: #000080\">La ilusi\u00f3n de la memoria virtual est\u00e1 soportada por el mecanismo de traducci\u00f3n de memoria, junto con una gran cantidad de almacenamiento r\u00e1pido en disco duro. As\u00ed en cualquier momento el espacio de direcciones virtual hace un seguimiento de tal forma que una peque\u00f1a parte de \u00e9l, est\u00e1 en memoria real y el resto almacenado en el disco, y puede ser referenciado f\u00e1cilmente.<\/span><\/p>\n<p><span style=\"color: #000080\">Debido a que s\u00f3lo la parte de memoria virtual que est\u00e1 almacenada en la memoria principal, es accesible a la CPU, seg\u00fan un programa va ejecut\u00e1ndose, la proximidad de referencias a memoria cambia, necesitando que algunas partes de la memoria virtual se traigan a la memoria principal desde el disco, mientras que otras ya ejecutadas, se pueden volver a depositar en el disco (archivos de paginaci\u00f3n).<\/span><\/p>\n<p><span style=\"color: #000080\">La memoria virtual ha llegado a ser un componente esencial de la mayor\u00eda de los sistemas operativos actuales. Y como en un instante dado, en la memoria s\u00f3lo se tienen unos pocos fragmentos de un proceso dado, se pueden mantener m\u00e1s procesos en la memoria. Es m\u00e1s, se ahorra tiempo, porque los fragmentos que no se usan no se cargan ni se descargan de la memoria. Sin embargo, el sistema operativo debe saber c\u00f3mo gestionar este esquema.<\/span><\/p>\n<p><span style=\"color: #000080\">La memoria virtual tambi\u00e9n simplifica la carga del programa para su ejecuci\u00f3n llamada reubicaci\u00f3n, este procedimiento permite que el mismo programa se ejecute en cualquier posici\u00f3n de la memoria f\u00edsica.<\/span><\/p>\n<p><span style=\"color: #000080\">En un estado estable, pr\u00e1cticamente toda la memoria principal estar\u00e1 ocupada con fragmentos de procesos, por lo que el procesador y el S.O tendr\u00e1n acceso directo a la mayor cantidad de procesos posibles, y cuando el S.O traiga a la memoria un fragmento, deber\u00e1 expulsar otro. Si expulsa un fragmento justo antes de ser usado, tendr\u00e1 que traer de nuevo el fragmento de manera casi inmediata. Demasiados intercambios de fragmentos conducen a lo que se conoce como hiperpaginaci\u00f3n: donde el procesador consume m\u00e1s tiempo intercambiando fragmentos que ejecutando instrucciones de usuario. Para evitarlo el sistema operativo intenta adivinar, en funci\u00f3n de la historia reciente, qu\u00e9 fragmentos se usar\u00e1n con menor probabilidad en un futuro pr\u00f3ximo (v\u00e9ase <\/span><a title=\"Algoritmos de reemplazo de p\u00e1ginas\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Algoritmos_de_reemplazo_de_p%C3%A1ginas\"><span style=\"color: #000080\">algoritmos de reemplazo de p\u00e1ginas<\/span><\/a><span style=\"color: #000080\">).<\/span><\/p>\n<p><span style=\"color: #000080\">Los argumentos anteriores se basan en el principio de <\/span><a title=\"Cercan\u00eda de referencias\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Cercan%C3%ADa_de_referencias\"><span style=\"color: #000080\">cercan\u00eda de referencias<\/span><\/a><span style=\"color: #000080\"> o principio de localidad que afirma que las referencias a los datos y el programa dentro de un proceso tienden a agruparse. Por lo tanto, es v\u00e1lida la suposici\u00f3n de que, durante cortos per\u00edodos de tiempo, se necesitar\u00e1n s\u00f3lo unos pocos fragmentos de un proceso.<\/span><\/p>\n<p><span style=\"color: #000080\">Una manera de confirmar el principio de cercan\u00eda es considerar el rendimiento de un proceso en un entorno de memoria virtual.<\/span><\/p>\n<p><span style=\"color: #000080\">El principio de cercan\u00eda sugiere que los esquemas de memoria virtual pueden funcionar. Para que la memoria virtual sea pr\u00e1ctica y efectiva, se necesitan dos ingredientes. Primero, tiene que existir un soporte de hardware y, en segundo lugar, el S.O debe incluir un software para gestionar el movimiento de p\u00e1ginas o segmentos entre memoria secundaria y memoria principal.<\/span><\/p>\n<p><span style=\"color: #000080\">Justo despu\u00e9s de obtener la direcci\u00f3n f\u00edsica y antes de consultar el dato en memoria principal se busca en memoria-cache, si esta entre los datos recientemente usados la b\u00fasqueda tendr\u00e1 \u00e9xito, pero si falla, la memoria virtual consulta memoria principal , \u00f3, en el peor de los casos se consulta de disco (swapping).<\/span><\/p>\n<p><a id=\"Detalles\" name=\"Detalles\"><\/a><\/p>\n<h2><span style=\"color: #000080\"><span class=\"mw-headline\"><span style=\"text-decoration: underline\"><span style=\"color: #ff0000\">Detalles<\/span><\/span><\/span> <\/span><\/h2>\n<p><span style=\"color: #000080\">La traducci\u00f3n de las direcciones virtuales a reales es implementada por una <\/span><a class=\"mw-redirect\" title=\"Unidad de Manejo de Memoria\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Unidad_de_Manejo_de_Memoria\"><span style=\"color: #000080\">Unidad de Manejo de Memoria<\/span><\/a><span style=\"color: #000080\"> (MMU). El sistema operativo es el responsable de decidir qu\u00e9 partes de la memoria del programa es mantenida en memoria f\u00edsica. Adem\u00e1s mantiene las tablas de traducci\u00f3n de direcciones (si se usa <\/span><a class=\"mw-redirect\" title=\"Paginaci\u00f3n\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Paginaci%C3%B3n\"><span style=\"color: #000080\">paginaci\u00f3n<\/span><\/a><span style=\"color: #000080\"> la tabla se denomina <\/span><a title=\"Tabla de paginaci\u00f3n\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Tabla_de_paginaci%C3%B3n\"><span style=\"color: #000080\">tabla de paginaci\u00f3n<\/span><\/a><span style=\"color: #000080\">), que proveen las relaciones entre direcciones virtuales y f\u00edsicas, para uso de la MMU. Finalmente, cuando una excepci\u00f3n de memoria virtual ocurre, el sistema operativo es responsable de ubicar un \u00e1rea de memoria f\u00edsica para guardar la informaci\u00f3n faltante, trayendo la informaci\u00f3n desde el disco, actualizando las tablas de traducci\u00f3n y finalmente continuando la ejecuci\u00f3n del programa que dio la excepci\u00f3n de memoria virtual desde la instrucci\u00f3n que caus\u00f3 el fallo.<\/span><\/p>\n<p><span style=\"color: #000080\">En la mayor\u00eda de las computadoras, las tablas de traducci\u00f3n de direcciones de memoria se encuentran en memoria f\u00edsica. Esto implica que una referencia a una direcci\u00f3n virtual de memoria necesitar\u00e1 una o dos referencias para encontrar la entrada en la tabla de traducci\u00f3n, y una m\u00e1s para completar el acceso a esa direcci\u00f3n.<\/span><\/p>\n<p style=\"text-align: justify\"><span style=\"color: #000080\">Para acelerar el desempe\u00f1o de este sistema, la mayor\u00eda de las Unidades Centrales de Proceso (<\/span><a class=\"mw-redirect\" title=\"CPU\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/CPU\"><span style=\"color: #000080\">CPU<\/span><\/a><span style=\"color: #000080\">) incluyen una MMU en el mismo chip, y mantienen una tabla de las traducciones de dirrecciones virtuales a reales usadas recientemente, llamada <\/span><a class=\"mw-redirect\" title=\"TLB\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/TLB\"><span style=\"color: #000080\">Translation Lookaside Buffer (TLB)<\/span><\/a><span style=\"color: #000080\">. El uso de este <\/span><a title=\"Buffer\" href=\"http:\/\/blog.espol.edu.ec\/wiki\/Buffer\"><span style=\"color: #000080\">buffer<\/span><\/a><span style=\"color: #000080\"> hace que no se requieran referencias de memoria adicionales, por lo que se ahorra tiempo al traducir.<\/span><\/p>\n<p><span style=\"color: #000080\">En algunos procesadores, esto es realizado enteramente por el hardware. En otros, se necesita de la asistencia del sistema operativo: se levanta una excepci\u00f3n, y en ella el sistema operativo reemplaza una de las entradas del TLB con una entrada de la tabla de traducci\u00f3n, y la instrucci\u00f3n que hizo la referencia original a memoria es reejecutada.<\/span><\/p>\n<p><span style=\"color: #000080\">El hardware que tiene soporte para memoria virtual, la mayor\u00eda de la veces tambi\u00e9n permite protecci\u00f3n de memoria. La MMU puede tener la habilidad de variar su forma de operaci\u00f3n de acuerdo al tipo de referencia a memoria (para leer, escribir, o ejecutar), as\u00ed como el modo en que se encontraba el CPU en el momento de hacer la referencia a memoria. Esto permite al sistema operativo proteger su propio c\u00f3digo y datos (como las tablas de traducci\u00f3n usadas para memoria virtual) de corromperse por una aplicaci\u00f3n, y de proteger a las aplicaciones que podr\u00edan causar problemas entre s\u00ed.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La memoria virtual es una t\u00e9cnica que permite al software usar m\u00e1s memoria principal que la que realmente posee el ordenador. La mayor\u00eda de los ordenadores tienen cuatro tipos de memoria: registros en la CPU, la memoria cach\u00e9 (tanto dentro como fuera del CPU), la memoria f\u00edsica (generalmente en forma de RAM, donde la CPU [&hellip;]<\/p>\n","protected":false},"author":2221,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[393],"tags":[],"class_list":["post-155","post","type-post","status-publish","format-standard","hentry","category-informatica"],"_links":{"self":[{"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/posts\/155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/users\/2221"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/comments?post=155"}],"version-history":[{"count":2,"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/posts\/155\/revisions"}],"predecessor-version":[{"id":157,"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/posts\/155\/revisions\/157"}],"wp:attachment":[{"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/media?parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/categories?post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.espol.edu.ec\/nena\/wp-json\/wp\/v2\/tags?post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}