Está en la página 1de 22

UNIDAD 1: ORGANIZACIÓN Y ARQUITECTURA DE COMPUTADORES

1.1 Introducción.
Cuando se describe un computador, frecuentemente se distingue entre arquitectura y organización.
Aunque es difícil dar una definición precisa para estos términos, existe un consenso sobre las áreas
generales cubiertas por cada uno de ellos.

La arquitectura de computadores se refiere a los atributos de un sistema que son visibles a un


programador, o para decirlo de otra manera, aquellos atributos que tienen un impacto directo en la
ejecución lógica de un programa. La organización de computadores se refiere a las unidades funcionales
y sus interconexiones, que dan lugar a especificaciones arquitectónicas. Entre los ejemplos de atributos
arquitectónicos se encuentran el conjunto de instrucciones, el número de bits usados para representar
varios tipos de datos (por ejemplo, números, caracteres), mecanismos de E/S y técnicas para
direccionamiento de memoria. Entre los atributos de organización se incluyen aquellos detalles de
hardware transparentes al programador, tales como señales de control, interfaces entre el computador
y los periféricos y la tecnología de memoria usada.

Para poner un ejemplo, una cuestión de diseño arquitectónico es si el computador tendrá la instrucción
de multiplicar. Una cuestión de organización es si esa instrucción será implementada por una unidad
especializada en multiplicar o por un mecanismo que haga un uso iterativo de la unidad de suma del
sistema. La decisión de organización puede estar basada en la frecuencia prevista del uso de la
instrucción de multiplicar la velocidad relativa de las dos aproximaciones, y el coste y el tamaño físico
de una unidad especializada en multiplicar.

Históricamente, y aún hoy día, la distinción entre arquitectura y organización ha sido importante.
Muchos fabricantes de computadores ofrecen una familia de modelos, todos con la misma
arquitectura, pero con diferencias en la organización. Consecuentemente los diferentes modelos de la
familia tienen precios y prestaciones distintas. Más aún, una arquitectura puede sobrevivir muchos
años, pero su organización cambia con la evolución de tecnología. Un ejemplo destacado de ambos
fenómenos es la arquitectura IBM Sistema/370. Esta arquitectura apareció por primera vez en 1970 e
incluía varios modelos. Un cliente con necesidades modestas podía comprar un modelo más barato y
lento, y, si la demanda se incrementaba, cambiarse más tarde a un modelo más caro y rápido sin tener
que abandonar el software que ya había sido desarrollado. A través de los años IBM ha introducido
muchos modelos nuevos con tecnología mejorada para reemplazar a modelos más viejos, ofreciendo
al consumidor mayor velocidad, precios más bajos o ambos a la vez. Estos modelos más nuevos
conservaban la misma arquitectura para proteger así la inversión en software del consumidor. Podemos
destacar que la arquitectura del Sistema/370 con unas pocas mejoras ha sobrevivido hasta hoy día
como la arquitectura de la línea de grandes productos de computación IBM.

En una clase de sistemas, llamados microcomputadores, la relación entre arquitectura y organización


es muy estrecha. Los cambios en la tecnología no solo influyen en la organización, sino que también
dan lugar a la introducción de arquitecturas más ricas y potentes. Generalmente hay menos requisitos
de compatibilidad generación a generación para estas pequeñas máquinas. Así, hay más interacción
entre las decisiones de diseño arquitectónicas y de organización. Un ejemplo interesante de esto son
los computadores de repertorio reducido de instrucciones (RISC, Reduced Instruction Set Computer).
1.2 Buses. Memoria interna.

BUS
Un bus es un camino de comunicación entre dos o más dispositivos. Una característica clave de un bus
es que se trata de un medio de transmisión compartido. Al bus se conectan varios dispositivos, y
cualquier señal transmitida por uno de esos dispositivos está disponible para que los otros dispositivos
conectados al bus puedan acceder a ella. Si dos dispositivos transmiten durante el mismo periodo de
tiempo, sus señales pueden solaparse y distorsionarse. Consiguientemente, solo un dispositivo puede
transmitir con éxito en un momento dado.

Usualmente, un bus está constituido por varios caminos de comunicación, o líneas. Cada línea es capaz
de transmitir señales binarias representadas por 1 y por 0. En un intervalo de tiempo, se puede
transmitir una secuencia de dígitos binarios a través de una única línea. Se pueden utilizar varias líneas
del bus para transmitir dígitos binarios simultáneamente (en paralelo). Por ejemplo, un dato de 8 bits
puede transmitirse mediante ocho líneas del bus.
Los computadores poseen diferentes tipos de buses que proporcionan comunicación entre sus
componentes a distintos niveles dentro de la jerarquía del sistema. El bus que conecta los componentes
principales del computador (procesador, memoria, E/S) se denomina bus del sistema (system bus).
Las estructuras de interconexión más comunes dentro de un computador están basadas en el uso de
uno o más buses del sistema.

ESTRUCTURA DEL BUS


El bus de sistema está constituido, usualmente, por entre cincuenta y cien líneas. A cada línea se le
asigna un significado o una función particular. Aunque existen diseños de buses muy diversos, en todos
ellos las líneas se pueden clasificar en tres grupos funcionales: líneas de datos, de direcciones y de
control. Además, pueden existir líneas de alimentación para suministrar energía a los
módulos conectados al bus.

Esquema de interconexión mediante un bus

