Sistema+Operativo+OS+2


 * OS/2 **


 * ANTECEDENTES**

**OS/2** son las siglas de "Sistema operativo de segunda generación". La idea de **OS/2** surgió entre **IBM** y **Microsoft** a mediados de los 80, en un intento de hacer un sucesor de MS-DOS, el cual ya empezaba a acusar el paso del tiempo y resultaba claramente desaprovechador de los recursos de las máquinas de la época (basadas en el Intel 286).

OS/2 1.0 salió en abril de 1987 y era un sistema operativo de 16 bits, pues estaba pensado para trabajar sobre el microprocesador 286. Sin embargo, aprovechaba plenamente el modo protegido de este ordenador, haciendo uso de sus capacidades para protección de memoria, gestión de multitarea, etc. El resultado fue un S.O. estable, rápido y muy potente.



OS/2 ya tenía incorporada desde esa primera versión la multitarea real. Se podían ejecutar varias sesiones simultáneamente, en cada una de ellas se podían tener múltiples programas, y cada uno de ellos podía tener múltiples threads en ejecución. Se trataba de una multitarea jerárquica, con cuatro niveles de prioridad: Crítico (útil para programas que requieran atención casi constante por parte de la CPU, como un módem), Primer plano (correspondiente al programa que tiene acceso a la pantalla, teclado y ratón), Medio (programas lanzados por el usuario que se ejecutan en BackGround) y Desocupado (tareas de poca importancia o lentas, como el Spooler de impresión). Dentro de cada nivel (a excepción del de Primer plano), existen 32 niveles de prioridad, los cuales son asignados dinámicamente a cada programa por el S.O. en función del porcentaje de uso de la CPU, de los puertos de E/S, etc.

OS/2, además, permitía memoria virtual, con lo que se podían ejecutar programas más largos que lo que la memoria física instalada permitiría en principio (los requerimientos de aquella versión eran un 286 con 2 megas de memoria). Por otro lado, incluía la característica de compartición de código: al cargar dos veces un mismo programa, el código de este no se duplicaba en memoria, sino que el mismo código era ejecutado por dos Threads diferentes. Esto permitía ahorrar mucha memoria.

Esta versión de OS/2 era íntegramente en modo texto. Si bien el Sistema Operativo daba la posibildad de usar los modos gráficos de la tarjeta del ordenador, no incluía ningún API que ayudase en ello, recayendo todo el trabajo de diseño de rutinas de puntos, líneas, etc en el programador de la aplicación. Esto no era realmente tan problemático, pues era lo que se hacía (y se hace) en el mundo del MS-DOS. Sin embargo, se hechaba en falta un entorno gráfico como Windows.

En la versión 1.1, aparecida en octubre de 1988, llegó por fin el Presentation Manager, un gestor de modo gráfico, junto con la primera versión de Work Place Shell. Ambos formaban un entorno gráfico muy parecido al aún no comercializado Windows 3.0. También hizo su aparición el formato de ficheros HPFS (High Performance File System). Este sistema de ficheros complementaba al clásico FAT, que era el usado por MS-DOS y por OS/2 1.0; sin embargo, ofrecía una gran cantidad de ventajas, tales como:

El gran problema de OS/2 es que seguia siendo un S.O. de 16 bits, con lo que no aprovechaba plenamente las capacidades de los 386 de la época, que empezaron a extenderse con más velocidad de la esperada. Según una revista del sector, Microsoft //sugirió// hacer una versión de 32 bits (que obligaría a ejecutarla en ordenadores 386 o superiores), pero IBM //insistió// en perfeccionar la de 16 bits. Sobre quien dijo cada cosa realmente solo se puede especular. Lo único que se sabe a ciencia cierta es que la versión de OS/2 de 32 bits presentada por MicroSoft en 1990 era casi igual que la versión 1.3, con la única diferencia de que el kernel era de 32 bits. IBM, por su parte, quería un escritorio orientado a objetos, y no el clásico shell de OS/2 1.x (el cual MicroSoft copiaría para su Windows 3.0). Puestas así las cosas, finalmente se rompió el acuerdo entre ambos.        
 * Menor fragmentación de ficheros: HPFS busca primero una zona en donde el archivo entre completo, con lo que la fragmentación de ficheros es prácticamente inexistente. De hecho, IBM recomienda desfragmentar los discos duros una vez al año, y solo a los paranoicos.
 * Mayor capacidad: HPFS admite discos duros de hasta 512 gigabytes de capacidad, manteniendo el tamaño del cluster (unidad mínima de información almacenable) en 512 bytes o un sector. En FAT, el tamaño mínimo de cluster para un disco duro es 2048 bytes, y para discos mayores aumenta (un disco duro de 1 giga tiene un tamaño de cluster de 32Ks).
 * Soporte para nombres largos: permite nombres de hasta 256 caracteres.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Mayor seguridad: si al grabar en un sector se detecta un error, se marca automáticamente como defectuoso y se graba en otra parte.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Mayor velocidad en el acceso, gracias a la estructura jerarquica de directorios, que optimiza el acceso a disco.

