sistema operativo os2
TRANSCRIPT
INDICE INTRODUCCION
SISTEMA OPERATIVO OS/2
VERSIONES OS/2
COMPATIBILIDAD DEL SISTEMA OPERATIVO OS/2
KERNEL OS/2
ACCESO AL API DE OS/2
FUNCIONES DE ACCESO A FICHEROS Y AL HARDWARE.
o ESTRUCTURA DE OS/2 (SISTEMA DE FICHEROS Y SUBSISTEMAS).
o EL SISTEMA DE FICHEROS DE OS/2.
o LOS SUBSISTEMAS DE OS/2.
EL SUBSISTEMA DE VIDEO (API VIO).
EL SUBSISTEMA DE TECLADO (API KBD).
MODOS DEL TECLADO.
EL SUBSISTEMA DE RATÓN (API MOU).
ACCESO A LAS FUNCIONES DE 16 BITS. EL THUNKING.
GESTION DE MEMORIA EN EL MODO PROTEGIDO DEL 286
GESTION DE MEMORIA EN EL MODO PROTEGIDO DEL 386
MULTITAREA.
o CONCEPTO DE THREAD.
o CONCEPTO DE PROCESO.
o CONCEPTO DE SESIÓN.
o ESTRUCTURA DE OS/2 (SELECTOR DE PROGRAMAS, SESIONES, PROCESOS Y
THREADS).
GESTION DE MEMORIA.
FUNCIONES DE SINCRONIZACIÓN ENTRE THREADS Y PROCESOS.
o CONCEPTO DE SEMÁFORO.
o SERVICIOS DE TEMPORIZACIÓN.
o COMUNICACIÓN ENTRE PROCESOS
SEMÁFOROS Y MEMORIA COMPARTIDA.
CAUCES.
COLAS.
APENDICE A
o LLAMADAS DOSXXX DEL SISTEMA DE FICHEROS
INTRODUCCION
Un sistema operativo explota los recursos de hardware de uno o más
procesadores para ofrecer un conjunto de servicios a los usuarios del
sistema operativo. También gestiona la memoria secundaria y los
dispositivos E/S en nombre de los usuarios.
OS/2 es un sistema operativo desarrollado con la ambición de
satisfacer las necesidades de muchos usuarios así como mejorar a los
sistemas operativos que antes de él se habían creado.
Los objetivos principales de los diseñadores de OS/2 fueron crear un
sistema operativo ideal para la automatización de oficinas, proporcionar
manejadores gráficos independientes de los dispositivos, que las
aplicaciones tuviesen acceso directo a periféricos con gran ancho de banda,
ofrecen capacidad multitarea, proporcionar un ambiente adaptado para
cada programa y para sus descendientes además de ofrecer un ambiente
protegido para garantizar la estabilidad del programa.
OS/2 fue diseñado en un principio por Microsoft con ayuda de IBM
con el objetivo de reemplazar a MS-DOS, cosa que no sucedió, tras tener
OS/2 sus propias características favorables como: uso real de memoria,
ejecución en modo protegido y soporte de multiprogramación en forma
elegante; no fue finalmente aceptado por los usuarios.
SISTEMA OPERATIVO OS/2
OS/2 es un sistema operativo multitarea para PCs creado en la
década pasada, pero que no ha perdido su vigencia, bastante usado por
empresas en aplicaciones críticas, servidores, comunicaciones (en 1992 se
calculaba que más del 90% de los cajeros automáticos del mundo usaban
como sistema operativo a OS/2) y por usuarios particulares.
Entre otras cosas, provee:
Estable - Su estabilidad sólo es comparable con la de Unix, y puede
correr decenas de programas de forma simultánea sin degradar su
performance ni su disponibilidad de memoria.
Multitarea y Multithreading - La posibilidad de ejecutar varios "hilos"
dentro de una misma aplicación. Esto permite una multitarea mucho mas
eficiente y un mejor desempeño de los programas diseñados para el.
Ejecución de programas DOS y Windows - "Mejor Windows que
Windows" fue una frase que IBM usó mucho hace unos años para
describirlo. Dada la mejor multitarea, mejor manejo de memoria y
dispositivos en general, y de dispmitiendo nombres largos y atributos
extendidos, bajo slack space (los clusters son de 512 bytes) y
fragmentación (casi nula en ambientes normales), y alta velocidad en
acceso a los archivos.
WorkPlace Shell - El mejor desktop para computadoras personales (y
no tanto) que existe hasta la fecha. Muy intuitivo, orientado a objetos,
extensible y muy consistente, muy integrado con el sistema operativo y
especialmente potenciable vía exx o programas de usuario. Aún no he
encontrado algo que se le compare ni para Macintosh, Windows 95/NT, o X
Windows que se le acerque.
Compatibilidad con otras plataformas - Aparte de la ya nombrada
capacidad de correr de forma inmejorable aplicaciones para DOS y Windows
3.x, dispone de una serie de herramientas para ejecutar o portar
aplicaciones desde otros sistemas operativos y plataformas. Con las librerías
EMX es relativamente fácil portar aplicaciones desde Unix, teniendo desde
hace ya años Apache, XFree86 con muchas de sus aplicaciones, la mayoría
de las aplrientado a objetos, extensibles y muy consistentes, muy
integradas con el sistema operativo y especialmente potenciable vía exx o
programas de usuario. Aún no he encontrado algo que se le compare ni para
Macintosh, Windows 95/NT, o XWindows que se le acerque.
Compatibilidad con otras plataformas - Aparte de la ya nombrada
capacidad de correr de forma inmejorable aplicaciones para DOS y Windows
3.x, dispone de una serie de herramientas para ejecutar o portar
aplicaciones desde otros sistemas operativos y plataformas. Con las librerías
EMX es relativamente fácil portar aplicaciones desde Unix, teniendo desde
hace ya años Apache, XFree86 con muchas de sus aplicaciones, la mayoría
de las aplicaciones GNU, y mucho mas. IBM provee las bibliotecas Open32,
que permiulnerables a ataques del exterior como lo son de forma genérica
los sistemas operativos Unix y WindowsNT.
VERSIONES OS/2
OS/2 1.0 (1987):
Diseñado originalmente por Microsoft con la ayuda de IBM. Cuando el
procesador 286 era el último y más grande chip. Tras esto, Microsoft
introduce OS/2 1.0 1987; este corre en modo texto programas
extremadamente poderosos.
OS/2 1.1 (1988) –1.3(1991):
Incluyó administrador de presentación, alta ejecución del sistema de
archivos que permite nombre de archivos largos.
OS/2 2.0 (1992):
Interfaz con el usuario de forma más acogedora, por ejemplo par imprimir
sólo se debe arrastrar el icono del objeto sobre la impresora. 32 bits, 386
basado en Kernel, produjo limitaciones como nunca antes.
OS/2 2.1 (1993):
Introdujo un sistema gráfico de 32 bits con algunas mejoras en algunos
aspectos en velocidad y muchos más manejadores;
- Multitarea presentación Manager (MMPM/2)
- Lista estándar de aplicaciones
- Utilitarios OS/2.
OS/2 WARP 3.0 (1994):
Producto refinado y fulido que lució un Kernel mucho más rápido y nuevas
rutinas de intercambio con mayor velocidad.
OS/2 tuvo el frenesí de Internet de 1995 con su Internet Acceskit.
OS/2 WARP CONNECT (1995):
OS/2 en el mango punto a punto y estaciones de trabajo cliente OS/2 por
diseño tiene incluido en el Sistema Operativo la gestión de redes. Es
conocido como un sistema confiable para clientes de redes o para pequeños
servidores.
OS/2 WARP SERVER (1996):
El mayor Sistema Operativo de redes muy eficiente y requiere menos
Hardware que sus equivalentes funcionales NT y UNIX.
OS/2 WARP 4.0 O MERLIN (1996):
Segunda versión de OS/2 Warp. Nunca existirá una versión OS/2 sola
siempre será un servicio de cliente y redes de punto en todas las futuras
versiones de OS/2.
COMPATIBILIDAD DEL SISTEMA OPERATIVO OS/2
OS/2 a la multiprogramación es compatible con todos los programas
DOS. Incluye su propia máquina virtual de DOS, es decir, puede ejecutar
programas DOS desde dentro del OS/2 (sin tener que reiniciar a modo MS-
DOS).
La elasticidad de DOS en ventana, en pantalla completa o sesiones
DOS de disquete. Ésta última consiste en que sin abandonar OS/2 se puede
ejecutar cualquier versión de MS-DOS real a partir de un disquete de
arranque y se puede alternar entre OS/2 y esta sesión MS-DOS sin reiniciar
el ordenador.
Además es capaz de ejecutar simultáneamente aplicaciones DOS,
WINDOWS Y OS/2. Ésta hace que OS/2 se convierta en una buena elección
para el usuario ya que hay muchas opciones disponibles en software para
seleccionar y usar.
KERNEL OS/2
El núcleo de cualquier sistema operativo proporciona las funciones básicas
para ese sistema operativo. Es la parte del sistema operativo que realiza
funciones básicas tales como la asignación de los recursos de hardware
como la memoria y el tiempo de CPU. El OS / 2 funciones del núcleo residen
en el archivo ejecutable OS2KRNL que se carga durante el inicio. Tenga en
cuenta que el nombre del archivo no tiene extensión.
El núcleo de OS / 2 realiza las siguientes funciones básicas.
1. Gestión de la memoria . Los kernel puede asignar memoria y
desasigna y asigna direcciones de memoria física en base a las
solicitudes, ya sea implícita o explícita, de los programas de
aplicación. En cooperación con la CPU, el núcleo también administra el
acceso a la memoria para asegurar que los programas sólo acceso a las
regiones de la memoria que han sido asignados. Parte de la gestión de
memoria incluye la gestión del archivo SWAPPER.DAT y el movimiento
de páginas de memoria entre la RAM y el archivo de intercambiador en
el disco duro.
2. Gestión de tareas . El kernel OS / 2 maneja la ejecución de todas las
tareas que se ejecutan en el sistema. La porción planificador del núcleo
asigna tiempo de CPU para cada proceso que se ejecuta en base a su
prioridad y si es capaz de ejecutar. Una tarea que se bloquea - tal vez
está a la espera de los datos que se entregarán a partir del disco o de la
entrada del teclado - no recibe el tiempo de CPU. El kernel de OS / 2
también se adelantará una tarea de menor prioridad cuando una tarea
de mayor prioridad se convierte en desbloqueado y capaz de correr.
3. La comunicación entre procesos . Comunicación entre procesos (IPC)
es vital para cualquier sistema operativo multitarea. Muchas tareas se
deben sincronizar o se comunican entre sí para garantizar que su trabajo
se coordine adecuadamente. El núcleo gestiona una serie de memoria
methods.Shared IPC se utiliza cuando dos tareas necesitan para pasar
datos entre ellos. El portapapeles OS / 2 es un buen ejemplo de la
memoria compartida. Los datos que se cortan o copian en el
portapapeles se guardan en la memoria compartida.Cuando los datos
almacenados se pega en otra aplicación, que la aplicación busca los
datos en el área de memoria compartida del portapapeles.
Las canalizaciones con nombre se pueden utilizar para comunicar datos
entre dos programas. Los datos pueden ser empujadas dentro de la
tubería por un programa y el otro programa puede extraer los datos
fuera del otro extremo de la tubería. Un programa puede recopilar datos
con gran rapidez y empuje en el tubo. Otro programa puede tomar los
datos del otro extremo de la tubería y, o bien que aparezca en la
pantalla o guardarlo en el disco, pero se puede manejar los datos a su
propio ritmo.
Los semáforos se pueden utilizar para coordinar la actividad de los dos
programas o dos hilos separados dentro de un solo programa. Cuando
una tarea establece el semáforo, por ejemplo, la otra tarea no puede
proceder hasta que el primero ha restablecer el semáforo.
4. La gestión de dispositivos . El núcleo gestiona el acceso al hardware
físico a través del uso de controladores de dispositivos. Acceso a
dispositivos físicos debe ser manejada con cuidado, o más de una
aplicación puede intentar controlar el mismo dispositivo al mismo
tiempo. El núcleo de OS / 2 logra esto de modo que un solo programa en
realidad tiene el control de acceso o a un dispositivo en cualquier
ejemplo dado moment.One de esto es un puerto COM. Sólo un programa
puede comunicarse a través de un puerto COM en cualquier momento
dado. Si está utilizando el puerto COM para obtener su dirección de e-
mail a través de Internet, por ejemplo, y tratar de iniciar otro programa
que intenta utilizar el mismo puerto COM como HyperAccess Lite, el
núcleo de OS / 2 que detecta el puerto COM es ya en uso. El kernel
utiliza entonces el controlador de errores de hardware (HARDERR.EXE)
para mostrar un mensaje en la pantalla que el puerto COM está en uso.
5. I / O de Gestión . El núcleo también se encarga de gestionar los
dispositivos de E / S. Esto incluye el puerto paralelo y serial I / O, y el
sistema de archivo de E / kernel O.The realidad no manejar el acceso
físico en el disco, sino que gestiona las solicitudes de disco I / O
presentadas por los diferentes programas que se ejecutan. Pasa a estas
solicitudes en el sistema de archivos, ya sea FAT, HPFS, CDFS (sistema
de archivos de CD-ROM), o NFS (Network File System), y gestiona la
transferencia de datos entre el sistema de archivos y los programas que
solicitan.
Durante el proceso de arranque, el núcleo también se encarga de cargar
y procesar el archivo CONFIG.SYS.
La mayor parte del código de la aplicación real de estas funciones a
nivel del núcleo reside en las bibliotecas de vínculos dinámicos como
DOSCALL1.DLL. El procesador de comandos cmd.exe es también parte
del kernel. Algunos comandos básicos de línea de comandos también se
incluyen en el núcleo como parte del archivo cmd.exe. Los comandos
son llamados comandos internos debido a que son una parte del
núcleo. Los comandos DEL COPIA y son ejemplos de los comandos
internos.
FUNCIONES DE ACCESO A FICHEROS Y AL HARDWARE
ESTRUCTURA DE OS/2
(SISTEMA DE FICHEROS Y SUBSISTEMAS)
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.
IMPLEMENTACIÓN DEL SISTEMA DE FICHEROS DE OS/2
En este gráfico vemos como está construido el acceso a los dispositivos en
OS/2.
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.
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.
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.
EL SISTEMA DE ARCHIVOS DE OS/2
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.
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.
APERTURA Y CIERRE DE FICHEROS
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).
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.
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.
DosOpen
DosClose
LECTURA Y ESCRITURA DE DATOS
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.
DosRead
DosWrite
COMPARTICIÓN DE FICHEROS
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:
Modos de acceso al fichero
READ_ONLY: solo se va a leer del fichero.
WRITE_ONLY: solo se va a escribir en el fichero.
READ_WRITE: se va a leer y escribir (es el valor por omisión).
Modos de compartición
DENY_ALL: OS/2 rechaza cualquier petición posterior de abrir ese
archivo.
DENY_READ: OS/2 rechaza cualquier petición de abrir ese archivo
para lectura.
DENY_WRITE: OS/2 rechaza cualquier petición de abrir ese archivo
para escritura.
DENY_NONE: OS/2 permite cualquier operación con ese archivo.
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.
GESTIÓN DE DISPOSITIVOS
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.
Los nombres de los archivos de que disponemos son:
COM1-COM4: maneja los puertos serie del ordenador.
CLOCK$: el reloj del sistema.
CON: gestiona la consola (en lectura es el teclado, en escritura, la
pantalla).
SCREEN$: maneja la pantalla.
KBD$: maneja el teclado.
LPT1-LPT3: maneja los puertos pararelo (normalmente la
impresora).
NUL: dispositivo nulo. Todo lo que se envíe a él simplemente es
ignorado.
POINTER$: gestiona el dispositivo de puntero (el ratón).
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.
Funciones del DOS
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.
DosCopy
DosMove
DosDelete
DosForceDelete
DosCreateDir
DosDeleteDir
DosQueryCurrentDir
DosQueryCurrentDisk
DosSetCurrentDir
DosSetDefaultDisk
BUSQUEDA DE FICHEROS
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 Fen 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:
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.
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...
DosFindFirst
DosFindNext
DosFindClose
REDIRECCIÓN DE ENTRADAS Y SALIDAS
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
C:\>UPCASE.EXE <entrada.txt >salida.txt
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
C:\>UPCASE.EXE <entrada.txt |MORE.EXE
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.
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).
VARIABLES DE ENTORNOPara 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
SET mi_variable=C:\OS2UTIL\MIPROGRAMA
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.
DosScanEnv
OTRAS FUNCIONES DOS
Otras funciones pertenecientes a este grupo son las siguientes:
DosResetBuffer
DosShutdown
DosBeep
LOS SUBSISTEMAS EN OS/2
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.
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.
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.
En OS/2 disponemos de los siguientes subsistemas:
Subsistema de Video
Subsistema de Teclado
Subsistema de Puntero (Ratón)
EL SUBSISTEMA DE VIDEO
El subsistema de vídeo (VIO) es el encargado de gestionar la comunicación
entre los programas y la pantalla. Es, sin duda, el subsistema más complejo
de los tres, y el que ofrece, por tanto, mayores posibilidades.
Dado que puede haber varios programas ejecutándose a la vez en el
sistema, pero solo uno puede acceder a la vez a la pantalla (normalmente el
programa que se encuentra en primer plano o foreground), es necesario
virtualizar ésta por medio de un buffer de pantalla propio de cada
programa: el LVB (Logic Video Buffer, buffer de vídeo virtual). Cuando una
aplicación quiere escribir en pantalla y se encuentra en segundo plano
(background), su salida se escribe en dicho LVB. En el momento en que el
usuario conmuta dicho programa a primer plano, el LVB se copia tal cual en
la memoria de pantalla, y el resto de las escrituras van a ésta directamente.
Si se vuelve a conmutar dicho programa a segundo plano, OS/2 copia lo que
hubiese en pantalla en ese momento al LVB. De este modo, el programa
nunca sabe ni le preocupa cuando está en primer o en segundo plano.
FUNCIONES VIO
Salida por TTY virtual
En un extremo se encuentra el primer servicio que ofrece el subsistema VIO,
que es el de salida TTY. Este servicio es casi idéntico a la salida de
caracteres por medio del sistema de archivos. De hecho, éste, cuando
comprueba que lo que el programa envía va dirigido a la pantalla, usa este
servicio para realizar la función.
¿Cuál es la diferencia entre uno y otro, entonces? Las diferencias son dos: la
primera es que el uso del subsistema VIO es una opción más rápida que el
sistema de ficheros; la segunda es que si usamos el subsistema, no
podremos redireccionar la salida a un fichero, o a otro dispositivo de salida.
Siempre irá a la pantalla.
El servicio TTY admite los caracteres de control estándar del ASCII, y
también puede soportar ANSI, si éste es activado mediante la llamada
correspondiente.
VioWrtTTY
VioGetAnsi
VioSetAnsi
VioGetMode
VioSetMode
VioGetState
VioSetState
SALIDA DE CADENAS DE CARACTERES
Los siguientes servicios se encargan del tratamiento de la pantalla a más
bajo nivel. Con ellos podemos imprimir largas cadenas de caracteres con
atributos y leer los caracteres que hay en determinadas posiciones de la
pantalla. También podemos repetir un caracter o una pareja caracter-
atributo un número determinado de veces.
Los atributos son bytes que definen el color de tinta y de fondo para cada
caracter, así como otras características como el parpadeo. Están
compuestos por un byte, el cual se divide en dos nibbles (grupos de 4 bits).
El nibble de menor peso determina el color de la tinta del caracter, y el de
mayor peso el color de fondo y, según se encuentre activo o no, el parpadeo
del caracter. La distribución es como sigue:
Parpadeo activado
Bi Significado
Intensidad activada
Bi Significado
t
7 Parpadeo del carácter
6 Rojo del fondo
5 Verde del fondo
4 Azul del fondo
3 Intensidad de la tinta
2 Rojo de la tinta
1 Verde de la tinta
0 Azul de la tinta
t
7 Intensidad del fondo
6 Rojo del fondo
5 Verde del fondo
4 Azul del fondo
3 Intensidad de la tinta
2 Rojo de la tinta
1 Verde de la tinta
0 Azul de la tinta
Los bits de color activan directamente cada una de las componentes del
monitor, de modo que éstas se suman directamente, dando lugar a los
siguientes colores:
0Negr
o1 Azul 2 Verde 3
Celest
e
4 Rojo 5Magent
a6
Amarill
o7 Blanco
El bit de intensidad se limita a hacer estos colores más o menos brillantes.
Estos servicios orientados a carácter siguen siendo independientes del
hardware utilizado de modo que no es necesario saber como se trabaja a
nivel físico con ellos. Por otra parte, el propio OS/2 optimiza las
transferencias para cada uno de ellos, de modo que se consigue la mayor
velocidad posible, y se eliminan ciertos problemas inherentes a algunos
sistemas gráficos (por ejemplo, en las tarjetas CGA sincroniza
automáticamente la escritura con el retrasado vertical, de modo que se
evita la aparición de nieve en la pantalla).
Tanto cuando hacemos una lectura como una escritura, si excedemos el fin
de una línea se seguirá leyendo en la siguiente, y si llegamos al final de la
pantalla no se seguirá leyendo ni imprimiendo.
VioWrtCellStr
VioWrtCharStr
VioWrtCharStrAtt
VioWrtNAttr
VioWrtNCell
VioWrtNChar
VioReadCellStr
VioReadCharStr
FUNCIONES DE SCROLL
El subsistema VIO ofrece, además, la posibilidad de realizar scroll de
ventanas en modo texto. Con este conjunto de funciones, podemos
desplazar parte o toda la pantalla en cualquiera de las cuatro direcciones
posibles. La razón de incluirlas es que resulta mucho más rápido que hacer
una rutina que lea cada posición del buffer de video y la reescriba en el
lugar adecuado, aparte de que se trata de una función muy común en casi
cualquier programa.
VioScrollDn
VioScrollLf
VioScrollRt
VioScrollUp
DEFINICIÓN Y MOVIMIENTO DEL CURSOR
El cursor (el cuadradito parpadeante) es totalmente definible por el usuario
en las sesiones de texto y gráficos de OS/2. Podemos definir tanto su
tamaño como su posición dentro del caracter.
Al contrario que en MS-DOS, cuando escribimos en la pantalla de OS/2 la
posición del cursor no se cambia. Esto se hace así para ganar tiempo.
Normalmente el cursor solo se usa cuando hay que introducir datos por
teclado, y el resto de las veces se suele hacer desaparecer de la pantalla.
Esta es la razón de que halla un conjunto de funciones para situar el cursor.
De esta manera se gana en velocidad.
VioGetCurPos
VioSetCurPos
VioGetCurType
VioSetCurType
ACCESO AL LVB
Cuando se necesite alta velocidad, se puede pedir acceso directo al buffer
virtual de video asociado con la aplicación. Al hacerlo, OS/2 devuelve un
puntero a la zona de memoria en donde está situado, con lo que podremos
escribir en él como si se tratase de la pantalla física. Una vez que hemos
terminado, debemos enviar una orden de retrasado, que hará que OS/2
copie el LVB a la pantalla física (siempre que la aplicación se encuentre en
primer plano). Esto significa que los cambios que hagamos en el LVB no son
visibles hasta que nosotros queramos.
Usar esta opción implica que perdemos el aislamiento entre el hardware y
nosotros: dado que el LVB no es más que una copia del buffer real de
pantalla, es necesario que nuestro programa conozca la geometría y la
forma de almacenamiento de los datos en ésta.
VioGetBuf
VioShowBuf
ACCESO DIRECTO AL BUFFER REAL DE VIDEO
En el extremo opuesto se encuentran las funciones de acceso directo al
video. Con ellas, OS/2 da acceso directo a la memoria de pantalla. Sin
embargo, esto que en el DOS de siempre es la opción más normal y común,
puede resultar catastrófico en un Sistema Operativo multitarea como OS/2;
no se hundiría el suelo bajo nuestros pies, pero la pantalla podría ser
alterada en un momento poco oportuno... si OS/2 no tomase las debidas
precauciones.
Para que un programa pueda acceder directamente a la memoria real de
video, es absolutamente necesario que se encuentre en primer plano. Esto
es así porque si escribiese algo en pantalla cuando estuviese en
background, machacaría la imagen de la aplicación que se encontrase en
ese momento en primer plano.
Lo primero que hay que hacer es pedir la dirección física de la memoria de
vídeo. OS/2 devuelve un selector (o varios) a dicha zona de memoria. Estos
selectores deben ser convertidos a punteros antes de poder trabajar con
ellos. Pueden ser varios pues cada selector no puede apuntar a un bloque
de memoria mayor de 64Ks, el cual es también, casualmente, el tamaño de
cada bloque de memoria de las tarjetas de vídeo actuales. Esto ayuda a
simplificar el acceso, pues en modos como 640x480x16colores no
necesitaremos cambiar de bancos; OS/2 nos devuelve un selector que
apunta a cada uno de ellos, con lo que solo tenemos que acceder
normalmente como si fuese memoria lineal, y el Sistema Operativo
conmutará de uno a otro automáticamente.
El hecho de obtener un selector no significa que dispongamos de acceso
todavía a la pantalla. De hecho, si intentásemos escribir o leer algo en ese
momento y la aplicación no se encontrase en primer plano, OS/2 la cerraría
inmediatamente, dando un Fallo de Protección General (el cual ya
sabemos que no es tan fatal como el de Windows, pues en OS/2 solo afecta
a la aplicación que lo ha provocado, dejando intacto al Sistema Operativo y
al resto de los programas).
Cada vez que queramos acceder a la memoria física de video, debemos
bloquear el acceso al buffer. Si el programa estaba en primer plano, OS/2
devolverá un valor afirmativo al retornar de la llamada, y bloqueará el
selector de programas. Esto significa que el usuario no podrá conmutar la
sesión actual a segundo plano hasta que ésta termine el acceso. Sin
embargo, el resto de las aplicaciones siguen funcionando en segundo plano,
sin verse afectadas por este hecho. Por supuesto, esto puede ser peligroso,
y OS/2 toma algunas precauciones: si el sistema está bloqueado y el usuario
hace una conmutación de tarea, si el programa no desbloquea el
conmutador antes de un cierto tiempo definido por el sistema, queda
congelado y se realiza la conmutación. Por eso es recomendable
desbloquear cada x tiempo el selector de programas y volverlo a bloquear.
Si por el contrario el programa se encontraba en segundo plano, hay dos
opciones: OS/2 puede retornar un código de error al programa, con lo que
este sabrá que no tiene acceso al buffer y puede seguir trabajando en otra
cosa, o bien OS/2 congelará al programa hasta que el usuario lo pase a
primer plano, momento en que lo despertará indicándole que tiene acceso
al buffer real.
Una vez que OS/2 ha devuelto un resultado afirmativo, el programa tiene
acceso total a la memoria de video. Cuando haya terminado, tiene que
proceder a desbloquear la pantalla, de modo que OS/2 pueda desbloquear
el selector de programas y devolver el sistema a la normalidad.
VioGetPhysBuf
VioScrLock
VioScrUnLock
Existe una dificultad adicional a la hora de trabajar con acceso directo a la
pantalla. Se trata de que OS/2, al conmutar de una tarea a otra, solo guarda
el contenido de la pantalla si ésta se encontraba en modo texto (esto se
cumple para OS/2 1.x. En Warp 4, sin embargo, SI conserva el contenido de
la pantalla, pero no se si se cumple también para OS/2 2.x o 3.x). Si
estabamos trabajando en modo gráfico, el contenido se perderá. Para
evitarlo, OS/2 facilita la posibilidad de crear un thread (este concepto será
explicado más adelante, cuando veamos la multitarea a fondo) que será
activado cuando el programa vaya a cambiar de primer a segundo plano, y
viceversa. Esto es así para permitir que un programa pueda almacenar el
contenido de la pantalla en modo gráfico cuando no tiene bloqueado el
acceso a la memoria de video. Es el thread SavRedrawWait.
Para implementarlo, es necesario crear un nuevo thread en el que se
ejecute la llamada VioSavRedrawWait. Esta llamada bloqueará el thread
hasta que el usuario pulse CTRL+ESC, momento en que OS/2, antes de
conmutar de tarea, despertará a dicho thread indicándole que debe
almacenar el contenido de la pantalla. Cuando el thread termine, debe
volver a ejecutar la llamada, con lo que OS/2 sabrá que ha finalizado. El
thread se quedará dormido de nuevo, y solo será despertado cuando el
usuario vuelva a conmutar a primer plano el programa. Entonces OS/2 le
indicará que debe repintar la pantalla.
VioSavRedrawWait
La inclusión de este sistema de acceso puede parecer innecesaria, a la vista
de la potencia del acceso al LVB; la razón de haberla implementado fue que,
cuando salió OS/2, no llevaba todavía el Presentation Manager, el gestor
de ventanas, sino que era un Sistema Operativo en modo texto, por lo que
se incluyó este sistema para poder acceder en modo gráfico a la pantalla,
dado que VIO no ofrece ninguna facilidad como el trazado de puntos o
líneas. Actualmente, al disponer de un completo (y complejo) gestor de
ventanas, este método puede parecer inutil, sin embargo, para juegos
puede ser muy útil, pues permite acceder a pantalla completa en modos
como 320x200 en 256 colores, lo que permite una alta velocidad de
refresco, así como una gran facilidad de manejo. Hay que señalar que el
acceso directo a la memoria de vídeo solo se puede hacer estando en una
sesión de pantalla completa; no funcionará en una sesión de ventana.
EL SUBSISTEMA DE TECLADO
El subsistema de teclado es el encargado de gestionar el acceso de los
programas a este periférico. Al igual que el subsistema de vídeo, no es
necesario usarlo para escribir programas sencillos de cara al interface de
usuario, pues se puede acceder fácilmente a él a través del sistema de
archivos. Es más, el uso del subsistema de teclado no ofrece casi ninguna
ventaja en lo que a velocidad se refiere. Por tanto ¿para qué usarlo?
Simplemente porque el acceso a través del sistema de archivos solo nos
permite detectar códigos ASCII, pero no la pulsación de teclas de funcion, o,
por ejemplo, si tenemos pulsada la tecla ALT, o CTRL, etc. Para este tipo de
funciones necesitamos usar los servicios del subsistema de teclado.
FUNCIONES KBD
Acceso a nivel de cadenas de caracteres
La primera posibilidad que ofrece el subsistema de teclado es leer
caracteres, lo cual se puede hacer de dos formas: por cadenas, o caracter a
caracter.
La lectura por cadenas es exactamente igual que el uso de los servicios del
sistema de archivos. De hecho, es el servicio que emplea la función
DosRead cuando tiene que leer del teclado. Sin embargo, no necesita un
indicativo de dispositivo abierto, ni participa en el redireccionamiento de
E/S. Además, funciona de modo diferente según el modo de teclado en que
se encuentre: ASCII, BINARIO o ECO.
Con este sistema, se leen caracteres hasta que el buffer definido esté lleno
o hasta que se pulse el caracter de retorno, que por defecto es
el retorno de carro (tecla enter).
KbdStringIn
KbdGetStatus
KbdSetStatus
La lectura por caracteres es un acceso más a bajo nivel. En este caso
podemos saber exactamente qué tecla está pulsada y cual no, y saber si
además se encuentran apretadas teclas como Ctrl, Alt, AltGr, etc. Además,
si el informe de cambio está activo, se notificará no solo cuando se pulse
una tecla, sino también cuando se suelte.
KbdCharIn
KbdPeek
Por último, tenemos una función que nos permite vaciar el buffer de
teclado, de modo que todas las pulsaciones hechas hasta el momento que
no han sido atendidas serán borradas.
KbdFlushBuffer
EL SUBSISTEMA DE RATON
El subsistema de ratón controla todo lo referente a este dispositivo.
Lo primero que hay que hacer para trabajar con el ratón es abrir el
dispositivo. Esta acción crea una cola de eventos para el ratón e inicializa
todos los parámetros de la sesión a un valor conocido.
MouOpen
MouClose
La cola de eventos del ratón almacena todos los sucesos ocurridos con éste
dispositivo, de modo que puedan ser leídos por el programa en el momento
adecuado. Un evento es, por ejemplo, mover el ratón, pulsar un botón,
soltarlo... Existe la posibilidad de filtrar determinados eventos, de modo que
al leer la cola, el resultado será exactamente igual que si no se hubiesen
producido.
Cuando se lee la cola, se puede especificar además si la función retornará
aún en el caso de que ésta esté vacía, o bien si debe esperar a que haya
algún evento en ella. Además de esto, podemos conocer en cualquier
momento la posición actual del ratón, así como cambiarla por otra. Estas
opciones deben usarse sólo con fines de actualizar alguna variable del
programa; si se pretende que sea el propio programa el que pinte el cursor,
es mejor leer las coordenadas por medio de la cola de eventos.
MouReadEventQue
MouGetEventMask
MouSetEventMask
MouFlushQue
MouGetNumQueEl
MouGetPtrPos
MouSetPtrPos
El controlador de ratón puede encargarse él mismo de pintar el cursor en
pantalla (solo en sesiones de texto), o bien relegar dicha acción al
programa. Así mismo, puede devolver las coordenadas bien en coordenadas
de pantalla, bien en Mickeys, que son unidades naturales del ratón.
Por otro lado, es posible definir un área de la pantalla que será especifica de
la aplicación, de modo que el controlador no pintará el cursor cuando éste
se encuentre dentro de aquella. Por defecto, este área ocupa toda la
pantalla.
MouDrawPtr
MouRemovePtr
MouGetDevStatus
MouSetDevStatus
Por último, es posible obtener información sobre las características de
nuestro ratón.
MouGetNumButtons
MouGetNumMickeys
MULTITAREA
ESTRUCTURA DEL OS/2
(Selector de Programas, Sesiones, Procesos y Threads)
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.
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.
Surge 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.
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.
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.
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.
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.
De todo esto deducimos varias cosas
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.
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.
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.
GESTION DE LA MEMORIA
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.
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, liberándola al terminar.
DosAllocMem
DosFreeMem
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.
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.
DosAllocSharedMem
En el primer caso, se debe especificar un nombre para el bloque que cumpla
el convenio de nombres de ficheros de OS/2, y además debe empezar por \
SHAREMEM\. Por ejemplo, un nombre válido sería\SHAREMEM\
BLOQUE.DAT.
DosGetNamedSharedMem
Si no se especifica un nombre, la memoria solo podrá ser compartida
mediante el intercambio de un puntero que señale al inicio del bloque. Si
ambos procesos conocen este valor, podrán acceder a dicho bloque
pidiéndolo o asignándolo. Para comunicarlo, es necesario usar la
comunicación entre procesos, que veremos más adelante.
DosGetSharedMem
DosGiveSharedMem
SUBASIGNACIÓN DE MEMORIA
La asignación de memoria es una parte muy importante en cualquier
sistema operativo. Da a los programas la capacidad de adaptarse
dinámicamente a las necesidades de cada momento. Sin embargo, hay un
coste relativamente elevado en la asignación de memoria dinámica. En
cada petición es preciso buscar una zona libre, cambiar los descriptores de
segmento, y cargar los registros de nuevo. Todo esto lleva un tiempo muy
elevado, debido a la propia arquitectura del microprocesador. Lo mismo
ocurre al liberar una zona. De aquí se saca una conclusión clara: utiliza toda
la memoria que necesites, pero evita asignar y desasignar constantemente
bloques. La solución consiste en asignar un bloque de tamaño moderado y
dentro de él sub asignar bloques de tamaño más pequeño, aumentando el
tamaño del bloque físico sólo cuando se necesita más espacio.
Para ayudar en esto, OS/2 ofrece un grupo completo de sub asignación de
memoria.
DosSubAllocMem
DosSubFreeMem
DosSubSetMem
DosSubUnsetMem
La primera acción consiste en reservar un bloque de memoria
con DosAllocMem. Este bloque de memoria es necesario prepararlo para
sub asignación con DosSubSetMem. Una vez hecho esto, podemos asignar
y desasignar pequeños bloques
con DosSubAllocMem y DosSubFreeMem como si usásemos las llamadas
de siempre, pero con la diferencia de que será notablemente más rápido.
Sin embargo, no debemos olvidar que se trata de un solo bloque de
memoria subdividido, por lo que aunque tengamos sub asignado un bloque,
podemos salirnos de él por accidente sin que el sistema dé un error
(siempre, claro está, que no nos salgamos de la memoria asignada).
Debemos ver las funciones de sub asignación de memoria simplemente
como una ayuda en la gestión de ésta. Para cualquier aplicación es
exactamente lo mismo dividir nosotros mismos un bloque de memoria de
forma lógica que usar estas funciones. La ventaja consiste en que nos
ahorramos programar un grupo de funciones que compruebe cuanto
espacio nos queda libre y en donde y actualice las estructuras. Se trata de
una ganancia en comodidad. Una aplicación clara de estas funciones se
verá cuando expliquemos las colas de mensajes, pues en ellas se hace uso
intensivo de pequeños bloques de memoria que se crean y liberan
constantemente.
SINCRONIZACION Y COMUNICACION ENTRE PROCESOS
Al ser OS/2 un Sistema Operativo multitarea, sus programas se componen
de múltiples partes denominadas threads, las cuales se ejecutan de forma
paralela. Debido a esto, cuando dos o más threads intentan acceder a la vez
a un mismo recurso (por ejemplo, una zona de memoria compartida), el
resultado puede ser, en el mejor de los casos, impredecible. Por eso surgen
los sistemas de sincronización entre procesos. Estos permiten establecer un
sincronismo entre dos o más threads y procesos de una forma consistente
y, sobre todo, fiable y predecible. En OS/2, estos sistemas están formados
por los semáforos.
Por otro lado, dos procesos pueden necesitar intercambiar información entre
ellos. En un primer momento, la memoria compartida puede parecer la
panacea, pero en muchas aplicaciones no son el método más eficiente. Por
eso surgen otros: los cauces y las colas de mensajes.
APENDICE
GRUPO DE LLAMADAS
(Sistema de ficheros)
DosBeep
DosBeep activa el altavoz interno.
#define INCL_BASE
#include <os2.h>
ULONG ulFrequency;
ULONG ulDuration;
APIRET rc; /* Codigo de error */
rc = DosBeep(ulFrequency, ulDuration);
DosClose
DosClose cierra un handle a un fichero, cauce o dispositivo.
#define INCL_BASE
#include <os2.h>
HFILE fileHandle;
APIRET rc; /* Codigo de error */
rc = DosClose(FileHandle);
DosCopy
DosCopy copia el contenido de un fichero o subdirectorio al fichero o
subdirectorio de destino.
#define INCL_BASE
#include <os2.h>
PSZ pszFicheroOrigen;
PSZ pszFicheroDestino;
ULONG ulModoOp;
APIRET rc; /* Codigo de error */
rc = DosCopy(pszFicheroOrigen, pszFicheroDestino,ulModoOp);
#define INCL_BASE
#include <os2.h>
PSZ pszDirName;
EAOP2 pEABuf;
APIRET rc; /* Codigo de error */
rc = DosCreateDir(pszDirName, pEABuf);
DosDelete
DosDelete borra un fichero. Este puede ser recuperado.
#define INCL_BASE
#include <os2.h>
PSZ pszFileName;
APIRET rc; /* Codigo de error */
rc = DosDelete(pszFileName);
DosDeleteDir
DosDeleteDir borra un directorio. Es necesario que esté vacío.
#define INCL_BASE
#include <os2.h>
PSZ pszDirName;
APIRET rc; /* Codigo de error */
rc = DosDeleteDir(pszFileName);
DosFindClose
DosFindClose cierra un cauce de busqueda de ficheros abierto con
DosFindFirst; esto es, termina una búsqueda.
#define INCL_BASE
#include <os2.h>
HDIR hdirDirHandle;
APIRET rc; /* Codigo de error */
rc = DosFindClose(hdirDirHandle);
DosFindFirst
DosFindFirst busca el primer archivo de un directorio que coincide con el
patrón de búsqueda.
#define INCL_BASE
#include <os2.h>
PSZ pszFileName;
PHDIR phdirDirHandle;
ULONG ulAttribute;
PVOID pResultBuf;
ULONG ulResultBufLen;
PULONG pSearchCount;
ULONG ulFileInfoLevel;
APIRET rc; /* Codigo de error */
rc = DosFindFirst(pszFileName, phdirDirHandle, ulAttribute, pResultBuf,
ulResultBufLen, pSearchCount, ulFileInfoLevel);
Bit Descripción
31-14 Reservados. Deben ser cero.
13
1: los ficheros que no tienen activo el bit de ARCHIVO son
ignorados.
0: son buscados también los ficheros que no tienen activo el
bit de ARCHIVO.
12
1: los ficheros que no tienen activo el bit de DIRECTORIO son
ignorados.
0: son buscados también los ficheros que no tienen activo el
bit de DIRECTORIO
11 Reservado. Debe ser cero.
10
1: los ficheros que no tienen activo el bit de SISTEMA son
ignorados.
0: son buscados también los ficheros que no tienen activo el
bit de SISTEMA
9
1: los ficheros que no tienen activo el bit de OCULTO son
ignorados.
0: son buscados también los ficheros que no tienen activo el
bit de OCULTO
8
1: los ficheros que no tienen activo el bit
de SOLO_LECTURA son ignorados.
0: son buscados también los ficheros que no tienen activo el
bit de SOLO_LECTURA
7-6 Reservados. Deben ser cero.
5
1: incluye los ficheros que tienen activo el bit de ARCHIVO.
0: excluye los ficheros que tienen activo el bit de ARCHIVO.
4
1: incluye los ficheros que tienen activo el bit de DIRECTORIO.
0: excluye los ficheros que tienen activo el bit de DIRECTORIO.
3 Reservado. Debe ser cero.
2
1: incluye los ficheros que tienen activo el bit de SISTEMA.
0: excluye los ficheros que tienen activo el bit de SISTEMA.
1
1: incluye los ficheros que tienen activo el bit de OCULTO.
0: excluye los ficheros que tienen activo el bit de OCULTO.
0
1: incluye los ficheros que tienen activo el bit
de SOLO_LECTURA.
0: excluye los ficheros que tienen activo el bit
de SOLO_LECTURA.
DosFindNext
DosFindNext encuentra el siguiente archivo de un directorio que coincide
con la cadena de busqueda dada en un DosFindFirst. Al usarse un handle
para identificar la búsqueda, se pueden hacer varias simultáneamente.
#define INCL_BASE
#include <os2.h>
HDIR hdirDirHandle;
PVOID pResultBuf;
ULONG ulResultBufLen;
PULONG pSearchCount;
APIRET rc; /* Codigo de error */
rc = DosFindNext (hdirDirHandle, pResultBuf, ulResultBufLen,
pSearchCount);
DosForceDelete
DosForceDelete borra un fichero, de forma que es irrecuperable.
#define INCL_BASE
#include <os2.h>
PSZ pszFileName;
APIRET rc; /* Codigo de error */
rc = DosForceDelete(pszFileName);
DosMove
DosMove mueve un fichero de un directorio a otro distinto.
#define INCL_BASE
#include <os2.h>
PSZ pszOldPathName;
PSZ pszNewPathName;
APIRET rc; /* Codigo de error */
rc = DosMove(pszOldPathName, pszNewPathName);
DosOpen
DosOpen abre un fichero nuevo o uno ya existente para trabajar con él.
#define INCL_BASE
#include <os2.h>
PSZ pszFileName;
PHFILE pshfFileHandle;
PULONG pActionTaken;
ULONG ulFileSize;
ULONG ulFileAttribute;
ULONG ulOpenFlag;
ULONG ulOpenMode;
PEAOP2 pEABuf;
APIRET rc; /* Codigo de error */
rc = DosOpen(pszFileName, pshfFileHandle, pActionTaken, ulFileSize,
ulFileAttribute, ulOpenFlag, ulOpenMode, pEABuf);
Parámetros
pszFileName
Puntero a una cadena con el nombre del fichero a abrir. Puede
ir acompañado de un path. La barra derecha (/) y la invertida
(\) pueden ser usadas indistintamente.
pshfFileHandl
e
Puntero a una variable donde OS/2 almacenará el handle
asignado al fichero.
pActionTaken
Puntero a una variable donde OS/2 almacenará un valor que
indica la acción tomada por DosOpen. Si la función falla, este
valor no tiene significado.
Valor Definición
1 El fichero existía
2 El fichero fue creado (no existía)
3El fichero fue truncado (existía y fue
reescrito)
ulFileSize
Nuevo tamaño lógico (fin de fichero, EOF) en bytes. Este
parámetro solo es válido cuando se crea un nuevo fichero o se
reescribe uno. En otro caso es ignorado. Es un error crear o
reemplazar un fichero con una longitud distinta de cero si el
modo de apertura está puesto en SOLO_LECTURA
ulFileAttributeDoble palabra conteniendo el siguiente mapa de bits. Solo es
válido si el fichero es creado.
Bit Descripción
31-6 Reservados. Deben ser cero.
5 El fichero ha sido archivado (bit ARCHIVO activo)
4 El fichero es un subdirectorio.
3 Reservado. Debe ser cero.
2 El fichero es un archivo de sistema.
ulOpenFlagCampo de bits de doble palabra que indica la acción a tomar
en caso de que exista o no el fichero.
Bits Descripción
31-8 Reservados. Deben ser cero.
7-4
0000: Abre un fichero que ya existe; falla si no existe.
0001: Abre un fichero si existe; lo crea el fichero si no
existe.
3-0
0000: Crea el fichero. Falla si ya existe.
0001: Abre el fichero si ya existe.
0010: Abre el fichero; si ya existe lo reescribe.
ulOpenModeCampo de bits de doble palabra que describe el modo de
operación de la función.
Bit Descripción
31-16 Reservado. Debe ser cero.
15
Apertura directa:
0: FileName representa un fichero para ser abierto
normalmente.
1: FileName es 'unidad' (como C: o A:), y representa
una unidad de disco o disquete para ser abierta para
un acceso directo.
14 0: Las escrituras en el fichero son a través de la cache
de disco. El sistema de ficheros escribe los sectores
cuando ésta se llena o el fichero es cerrado.
1: Las escrituras en el fichero son a través de la cache
de disco, pero los sectores son escritos antes del
retorno de una llamada de escritura síncrona. Este
estado del fichero lo define como un archivo síncrono.
13
Bit de notificación de errores físicos.
0: Los errores van a través del manejador del
sistema.
1: Los errores son notificados al thread que hizo la
llamada a través de un código de retorno.
12
0: El driver de disco puede poner datos de las
operaciones de I/O en su cache.
1: Las operaciones de I/O al fichero no deben ser
realizadas a través del cache del sistema de ficheros.
11 Reservado. Debe ser cero.
10-8
Especifica el modo en que se va a acceder al fichero,
de cara a la colocación de los datos en el disco:
000: Sin un modo concreto.
001: Principalmente acceso secuencial.
010: Principalmente acceso aleatorio.
011: Aleatorio concentrado en zonas concretas.
7
0: El handle del fichero puede ser heredado por
procesos creados con DosExecPgm.
1: El handle del fichero es privado, y solo accesible
por el proceso actual.
6-4
Modos de compartición del fichero:
001: DENY_ALL; no se permite que otros procesos
accedan.
010: DENY_WRITE; otros procesos pueden abrirlo para
lectura, pero no para escritura.
011: DENY_READ; otros procesos pueden abrirlo para
escritura, pero no para lectura.
100: DENY_NONE; otros procesos pueden abrirlo para
lectura y para escritura.
3 Reservado. Debe ser cero.
2-0
Modo de acceso. Define como va a acceder el proceso
que ha abierto el fichero:
000: READ_ONLY; solo va a realizar operaciones de
lectura.
001; WRITE_ONLY; solo va a realizar operaciones de
escritura.
010; READ_WRITE; va a realizar operaciones de
lectura y escritura.
pEABuf
Puntero a una variable de EAs. Antes de hacer la llamada, debe
contener una estructura de atributos extendidos. A la salida,
no hay cambios en ella. Si no se van a definir o modificar
atributos extendidos,pEABuf debe apuntar a cero.
DosQueryCurrentDir
DosQueryCurrentDir devuelve el path completo del directorio actual para el
proceso que realiza la llamada. Es necesario indicar una unidad, pues para
cada una de ellas hay un path distinto.
#define INCL_BASE
#include <os2.h>
ULONG ulDriveNumber;
PBYTE pbDirPath;
PULONG pDirPathLen;
APIRET rc; /* Codigo de error */
rc = DosQueryCurrentDir(ulDriveNumber, pbDirPath, pDirPathLen);
DosQueryCurrentDisk
DosQueryCurrentDisk devuelve la unidad por defecto para el proceso que
hace la llamada.
#define INCL_BASE
#include <os2.h>
PULONG pDriveNumber;
PULONG pLogicalDriveMap;
APIRET rc; /* Codigo de error */
rc = DosQueryCurrentDisk(pDriveNumber, pLogicalDriveMap);
PARÁMETROS
pDriveNumber
Puntero a una variable donde OS/2 devolverá el número
de la unidad por defecto. El valor 1 es la unidad A, el 2 la
unidad B, el 3 la unidad C, etc.
pLogicalDriveMap
Puntero a un mapa de bits donde el sistema devuelve un
mapa de las unidades lógicas disponibles. Las unidades de
la A a la Z tienen cada una un bit asignado, desde el 0 al
25, del mapa. Por ejemplo, el bit 0 representa la unidad A,
el 1 la unidad B, etc. El significado de dicho bit es el
siguiente:
Valor Definición
0La unidad lógica no
existe
1 La unidad lógica sí existe
DosRead
DosRead lee el número especificado de bytes a un buffer, desde un fichero,
cauce o dispositivo.
#define INCL_BASE
#include <os2.h>
HFILE FileHandle;
PVOID pBufferArea;
ULONG ulBufferLength;
PULONG pBytesRead;
APIRET rc; /* Codigo de error */
rc = DosRead(FileHandle, pBufferArea, ulBufferLength, pBytesRead);
DosResetBuffer
DosResetBuffer escribe los buffers de escritura del fichero indicado. Cuando
se escriben caracteres en un fichero, estos son almacenados en un buffer
de, al menos, un sector, el cual se escribe cuando se llena o cuando se
cierra el fichero. Esta llamada fuerza una escritura de dicho buffer aun
cuando no esté lleno.
#define INCL_BASE
#include <os2.h>
HFILE FileHandle;
APIRET rc; /* Codigo de error */
rc = DosResetBuffer(FileHandle);
DosScanEnv
DosScanEnv busca una variable de entorno (asignada con SET en el
CONFIG.SYS o desde la línea de comandos) y devuelve su contenido.
#define INCL_BASE
#include <os2.h>
PSZ pszEnvVarName;
PSZ pszResultPointer;
APIRET rc; /* Codigo de error */
rc = DosScanEnv(pszEnvVarName, &pszResultPointer);
DosSetCurrentDir
DosSetCurrentDir permite cambiar el directorio por defecto. Solo afecta al
proceso que realiza la llamada.
#define INCL_BASE
#include <os2.h>
PSZ pszDirName;
APIRET rc; /* Codigo de error */
rc = DosSetCurrentDir(pszDirName);
DosSetDefaultDisk
DosSetDefaultDisk cambia la unidad por defecto. Solo afecta al proceso que
hace la llamada.
#define INCL_BASE
#include <os2.h>
ulDriveNumber;
APIRET rc; /* Codigo de error */
rc = DosSetDefaultDisk(ulDriveNumber);
DosShutdown
DosShutdown graba todos los buffers del sistema, cierra los ficheros
abiertos y graba la cache, preparando el sistema para apagarlo. Puede
tardar varios segundos en ejecutarse.
#define INCL_BASE
#include <os2.h>
ULONG ulReserved;
APIRET rc; /* Codigo de error */
rc = DosShutdown(ulReserved);
DosWrite
DosWrite escribe un determinado grupo de bytes desde un buffer al fichero
especificado.
#define INCL_BASE
#include <os2.h>
HFILE FileHandle;
PVOID pBufferArea;
ULONG ulBufferLength;
PULONG pBytesWritten;
APIRET rc; /* Codigo de error */
rc = DosWrite(FileHandle, pBufferArea, ulBufferLength, pBytesWritten);
ERRORES DE OS/2 POR CODIGO
0 Sin error
1 Función no válida
2 Fichero no encontrado
3 Path no encontrado
4 Demasiados archivos abiertos
5 Acceso denegado
6 HANDLE no válido
8 No hay suficiente memoria
10 Entorno no válido
11 Formato no válido
12 Modo de acceso no válido
13 Datos no válidos
15 Unidad no válida
16 Intenta borrar el directorio actual
17 Los dispositivos fuente y destino son distintos
18 No hay más ficheros
19 El sistema es de solo lectura o está protegido contra escritura
26 Disco sin sistema de ficheros
29 Ha fallado la escritura
32 Violación de compartición
33 Violación del bloqueo
36 Desbordamiento del buffer de compartición
82 No se puede crear fichero
84 Fuera de las estructuras (error interno)
87 Parámetro no válido
89 Sin slots de procedimientos
90 El thread no estaba parado
95 Interrupción
99 Dispositivo en uso
103 Demasiados SEM_REQUEST
105 El propietario del semáforo ha muerto
108 Unidad bloqueada
109 El cauce (pipe) está cerrado
110 Fallo en la apertura
111 Desbordamiento del buffer
112 Disco lleno
113 No hay más handles de busqueda
114 El handle de destino no es válido
115 Violación de protección
123 Nombre no válido
127 Proc no encontrado
164 No se pueden crear más threads
170 Ocupado
182 Ordinal no válido
183 Ya existe
187 Semáforo no encontrado
190 Tipo de módulo no válido
191 Signatura de EXE no válida
192 Marca de EXE no válida
195 MINALLOCSIZE no válido
196 Enlace dinámico pedido desde un anillo no válido
203 Variable de entorno no encontrada
206 Nombre de fichero demasiado largo
208 Meta-expansion demasiado larga
212 Bloqueado
217 Procesos Zombie
224 No existe tal ventana (la sesión no se puede traer a primer plano)
230 Cauce incorrecto
231 Cauce (pipe) ocupado.
233 Cauce no abierto
234 Demasiados datos
250 Fichero origen y destino son el mismo
251 El directorio destino está dentro del fuente
254 Nombre de EA no válido
255 Lista de EAs inconsistente
Valor de EA no soportado
267 Directorio incorrecto
274 Ya se está ejecutando un ShutDown
275 EAs no coinciden
282 EAs no soportados en la unidad
283 Hay EAs importantes
285 Nombre duplicado
288 No se ha hecho DosRequestMutexSem
290 No quedan handles disponibles
291 Demasiadas aperturas
294 Thread no terminado
298 Demasiados post ejecutados
299 Ya se encuentra posted
300 El semáforo ya está borrado.
301 Semáforo ocupado
303 PID no válido
304 PDELTA no válido
305 No hay descendientes
307 PCLASS no válido
308 SCOPE no válido
309 Identificador de Thread no válido
310 No se puede reducir un segmento subasignado
311 No hay suficiente memoria libre
312 Superposición no válida en el bloque
322 Incapaz de despertar
323 Semáforo del sistema
324 No quedan temporizadores disponibles
326 Handle de temporizador no válido
327 Fecha u hora no válida
330 El proceso no es el dueño de la cola
332 Cola duplicada
333 El elemento no existe
334 No hay memoria suficiente
335 Nombre no válido
337 Handle de cola no válido
340 El elemento anterior es el último
341 Acceso no permitido
342 Cola vacía
343 No existe ese nombre
350 Puntero no válido
355 Modo no válido
356 Ancho no válido
358 Fila no válida
359 Columna no válida
366 Valor de WaitFlag no válido
367 No está bloqueado
369 Identificador de sesión no válido
375 Valor de espera no válido
376 Longitud no válida
377 Mascara de Echo no válida
378 Mascara de modo de entrada no válida
385 No hay ratón.
387 Parámetro no válido.
390 Nombre de dispositivo no válido.
393 No hay datos en la cola de eventos.
395 Frecuencia no válida
418 Llamada no válida
421 Parámetros no válidos
422 El thread SavRestoreWait ya tiene dueño
423 El thread SavRestoreWait ha sido liberado
429 El proceso está en background
430 Ilegal durante POPUP
433 Valor de Wait no válido
434 Ya está bloqueado
436 Handle VIO no válido
438 Longitud no válida
439 Handle KBD no válido
445 Se requiere el foco del teclado
447 El teclado está ocupado
458 Opción de STOP no válida
459 Reserva no válida
460 La sesión no es hija de la actual
463 Reintentar el Sub Alloc
464 KBD inactivo (proceso en detached)
465 VIO inactivo (proceso en detached)
466 MOU inactivo (proceso en Detached)
467 No hay una fuente adecuada para ese modo
468 Una fuente de usuario está activa
484 Desbordamiento de CritSec
485Underflow de CritSec (se ha intentado ejecutar
más Exits que Enters).
487 Dirección no válida
494 VIO Extended SG
501 Mouse no console
504 KBD Extended SG
505 MOU extended SG
532 DosSub corrupto
640 TimeOut (finalizó el tiempo)
RECOMENDACIONES
Los usuarios de OS/2 deberían considerar igualmente que el tiempo es dinero y que no
siempre han de buscar por una solución freeware, excepto en el caso que esta sea la mejor
disponible. Cada compra de productos OS/2 cuenta y algunos de los productos de OS/2 son
de los de mayor calidad del mercado, aunque ahora lo ha reemplazado por eComStation.
Para IBM, el destino de OS/2 es ser utilizado únicamente por las grandes empresas. IBM
pretende convertir a OS/2 en un sistema operativo especializado capaz de ejecutar "un
puñado" de cosas en el escritorio, pero manteniéndolo básicamente como un cliente de JAVA.
Esto va en contra de las necesidades de la mayoría de usuarios activos de OS/2.
En consecuencia, los usuarios y vendedores de OS/2 hemos de trabajar conjuntamente para
controlar nuestro propio futuro con eComStation. La dirección que toma IBM nos asegura
que tendremos el soporte necesario de drivers que es lo único que las terceras partes no
podemos hacer.
Una página web para el WarpCaster que sea controlada por alguien sin intereses, con
enlaces desde las páginas de todos los desarrolladores de aplicaciones OS/2 y con un enlace
creado por la instalación de todos los programas de OS/2 también es de vital importancia.
Una organización internacional de usuarios de OS/2 que trabaje conjuntamente con los
desarrolladores de software también ayudará a acercar el OS/2 a los nuevos usuarios y a
mantener a aquellos que no están en la red al día de las novedades relacionadas con OS/2.
Y, por último, una organización que sea capaz de presentar nuevas mejoras y prestaciones al
OS/2 para mantenerlo con la últimas prestaciones. Esta organización debería trabajar para
que los ISVs de OS/2 crearan estos componentes después que un número significativo de
usuarios mostrara su interés en que se hicieran. Incluso, al tener un número importante de
nuevas prestaciones, nos podríamos plantear el lanzamiento de una actualización del
sistema operativo (algo así como Power OS versión 5 o similar) en el caso de que IBM lanzara
definitivamente la toalla. Creo, igualmente, que de esta forma los usuarios de OS/2 serán
más conscientes de como ellos mismos pueden afectar al futuro de OS/2 para permitir que
en el futuro continúen apareciendo aplicaciones nativas para OS/2.
OS/2 ha tenido una autentica historia épica y, con un poco de suerte, la aventura no ha
hecho más que empezar.
Autentica historia épica y, con un poco de suerte, la aventura no ha hecho más que empezar.
CONCLUSIONES
Luego de analizar e investigar el tema tratado, podemos decir
concretamente que la tecnología va de acuerdo a las necesidades del diario
vivir; que, cada día van naciendo ideas nuevas, nuevas fórmulas, nuevas
técnicas, y por supuesto, según nuestro tema en cuestión, nuevas versiones
de los llamados “Sistemas Operativos”, en nuestro caso, el denominado
OS/2. Es así como llegamos al presente. Hoy en día, están disponibles
Windows 7 y Windows 8, las más recientes creaciones en Sistemas
Operativos.
Además de todos los beneficios de productividad y eficacia que
presentaba dicho sistema, es importante señalar los siguientes puntos más
destacables:
OS/2 ofrece u “ofrecía” multitarea para poder controlar varias
actividades en forma simultánea. El usuario podía estar trabajando con una
aplicación, imprimiendo una anterior y haciendo otras cosas.
OS/2 utilizaba ‘planificación apropiada’, podía quitarle la CPU a un
proceso y dársela a otro que considere más importante. Utilizaba de igual
forma, la denominada Memoria Virtual, en donde permitía al usuario
controlar su propio espacio de direcciones. En un OS/2 multitarea
resultaba mejor crear programas pequeños, cada uno de los cuales
realizaba bien una función o un conjunto de funciones afines y después
hacer que se comunicaran entre sí para alcanzar los objetivos del usuario.
Lo que hoy en día en materia de Programación se asemeja con
‘Programación Modular’.
Sin duda, en un futuro no muy lejano, aparecerán nuevas versiones,
nuevos diseños de sistemas operativos. Probablemente, así como
comparamos OS/2 con Windows 8, se compararán Windows 8 con otro
mucho más avanzado.
BIBLIOGRAFIA
INTRODUCCION A LOS SISTEMAS OPERATIVOS
Segunda Edición, 1993
H. M. Dertel.
Pág. 822-871
INTERNET
www.altavista.com
http://www.rastersoft.com/OS2
www.os2spain.org
www.internet.com.uy
www.monografías.com
www.yupi.com
www.os2ss.com