Las líneas de datos proporcionan un camino para transmitir datos entre los módulos del sistema. El
conjunto constituido por estas líneas se denomina bus de datos. El bus de datos puede incluir entre 32
y cientos de líneas, cuyo número se conoce como anchura del bus de datos. Puesto que cada línea solo
puede transportar un bit cada vez, el número de líneas determina cuántos bits se pueden transferir al
mismo tiempo. La anchura del bus es un factor clave a la hora de determinar las prestaciones del
conjunto del sistema. Por ejemplo, si el bus de datos tiene una anchura de ocho bits, y las instrucciones
son de 16 bits, entonces el procesador debe acceder al módulo de memoria dos veces por cada ciclo de
instrucción.
Las líneas de dirección se utilizan para designar la fuente o el destino del dato situado en el bus de datos.
Por ejemplo, si el procesador desea leer una palabra (8, 16 o 32 bits) de datos de la memoria, sitúa la
dirección de la palabra deseada en las líneas de direcciones. Claramente, la anchura del bus de
direcciones determina la máxima capacidad de memoria posible en el sistema. Además, las líneas de
direcciones generalmente se utilizan también para direccionar los puertos de E/S. Usualmente, los bits
de orden más alto se utilizan para seleccionar una posición de memoria o un puerto de E/S dentro de
un módulo. Por ejemplo, en un bus de 8 bits, la dirección 01111111 e inferiores harían referencia a
posiciones dentro de un módulo de memoria (el módulo 0) con 128 palabras de memoria, y las
direcciones 10000000 y superiores designarían dispositivos conectados a un módulo de E/S (módulo 1).
Las líneas de control se utilizan para controlar el acceso y el uso de las líneas de datos y de direcciones.
Puesto que las líneas de datos y de direcciones son compartidas por todos los componentes, debe
existir una forma de controlar su uso. Las señales de control transmiten tanto órdenes como
información de temporización entre los módulos del sistema. Las señales de temporización indican la
validez de los datos y las direcciones. Las señales de órdenes especifican las operaciones a realizar.

Algunas líneas de control típicas son:

• Escritura en memoria (Memory write): hace que el dato del bus se escriba en la posición direccionada.
• Lectura de memoria (Memory read): hace que el dato de la posición direccionada se sitúe en el bus.
• Escritura de E/S (I/O write): hace que el dato del bus se transfiera a través del puerto de E/S
direccionado.
• Lectura de E/S (E/S read): hace que el dato del puerto de E/S direccionado se sitúe en el bus.
• Transferencia reconocida (Transfer ACK): indica que el dato se ha aceptado o se ha situado en el bus.
• Petición de bus (Bus request): indica que un módulo necesita disponer del control del bus.
• Cesión de bus (Bus grant): indica que se cede el control del bus a un módulo que lo había solicitado.
• Petición de interrupción (Interrupt request): indica si hay una interrupción pendiente.
• Interrupción reconocida (Interrupt ACK): Señala que la interrupción pendiente se ha aceptado.
• Reloj (clock): se utiliza para sincronizar las operaciones.
• Inicio (reset): pone los módulos conectados en su estado inicial.
El funcionamiento del bus se describe a continuación. Si un módulo desea enviar un dato a otro debe
hacer dos cosas: (1) obtener el uso del bus y (2) transferir el dato a través del bus. Si un módulo desea
pedir un dato a otro módulo, debe (1) obtener el uso del bus y (2) transferir la petición al otro módulo
mediante las líneas de control y dirección apropiadas. Después debe esperar a que el segundo módulo
envíe el dato.
Físicamente, el bus de sistema es de hecho un conjunto de conductores eléctricos paralelos. Estos
conductores son líneas de metal grabadas en una tarjeta (tarjeta de circuito impreso). El bus se extiende
a través de todos los componentes del sistema, cada uno de los cuales se conecta a algunas o a todas
las líneas del bus. Una disposición física muy común es el de dos columnas en este el bus consta de dos
columnas verticales de conductores. A lo largo de esas columnas, a intervalos regulares, hay puntos de
conexión en forma de ranuras (slots) dispuestas en sentido horizontal para sostener las tarjetas de
circuito impreso. Cada uno de los componentes principales del sistema ocupa una o varias tarjetas y se
conecta al bus a través de esas ranuras. El sistema completo se introduce dentro de un chasis. Esta
organización puede encontrarse todavía en alguno de los buses del computador. No obstante, los
sistemas actuales tienden a tener sus componentes principales en la misma tarjeta y los circuitos
integrados incluyen más elementos. Así, el bus que conecta el procesador y la memoria caché se integra
en el microprocesador junto con el procesador y la caché (on-chip), y el bus que conecta el procesador
con la memoria y otros componentes se incluye en la tarjeta (on-board).

Esta es la disposición más conveniente. Así se puede adquirir un computador pequeño y expandirlo
(ampliar memoria, módulos de E/S) más adelante añadiendo más tarjetas. Si un componente de
una tarjeta falla, la tarjeta puede quitarse y sustituirse fácilmente.

El bus es simplemente un canal de comunicación entre todas las unidades del sistema, donde cada una
está conectada. Un bus se compone en varias líneas o hilos (uno por bit) por el que circula un cierto
tipo de información. El bus a su vez se divide en tres tipos, según la información que circula por el
mismo:

Bus de datos: Se utiliza para transmitir datos entre los componentes de la computadora.
Bus de direcciones: Se utiliza para transmitir las direcciones de las posiciones de memoria y de los
dispositivos conectados.
Bus de control: Serie de líneas que sirven básicamente para indicar el tipo de información que viaja por
el bus de datos.