<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">OS/2 2.0, la primera versión de OS/2 de 32 bits, iba a salir inicialmente a finales de 1990; pero al no contar con la ayuda de Microsoft, IBM no fue capaz de sacarlo hasta 1992, dandole a Windows 3.0 el tiempo suficiente para asentarse en el mercado. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">OS/2 2.0 tenía todas las ventajas de los anteriores OS/2, unido al nuevo núcleo de 32 bits. No se trataba, por tanto, de un retoque de la versión de 16 bits, sino un sistema operativo prácticamente nuevo que aprovechaba al máximo las capacidades del modo protegido del microprocesador 386. Sin embargo, iba más allá que Windows, pues al contrario que éste, ofrecía compatibilidad garantizada con todas las aplicaciones de 16 bits anteriores, gracias a la inclusión del API original de 16 bits junto con el nuevo de 32, y además sin perdida de prestaciones. Así mismo, ofrecía también compatibilidad con Windows 2.x y 3.0, junto con una compatibilidad con MS-DOS muy mejorada, gracias al modo V86 que incorporan los micros 386 y del que carecía el 286: en OS/2 1.x la compatibilidad DOS era muy limitada, quedando reducida a una sola tarea y realizando un cambio entre modo real y modo protegido del microprocesador, además de consumir de manera permanente 640 Ks de memoria. Aparte, la emulación no era todo lo buena que cabía esperar. Todos estos problemas desaparecieron en la versión 2.0, pudiendo tener varias sesiones DOS totalmente independientes entre sí, con una compatibilidad cercana al 100% y beneficiándose de las capacidades de Crash Protection del OS/2, que impiden que un programa pueda colapsar el sistema entero.

<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Por otro lado, el Work Place Shell (el shell de trabajo gráfico, de ahora en adelante WPS) fue muy mejorado, resultando un shell totalmente orientado a objetos, con acceso directo a los ficheros, carpetas dentro de carpetas, ficheros sombra (conocidos como alias en los sistemas UNIX) y un escritorio de verdad. A su lado, el shell de Windows 3.0 quedaba a la altura del betún. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">IBM consiguió vender OS/2 2.0 en grandes cantidades; sin embargo, no consiguio su autentico despegue, en parte por culpa de la falta de apoyo por parte de las empresas de software. El API del Presentation Manager, aunque similar al de Windows, tenía muchas diferencias, con lo que las empresas tuvieron que elegir entre uno u otro, ante la imposibilidad de muchas de ellas de dividir su talento entre ambos sistemas. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">A principios de 1994 aparece OS/2 Warp, nombre comercial de la versión 3.0 de OS/2. En ella surgen nuevos elementos: un kit completo de multimedia (mejora del que traía la versión 2.1) y el Bonus Pak, un kit de aplicaciones que permite ponerse a trabajar con el ordenador nada más instalar el Sistema Operativo, pues contiene elementos como un Kit de conexión a Internet completo, el paquete integrado IBM Works (formado por un procesador de textos, hoja de cálculo, base de datos y graficos de empresa, junto con el PIM, que añade más funcionalidades aprovechando las capacidades drag&drop del WPShell), soft de terminal, soft de captura y tratamiento de video, etc. Así mismo, la cantidad de hardware soportado fue ampliado de manera considerable, soportando casi cualquier dispositivo existente en el mercado: CD-Roms, impresoras, tarjetas de sonido, soporte PCMCIA, tarjetas de video, tarjetas de captura de video, tarjetas SCSI, etc. Los requisitos mínimos de esta versión seguían siendo un 386sx a 16MHz con 4 megas de RAM, los mismos que Windows 3.11, y podía ejecutar programas DOS, OS/2 16bits, OS/2 32 bits, Windows 2.x y Windows 3.x (incluia además el API Win32s, con lo que se podían ejecutar incluso programas Windows de 32bits).

