Andrew s. Tanenbaum



Descargar 4,35 Mb.
Ver original pdf
Página6/134
Fecha de conversión12.11.2019
Tamaño4,35 Mb.
1   2   3   4   5   6   7   8   9   ...   134

sistema (system call), la cual se atrapa en el kernel e invoca al sistema operativo. La instrucción

TRAP


cambia del modo usuario al modo kernel e inicia el sistema operativo. Cuando se ha comple-

tado el trabajo, el control se devuelve al programa de usuario en la instrucción que va después de

la llamada al sistema. Más adelante en este capítulo explicaremos los detalles acerca del mecanis-

mo de llamadas al sistema, pero por ahora piense en él como un tipo especial de instrucción de lla-

mada a procedimiento que tiene la propiedad adicional de cambiar del modo usuario al modo

kernel. Como indicación sobre la tipografía, utilizaremos el tipo de letra Helvetica en minúsculas

para indicar las llamadas al sistema en el texto del libro, como se muestra a continuación: 

read


.

Vale la pena indicar que las computadoras tienen otros traps aparte de la instrucción para eje-

cutar una llamada al sistema. La mayoría de los demás traps son producidos por el hardware para

advertir acerca de una situación excepcional, tal como un intento de dividir entre 0 o un subdesbor-

Unidad

de

obtención



Unidad

de

obtención



Unidad

de

obtención



Unidad

de deco-


dificación

Unidad


de deco-

dificación

Unidad

de

ejecución



Unidad

de deco-


dificación

Búfer


de

contención

(a)

(b)


Unidad

de

ejecución



Unidad

de

ejecución



Unidad

de

ejecución



Figura 1-7. (a) Canalización de tres etapas;  (b) CPU superescalar.

damiento de punto flotante. En cualquier caso, el sistema operativo obtiene el control y debe deci-

dir qué hacer. Algunas veces el programa debe terminarse con un error. Otras veces el error se pue-

de ignorar (un número que provoque un subdesbordamiento puede establecerse en 0). Por último,

cuando el programa anuncia por adelantado que desea manejar ciertos tipos de condiciones, puede

devolvérsele el control para dejarlo resolver el problema. 

Chips con multihilamiento y multinúcleo

La ley de Moore establece que el número de transistores en un chip se duplica cada 18 meses. Es-

ta “ley” no es ningún tipo de ley de física, como la de la conservación del momento, sino una ob-

servación hecha por Gordon Moore, cofundador de Intel, acerca de la velocidad con la que los

ingenieros de procesos en las compañías de semiconductores pueden reducir sus transistores. La ley

de Moore ha estado vigente durante tres décadas hasta hoy y se espera que siga así durante al me-

nos una década más. 

La abundancia de transistores está ocasionando un problema: ¿qué se debe hacer con todos

ellos? En párrafos anteriores vimos una solución: las arquitecturas superescalares, con múltiples

unidades funcionales. Pero a medida que se incrementa el número de transistores, se puede hacer

todavía más. Algo obvio por hacer es colocar cachés más grandes en el chip de la CPU y eso está

ocurriendo, pero en cierto momento se llega al punto de rendimiento decreciente.

El siguiente paso obvio es multiplicar no sólo las unidades funcionales, sino también parte de

la lógica de control. El Pentium 4 y algunos otros chips de CPU tienen esta propiedad, conocida co-

mo multihilamiento (multithreading) o hiperhilamiento (hyperthreading) (el nombre que puso In-

tel al multihilamiento). Para una primera aproximación, lo que hace es permitir que la CPU

contenga el estado de dos hilos de ejecución (threads) distintos y luego alterne entre uno y otro con

una escala de tiempo en nanosegundos (un hilo de ejecución es algo así como un proceso ligero,

que a su vez es un programa en ejecución; veremos los detalles sobre esto en el capítulo 2). Por

ejemplo, si uno de los procesos necesita leer una palabra de memoria (que requiere muchos ciclos

de reloj), una CPU con multihilamiento puede cambiar a otro hilo. El multihilamiento no ofrece un

verdadero paralelismo. Sólo hay un proceso en ejecución a la vez, pero el tiempo de cambio entre

un hilo y otro se reduce al orden de un nanosegundo.

El multihilamiento tiene consecuencias para el sistema operativo, debido a que cada hilo apa-