Arquitectura Interna
Desde la perspectiva de un programa en ejecución, la arquitectura interna de un procesador x86-64 se
puede dividir lógicamente en varias unidades distintas. Estos incluyen los registros de uso general, las
banderas de estado y control (registro RFLAGS), el puntero de instrucción (registro RIP), los registros
XMM y el control y estado de punto flotante (MXCSR). Por definición, un programa en ejecución utiliza
los registros de propósito general, el registro RFLAGS y el registro RIP. La utilización del programa de
los registros XMM, YMM, ZMM o MXCSR es opcional. La Figura ilustra la arquitectura interna de un
procesador x86-64.
Todos los procesadores compatibles con x86-64 admiten SSE2 e incluyen 16 registros XMM de 128 bits
que los programadores pueden usar para realizar cálculos escalares de coma flotante. Estos registros
también se pueden emplear para realizar operaciones SIMD utilizando enteros empaquetados o valores
de coma flotante empaquetados (tanto de precisión simple como de precisión doble). Aprenderá a
utilizar los registros XMM, el registro MXCSR y el conjunto de instrucciones AVX para realizar cálculos
de punto flotante.

Registros

Registros de propósito general


La unidad de ejecución x86-64 contiene 16 registros de uso general de 64 bits, que se utilizan para
realizar operaciones aritméticas, lógicas, de comparación, de transferencia de datos y de cálculo de
direcciones. También se pueden usar como ubicaciones de almacenamiento temporal para valores
constantes, resultados intermedios y punteros a valores de datos almacenados en la memoria. La figura
muestra el conjunto completo de registros de propósito general x86-64 junto con sus nombres de
operandos de instrucción.
La palabra doble, la palabra y el byte de orden inferior de cada registro de 64 bits son accesibles de
forma independiente y se pueden utilizar para manipular operandos de 32 bits, 16 bits y 8 bits de ancho.
Por ejemplo, una función puede utilizar los registros EAX, EBX, ECX y EDX para realizar cálculos de 32
bits en las palabras dobles de orden inferior de los registros RAX, RBX, RCX y RDX, respectivamente. De
manera similar, los registros AL, BL, CL y DL se pueden usar para realizar cálculos de 8 bits en los bytes
de orden inferior. Cabe señalar que existe una discrepancia con respecto a los nombres de algunos
registros de bytes. El ensamblador de 64 bits de Microsoft usa los nombres que se muestran en la figura,
mientras que la documentación de Intel usa los nombres R8L – R15L. Se utiliza los nombres de registro
de Microsoft para mantener la coherencia entre el texto y el código de muestra. En la figura no se
muestran los registros de bytes heredados AH, BH, CH y DH. Estos registros tienen alias en los bytes de
orden superior de los registros AX, BX, CX y DX, respectivamente. Los registros de bytes heredados se
pueden usar en programas x86-64, aunque con algunas restricciones.
A pesar de su designación como registros de propósito general, el conjunto de instrucciones x86-64
impone algunas restricciones notables sobre cómo se pueden usar. Algunas instrucciones requieren o
usan implícitamente registros específicos como operandos. Este es un patrón de diseño heredado que
se remonta al 8086 aparentemente para mejorar la densidad del código. Por ejemplo, algunas
variaciones de la instrucción imul (Multiplicación de enteros con signo) guardan el producto entero
calculado en RDX:RAX, EDX:EAX, DX:AX o AX (la notación de dos puntos significa que el producto final
está contenido en dos registros, con el primer registro contiene los bits de orden superior). La
instrucción idiv (División de enteros con signo) requiere que el dividendo entero se cargue en RDX:RAX,
EDX:EAX, DX:AX o AX. Las instrucciones de cadena x86 requieren que las direcciones de los operandos
de origen y destino se coloquen en los registros RSI y RDI, respectivamente. Las instrucciones de cadena
que incluyen un prefijo de repetición deben usar RCX como registro de conteo, mientras que las
instrucciones de desplazamiento y rotación de bits variables deben cargar el valor de conteo en el
registro CL.

El procesador utiliza el registro RSP para admitir operaciones relacionadas con la pila, como llamadas y
devoluciones de funciones. La pila en sí es simplemente un bloque contiguo de memoria que el sistema
operativo asigna a un proceso o subproceso. Los programas de aplicación también pueden usar la pila
para pasar argumentos de funciones y almacenar datos temporales. El registro RSP siempre apunta al
elemento superior de la pila. Las operaciones de inserción y extracción de pila se realizan utilizando
operandos de 64 bits de ancho. Esto significa que la ubicación de la pila en la memoria generalmente
se alinea con un límite de 8 bytes. Algunos entornos de tiempo de ejecución (p. ej., programas Visual
C++ de 64 bits que se ejecutan en Windows) alinean la memoria de la pila y el RSP en un límite de 16
bytes para evitar transferencias de memoria mal alineadas entre los registros XMM y los operandos de
128 bits de ancho almacenados en la pila.

Si bien es técnicamente posible utilizar el registro RSP como un registro de propósito general, dicho uso
no es práctico y se desaconseja enfáticamente. El registro RBP generalmente se usa como un puntero
base para acceder a los elementos de datos que se almacenan en la pila. RSP también se puede usar
como un puntero base para acceder a elementos de datos en la pila. Cuando no se emplea como
puntero base, los programas pueden usar RBP como un registro de propósito general.

Registros bandera
El registro RFLAGS contiene una serie de bits de estado (o banderas) que el procesador usa para indicar
los resultados de una operación aritmética, lógica o de comparación. También contiene una serie de
bits de control que utilizan principalmente los sistemas operativos. La tabla muestra la organización de
los bits en el registro RFLAGS.
Para los programas de aplicación, los bits más importantes en el registro RFLAGS son las siguientes
banderas de estado: bandera de acarreo (CF), bandera de desbordamiento (OF), bandera de paridad
(PF), bandera de signo (SF) y bandera cero (ZF). El procesador establece la bandera de acarreo para
indicar una condición de desbordamiento al realizar aritmética de enteros sin signo. También lo utilizan
algunas instrucciones de rotación y desplazamiento de registros. El indicador de desbordamiento indica
que el resultado de una operación de entero con signo es demasiado pequeño o grande. El procesador
establece el indicador de paridad para indicar si el byte menos significativo de una operación aritmética,
de comparación o lógica contiene un número par de 1 bits (algunos protocolos de comunicación utilizan
bits de paridad para detectar errores de transmisión). Los indicadores de signo y cero se establecen
mediante instrucciones aritméticas y lógicas para indicar un resultado negativo, cero o positivo.