**<span style="font-family: 'Times New Roman',serif; font-size: 24pt;">ESTRUCTURA DE OS/2 ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Vamos a empezar por ver como acceder al disco, pantalla y teclado en OS/2. Si bien es cierto que todos los lenguajes de programación ofrecen instrucciones estandar (y sobre todo, portables) para acceder a estos dispositivos, el uso de las funciones específicas que ofrece OS/2 nos permite conseguir mejores rendimientos. Un ejemplo es la lectura de datos desde un fichero. Si usamos las funciones estandar de C, por ejemplo, leeremos datos de un en un byte; dado que, al compilar, estamos haciendo una llamada al sistema en sí, en principio sería lo mismo usar estas funciones que las de OS/2; sin embargo, OS/2 permite leer multiples bytes de una sola vez. La ventaja es que para cada lectura hay que llamar al núcleo de OS/2, lo cual consume mucho tiempo. Si tenemos que hacer 100 llamadas estandar para leer 100 bytes, será un proceso bastante lento. Pero si usamos una llamada de OS/2 para leer los 100 bytes de una sola vez, al haber una sola transición **programa-nucleo-programa**, la lectura será notablemente más rápida. Es imposible acelerar esa transición, pues no es problema de OS/2, sino de la propia arquitectura Intel.

<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">En el esquema, vemos que la aplicación se comunica con el Sistema de Ficheros de OS/2, que forma parte del núcleo, y éste determina a quien tiene que enviar o de quien debe leer los datos. Si el programa quiere acceder a la pantalla, el Sistema de Ficheros envía los caracteres al Subsistema de Video (VIO), que es la parte encargada de controlar la totalidad de accesos a la pantalla. Lo mismo si se trata del teclado, el ratón o un fichero de disco. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">La razón de usar el Sistema de Ficheros para acceder tanto a los archivos de disco como a los dispositivos, es que permite que el programa no se tenga que preocupar de la estructura de estos: cualquier entrada o salida será tratada como un conjunto de caracteres en serie. Esta independencia de estructura es cómoda para algunas aplicaciones, pero en otras puede ser mejor poder acceder directamente a cada dispositivo, normalmente por razones de velocidad. Esa es la razón de que OS/2 permita a las aplicaciones acceder directamente a los Subsistemas de Video (VIO), teclado (KBD) y ratón (MOU). A través de estos, podemos por ejemplo hacer funciones de Scroll en la pantalla, conocer la posición del ratón, etc.

<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Podemos comparar los Subsistemas de OS/2 con la BIOS del ordenador, si bien estos son más completos que aquella en muchas funciones, y sobre todo mucho más rápidos.