rece para el sistema operativo como una CPU separada. Considere un sistema con dos CPU reales,

cada una con dos hilos. El sistema operativo verá esto como si hubiera cuatro CPU. Si hay suficien-

te trabajo sólo para mantener ocupadas dos CPU en cierto punto en el tiempo, podría planificar de

manera inadvertida dos hilos en la misma CPU, mientras que la otra CPU estaría completamente

inactiva. Esta elección es mucho menos eficiente que utilizar un hilo en cada CPU. El sucesor del

Pentium 4, conocido como arquitectura Core (y también Core 2), no tiene hiperhilamiento, pero In-

tel ha anunciado que el sucesor del Core lo tendrá nuevamente.

Más allá del multihilamiento, tenemos chips de CPU con dos, cuatro o más procesadores com-

pletos, o núcleos (cores) en su interior. Los chips de multinúcleo (multicore) de la figura 1-8 con-

tienen efectivamente cuatro minichips en su interior, cada uno con su propia CPU independiente

(más adelante hablaremos sobre las cachés). Para hacer uso de dicho chip multinúcleo se requiere

en definitiva un sistema operativo multiprocesador.



22

INTRODUCCIÓN

CAPÍTULO 1


SECCIÓN 1.3

REVISIÓN DEL HARDWARE DE COMPUTADORA



23

1.3.2  Memoria

El segundo componente importante en cualquier computadora es la memoria. En teoría, una memo-

ria debe ser en extremo rápida (más rápida que la velocidad de ejecución de una instrucción, de ma-

nera que la memoria no detenga a la CPU), de gran tamaño y muy económica. Ninguna tecnología

en la actualidad cumple con todos estos objetivos, por lo que se adopta una solución distinta. El sis-

tema de memoria está construido como una jerarquía de capas, como se muestra en la figura 1-9.

Las capas superiores tienen mayor velocidad, menor capacidad y mayor costo por bit que las capas

inferiores, a menudo por factores de mil millones o más.

L2

L2

L2



L2

Caché L2


Caché

L1

(a)



(b)

Núcleo


1

Núcleo


2

Núcleo


1

Núcleo


2

Núcleo


3

Núcleo


4

Núcleo


3

Núcleo


4

Figura 1-8. (a) Un chip de cuatro núcleos (quad-core) con una caché L2 compartida.

(b) Un chip de cuatro núcleos con cachés L2 separadas.

Registros

Caché


Memoria principal

Cinta magnética

Disco magnético

    1 nseg

    2 nseg

  10 nseg

  10 mseg

100 seg


<1 KB

  4 MB


  512-2048 MB

  200-1000 GB

  400-800  GB

Capacidad típica

Tiempo de acceso típico

Figura 1-9.  Una común jerarquía de memoria. Los números son sólo aproximaciones. 

La capa superior consiste en los registros internos de la CPU. Están compuestos del mismo ma-

terial que la CPU y, por ende, tienen la misma rapidez. En consecuencia no hay retraso a la hora 

de utilizarlos. La capacidad de almacenamiento disponible en estos registros es generalmente de 

32 

 32 bits en una CPU de 32 bits y de 64  64 bits en una CPU de 64 bits. Menos de 1 KB en



ambos casos. Los programas deben administrar los registros (es decir, decidir qué deben guardar 

en ellos) por su cuenta, en el software.



El siguiente nivel es la memoria caché, que el hardware controla de manera parcial. La memoria

principal se divide en líneas de caché, que por lo general son de 64 bytes, con direcciones de 0 a 63

en la línea de caché 0, direcciones de 64 a 127 en la línea de caché 1 y así sucesivamente. Las líneas

de caché que se utilizan con más frecuencia se mantienen en una caché de alta velocidad, ubicada den-

tro o muy cerca de la CPU. Cuando el programa necesita leer una palabra de memoria, el hardware de

la caché comprueba si la línea que se requiere se encuentra en la caché. Si es así (a lo cual se le cono-

ce como acierto de caché), la petición de la caché se cumple y no se envía una petición de memoria

a través del bus hacia la memoria principal. Los aciertos de caché por lo general requieren un tiempo

aproximado de dos ciclos de reloj. Los fallos de caché tienen que ir a memoria, con un castigo consi-