El registro RFLAGS contiene un bit de control llamado bandera de dirección (DF). Un programa de
aplicación puede establecer o restablecer el indicador de dirección, que define la dirección de
incremento automático (0 = direcciones de menor a mayor, 1 = direcciones de mayor a menor) de los
registros RDI y RSI durante la ejecución de instrucciones de cadena. Los bits restantes en el registro
RFLAGS son utilizados exclusivamente por el sistema operativo para administrar interrupciones,
restringir operaciones de E/S, respaldar la depuración de programas y manejar operaciones virtuales.
Nunca deben ser modificados por un programa de aplicación. Los bits reservados tampoco deben
modificarse nunca, y nunca se deben hacer suposiciones con respecto al estado de cualquier bit
reservado.

Registro puntero de instrucciones


El registro de puntero de instrucción (RIP) contiene la dirección lógica de la siguiente instrucción a
ejecutar. El valor en el registro RIP se actualiza automáticamente durante la ejecución de cada
instrucción. También se altera implícitamente durante la ejecución de instrucciones de transferencia
de control. Por ejemplo, la instrucción de llamada (procedimiento de llamada) empuja el contenido del
registro RIP a la pila y transfiere el control del programa a la dirección designada por el operando
especificado. La instrucción ret (Retorno del procedimiento) transfiere el control del programa
extrayendo los ocho bytes superiores de la pila y cargándolos en el registro RIP.

Las instrucciones jmp (salto) y jcc (Saltar si se cumple la condición) también transfieren el control del
programa modificando el contenido del registro RIP. A diferencia de las instrucciones call y ret, todas
las instrucciones de salto x86-64 se ejecutan independientemente de la pila. El registro RIP también se
utiliza para el direccionamiento de memoria de operandos basados en desplazamiento. No es posible
que una tarea en ejecución acceda directamente al contenido del registro RIP.

Memoria principal
En la memoria principal se almacenan los programas que se deben ejecutar y sus datos, es la memoria
visible para el programador mediante su espacio de direcciones.
La memoria principal se implementa utilizando diferentes chips conectados a la placa principal del
computador y tiene una capacidad mucho más elevada que la memoria caché (del orden de Gbytes o
de Tbytes en supercomputadores).
Utiliza tecnología DRAM (Dynamic RAM), que es más lenta que la SRAM, pero con una capacidad de
integración mucho más elevada, hecho que permite obtener más capacidad en menos espacio.

1.3 Memoria externa.

En computadores antiguos, la forma más común de almacenamiento de acceso aleatorio para la


memoria principal consistía en una matriz de pequeños anillos ferromagnéticos denominados núcleos.
Es por esto que la memoria principal recibía a menudo el nombre de núcleo (core), un término que
perdura en la actualidad. La llegada de la microelectrónica, y sus ventajas, acabó con las memorias de
núcleos. Hoy en día es casi universal el uso de chips semiconductores para la memoria principal. En esta
sección se exploran aspectos clave de esta tecnología.

La memoria externa corresponde a dispositivos de almacenamiento secundario: discos magnéticos,


cintas magnéticas, discos ópticos, dispositivos de memoria flash, etc., y también se pueden considerar
sistemas de almacenamiento en red.
Estos dispositivos son gestionados por el sistema de ficheros del sistema operativo mediante el sistema
de entrada/salida.
Los dispositivos que forman la memoria externa se conectan al computador con algún tipo de bus (serie
o paralelo). Estos dispositivos se pueden encontrar físicamente dentro del computador conectados por
buses internos del computador (IDE, SATA, SCSI, etc.) o pueden estar fuera del computador conectados
por buses externos (USB, Firewire, eSATA, Infiniband, etc.).
ORGANIZACIÓN
El elemento básico de una memoria semiconductora es la celda de memoria. Aunque se utilizan
diversas
tecnologías electrónicas, todas las celdas de memoria semiconductora comparten ciertas propiedades:
• Presentan dos estados estables (o semiestables), que pueden emplearse para representar el 1 y el 0
binarios.
• Puede escribirse en ellas (al menos una vez) para fijar su estado.
• Pueden leerse para detectar su estado.

Funcionamiento de una celda de memoria.

La Figura describe el funcionamiento de una celda de memoria. Lo más común es que la celda tenga
tres terminales para transportar señales eléctricas. El terminal de selección, como su nombre indica,
selecciona la celda para que pueda realizarse una operación de escritura o de lectura. El terminal de
control indica si se trata de una lectura o de una escritura. Para la escritura, el tercer terminal
proporciona la señal que fija el estado de la celda a uno o a cero. En una lectura, el tercer terminal se
utiliza como salida del estado de la celda. Los detalles sobre estructura interna, funcionamiento y
temporización de la celda de memoria, dependen de la tecnología específica de circuito integrado. Para
nuestros propósitos, daremos por sentado que las celdas individuales pueden seleccionarse para
operaciones de lectura y de escritura.

1.4 Entrada/salida.

Puertos de Entrada/Salida Son vías de comunicación con otros componentes de la computadora


excepto la memoria. Se identifican mediante una dirección pudiéndose leer datos de un puerto y
escribir sobre él.