**<span style="font-family: 'Times New Roman',serif; font-size: 24pt;">EL SISTEMA DE ARCHIVOS DE OS/2 ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">La parte básica de la conexión entre el hardware del ordenador y el programador se encuentra en el **Sistema de Archivos**. Es él quien se encarga de darnos acceso a los ficheros del disco, al teclado y a la pantalla en modo texto. La ventaja que tiene esto es que nos abstrae totalmente de las características del hardware, presentándonos todo como una ristra de caracteres. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El acceso a un fichero sigue una serie de pasos absolutamente necesarios: primero es preciso **abrir** el archivo, de modo que el programa obtenga control sobre él; una vez hecho esto, podemos realizar cualquier operación de lectura y/o escritura sobre él, y finalizar **cerrando** el archivo, de modo que lo liberamos y puede ser accedido por otro programa. **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Apertura y cierre de ficheros ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">La primera operación necesaria antes de poder acceder a un archivo es identificarlo mediante una llamada al Sistema Operativo. A esta operación se le denomina **apertura** del archivo. Le enviamos como parámetros el nombre del archivo a abrir y una serie de opciones, y nos devolverá un //identificador// de archivo (en adelante se denominará **Handle**) que usaremos para referirnos a él cuando queramos leer o escribir. El identificador es simplemente un número entero. Existe una única excepción en este caso: los archivos estandar no es necesario que sean abiertos, pues ya tienen asignado un identificador (**STDIN**=0, **STDOUT**=1, **STDERR**=2). <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Las opciones de apertura especifican la forma en que el programa va a acceder a dicho fichero. Por ejemplo, puede querer acceder solo en modo lectura, o bien puede especificar que si dicho fichero no existe, devuelva un error, o bien que lo cree. O bien, si existe, puede pedir que lo sobreescriba. Etc. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El cierre del fichero se hace al final del acceso, cuando ya no vamos a leer o escribir nada más en él. Esto permite su liberación, de modo que cualquier otro programa puede acceder a él con total libertad. <span style="font-family: 'Times New Roman',serif;"> **Dosopen** <span style="font-family: 'Times New Roman',serif;"> **Dosclose** **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Lectura y escritura de datos ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Una vez que hemos abierto un fichero, podemos acceder a él. Los ficheros aparecen como un flujo de caracteres en serie, y el caracter actual está referenciado por un puntero que se incrementa automáticamente después de cada operación. Esto significa que cuando hacemos una lectura de un fichero, recibiremos el caracter siguiente al último leido. Y cada vez que escribamos un caracter, lo haremos a continuación del último escrito. Existe sin embargo la posibilidad de cambiar la posición de dicho puntero, de modo que podemos leer y escribir de forma aleatoria. Esta opción, sin embargo, solo funciona con ficheros de disco, y no con dispositivos como el teclado, pantalla, etc. <span style="font-family: 'Times New Roman',serif;"> **DosRead** <span style="font-family: 'Times New Roman',serif;"> **DosWrite** **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Compartición de ficheros ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Dado que OS/2 es un Sistema Operativo multitarea, puede ocurrir que dos (o más) programas intenten acceder a la vez a un mismo fichero de disco. Para evitar interferencias, OS/2 ofrece una serie de opciones de compartición de archivos, que se especifican en el momento de abrirlos. Estas son: **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Modos de acceso al fichero ** **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Modos de compartición ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Los modos de compartición permiten elegir la forma en que otros programas acceden al fichero que tenemos abierto. Por ejemplo, si tenemos un programa que lee del fichero //prueba.txt// y lo envía a la impresora, lo lógico es que lo abra como READ_ONLY, pues no va a escribir nada en él. Por otro lado, no puede permitir que otro programa modifique el fichero, pero no le importa que pueda leerlo, por lo que como modo de acceso asigna READ_ONLY. De esta forma, si otro programa intenta acceder al mismo fichero, OS/2 solo le dará acceso si intenta acceder en modo READ_ONLY; si intenta abrirlo como WRITE_ONLY o READ_WRITE, OS/2 le devolverá un error. **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Gestión de dispositivos ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">A través del sistema de ficheros podemos acceder también a los dispositivos físicos que forman el ordenador. Existen normalmente una serie de archivos que identifican a cada periférico y que nos permiten enviar y recibir datos hacia y desde ellos. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Los nombres de los archivos de que disponemos son: <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Los dispositivos cuyo nombre acaba en $ no son accesibles directamente por los programas, y es preciso usar funciones específicas para acceder a ellos. Esto da una mayor riqueza y control sobre ellos. **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Funciones del DOS ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">OS/2 ofrece una gran colección de llamadas para gestionar ficheros en el sistema de archivos. Estas llamadas permiten copiar un fichero a otro, renombrarlo, borrarlo, cambiar de directorio, etc. <span style="font-family: 'Times New Roman',serif;"> **DosCopy** <span style="font-family: 'Times New Roman',serif;"> **Dosmuve** <span style="font-family: 'Times New Roman',serif;"> **Dosdelate** <span style="font-family: 'Times New Roman',serif;"> **Dosforcedelate** <span style="font-family: 'Times New Roman',serif;"> **Doscreatedir** <span style="font-family: 'Times New Roman',serif;"> **Dosdelatedir** <span style="font-family: 'Times New Roman',serif;"> **Dosquerycurrentydir** <span style="font-family: 'Times New Roman',serif;"> **Dosquerycurrentdisk** <span style="font-family: 'Times New Roman',serif;"> **Dossetdisk** <span style="font-family: 'Times New Roman',serif;"> **Dossetdefoultdisk** **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Busqueda de ficheros ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">En muchas ocasiones un programa necesita conocer todos los ficheros que coinciden con un patrón determinado. Es el caso, por ejemplo, de querer mostrar una lista de ficheros que acaben en **AL**, o que tengan la letra **F** en el tercer lugar, etc. Para ello, OS/2 facilita una serie de funciones que permiten realizar ésto. En ellas se debe especificar un nombre de fichero, sabiendo que: <span style="font-family: 'Times New Roman',serif;"> **Dosfindfirst** <span style="font-family: 'Times New Roman',serif;"> **Dosfindnext** <span style="font-family: 'Times New Roman',serif;"> **Dosfindclose** **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Redirección de entradas y salidas ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Además de estos ficheros de dispositivo, existen también tres 'archivos' especiales: la entrada estandar (**STDIN**), la salida estandar (**STDOUT**), y la salida de error estandar (**STDERR**). Por defecto, STDIN está asociada al teclado, y STDOUT y STDERR a la pantalla; sin embargo, pueden ser //redireccionadas// desde la linea de comandos a un fichero o incluso a otro programa por medio de cauces o //Pipes//. Por ejemplo, si tenemos un programa UPCASE.EXE que lee de la entrada estandar un caracter, lo convierte en mayusculas y lo escribe en la salida estandar, y hacemos desde la linea de comandos un  <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">C:\>UPCASE.EXE <entrada.txt >salida.txt <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">no se quedará esperando a que pulsemos una tecla, ni mostrará en pantalla lo que haya convertido. Lo que hará será leer caracteres del fichero //entrada.txt//, y todo lo que salga lo escribirá en el fichero //salida.txt//. Hemos redireccionado la entrada al fichero //entrada.txt// y la salida al fichero //salida.txt//. También podemos direccionar la salida de un programa a la entrada de otro programa distinto, con el caracter |. Así, si hiciesemos <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">C:\>UPCASE.EXE <entrada.txt |MORE.EXE <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">nos saldría el texto contenido en //entrada.txt// por pantalla, y cada vez que se llene ésta, esperará a que pulsemos una tecla. La salida de UPCASE.EXE ha sido tomada como entrada de MORE.EXE. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Para poder hacer ésto en nuestros programas, simplemente necesitamos leer las órdenes a través de la entrada estandar (indicando 0 como handle en **DosRead**) y enviar los resultados y errores por la salida estandar y la salida de error estandar (indicando respectivamente 1 y 2 como handle en **DosWrite**). **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Variables de entorno ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Para permitir la colocación de programas en múltiples directorios y simplificar algunas opciones de configuración, OS/2 facilita las **variables de entorno**. Se trata de una serie de variables que se definen bien en la línea de comandos, bien en el CONFIG.SYS, por medio de la sentencia //SET//. Por ejemplo, la línea **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">SET mi_variable=C:\OS2UTIL\MIPROGRAMA ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">asigna a la variable de entorno //mi_variable// el valor //C:\OS2UTIL\MIPROGRAMA//. De este modo, el usuario puede especificar el directorio en donde estarán diversas partes de un programa, o bien diversas opciones para éste. Por ejemplo, el compilador EMX requiere de algunas variables de este tipo para saber donde están las librerias, documentación, etc. El propio OS/2 hace uso de esta facilidad para implementar variables como el PATH de datos, etc. <span style="font-family: 'Times New Roman',serif;"> **DosScanDev** **<span style="font-family: 'Times New Roman',serif; font-size: 18pt;">Otras funciones DOS ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Otras funciones pertenecientes a este grupo son las siguientes: <span style="font-family: 'Times New Roman',serif;"> **Dosresetbuffer** <span style="font-family: 'Times New Roman',serif;"> **Dosshutdown** <span style="font-family: 'Times New Roman',serif;"> **Dosbeep**
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">READ_ONLY: solo se va a leer del fichero.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">WRITE_ONLY: solo se va a escribir en el fichero.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">READ_WRITE: se va a leer y escribir (es el valor por omisión).
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">DENY_ALL: OS/2 rechaza cualquier petición posterior de abrir ese archivo.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">DENY_READ: OS/2 rechaza cualquier petición de abrir ese archivo para lectura.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">DENY_WRITE: OS/2 rechaza cualquier petición de abrir ese archivo para escritura.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">DENY_NONE: OS/2 permite cualquier operación con ese archivo.
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">COM1-COM4 **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: maneja los puertos serie del ordenador.
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">CLOCK$ **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: el reloj del sistema.
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">CON **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: gestiona la consola (en lectura es el teclado, en escritura, la pantalla).
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">SCREEN$ **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: maneja la pantalla.
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">KBD$ **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: maneja el teclado.
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">LPT1-LPT3 **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: maneja los puertos pararelo (normalmente la impresora).
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">NUL **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: dispositivo nulo. Todo lo que se envíe a él simplemente es ignorado.
 * **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">POINTER$ **<span style="font-family: 'Times New Roman',serif; font-size: 12pt;">: gestiona el dispositivo de puntero (el ratón).
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El símbolo **?** sustituye a cualquier caracter situado en esa posicion. Así, la búsqueda de **program?.exe** devolverá los nombres de los ficheros que empiecen por **program**, a continuación tengan un caracter cualquiera, y por último, terminen con **.exe**, como por ejemplo, //programa.exe//, o //programz.exe//; pero no devolverá //programad.exe// ni //programa//.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El símbolo ***** sustituye a cualquier cadena situada desde esa posición en adelante. Así, la búsqueda de **prog*** devolverá cualquier fichero que empiece por **prog**, tenga lo que tenga después. Por ejemplo, devolverá //programa//, //progs//...

