Tiempo de ejecución portátil de Netscape
Netscape Portable Runtime, o NSPR, es una biblioteca de capas de abstracción multiplataforma para el lenguaje de programación C. Proporciona una API uniforme para varias funciones del sistema operativo.
Historia
Gran parte de la biblioteca, y quizás su impulso general en el entorno Gromit, proporciona los fundamentos de la máquina virtual Java, mapeando más o menos la capa de sistema que Sun define para la migración de la máquina virtual Java a varias plataformas. NSPR va más allá de ese requisito en algunas áreas, ya que también funciona como capa independiente de la plataforma para la mayoría de los servidores producidos por Netscape.
La primera generación de NSPR originalmente tenía como objetivo satisfacer los requisitos de portar Java a varios entornos de host. NSPR20, un esfuerzo iniciado en 1996, se basó en esa idea original, aunque queda muy poco del código original. (El "20" en "NSPR20" no significa "versión 2.0" sino más bien "segunda generación"). Muchos de los conceptos muestran reforma, expansión y maduración. En 2009, NSPR todavía funcionaba adecuadamente como capa dependiente de la plataforma en Java, pero también servía para soportar clientes escritos completamente en C o C++.
Características
Hilos
Los hilos ocupan un lugar destacado en NSPR. La oferta de subprocesos de la industria del software carece de coherencia. NSPR, aunque está lejos de ser perfecto, proporciona una API única en la que los clientes pueden programar y esperar un comportamiento razonablemente consistente. Los sistemas operativos proporcionan de todo, desde ningún concepto de subprocesos hasta implementaciones sofisticadas, escalables y eficientes. NSPR hace el mayor uso posible de lo que ofrecen los sistemas. NSPR tiene como objetivo imponer la menor sobrecarga posible al acceder a esas funciones apropiadas del sistema.
Sincronización de hilos
La sincronización de subprocesos depende en gran medida de los monitores, como lo describe C. A. R. Hoare en "Monitores: un concepto de estructuración del sistema operativo", Comunicaciones del ACM, 17(10), octubre de 1974 y luego formalizado por Xerox' Lenguaje de programación Mesa ("Mesa Language Manual", J.G. Mitchell et al., Xerox PARC, CSL-79-3 (abril de 1979)). Este mecanismo proporciona las funciones básicas de exclusión mutua (mutex) y notificación de subprocesos (variables de condición) implementadas por NSPR. Además, NSPR proporciona métodos de sincronización más adecuados para su uso en Java. Las funciones similares a Java incluyen reentrada de monitor, capacidades de notificación implícitas y estrechamente vinculadas con la capacidad de asociar los objetos de sincronización dinámicamente.
E/S
La E/S de NSPR aumenta ligeramente el modelo de sockets de Berkeley y permite capas arbitrarias. Originalmente, los diseñadores tenían la intención de exportar únicamente métodos de E/S síncronos, confiando en subprocesos para proporcionar la concurrencia necesaria para aplicaciones complejas. Ese método de operación sigue siendo el preferido, aunque se pueden configurar los canales de E/S de la red como sin bloqueo en el sentido tradicional.
Direcciones de red
Parte de NSPR se ocupa de la manipulación de direcciones de red. NSPR define un objeto de dirección de red centrado en IP. Si bien no define el objeto como opaco, la API proporciona métodos que permiten y alientan a los clientes a tratar las direcciones como elementos polimórficos. En esta área, NSPR tiene como objetivo proporcionar una ruta de migración entre IPv4 e IPv6. Con ese fin, se pueden realizar traducciones de cadenas ASCII (nombres DNS) en las estructuras de direcciones de red de NSPR, independientemente de si la tecnología de direccionamiento utiliza IPv4 o IPv6.
Tiempo
NSPR ofrece funciones de cronometraje en dos formas: cronometraje por intervalos y funciones de calendario.
Los temporizadores de intervalos se basan en un temporizador de resolución dependiente de la plataforma, de ejecución libre y de 32 bits. Estos temporizadores se utilizan normalmente para especificar tiempos de espera en E/S, espera de variables de condición y otras programaciones de subprocesos rudimentarias. Dado que estos temporizadores tienen un espacio de nombres finito y se ejecutan libremente, pueden ajustarse en cualquier momento. NSPR no proporciona una época, pero espera que los clientes se ocupen de esa cuestión. Se garantiza que la granularidad de los temporizadores estará entre 10 microsegundos y 1 milisegundo. Esto permite un período mínimo de temporizador de aproximadamente 12 horas. Pero para solucionar el problema general, sólo se puede utilizar la mitad de ese espacio de nombres. Por lo tanto, el intervalo mínimo utilizable disponible en los temporizadores es ligeramente inferior a seis horas.
Las horas del calendario son números de 64 bits con signo y unidades de microsegundos. La época de los tiempos del calendario es la medianoche del 1 de enero de 1970, hora media de Greenwich. Los tiempos negativos se extienden a tiempos anteriores a 1970, y los números positivos hacia adelante. El uso de 64 bits permite una representación de horas aproximadamente en el rango de −30000 al año 30000. Existe una representación estructural (es decir, vista detallada), rutinas para adquirir la hora actual del sistema host y convertirlas hacia y desde la representación estructural y de 64 bits. Además, existen rutinas para convertir hacia y desde las formas más conocidas de ASCII a la representación NSPR de 64 bits.
Gestión de memoria
NSPR proporciona API para realizar las funciones básicas malloc, calloc, realloc y free. Dependiendo de la plataforma, las funciones pueden implementarse casi por completo en el tiempo de ejecución de NSPR o simplemente ajustes que llaman inmediatamente a las ofertas del sistema operativo host.
Enlace
La compatibilidad con la vinculación (carga y descarga de bibliotecas compartidas) forma parte del conjunto de funciones de NSPR. En la mayoría de los casos se trata simplemente de suavizar las posibilidades que ofrecen los distintos proveedores de plataformas.