La E/S se constituye en la interfaz mediante el cual el computador interactúa con el exterior; permite
efectuar las operaciones de E/S a través de los periféricos y la memoria o los registros del procesador.
Con la finalidad de efectuar la gestión de las operaciones de E/S es necesario el hardware y el software.
La gestión del sistema de E/S de un computador se efectúa mediante el sistema operativo (SO);
“administrador de los recursos del sistema”. Las técnicas para controlar la E/S las utiliza el SO y el
programador cuando quieren acceder al periférico, pero en las máquinas actuales, a causa de la
complejidad de controlar y gestionar los periféricos, el acceso se lleva a cabo generalmente mediante
llamadas al SO, que es quien gestiona la transferencia. El conjunto de rutinas que permiten controlar
un determinar periférico es lo que denominamos habitualmente programas controladores o drivers y
cuando el SO quiere hacer una operación de E/S con un periférico llama a una de estas rutinas.

Los elementos principales que forman el sistema de E/S son los siguientes:

✓ Los periféricos.
✓ Los módulos de E/S.
✓ Los sistemas de interconexión externos.
✓ El mapa de memoria e instrucciones de E/S.

Los periféricos.
Los periféricos pueden ser:
– Dispositivos de entrada de datos: el teclado, el ratón, el escáner, los sensores de magnitudes
mecánicas o eléctricas, etc.
– Dispositivos de salida de datos: el monitor, la impresora, etc.
– Dispositivos de entrada y salida de datos (almacenamiento, comunicación): como los discos.

Los módulos de E/S.


Se trata de un controlador compuesto por uno o varios periféricos que establecen la interfaz entre el
periférico y el computador (procesador y memoria) para facilitar la comunicación entre el uno y el otro
de manera que buena parte de los detalles técnicos del periférico queden ocultos al resto del
computador.
En la gestión de la comunicación de la entrada salida se deben tener en cuenta tres aspectos:
- Selección del periférico: identificar el periférico entre todos los disponibles mediante el
direccionamiento de los registros de datos y de control
- Sincronización con la CPU: evitar los problemas surgidos de las diferentes velocidades de trabajo
de la CPU y de los periféricos. Evitar inundar al periférico con datos provenientes de la CPU y
evitar que ésta se quede esperando los datos del periférico.
- Gestión de las señales de control: determinar para cada tipo de sincronización y cada tipo de
selección de periférico el conjunto de señales de control que deberán ser tenidos en cuenta por
la Unidad de Control para la correcta gestión de la comunicación

Para elegir un periférico y comunicarse con él se emplean los puertos de entrada-salida que en su
versión más simple se corresponden con un registro.
Para comunicarse con un periférico la CPU debe:
- Especificar la dirección: identificar el puerto de entrada-salida entre todos los que tenga
(normalmente tienen varios puertos de entrada salida)
- Indicar el sentido de la comunicación: especificar si se trata de una lectura o de una escritura.
- Enviar el dato: si se trata de una escritura

Los sistemas de interconexión externos.


También llamados sistemas de interconexión de E/S o buses de E/S, permite la comunicación entre los
módulos de E/S y el resto del computador; posee una estructura jerárquica formada por diferentes
tipos de buses para aislar los elementos más rápidos de los más lentos con la finalidad de mejorar las
prestaciones del sistema.
El mapa de memoria e instrucciones de E/S.
El procesador ve el banco de registros del módulo de E/S como un espacio de memoria dirigible, de
manera que cada registro del módulo de E/S tiene asociada (mapeada) una dirección única.

1.5 Sistema Operativo.


Un sistema operativo es un programa que administra el hardware de una computadora. También
proporciona una base para los programas de aplicación y actúa como intermediario entre el usuario de
la computadora y el hardware de la computadora. Un aspecto sorprendente de los sistemas operativos
es cómo varían en el cumplimiento de estas tareas. Los sistemas operativos de mainframe están
diseñados principalmente para optimizar la utilización del hardware. Los sistemas operativos de
computadoras personales (PC) admiten juegos complejos, aplicaciones comerciales y todo lo demás.
Los sistemas operativos para computadoras móviles brindan un entorno en el que un usuario puede
interactuar fácilmente con la computadora para ejecutar programas. Por lo tanto, algunos sistemas
operativos están diseñados para ser convenientes, otros para ser eficientes y otros para ser una
combinación de los dos.

Debido a que un sistema operativo es grande y complejo, debe crearse pieza por pieza. Cada una de
estas piezas debe ser una parte bien delineada del sistema, con entradas, salidas y funciones
cuidadosamente definidas.

Un sistema informático se puede dividir aproximadamente en cuatro componentes: el hardware, el


sistema operativo, los programas de aplicación y los usuarios.

El hardware, la unidad central de procesamiento (CPU), la memoria y los dispositivos de entrada/salida


(E/S), proporciona los recursos informáticos básicos para el sistema. Los programas de aplicación, como
los procesadores de texto, las hojas de cálculo, los compiladores y los navegadores web, definen las
formas en que se utilizan estos recursos para resolver los problemas informáticos de los usuarios. El
sistema operativo controla el hardware y coordina su uso entre los diversos programas de aplicación
para los distintos usuarios.

También podemos ver un sistema informático como compuesto por hardware, software y datos. El
sistema operativo proporciona los medios para el uso adecuado de estos recursos en el funcionamiento
del sistema informático. Un sistema operativo es similar a un gobierno. Como un gobierno, no realiza
ninguna función útil por sí mismo. Simplemente proporciona un entorno en el que otros programas
pueden realizar un trabajo útil.