**<span style="font-family: 'Times New Roman',serif; font-size: 24pt;">LOS SUBSISTEMAS EN OS/2 ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">En principio, el uso del sistema de ficheros para Entrada/Salida con el teclado y la pantalla debería ser suficiente, pero por desgracia no es así. Su uso es relativamente lento, por lo que solo parece útil utilizarlo cuando necesitamos poder redireccionar la entrada o la salida del programa, o cuando la velocidad no es importante. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Para mejorar y simplificar el acceso a los tres dispositivos principales de entrada de datos, OS/2 permite el acceso directo a los subsistemas de Video, Teclado y Ratón, de modo que se puede mejorar notablemente la velocidad de los programas. El acceso a estas funciones va desde el mismo procedimiento que en el acceso a través del sistema de archivos (una ristra de caracteres) hasta el acceso directo al hardware del sistema. Entre ambos extremos hay un amplio abanico de posibilidades. De entre todas ellas, se deberá escoger la que mejor se adapte a las necesidades de velocidad y flexibilidad del programa. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Estrictamente hablando, siempre usamos los subsistemas. El sistema de ficheros, cuando sabe que una salida es para la pantalla, envía los datos al subsistema de video (VIO). Sin embargo, antes tiene que comprobar para quien es la salida, con lo que pierde algo de rendimiento. Así mismo, la posibilidad de redireccionar entradas y salidas es otra opción que ralentiza el sistema. En muchos casos, la pérdida de velocidad es totalmente inapreciable, pero en algunos programas (juegos, aplicaciones a pantalla completa,...) el uso del sistema de ficheros puede ser totalmente contraproducente para el rendimiento. Usando el subsistema directamente nos ahorramos pasos intermedios, a costa de perder la posibilidad de redirección y de entrada/salida generalizada para ficheros y dispositivos. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">En OS/2 disponemos de los siguientes subsistemas:
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">De video
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">De teclado
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">De punteo