derable de tiempo. La memoria caché está limitada en tamaño debido a su alto costo. Algunas máqui-

nas tienen dos o incluso tres niveles de caché, cada una más lenta y más grande que la anterior.

El uso de cachés juega un papel importante en muchas áreas de las ciencias computacionales,

no sólo en la caché de las líneas de RAM. Cada vez que hay un recurso extenso que se puede divi-

dir en piezas, algunas de las cuales se utilizan con mucho más frecuencia que otras, a menudo se

invoca a la caché para mejorar el rendimiento. Los sistemas operativos la utilizan todo el tiempo.

Por ejemplo, la mayoría de los sistemas operativos mantienen (piezas de) los archivos que se utili-

zan con frecuencia en la memoria principal para evitar tener que obtenerlos del disco en forma 

repetida. De manera similar, los resultados de convertir nombres de rutas extensas tales como



/home/ast/proyectos/minix3/src/kernel/reloj.c

a la dirección en disco donde se encuentra el archivo, se pueden colocar en la caché para evitar bús-

quedas repetidas. Por último, cuando una dirección de una página Web (URL) se convierte en una

dirección de red (dirección IP), el resultado se puede poner en la caché para usarlo a futuro (exis-

ten muchos otros usos).

En cualquier sistema de caché surgen con rapidez varias preguntas, incluyendo:

1. Cuándo se debe poner un nuevo elemento en la caché.

2. En qué línea de caché se debe poner el nuevo elemento.

3. Qué elemento se debe eliminar de la caché cuando se necesita una posición.

4. Dónde se debe poner un elemento recién desalojado en la memoria de mayor tamaño.

No todas las preguntas son relevantes para cada situación de uso de la caché. Para poner líneas de

la memoria principal en la caché de la CPU, por lo general se introduce un nuevo elemento en ca-

da fallo de caché. La línea de caché a utilizar se calcula generalmente mediante el uso de algunos

de los bits de mayor orden de la dirección de memoria a la que se hace referencia. Por ejemplo, con

4096 líneas de caché de 64 bytes y direcciones de 32 bits, los bits del 6 al 17 podrían utilizarse pa-

ra especificar la línea de caché, siendo los bits del 0 al 5 el byte dentro de la línea de la caché. En

este caso, el elemento a quitar es el mismo en el que se colocan los nuevos datos, pero en otros sis-

temas podría ser otro. Por último, cuando se vuelve a escribir una línea de caché en la memoria prin-

cipal (si se ha modificado desde la última vez que se puso en caché), la posición en memoria donde

se debe volver a escribir se determina únicamente por la dirección en cuestión.

Las cachés son una idea tan útil que las CPUs modernas tienen dos de ellas. La caché L1 o de

primer nivel está siempre dentro de la CPU, y por lo general alimenta las instrucciones decodifica-

das al motor de ejecución de la CPU. La mayoría de los chips tienen una segunda caché L1 para las

24

INTRODUCCIÓN

CAPÍTULO 1


SECCIÓN 1.3

REVISIÓN DEL HARDWARE DE COMPUTADORA



25

palabras de datos que se utilizan con frecuencia. Por lo general, las cachés L1 son de 16 KB cada

una. Además, a menudo hay una segunda caché, conocida como caché L2, que contiene varios me-

gabytes de palabras de memoria utilizadas recientemente. La diferencia entre las cachés L1 y L2 es-

tá en la velocidad. El acceso a la caché L1 se realiza sin ningún retraso, mientras que el acceso a la

caché L2 requiere un retraso de uno o dos ciclos de reloj.

En los chips multinúcleo, los diseñadores deben decidir dónde deben colocar las cachés. En la fi-

gura 1-8(a) hay una sola caché L2 compartida por todos los núcleos; esta metodología se utiliza en los

chips multinúcleo de Intel. En contraste, en la figura 1-8(b) cada núcleo tiene su propia caché L2; AMD

utiliza esta metodología. Cada estrategia tiene sus pros y sus contras. Por ejemplo, la caché L2 compar-

tida de Intel requiere un dispositivo controlador de caché más complicado, pero la manera en que AMD

utiliza la caché hace más difícil la labor de mantener las cachés L2 consistentes.

La memoria principal viene a continuación en la jerarquía de la figura 1-9. Es el “caballo de

batalla” del sistema de memoria. Por lo general a la memoria principal se le conoce como RAM