Para que una computadora comience a funcionar, por ejemplo, cuando se enciende o se reinicia, debe
tener un programa inicial para ejecutarse. Este programa inicial, o programa de arranque, tiende a ser
simple. Por lo general, se almacena dentro del hardware de la computadora en la memoria de solo
lectura (ROM) o en la memoria de solo lectura programable y borrable eléctricamente (EEPROM),
conocida por el término general firmware. Inicializa todos los aspectos del sistema, desde los registros
de la CPU hasta los controladores de dispositivos y el contenido de la memoria. El programa de arranque
debe saber cómo cargar el sistema operativo y cómo comenzar a ejecutar ese sistema. Para lograr este
objetivo, el programa de arranque debe ubicar el núcleo del sistema operativo y cargarlo en la memoria.

La memoria principal es fundamental para el funcionamiento de un sistema informático moderno. La


memoria principal es una gran variedad de bytes, que varían en tamaño desde cientos de miles hasta
miles de millones. Cada byte tiene su propia dirección. La memoria principal es un depósito de datos
rápidamente accesibles compartidos por la CPU y los dispositivos de E/S. El procesador central lee
instrucciones de la memoria principal durante el ciclo de obtención de instrucciones y lee y escribe
datos de la memoria principal durante el ciclo de obtención de datos (en una arquitectura de Von
Neumann). Como se señaló anteriormente, la memoria principal es generalmente el único dispositivo
de almacenamiento grande al que la CPU puede dirigirse y acceder directamente. Por ejemplo, para
que la CPU procese datos del disco, esos datos primero deben transferirse a la memoria principal
mediante llamadas de E/S generadas por la CPU. De la misma manera, las instrucciones deben estar en
la memoria para que la CPU las ejecute.

Para que un programa se ejecute, debe asignarse a direcciones absolutas y cargarse en la memoria. A
medida que se ejecuta el programa, accede a las instrucciones del programa y a los datos de la memoria
generando estas direcciones absolutas. Eventualmente, el programa termina, su espacio de memoria
se declara disponible y el siguiente programa puede cargarse y ejecutarse.

Para mejorar tanto la utilización de la CPU como la velocidad de respuesta de la computadora a sus
usuarios, las computadoras de uso general deben mantener varios programas en la memoria, lo que
genera la necesidad de administrar la memoria. Se utilizan muchos esquemas de gestión de memoria
diferentes. Estos esquemas reflejan varios enfoques, y la efectividad de cualquier algoritmo dado
depende de la situación. Al seleccionar un esquema de administración de memoria para un sistema
específico, debemos tener en cuenta muchos factores, especialmente el diseño del hardware del
sistema. Cada algoritmo requiere su propio soporte de hardware.

El sistema operativo es responsable de las siguientes actividades en relación con la gestión de la


memoria:
• Hacer un seguimiento de qué partes de la memoria se están utilizando actualmente y quién las
está utilizando.
• Decidir qué procesos (o partes de procesos) y datos mover dentro y fuera de la memoria.
• Asignación y desasignación de espacio de memoria según sea necesario.

Intercambio (Swapping)
Un proceso debe estar en memoria para ser ejecutado. Sin embargo, un proceso puede intercambiarse
temporalmente fuera de la memoria a un almacén de respaldo y luego traerse de vuelta a la memoria
para su ejecución continua. El intercambio hace posible que el espacio total de direcciones físicas de
todos los procesos exceda la memoria física real del sistema, aumentando así el grado de
multiprogramación en un sistema.

Intercambio estándar (Standard Swapping)


El intercambio estándar implica mover procesos entre la memoria principal y un almacén de respaldo.
El almacén de respaldo suele ser un disco rápido. Debe ser lo suficientemente grande para albergar
copias de todas las imágenes de memoria para todos los usuarios y debe proporcionar acceso directo
a estas imágenes de memoria. El sistema mantiene una cola lista que consta de todos los procesos
cuyas imágenes de memoria están en el almacén de respaldo o en la memoria y están listos para
ejecutarse. Cada vez que el programador de la CPU decide ejecutar un proceso, llama al despachador.
El despachador verifica si el siguiente proceso en la cola está en la memoria. Si no es así, y si no hay una
región de memoria libre, el despachador intercambia un proceso actualmente en la memoria e
intercambia el proceso deseado. Luego recarga los registros y transfiere el control al proceso
seleccionado.

Intercambio en sistemas móviles (Swapping on Mobile Systems)


Aunque la mayoría de los sistemas operativos para PC y servidores admiten alguna versión modificada
de intercambio, los sistemas móviles generalmente no admiten intercambio de ninguna forma. Los
dispositivos móviles generalmente usan memoria flash en lugar de discos duros más espaciosos como
almacenamiento persistente. La restricción de espacio resultante es una de las razones por las que los
diseñadores de sistemas operativos móviles evitan el intercambio. Otras razones incluyen la cantidad
limitada de escrituras que la memoria flash puede tolerar antes de que se vuelva poco confiable y el
bajo rendimiento entre la memoria principal y la memoria flash en estos dispositivos.

Asignación de memoria contigua


La memoria principal debe albergar tanto el sistema operativo como los diversos procesos de usuario.
Por lo tanto, debemos asignar la memoria principal de la manera más eficiente posible.

La memoria generalmente se divide en dos particiones: una para el sistema operativo residente y otra
para los procesos del usuario. Podemos colocar el sistema operativo en memoria baja o memoria alta.
El principal factor que afecta esta decisión es la ubicación del vector de interrupción. Dado que el vector
de interrupción a menudo tiene poca memoria, los programadores también suelen colocar el sistema
operativo en poca memoria. Por lo tanto, en este texto, solo analizamos la situación en la que el sistema
operativo reside con poca memoria. El desarrollo de la otra situación es similar.