**<span style="font-family: 'Times New Roman',serif; font-size: 24pt;">ESTRUCTURA DEL OS/2 ** **<span style="font-family: 'Times New Roman',serif; font-size: 24pt;">(Selector de Programas, Sesiones, Procesos y Threads) ** <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">La estructura de OS/2 a nivel de multitarea se centra en los tres conceptos dados anteriormente: **Threads** y **Procesos**, gestionados por el núcleo, y **Sesiones**, gestionadas por los subsistemas y por el //Selector de programas//. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El selector de programas es la parte de OS/2 que se encarga de conmutar la pantalla, teclado y ratón físicos hacia los buffers lógicos de cada sesión. Para ello, incluye un API propio, que permite a una sesión hacer pasar a primer plano a cualquier sesión hija. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Surje la cuestión de como se arranca la primera sesión, la que nos permitirá arrancar nuevos programas, etc. Para ello, OS/2 incluye una línea en el **CONFIG.SYS** que le indica un proceso que debe arrancar al principio de todo. Este proceso será el //Shell// del sistema. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El Shell del sistema, en principio, puede ser cualquier programa, de modo que al arrancar OS/2, se arrancará éste también. Sin embargo, para que sea útil, tiene que permitir arrancar nuevas sesiones desde él y pasar el control a éstas. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">En OS/2 1.0, el Shell del sistema era un simple menú, que contenía los programas básicos (como una línea de comandos). Pulsando sobre estos, se arrancaba una nueva sesión con éste, y se le cedía el control. En las versiones posteriores, como Shell se pone el **Presentation Manager**. Este es el gestor de ventanas. Sin embargo, el PM no incluye ningún Shell, por lo que surge una nueva línea en el **CONFIG.SYS**, que especifica qué Shell debe arrancar el PM. Este Shell, por defecto, es el **Work Place Shell**, o **WPS**, que es el que nos da la orientación a objetos del escritorio de OS/2; sin embargo, puede ser cambiado por otro cualquiera. Por ejemplo, poniendo como Shell el CMD.EXE de OS/2, tendremos una situación parecida a UNIX, en la que arrancamos siempre desde una línea de comandos. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El selector de programas incorpora dos //Hot Keys// o //Teclas Calientes//: **Ctrl+Esc** y **Alt+Esc**. La primera pasa la sesión actual a segundo plano y vuelve a poner el Shell en primer plano. Esto nos permite arrancar nuevas sesiones sin cerrar la actual. La segunda permite conmutar de una sesión a otra de forma cíclica, pero sin pasar por la del Shell. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">OS/2 es muy atento con el usuario, y por eso tiene especial cuidado con el Shell. Dado que se trata del principal nexo de unión entre ambos, si se produce un error y el Shell se cierra, OS/2 abre uno nuevo inmediatamente, sin afectar para nada al resto de las aplicaciones que estaban corriendo. De esta forma el usuario nunca se queda sin control de la máquina. No olvidemos que el Shell es un programa más, que no corre en el núcleo, y que por tanto puede contener errores. <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">De todo esto deducimos varias cosas <span style="font-family: 'Times New Roman',serif;">
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">El Shell del sistema es un programa más, que se ejecuta en una sesión independiente, por lo que nada impide que escribamos el nuestro propio.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Un Shell nunca debe arrancar ningún programa en su misma sesión, pues eso implicaría que el pulsar **Ctrl+Esc** no nos devolvería al Shell, sino al programa que estamos ejecutando en su sesión.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Dado que el Shell es el padre de todas las sesiones que se arrancan, puede conmutar a cualquiera de ellas sin usar ningún truco especial, simplemente usando el API del selector de programas. Por esto mismo, tiene acceso a todas las sesiones de la lista de tareas de OS/2, y también puede matar a cualquiera de ellas.

