<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://1984.lsi.us.es/wiki-ssoo/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pedgarvic</id>
		<title>Wiki de Sistemas Operativos - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://1984.lsi.us.es/wiki-ssoo/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Pedgarvic"/>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php/Especial:Contribuciones/Pedgarvic"/>
		<updated>2026-05-09T20:57:54Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Paginaci%C3%B3n&amp;diff=3434</id>
		<title>Paginación</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Paginaci%C3%B3n&amp;diff=3434"/>
				<updated>2017-05-11T18:03:30Z</updated>
		
		<summary type="html">&lt;p&gt;Pedgarvic: /* Definición */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Definición=&lt;br /&gt;
La paginación es una estrategia de organización de la memoria que consiste en dividir la memoria en porciones de igual tamaño, a dichas porciones se las conoce como marcos de página o simplemente como páginas.&lt;br /&gt;
Las páginas están identificadas por un número, conocido como número de página (dentro del espacio de memoria de un proceso). Cada página se asigna en exclusividad a un proceso.&lt;br /&gt;
&lt;br /&gt;
=Funcionamiento=&lt;br /&gt;
&lt;br /&gt;
Desde el punto de vista de la paginación la traducción de las direcciones de memoria se basa en dos conceptos:&lt;br /&gt;
&lt;br /&gt;
1. El dispositivo traductor divide las direcciones lógicas en 2 partes de la siguiente forma: los n bits más significativos identifican la página mientras que el resto identifica el desplazamiento.&lt;br /&gt;
&lt;br /&gt;
2. Cuando el traductor dinámico de páginas recibe, en una dirección lógica, un número de página este examina una tabla (llamada tabla de páginas) en la cual se relacionan las páginas lógicas con las páginas físicas y obtiene la dirección real (Número de marco) de la siguiente forma:&lt;br /&gt;
&lt;br /&gt;
[[Archivo:Paginas.png]]&lt;br /&gt;
&lt;br /&gt;
Al igual que en la segmentación al intentar acceder a una página ausente se produce un fallo (llamado en este caso '''fallo de página''').&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Otras características=&lt;br /&gt;
*Los valores óptimos para las porciones son: en arquitectura de 32 bits es de 4KB, y en arquitectura de 64 bits es de 8KB.&lt;br /&gt;
*Los criterios vistos en el tema anterior no se aplican aquí, no tiene sentido hacerlo ya que todas las páginas de memoria son iguales.&lt;br /&gt;
&lt;br /&gt;
==Dispositivo de traducción de direcciones paginadas==&lt;br /&gt;
Se dispone de la tabla de páginas de cada proceso en memoria para llevar a cabo la traducción. La tabla de páginas se indexa por número de página.&lt;br /&gt;
&lt;br /&gt;
El dispositivo de traducción de direcciones paginadas debe ser un dispositivo muy rápido, ya que se usa con cada acceso a memoria que se realiza. El tamaño de la tabla de páginas es uno de los aspectos que más influye en el diseño del dispositivo e incluso en la organización de la propia tabla. Otro aspecto relevante es la localización de dicha tabla, la cual puede encontrarse en el traductor o guardada en memoria:&lt;br /&gt;
*'''Tabla de páginas en el traductor:'''&lt;br /&gt;
&lt;br /&gt;
Se usa en equipos cuyo espacio de direcciones es de pocas páginas. &lt;br /&gt;
El dispositivo de traducción contiene un conjunto de registros organizados como una memoria en los cuales almacena la tabla de páginas.&lt;br /&gt;
Dicha tabla de páginas debe sustituirse (lo cual aumenta el tiempo de conmutación) en dos situaciones distintas: al cambiar de proceso y al transferir el control al s.o. (en este caso se reduce el tiempo de conmutación utilizando dos tablas separadas, una para los procesos y otra para el s.o., las cuales se utilizan dependiendo del modo de uso de la CPU, supervisor o usuario).&lt;br /&gt;
&lt;br /&gt;
*'''Tabla de páginas en memoria:'''&lt;br /&gt;
&lt;br /&gt;
Se usa en equipos con mucha memoria, en los cuales el número de páginas puede llegar a ser muy alto con lo que el tiempo necesario para cargar las páginas en el traductor es demasiado alto.&lt;br /&gt;
La tabla de páginas es guardada en la memoria principal y el dispositivo traductor tiene la dirección de comienzo y el tamaño de la tabla, debido a que la tabla está en la memoria principal se necesita, por cada acceso a memoria, un acceso a memoria adicional para obtener el número de página física asociado a la página lógica. Para mantener un tiempo de acceso aceptable se establece una memoria asociativa que conserva las parejas página lógica-página física utilizadas recientemente. &lt;br /&gt;
&lt;br /&gt;
También hay dispositivos traductores que no utilizan tablas de páginas, buscan directamente la información en una memoria asociativa, y si no la encuentran, lanzan una excepción que manejará el sistema operativo. Así, el SO es el responsable de determinar la asociación entre números de página y números de marco, y además de actualizar la memoria asociativa, lo que da cierta flexibilidad.&lt;br /&gt;
&lt;br /&gt;
==Tabla de páginas multinivel==&lt;br /&gt;
El objetivo es paginar la tabla de páginas lo que permite que esta no esté cargada completa en memoria y que no ocupe direcciones consecutivas.&lt;br /&gt;
En los ss.oo. con tablas de páginas multinivel los números de página se dividen en dos partes: los bits más significativos indican el directorio de páginas correspondiente y con los bits menos significativos el índice del directorio en el que se encuentra la página buscada:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Archivo:PaginacionMultinivel.jpg‎ ]]&lt;br /&gt;
&lt;br /&gt;
*'''Tabla de páginas para todo el sistema:''' Es una variante de las tablas de página multinivel, en la que el dispositivo traductor sólo contiene una entrada por cada proceso, indexadas por PID, y una dirección de tabla que contiene las páginas de dicho proceso. Así, ante una conmutación de procesos basta con cambiar de PID.&lt;br /&gt;
==Elementos de administración==&lt;br /&gt;
La administración es sencilla ya que todas las porciones de memoria son de igual tamaño (se limita a comprobar si hay suficientes marcos libres para ejecutar el proceso).&lt;br /&gt;
&lt;br /&gt;
Se pueden usar:&lt;br /&gt;
&lt;br /&gt;
*'''Tabla de asignación de marcos a procesos:''' Tiene una entrada por marco, que contiene el PID del proceso que lo tiene asignado, o 0, si está libre. &lt;br /&gt;
*'''Lista de marcos asignados a procesos:''' Dado que el número de marcos es fijo, se implementa mediante una tabla. Estas listas tienen una entrada por marco. En cada entrada está, o el siguiente marco en la lista, o -1 si el marco es el último. Hay una lista global de marcos libres, y una lista por proceso de marcos ocupados. Para ayudar a la gestión, cada proceso tiene en su PCB los índices del primer y el último marco que tiene asignados.&lt;/div&gt;</summary>
		<author><name>Pedgarvic</name></author>	</entry>

	<entry>
		<id>https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=3428</id>
		<title>Llamadas al sistema</title>
		<link rel="alternate" type="text/html" href="https://1984.lsi.us.es/wiki-ssoo/index.php?title=Llamadas_al_sistema&amp;diff=3428"/>
				<updated>2017-02-18T00:21:12Z</updated>
		
		<summary type="html">&lt;p&gt;Pedgarvic: /* Definición de llamada al sistema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= 2.7. Llamadas al sistema =&lt;br /&gt;
&lt;br /&gt;
== Definición de llamada al sistema ==&lt;br /&gt;
&lt;br /&gt;
Una llamada al sistema es un método o función que puede invocar un proceso para solicitar un cierto servicio al sistema operativo. Dado que el acceso a ciertos recursos del sistema requieren la ejecución de código en modo privilegiado, el sistema operativo ofrece un conjunto de métodos o funciones que el programa puede emplear para acceder a dichos recursos. En otras palabras, el sistema operativo actúa como intermediario, ofreciendo una interfaz de programación (API) que el programa puede usar en cualquier momento para solicitar recursos gestionados por el sistema operativo.&lt;br /&gt;
&lt;br /&gt;
Algunos ejemplos de llamadas al sistema son las siguientes:&lt;br /&gt;
&lt;br /&gt;
* '''time''', que permite obtener la fecha y hora del sistema.&lt;br /&gt;
* '''write''', que se emplea para escribir un dato en un cierto dispositivo de salida, tales como una pantalla o un disco magnético.&lt;br /&gt;
* '''read''', que es usada para leer de un dispositivo de entrada, tales como un teclado o un disco magnético.&lt;br /&gt;
* '''open''', que es usada para obtener un descriptor de un fichero del sistema, ese fichero suele pasarse a write.&lt;br /&gt;
&lt;br /&gt;
Todo sistema operativo ofrece un conjunto de llamadas al sistema. En el caso de Linux 3.0, se ofrecen un total de 345 llamadas al sistema. En esta [http://syscalls.kernelgrok.com/ lista] se encuentran un gran número de ellas.&lt;br /&gt;
&lt;br /&gt;
Toda llamada al sistema se identifica de manera unívoca mediante un valor numérico que no debe ser modificado a lo largo de la vida del sistema operativo para evitar que se rompa la compatibilidad hacia atrás.&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra en C la invocación de las llamadas al sistema '''time''' y '''write'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
      uint64_t segundos;&lt;br /&gt;
&lt;br /&gt;
      segundos = time(NULL);&lt;br /&gt;
      write(stdout, &amp;quot;Segundos desde 1970: %d&amp;quot;, segundos);1&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Familias de llamadas al sistema operativo: POSIX y WIN32/64 ===&lt;br /&gt;
&lt;br /&gt;
Las dos familias de APIs estandarizas más importantes son:&lt;br /&gt;
&lt;br /&gt;
* [http://es.wikipedia.org/wiki/POSIX POSIX].&lt;br /&gt;
* WIN32/64, empleada en los sistemas operativos de tipo-Windows. Además, existen emuladores como '''Wine''' que también las implementan.&lt;br /&gt;
&lt;br /&gt;
== Implementación de llamadas al sistema ==&lt;br /&gt;
&lt;br /&gt;
El siguiente ejemplo muestra el código en ensamblador de x86 para invocar a la llamada al sistema '''write''' que permite escribir un dato en cualquier dispositivo. En concreto, se va a escribir una cadena por el dispositivo de salida '''pantalla''', que se identifica mediante el descriptor de fichero número 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
section .text&lt;br /&gt;
    global _start&lt;br /&gt;
_start:&lt;br /&gt;
    mov eax, 4         ;cargamos el número de la llamada al sistema en el regitro eax&lt;br /&gt;
    mov ebx, 1         ;cargamos el descriptor de fichero sobre el que queremos escribir&lt;br /&gt;
    mov ecx, string    ;cargamos en ecx la dirección de la cadena a imprimir&lt;br /&gt;
    mov edx, lenght    ;cargamos en edx el tamaño de la cadena a imprimir&lt;br /&gt;
    int 80h            ;se invoca al de&lt;br /&gt;
&lt;br /&gt;
    mov eax, 1&lt;br /&gt;
    mov ebx, 0&lt;br /&gt;
    int 80h&lt;br /&gt;
&lt;br /&gt;
section .data&lt;br /&gt;
    string: db &amp;quot;Hola Mundo&amp;quot;, 0x0A&lt;br /&gt;
    lenght: equ 13&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La instrucción ''int'' forma parte del conjunto de instrucciones de procesadores x86. Esta instrucción emite una [[Gestión_de_Entrada/Salida|interrupción]] por software cuyo tratamiento es realizado por la rutina ''dispatcher''. Dicha rutina se encarga del tratamiento de la interrupción por software número 80.&lt;br /&gt;
&lt;br /&gt;
'''Ejemplo de llamadas al sistema de Linux (64 bits):''' http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/&lt;br /&gt;
&lt;br /&gt;
[http://cs.lmu.edu/~ray/notes/linuxsyscalls/ Implementación de llamadas al sistema en Linux (32 y 64 bit)]&lt;br /&gt;
&lt;br /&gt;
== El ''dispatcher'' ==&lt;br /&gt;
&lt;br /&gt;
El dispatcher, que forma parte del SO, se ejecuta cuando se invoca una llamada al sistema. &lt;br /&gt;
Cuando un proceso hace una llamada al sistema, el dispatcher, se encarga de invocar la llamada que el proceso ha solicitado.&lt;br /&gt;
 &lt;br /&gt;
Tiene un comportamiento sincronizado, cuando recibe una llamada se la pasa al sistema operativo y hasta que no recibe respuesta no atiende otra llamada. &lt;br /&gt;
&lt;br /&gt;
En el caso de x86, el dispatcher consulta el registro eax e invoca a la llamada al sistema identificada con dicha numeración.&lt;br /&gt;
&lt;br /&gt;
== El punto de entrada == &lt;br /&gt;
&lt;br /&gt;
Es la posición de memoria desde la cual es posible solicitarle servicios al sistema operativo. Normalmente hay un único punto de entrada.&lt;br /&gt;
En algunos SO se realiza mediante llamadas a subprogramas. La dirección de memoria del punto de entrada puede cambiar si se modifica el SO. En algunos SO éste problema lo solucionan usando una dirección fija, mientras en otros han preferido usar una referencia a dicha dirección.&lt;br /&gt;
&lt;br /&gt;
Lo ideal es que sean compatibles a lo largo del tiempo (aunque Windows normalmente no lo respeta).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Ejercicios_fundamentos_Sistemas_Operativos | Ejercicios]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3.1.[[Modelos_de_Diseño_de_Sistemas_Operativos | Modelos de diseño de Sistemas Operativos]]&lt;/div&gt;</summary>
		<author><name>Pedgarvic</name></author>	</entry>

	</feed>