(Random Access Memory, Memoria de Acceso Aleatorio). Los usuarios de computadora antiguos

algunas veces la llaman memoria de núcleo debido a que las computadoras en las décadas de 1950

y 1960 utilizaban pequeños núcleos de ferrita magnetizables para la memoria principal. En la ac-

tualidad, las memorias contienen desde cientos de megabytes hasta varios gigabytes y su tamaño

aumenta con rapidez. Todas las peticiones de la CPU que no se puedan satisfacer desde la caché pa-

san a la memoria principal.

Además de la memoria principal, muchas computadoras tienen una pequeña cantidad de memo-

ria de acceso aleatorio no volátil. A diferencia de la RAM, la memoria no volátil no pierde su conte-

nido cuando se desconecta la energía. La ROM (Read Only Memory, Memoria de sólo lectura) se

programa en la fábrica y no puede modificarse después. Es rápida y económica. En algunas compu-

tadoras, el cargador de arranque (bootstrap loader) que se utiliza para iniciar la computadora está

contenido en la ROM. Además, algunas tarjetas de E/S vienen con ROM para manejar el control de

los dispositivos de bajo nivel.

La  EEPROM (Electrically Erasable PROM, PROM eléctricamente borrable) y la memoria



flash son también no volátiles, pero en contraste con la ROM se pueden borrar y volver a escribir

datos en ellas. Sin embargo, para escribir en este tipo de memorias se requiere mucho más tiempo

que para escribir en la RAM, por lo cual se utilizan en la misma forma que la ROM, sólo con la ca-

racterística adicional de que ahora es posible corregir los errores en los programas que contienen,

mediante la acción de volver a escribir datos en ellas en el campo de trabajo.

La memoria flash también se utiliza comúnmente como el medio de almacenamiento en los dis-

positivos electrónicos portátiles. Sirve como película en las cámaras digitales y como el disco en

los reproductores de música portátiles, para nombrar sólo dos usos. La memoria flash se encuentra

entre la RAM y el disco en cuanto a su velocidad. Además, a diferencia de la memoria en disco, si

se borra demasiadas veces, se desgasta. 

Otro tipo más de memoria es CMOS, la cual es volátil. Muchas computadoras utilizan memo-

ria CMOS para guardar la fecha y hora actuales. La memoria CMOS y el circuito de reloj que in-

crementa la hora en esta memoria están energizados por una pequeña batería, por lo que la hora se

actualiza en forma correcta aun cuando la computadora se encuentre desconectada. La memoria

CMOS también puede contener los parámetros de configuración, como el disco del cual se debe ini-

ciar el sistema. Se utiliza CMOS debido a que consume tan poca energía que la batería instalada en



la fábrica dura varios años. Sin embargo, cuando empieza a fallar puede parecer como si la compu-

tadora tuviera la enfermedad de Alzheimer, olvidando cosas que ha sabido durante años, como des-

de cuál disco duro se debe iniciar el sistema.

1.3.3 Discos

El siguiente lugar en la jerarquía corresponde al disco magnético (disco duro). El almacenamiento en

disco es dos órdenes de magnitud más económico que la RAM por cada bit, y a menudo es dos órde-

nes de magnitud más grande en tamaño también. El único problema es que el tiempo para acceder en

forma aleatoria a los datos en ella es de cerca de tres órdenes de magnitud más lento. Esta baja veloci-

dad se debe al hecho de que un disco es un dispositivo mecánico, como se muestra en la figura 1-10.



26

INTRODUCCIÓN

CAPÍTULO 1

Superficie 2

Superficie 1

Superficie 0

Cabeza de lectura/escritura (1 por superficie)

Dirección de movimiento del brazo

Superficie 3

Superficie 5

Superficie 4

Superficie 7

Superficie 6

Figura 1-10. Estructura de una unidad de disco.

Un disco consiste en uno o más platos que giran a 5400, 7200 o 10,800 rpm. Un brazo mecáni-

co, con un punto de giro colocado en una esquina, se mueve sobre los platos de manera similar al

brazo de la aguja en un viejo tocadiscos. La información se escribe en el disco en una serie de círcu-

los concéntricos. En cualquier posición dada del brazo, cada una de las cabezas puede leer una re-