**<span style="font-family: 'Times New Roman',serif; font-size: 24pt;">GESTION DE LA MEMORIA ** <span style="font-family: 'Times New Roman',serif;"> <span style="font-family: 'Times New Roman',serif;">
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">OS/2, como cualquier Sistema Operativo multitarea, mantiene un estricto control sobre la memoria usada por cada programa. Esto es así porque un programa que sobreescribiese la memoria de otro lo haría fallar con casi total seguridad. OS/2 hace uso del modo protegido de los microprocesadores 386 y superiores para asegurar que cada programa tenga acceso solo a sus bloques de memoria, y no pueda machacar el contendido de otra zona. A la vez, se encarga de intercambiar zonas de memoria entre la RAM y el disco duro, implementando así un sistema de memoria virtual eficiente, con lo que puede ejecutar programas más largos que los que la memoria física del ordenador permitiría.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Las funciones de asignación y desasignación dinámica de memoria son extremadamente útiles en programas en los que no sepamos la cantidad de esta que vamos a necesitar. Un ejemplo puede ser una zona de memoria para descomprimir imágenes en un visualizador: dado que cada una puede medir cualquier longitud, reservar una cantidad excesiva de forma estática hace al programa lento, y reservar poca puede impedir visualizar imágenes grandes. La solución es comprobar el tamaño de la imagen y reservar una zona de memoria dinámica acorde con este, liberandola al terminar.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Otra función es la de crear zonas de memoria compartida. Se trata de bloques de memoria a los que pueden acceder dos procesos distintos de forma simultánea, y se usan para intercambiar grandes cantidades de información de forma rápida, y para compartirla.
 * <span style="font-family: 'Times New Roman',serif; font-size: 12pt;">Existen dos formas de compartir un bloque de memoria: una es mediante un nombre que refiera a ese bloque; otra es mediante un puntero que señale a su inicio.