Uno de los métodos más simples para asignar memoria es dividir la memoria en varias particiones de
tamaño fijo. Cada partición puede contener exactamente un proceso. Por lo tanto, el grado de
multiprogramación está limitado por el número de particiones. En este método de múltiples
particiones, cuando una partición está libre, se selecciona un proceso de la cola de entrada y se carga
en la partición libre. Cuando finaliza el proceso, la partición queda disponible para otro proceso. El
método que se describe a continuación es una generalización del esquema de partición fija (llamado
MVT); se utiliza principalmente en entornos por lotes. Muchas de las ideas presentadas aquí también
son aplicables a un entorno de tiempo compartido en el que se utiliza la segmentación pura para la
gestión de la memoria.

En el esquema de partición variable, el sistema operativo mantiene una tabla que indica qué partes de
la memoria están disponibles y cuáles están ocupadas. Inicialmente, toda la memoria está disponible
para los procesos del usuario y se considera un gran bloque de memoria disponible, un agujero.
Eventualmente, como verá, la memoria contiene un conjunto de agujeros de varios tamaños.

A medida que los procesos ingresan al sistema, se colocan en una cola de entrada. El sistema operativo
tiene en cuenta los requisitos de memoria de cada proceso y la cantidad de espacio de memoria
disponible para determinar a qué procesos se les asigna memoria. Cuando se asigna espacio a un
proceso, se carga en la memoria y luego puede competir por el tiempo de CPU. Cuando un proceso
finaliza, libera su memoria, que el sistema operativo puede llenar con otro proceso de la cola de
entrada.

Entonces, en cualquier momento tenemos una lista de tamaños de bloque disponibles y una cola de
entrada. El sistema operativo puede ordenar la cola de entrada de acuerdo con un algoritmo de
programación. La memoria se asigna a los procesos hasta que, finalmente, los requisitos de memoria
del siguiente proceso no se pueden satisfacer, es decir, ningún bloque de memoria disponible (o
agujero) es lo suficientemente grande para contener ese proceso. El sistema operativo puede esperar
hasta que haya un bloque lo suficientemente grande disponible, o puede saltarse la cola de entrada
para ver si se pueden cumplir los requisitos de memoria más pequeños de algún otro proceso.

Fragmentación
Tanto las estrategias de primer ajuste como las de mejor ajuste para la asignación de memoria sufren
de fragmentación externa. A medida que los procesos se cargan y eliminan de la memoria, el espacio
de memoria libre se divide en pequeños fragmentos. La fragmentación externa existe cuando hay
suficiente espacio de memoria total para satisfacer una solicitud, pero los espacios disponibles no son
contiguos: el almacenamiento se fragmenta en una gran cantidad de pequeños agujeros. Este problema
de fragmentación puede ser grave. En el peor de los casos, podríamos tener un bloque de memoria
libre (o desperdiciado) entre cada dos procesos. Si todas estas pequeñas piezas de memoria estuvieran
en un gran bloque libre, podríamos ejecutar varios procesos más.

Segmentación
La segmentación es un esquema de gestión de la memoria que admite esta visión de la memoria del
programador. Un espacio de direcciones lógicas es una colección de segmentos. Cada segmento tiene
un nombre y una longitud. Las direcciones especifican tanto el nombre del segmento como el
desplazamiento dentro del segmento. Por lo tanto, el programador especifica cada dirección por dos
cantidades: un nombre de segmento y un desplazamiento.
Paginación
La paginación es otro esquema de administración de memoria que ofrece esta ventaja. Sin embargo, la
paginación evita la fragmentación externa y la necesidad de compactación, mientras que la
segmentación no lo hace. También resuelve el problema considerable de colocar fragmentos de
memoria de diferentes tamaños en el almacén de respaldo. La mayoría de los esquemas de
administración de memoria utilizados antes de la introducción de la paginación tenían este problema.
El problema surge porque, cuando es necesario intercambiar fragmentos de código o datos que residen
en la memoria principal, se debe encontrar espacio en el almacén de respaldo. El almacén de respaldo
tiene los mismos problemas de fragmentación discutidos en relación con la memoria principal, pero el
acceso es mucho más lento, por lo que la compactación es imposible. Debido a sus ventajas sobre los
métodos anteriores, la paginación en sus diversas formas se utiliza en la mayoría de los sistemas
operativos, desde los de mainframe hasta los de teléfonos inteligentes. La paginación se implementa a
través de la cooperación entre el sistema operativo y el hardware de la computadora.

Paginación jerárquica
La mayoría de los sistemas informáticos modernos admiten un gran espacio de direcciones lógicas (232
a 264). En tal entorno, la propia tabla de páginas se vuelve excesivamente grande. Por ejemplo,
considere un sistema con un espacio de direcciones lógicas de 32 bits. Si el tamaño de página en dicho
sistema es de 4 KB (212), entonces una tabla de páginas puede constar de hasta 1 millón de entradas
(232/212). Suponiendo que cada entrada consta de 4 bytes, cada proceso puede necesitar hasta 4 MB de
espacio de direcciones físicas solo para la tabla de páginas. Claramente, no querríamos asignar la tabla
de páginas de forma contigua en la memoria principal. Una solución simple a este problema es dividir
la tabla de páginas en partes más pequeñas. Podemos lograr esta división de varias maneras.

Tablas de páginas con hash


Un enfoque común para manejar espacios de direcciones de más de 32 bits es utilizar una tabla de
páginas con hash, siendo el valor hash el número de página virtual. Cada entrada en la tabla hash
contiene una lista enlazada de elementos que tienen un hash en la misma ubicación (para manejar
colisiones). Cada elemento consta de tres campos: (1) el número de página virtual, (2) el valor del marco
de la página asignada y (3) un puntero al siguiente elemento en la lista vinculada.

Tablas de páginas invertidas