gión anular conocida como pista (track). En conjunto, todas las pistas para una posición dada del

brazo forman un cilindro (cylinder).

Cada pista se divide en cierto número de sectores, por lo general de 512 bytes por sector. En los

discos modernos, los cilindros exteriores contienen más sectores que los interiores. Para desplazar el

brazo de un cilindro al siguiente se requiere aproximadamente 1 milisegundo. Para desplazar el brazo

a un cilindro aleatoriamente se requieren por lo general de 5 a 10 milisegundos, dependiendo de la uni-

dad. Una vez que el brazo se encuentra en la pista correcta, la unidad debe esperar a que el sector ne-

cesario gire hacia abajo de la cabeza, con un retraso adicional de 5 a 10 milisegundos, dependiendo de

las rpm de la unidad. Una vez que el sector está bajo la cabeza, la lectura o escritura ocurre a una velo-

cidad de 50 MB/seg en los discos de bajo rendimiento hasta de 160 MB/seg en los discos más rápidos.

Muchas computadoras presentan un esquema conocido como memoria virtual (virtual me-



mory), el cual describiremos hasta cierto punto en el capítulo 3. Este esquema hace posible la 

SECCIÓN 1.3

REVISIÓN DEL HARDWARE DE COMPUTADORA



27

ejecución de programas más grandes que la memoria física al colocarlos en el disco y utilizar la me-

moria principal como un tipo de caché para las partes que se ejecutan con más frecuencia. Este 

esquema requiere la reasignación de direcciones de memoria al instante, para convertir la dirección

que el programa generó en la dirección física en la RAM en donde se encuentra la palabra. Esta

asignación se realiza mediante una parte de la CPU conocida como MMU (Memory Management



Unit, Unidad de Administración de Memoria), como se muestra en la figura 1-6. 

La presencia de la caché y la MMU pueden tener un gran impacto en el rendimiento. En un sis-

tema de multiprogramación, al cambiar de un programa a otro (lo que se conoce comúnmente co-

mo cambio de contexto context switch), puede ser necesario vaciar todos los bloques modificados

de la caché y modificar los registros de asignación en la MMU. Ambas operaciones son costosas y

los programadores se esfuerzan bastante por evitarlas. Más adelante veremos algunas de las conse-

cuencias de sus tácticas.

1.3.4  Cintas

La última capa de la jerarquía en la memoria es la cinta magnética. Este medio se utiliza con fre-

cuencia como respaldo para el almacenamiento en disco y para contener conjuntos de datos muy

extensos. Para acceder a una cinta, primero debe colocarse en un lector de cinta, ya sea que lo ha-

ga una persona o un robot (el manejo automatizado de las cintas es común en las instalaciones con

bases de datos enormes). Después la cinta tal vez tenga que embobinarse hacia delante para llegar

al bloque solicitado. En general, este proceso podría tardar varios minutos. La gran ventaja de la

cinta es que es en extremo económica por bit y removible, lo cual es importante para las cintas de

respaldo que se deben almacenar fuera del sitio de trabajo para que puedan sobrevivir a los incen-

dios, inundaciones, terremotos y otros desastres.

La jerarquía de memoria que hemos descrito es la común, pero algunas instalaciones no tienen

todas las capas o tienen unas cuantas capas distintas (como el disco óptico). Aún así, a medida que

se desciende por todos las capas en la jerarquía, el tiempo de acceso aleatorio se incrementa en for-

ma dramática, la capacidad aumenta de igual forma y el costo por bit baja considerablemente. En

consecuencia, es probable que las jerarquías de memoria se utilicen por varios años más.

1.3.5  Dispositivos de E/S

La CPU y la memoria no son los únicos recursos que el sistema operativo debe administrar. Los

dispositivos de E/S también interactúan mucho con el sistema operativo. Como vimos en la figu-

ra 1-6, los dispositivos de E/S generalmente constan de dos partes: un dispositivo controlador y el

dispositivo en sí. El dispositivo controlador es un chip o conjunto de chips que controla físicamen-

te el dispositivo. Por ejemplo, acepta los comandos del sistema operativo para leer datos del dis-

positivo y los lleva a cabo.

En muchos casos, el control del dispositivo es muy complicado y detallado, por lo que el trabajo

del chip o los chips del dispositivo controlador es presentar una interfaz más simple al sistema operati-