Por lo general, cada proceso tiene una tabla de páginas asociada. La tabla de páginas tiene una entrada
para cada página que está utilizando el proceso (o una ranura para cada dirección virtual,
independientemente de la validez de esta última). Esta representación de tabla es natural, ya que
procesa las páginas de referencia a través de las direcciones virtuales de las páginas. Luego, el sistema
operativo debe traducir esta referencia a una dirección de memoria física. Dado que la tabla está
ordenada por dirección virtual, el sistema operativo puede calcular en qué parte de la tabla se
encuentra la entrada de la dirección física asociada y usar ese valor directamente. Uno de los
inconvenientes de este método es que cada tabla de páginas puede constar de millones de entradas.
Estas tablas pueden consumir grandes cantidades de memoria física solo para realizar un seguimiento
de cómo se utiliza otra memoria física.

Segmentación IA-32
La arquitectura IA-32 permite que un segmento tenga un tamaño de hasta 4 GB y la cantidad máxima
de segmentos por proceso es de 16 K. El espacio de direcciones lógicas de un proceso se divide en dos
particiones. La primera partición consta de hasta 8 K segmentos que son privados para ese proceso. La
segunda partición consta de hasta 8 K segmentos que se comparten entre todos los procesos. La
información sobre la primera partición se mantiene en la tabla de descriptores locales (LDT); la
información sobre la segunda partición se mantiene en la tabla de descriptores globales (GDT). Cada
entrada en LDT y GDT consiste en un descriptor de segmento de 8 bytes con información detallada
sobre un segmento en particular, incluida la ubicación base y el límite de ese segmento.

Paginación IA-32
La arquitectura IA-32 permite un tamaño de página de 4 KB o 4 MB. Para páginas de 4 KB, IA-32 utiliza
un esquema de paginación de dos niveles.

x86-64
Intel ha tenido una historia interesante en el desarrollo de arquitecturas de 64 bits. Su entrada inicial
fue la arquitectura IA-64 (más tarde llamada Itanium), pero esa arquitectura no fue ampliamente
adoptada. Mientras tanto, otro fabricante de chips, AMD, comenzó a desarrollar una arquitectura de
64 bits conocida como x86-64 que se basaba en ampliar el conjunto de instrucciones IA-32 existente. El
x86-64 admitía espacios de direcciones físicas y lógicas mucho más grandes, así como varios otros
avances arquitectónicos. Históricamente, AMD a menudo había desarrollado chips basados en la
arquitectura de Intel, pero ahora los roles se invirtieron cuando Intel adoptó la arquitectura x86-64 de
AMD. Al analizar esta arquitectura, en lugar de utilizar los nombres comerciales AMD64 e Intel 64,
utilizaremos el término más general x86-64.

Arquitectura ARM
Aunque los chips de Intel han dominado el mercado de las computadoras personales durante más de
30 años, los chips para dispositivos móviles, como teléfonos inteligentes y tabletas, a menudo se
ejecutan en procesadores ARM de 32 bits. Curiosamente, mientras que Intel diseña y fabrica chips, ARM
solo los diseña. Luego otorga licencias de sus diseños a los fabricantes de chips. Apple obtuvo la licencia
del diseño ARM para sus dispositivos móviles iPhone y iPad, y varios teléfonos inteligentes basados en
Android también usan procesadores ARM.

La arquitectura ARM de 32 bits admite los siguientes tamaños de página:

1. páginas de 4 KB y 16 KB
2. Páginas de 1 MB y 16 MB (secciones denominadas)

1.6 Aritmética del Computador.


La forma más sencilla de representación que emplea un bit de signo es la denominada representación
signo-magnitud. En una palabra de n bits, los n–1 bits de la derecha representan la magnitud del entero.

Suma y resta
REGLA DE DESBORDAMIENTO: al sumar dos números, y ambos son o bien positivos o negativos, se
produce desbordamiento si y solo si el resultado tiene signo opuesto.

REGLA DE LA RESTA: para substraer un número (el substraendo) de otro (minuendo), se obtiene el
complemento a dos del substraendo y se le suma al minuendo.
Substracción de números en la notación de complemento a dos (M – S)

Multiplicación

Multiplicación de enteros binarios sin signo

Multiplicación en complemento a dos


Si estos números se interpretan como enteros sin signo, estamos sumando 9 (1001) más 3 (0011) para
obtener 12 (1100). Como enteros en complemento a dos, estamos sumando 7 (1001) a 3 (0011) para
obtener 4 (1100).
Multiplicación de dos enteros sin signo de cuatro bits para producir un resultado de ocho bits.

División

Primero se examinan los bits del dividendo de izquierda a derecha hasta que el conjunto de bits
examinados represente un número mayor o igual que el divisor; o, en otras palabras, hasta que el
divisor sea capaz de dividir al número. Hasta que eso ocurre, se van colocando ceros en el cociente de
izquierda a derecha. Cuando dicho evento ocurre, se coloca un 1 en el cociente, y se substrae el divisor
del dividendo parcial. Al resultado se le denomina resto parcial. En cada ciclo, se añaden bits adicionales
del dividendo al resto parcial hasta que el resultado sea mayor o igual que el divisor. Como antes, de
este número se resta el divisor para producir un nuevo resto parcial. El proceso continúa hasta que se
acaban los bits del dividendo.

1.7 Función y estructura de la UCP.

La UCP (unidad central de proceso), también llamada microprocesador (μP) o simplemente procesador.
Es aquella sección de un PC en la que se procesan y operan los datos. Igualmente, en este chip se traen
las instrucciones de la memoria que se decodifican y se ejecutan. Básicamente la CPU está formada por
tres partes: la ALU, la unidad de control y los registros, perteneciendo algunos de estos también a la
ALU y a la unidad de control.

También podría gustarte