vo (pero de todas formas sigue siendo muy complejo). Por ejemplo, un controlador de disco podría

aceptar un comando para leer el sector 11,206 del disco 2; después, tiene que convertir este número de


sector lineal en un cilindro, sector y cabeza. Esta conversión se puede complicar por el hecho de que

los cilindros exteriores tienen más sectores que los interiores y que algunos sectores defectuosos se han

reasignado a otros. Posteriormente, el dispositivo controlador tiene que determinar en cuál cilindro se

encuentra el brazo y darle una secuencia de pulsos para desplazarse hacia dentro o hacia fuera el núme-

ro requerido de cilindros; tiene que esperar hasta que el sector apropiado haya girado bajo la cabeza, y

después empieza a leer y almacenar los bits a medida que van saliendo de la unidad, eliminando el

preámbulo y calculando la suma de verificación. Por último, tiene que ensamblar los bits entrantes en

palabras y almacenarlos en la memoria. Para hacer todo este trabajo, a menudo los dispositivos contro-

ladores consisten en pequeñas computadoras incrustadas que se programan para realizar su trabajo.

La otra pieza es el dispositivo en sí. Los dispositivos tienen interfaces bastante simples, debi-

do a que no pueden hacer mucho y también para estandarizarlas. Esto último es necesario de ma-

nera que cualquier dispositivo controlador de disco IDE pueda manejar cualquier disco IDE, por

ejemplo. IDE (Integrated Drive Electronics) significa Electrónica de unidades integradas y es el

tipo estándar de disco en muchas computadoras. Como la interfaz real del dispositivo está oculta

detrás del dispositivo controlador, todo lo que el sistema operativo ve es la interfaz para el disposi-

tivo controlador, que puede ser bastante distinta de la interfaz para el dispositivo.

Como cada tipo de dispositivo controlador es distinto, se requiere software diferente para con-

trolar cada uno de ellos. El software que se comunica con un dispositivo controlador, que le propor-

ciona comandos y acepta respuestas, se conoce como driver (controlador). Cada fabricante de

dispositivos controladores tiene que suministrar un driver específico para cada sistema operativo en

que pueda funcionar. Así, un escáner puede venir, por ejemplo, con drivers para Windows 2000,

Windows XP, Vista y Linux.

Para utilizar el driver, se tiene que colocar en el sistema operativo de manera que pueda ejecu-

tarse en modo kernel. En realidad, los drivers se pueden ejecutar fuera del kernel, pero sólo unos

cuantos sistemas actuales admiten esta posibilidad debido a que se requiere la capacidad para per-

mitir que un driver en espacio de usuario pueda acceder al dispositivo de una manera controlada,

una característica que raras veces se admite. Hay tres formas en que el driver se pueda colocar en

el kernel: la primera es volver a enlazar el kernel con el nuevo driver y después reiniciar el sistema

(muchos sistemas UNIX antiguos trabajan de esta manera); la segunda es crear una entrada en un

archivo del sistema operativo que le indique que necesita el driver y después reinicie el sistema, pa-

ra que en el momento del arranque, el sistema operativo busque los drivers necesarios y los cargue

(Windows funciona de esta manera); la tercera forma es que el sistema operativo acepte nuevos dri-

vers mientras los ejecuta e instala al instante, sin necesidad de reiniciar. Esta última forma solía ser

rara, pero ahora se está volviendo mucho más común. Los dispositivos conectables en caliente (hot-



pluggable), como los dispositivos USB e IEEE 1394 (que se describen a continuación) siempre ne-

cesitan drivers que se cargan en forma dinámica.

Todo dispositivo controlador tiene un número pequeño de registros que sirven para comunicar-

se con él. Por ejemplo, un dispositivo controlador de disco con las mínimas características podría

tener registros para especificar la dirección de disco, dirección de memoria, número de sectores e

instrucción (lectura o escritura). Para activar el dispositivo  controlador, el driver recibe un coman-

do del sistema operativo y después lo traduce en los valores apropiados para escribirlos en los re-

gistros del dispositivo. La colección de todos los registros del dispositivo forma el espacio de




Compartir con tus amigos:
1   2   3   4   5   6   7   8   9   ...   134


La base de datos está protegida por derechos de autor ©absta.info 2019
enviar mensaje

    Página principal