Monografias.com > Computación
Descargar Imprimir Comentar Ver trabajos relacionados

Administración Básica de Sistemas Operativos




Enviado por Caribay Osorio



  1. Gestión de procesos
  2. Administración de permisos a usuarios y grupos en windows y software libre
  3. Grupos
  4. Gestión de almacenamiento en UNIX
  5. Gestión de almacenamiento en Windows

La administración de un sistema incluye un amplia gama de tareas tales como las de instalar una impresora o un escáner, configurar y compartir el acceso a Internet, instalar programas, configurar un cortafuegos, añadir nuevos usuarios, etc., en definitiva crear un entorno de trabajo seguro, cómodo y productivo.

En sistemas operativos monousuario, tales como MS-DOS o Windows9x, las tareas administrativas podían ser realizadas por cualquiera que tuviese acceso a la máquina. Sin embargo en sistemas multiusuario como GNU/Linux se distingue cuidadosamente entre el administrador, que es el único usuario con permisos para administrar la máquina y el resto de usuarios, que carecen de tales privilegios.

Configurar y administrar un sistema es una tarea bastante compleja. De hecho, los manuales de administración suelen ser volúmenes de un tamaño y dificultad considerables.

No es nuestra intención, por tanto, abordar esta cuestión con detalle, sin embargo es necesario que conozca algunos procedimientos sencillos para mantener en forma su instalación doméstica de Ubuntu.

Gestión de procesos

Un proceso es simplemente, un programa en ejecución que necesita recursos para realizar su tarea: tiempo de CPU, memoria, archivos y dispositivos de E/S. El SO es el responsable de lo siguiente:

Crear y destruir procesos

Parar y reanudar procesos

Ofrecer mecanismos para que los procesos puedan comunicarse y se sincronicen

La gestión de procesos podría ser similar al trabajo de oficina. Se puede tener una lista de tareas a realizar y a estas fijarles prioridades alta, media, baja por ejemplo. Debemos comenzar haciendo las tareas de prioridad alta primero y cuando se terminen seguir con las de prioridad media y después las de baja. Una vez realizada la tarea se tacha. Esto puede traer un problema que las tareas de baja prioridad pueden que nunca lleguen a ejecutarse. y permanezcan en la lista para siempre. Para solucionar esto, se puede asignar alta prioridad a las tareas más antiguas.

Procesos y tareas.

Una de las tareas más importantes del SO es la gestión de los procesos que se están ejecutando en una máquina. El hecho de que todos los procesos deban compartir los recursos hardware disponibles (memoria RAM, CPU) hace que el SO juegue un papel primordial en gestionar esos recursos para que los procesos se ejecuten de forma simultánea (al menos de cara al usuario) y compatible. Una posible definición de proceso es que un proceso es un programa que se encuentra en ejecución. Cada proceso, durante su ejecución, guarda información sobre su "contexto" que incluye, entre otras cosas, información sobre su proceso padre, los recursos del sistema que se están consumiendo (segmentos de memoria asignados), permisos de seguridad

Terminación de un Proceso.

El ciclo de vida de un proceso es sencillo, consta de la creación, la ejecución de instrucciones y la terminación. Cabe señalar que un proceso en el transcurso de su ciclo puede estar en diferentes estados.

Salida normal.

Salida por error.

Error fatal.

Eliminado por otro proceso.

Salida normal, ésta se presenta cuando el proceso termina de forma voluntaria, por ejemplo, cuando se cierra en navegador web o el procesador de textos.

Salida por error, ésta se presenta cuando el proceso tiene que salir debido a insuficiencia de datos, por ejemplo, cuando solicita un archivo que no existe.

Error fatal, éste sucede por un error en el programa, como las divisiones entre 0 o requerimiento de memoria inaccesible.

Eliminado por otro proceso, éste es sumamente útil cuando un proceso se queda colgado, es decir, sin terminar, pero tampoco responde. En Unix un ejemplo es cuando se utiliza el comando kill para terminar procesos abruptamente.

Estados de un proceso

Los estados de un proceso obedecen a su participación y disponibilidad dentro del sistema operativo y surgen de la necesidad de controlar la ejecución de cada proceso. Los procesadores sólo pueden ejecutar un solo proceso a la vez, turnándolos para el uso de éste. Existen procesos no apropiativos o cooperativos que básicamente ocupan todo el tiempo del procesador hasta que ellos deciden dejarlo. Los procesos apropiativos son aquellos que ocupan por un período de tiempo el procesador hasta que una interrupción o señal llega al procesador para hacer el cambio de proceso, a esto se le conoce como cambio de contexto.

Los posibles estados que puede tener un proceso son ejecución, bloqueado y listo:

Ejecución, es un proceso que está haciendo uso del procesador.

Bloqueado, No puede ejecutarse hasta que un evento externo sea llevado a cabo.

Listo, ha dejado disponible al procesador para que otro proceso pueda ocuparlo.

Las posibles transiciones son 4. La primera se realiza cuando el sistema operativo determina que el proceso no puede continuar justo en ese momento, en algunos sistemas se puede hacer una llamada al sistema "pause" para pasar al estado bloqueado, en Unix cuando el proceso está leyendo datos provenientes de una canalización o de un archivo especial (terminal) y no hay entrada disponible, el proceso se bloquea de forma automática.

Las transiciones 2 y 3 son llevadas a cabo por el planificador de procesos, siendo que el proceso no tiene conocimiento de éste. La transición 2 se da cuando el planificador de procesos decide que el proceso ya estuvo el tiempo suficiente en ejecución y debe dar paso a la ejecución de otros procesos (adquieran tiempo del procesador). La transición 3 se realiza cuando todos los procesos han ocupado tiempo del procesador y debe retomarse el primer proceso.

La transición 4 ocurre cuando se produce un evento externo por el que un proceso estaba en espera, por ejemplos, introducir datos desde la terminal. Si no hay otro proceso en ejecución en ese instante, la transición 3 se activa y el proceso comienza a ejecutarse; también podría pasar al estado de "listo" y esperar un momento para iniciar la ejecución.

Administración de permisos a usuarios y grupos en windows y software libre

El primer usuario se crea durante el proceso de instalación tal como ya hemos comentado. Si usted es el único que usa el ordenador puede que sea suficiente pero si lo comparte con otros es casi obligado y recomendable tener un usuario diferente para cada uno.

Cada usuario tiene plenos poderes en su carpeta personal, pero fuera de ahí carece de ellos. Vamos a ver un ejemplo práctico de esta limitación.

Vaya al menú Lugares – > Carpeta personal.

Pulse dos veces el botón Subir o alternativamente pulse en el panel lateral el acceso a Sistemas de archivos. Se le mostrará entonces el árbol de directorios completo.

Seleccione la carpeta /bin que contiene ejecutables vitales para el sistema.

Pulse la tecla Supr para borrarlo aun sabiendo que podemos causar un daño irreparable.

Un primer mensaje de error nos advierte que no puede mover la carpeta a la papelera y nos pregunta si lo queremos eliminar inmediatamente.

Pulse sobre Borrar y aparecerá un segundo mensaje informándole de que carece de los privilegios necesarios para llevar a cabo tal acción.

De este modo es seguro que nadie, excepto el usuario con permisos de administración, puede, ni accidental ni maliciosamente, dañar el sistema.

Añadir usuarios

Añadir un usuario es sencillo, simplemente siga estos pasos:

Vaya al menú Sistema -> Administración -> Usuarios y grupos

En la ventana principal del gestor de usuarios verá que algunos botones están en gris lo que indica que no se pueden usar. Para poder hacerlo es necesario tener permisos de administración. Pulse el botón Desbloquear. En la lista desplegable seleccione un usuario con privilegios de administrador e introduzca la contraseña correspondiente a ese usuario.

Pulse ahora en Añadir usuario

Nos aparece ahora una ventana con varios campos para rellenar, de los cuales los obligatorios son:

Usuario. Es la palabra que se utilizará como identificador de usuario. No escriba espacios ni acentos aquí.

Nombre real. El nombre y los apellidos del usuario a crear.

Perfil. Un perfil está definido por el conjunto de cosas que un usuario puede hacer en el sistema. Los perfiles disponibles son los siguientes:

Usuario del escritorio. Puede hacer todo salvo tareas administrativas.

Administrador. Puede realizar tareas administrativas además de trabajar normalmente con el sistema.

Usuario sin privilegios. No puede hacer nada. Carece de sentido crear un usuario sin darle posibilidad de trabajar en el sistema. Esta opción se utiliza a menudo para deshabilitar una cuenta, es decir, revocar los permisos que se concedió cuando se creó por primera vez.

Si desea ajustar detalladamente los permisos para el usuario pulse en la pestaña Privilegios del usuario. Marque o desmarque la casilla correspondiente para asignar o quitar un permiso en particular. Los permisos así definidos prevalecerán sobre el perfil elegido.

Contraseña del usuario: Es una cadena de caracteres. Se distingue entre mayúsculas y minúsculas. También puede pedir al sistema que genere una contraseña aleatoria.

Una vez termine de completar los campos haga clic en Aceptar. Verá cómo se ha creado el nuevo usuario. Pulse finalmente Cerrar para abandonar la aplicación.

En general no es una buena idea conceder privilegios de administración a varios usuarios de un sistema. En aquellos casos donde varias personas deban administrar una instalación suele ser más conveniente habilitar la cuenta de "root", compartir la clave y utilizar este acceso sólo para tareas de configuración. Cuando se añade un nuevo usuario se crea automáticamente su Carpeta personal. En Ubuntu por defecto las carpetas personales son accesible a los demás en modo lectura, lo que significa que cualquiera puede ver su contenido aunque no puede ni modificarlo ni borrarlo. Si usted desea que su carpeta personal sea completamente confidencial haga lo siguiente:

Vaya al menú Lugares -> Carpeta personal.

Pulse el botón Subir para ascender un nivel en el árbol de directorios.

Haga clic con el botón derecho en su carpeta personal y seleccione Propiedades.

Pinche en la pestaña Permisos.

En la línea Otros desmarque las casillas Lectura y Ejecución.

Pulse Cerrar. Ahora su carpeta es privada, nadie excepto usted tendrá acceso a ella.

Editar información personal y cambiar la contraseña

En cualquier momento el usuario puede cambiar su información personal y su propia contraseña. Para ello haga clic con el botón derecho del ratón en la mini aplicación Selector de usuarios, situada en el extremo derecho del panel superior, y en el menú emergente seleccione Editar información personal.

En la ventana que aparece modifique o complete los apartados que estime oportuno dentro de cada una de las pestañas. Si desea cambiar la imagen que lo representa haga clic sobre el icono que hay justo a la izquierda de su nombre.

Verá entonces un listado de imágenes disponibles. Haciendo clic una vez sobre el nombre del fichero obtendrá una vista previa de la imagen. Para aplicar los cambios haga doble clic. Haga doble clic sobre cualquier carpeta bajo la columna Lugares para localizar otra imagen de su preferencia. Si no desea utilizar ninguna imagen pulse en el botón Sin imagen situado al pie de la ventana. También es posible cambiar su contraseña personal. Para ello haga clic en el botón Cambiar contraseña… situado a la derecha de su nombre. En el campo Contraseña actual introduzca su actual contraseña y pulse Intro o bien haga clic en el botón Autenticar. Ahora escriba su nueva contraseña dos veces en los campos correspondientes y pulse el botón Cambiar contraseña.

Cambiar de usuario

Utilizando el Selector de usuarios es posible que otro u otros usuarios inicien una nueva sesión sin cerrar la sesión actual. De este modo varias personas pueden trabajar sobre el equipo sin necesidad de tener que cerrar e iniciar la sesión cada vez, preservando en todo momento la confidencialidad de su trabajo. Esto puede resultar útil sobre todo si un usuario dejó un proceso ejecutándose, por ejemplo una descarga de ficheros desde Internet, y otro usuario cualquiera desea no obstante utilizar el equipo. De las diversas formas que hay de trabajar con varios usuarios simultáneamente hemos seleccionado la que nos ha parecido más sencilla. Vamos a suponer que en el sistema hay dos usuarios: Antonio Saorín Martínez y José J. Grimaldos Parra y que actualmente está trabajando en el equipo Antonio Saorín Martínez. Para cambiar de usuario haga clic con el botón izquierdo del ratón en el Selector de usuarios y en el listado que aparece seleccione el nombre del usuario que quiere iniciar sesión, en nuestro caso José J. Grimaldos Parra.

Verá entonces la pantalla de entrada en la que se le solicita la contraseña para ese usuario. Escríbala y pulse Intro. Ahora ya está en el sistema el nuevo usuario, en nuestro caso José J. Grimaldos Parra, así nos lo muestra el selector de usuarios. Para volver a la sesión del primer usuario haga clic con el botón izquierdo del ratón en el Selector de usuarios y en la lista seleccione su nombre, en nuestro ejemplo Antonio Saorín Martínez. Note que ese nombre está en negrita indicando con ello que el usuario está activo en el sistema.

Una vez hecho esto se cambiará a la sesión del primer usuario pero antes verá la pantalla de bloqueo de sesión y necesitará facilitar la contraseña. De este modo se preserva la confidencialidad de cada usuario pues no es posible acceder a su sesión de trabajo sin conocer la contraseña correspondiente.

Cuando hay varios usuarios registrados simultáneamente sólo los usuarios con permisos de administración pueden apagar el sistema. Cuando un usuario no es administrador e intenta apagar se le pide que se registre con una cuenta de administrador. Esta forma de cambiar de usuario exige que el usuario registrado "de paso" a un nuevo usuario desde su escritorio, pero hay otra forma de realizar este proceso que es por así decirlo más confidencial.

Suponemos que un usuario, Antonio Saorín Martínez en nuestro ejemplo, está trabajando con el equipo, quiere hacer una pausa sin cerrar su sesión y al mismo tiempo no desea que nadie pueda ver qué está haciendo. En ese caso hace clic con el botón izquierdo del ratón en el Selector de usuarios y en la lista selecciona Bloquear la pantalla. La pantalla se pone en negro y al pulsar cualquier tecla o mover el ratón aparece la ventana de bloqueo que ya hemos visto. Esta ventana solicita la contraseña para poder acceder a la sesión de trabajo. Ahora otro usuario, en nuestro caso José J. Grimaldos Parra, quiere acceder al equipo y se encuentra con esa ventana de bloqueo. Lo que tiene que hacer entonces es pulsar el botón Cambiar usuario. Verá entonces la ventana de entrada normal donde tendrá que escribir el nombre de usuario y la contraseña. José J. Grimaldos Parra a su vez también bloquea la pantalla antes de dejar el equipo. Antonio Saorín vuelve de sus quehaceres, ve la pantalla en negro y pulsa una tecla o mueve el ratón. Le aparece entonces la ventana de bloqueo pero no su ventana sino la de José J. Grimaldos, por lo que no funcionará el teclear su contraseña. Tiene entonces que pulsar el botón Cambiar usuario y escribir su nombre de usuario y contraseña. Pero no iniciará una nueva sesión sino que volverá a su sesión anterior, la que bloqueó antes de irse.

Cuando varios usuarios están registrados en el sistema simultáneamente para cambiar de sesión se pueden utilizar atajos de teclado. Con la combinación de teclas Ctrl+Alt+F7 accedemos a la sesión del primer usuario registrado, con Ctrl+Alt+F9 a la del segundo.

Cuando se tienen varios usuarios en el sistema es a menudo cómodo utilizar un tema para la ventana de entrada que los muestre. Para configurar la ventana de entrada vaya al menú Sistema?Administración?Ventana de entrada Haga clic en la pestaña Local. Seleccione un tema que incluya "visor de rostros (face browser)", por ejemplo "Human List" y pulse Cerrar. Ahora la ventana de entrada mostrará un listado con los usuarios del sistema.

Para registrarse como uno de esos usuarios haga clic en su nombre y escriba la contraseña oportuna. Note que este modo de configurar la ventana de entrada introduce un elemento de inseguridad ya que no se precisa conocer el nombre del usuario, aunque sí su contraseña, para registrarse en el sistema. Si cambió su imagen la verá aquí en esta lista. Si no lo hizo verá un icono estándar.

La cuenta de invitado

El Selector de usuarios muestra una cuenta especial denominada Sesión de invitado. Se trata de una cuenta en todo igual a la del usuario de escritorio pero con la particularidad de que los documentos guardados en la carpeta personal o los cambios de configuración se pierden una vez que se cierra la sesión.

Grupos

Para simplificar la administración de permisos y poder compartir recursos de manera segura como carpetas y archivos, GNU/Linux nos permite crear grupos. Un grupo está formado por uno o más usuarios de tal modo que los privilegios del grupo son también concedidos a cada uno de sus integrantes.

Cuando se añade un usuario el sistema automáticamente crea un grupo con el mismo nombre que ese identificador de usuario. Por ejemplo, cuando se añade el usuario grimaldos, se crea también el grupo grimaldos, y su carpeta personal será propiedad del usuario grimaldos y del grupo grimaldos, siendo éste el único miembro del grupo.

Podemos utilizar esta funcionalidad para compartir carpetas de modo fácil y seguro. Veamos un ejemplo comentado que le ayudará a comprender mejor este sencillo, pero potente concepto. Lo primero será crear el grupo.

Vaya al menú Sistema -> Administración -> Usuarios y grupos

Pulse el botón Desbloquear e introduzca la contraseña de administrador.

Haga clic en el botón Gestionar grupos.

Pulse el botón Añadir grupos.

En la ventana de diálogo escriba un nombre para el grupo, por ejemplo amigos. Bajo el epígrafe Miembros del grupo marque el usuario o usuarios que quiere que formen parte del grupo. Cuando haya terminado haga clic en Aceptar.

Ahora crearemos una carpeta que todos los usuarios del grupo podrán compartir.

Vaya a Aplicaciones -> Accesorios -> Terminal

En la terminal escriba

sudo nautilus

y pulse la tecla Intro

De esta forma ejecutaremos el administrador de archivos con privilegios de administración lo que significa que podemos crear y eliminar cualquier directorio, así que sea cuidadoso.

Pulse el botón Subir para ascender un nivel en el árbol de directorios y haga doble clic en la carpeta home

Vaya al menú Archivo, seleccione Crear una carpeta y escriba un nombre para la carpeta, por ejemplo, compartido.

Haga clic con el botón derecho del ratón sobre la carpeta recién creada y en el menú contextual seleccione Propiedades

Abra la pestaña Permisos. En la lista desplegable Grupo del archivo elija el nombre del grupo que creó más arriba (en nuestro ejemplo, amigos).

En la lista desplegable Acceso a carpeta seleccione Crear y borrar archivos y en Acceso a archivo seleccione Lectura y escritura.

Pulse el botón Cerrar para activar los cambios.

La carpeta creada será accesible a los miembros del grupo, y sólo a ellos, con tan sólo ascender un nivel desde su Carpeta personal.

Gestión de almacenamiento en UNIX

Al igual que en el apartado de procesos se realizó una comparación de la forma en que los dos sistemas operativos; UNIX y Windows, realizan dicha tarea, en este punto se realizará unas reseñas de cómo el sistema UNIX realiza la gestión de memoria, y en el punto 4.4 se realizará sobre el sistema Windows.Sólo se realizará este estudio de estos dos sistemas, porque cómo ya se ha comentado, los sistemas que van a ser objeto de estudio, Linux y Mac OS X, están diseñados a partir de UNIX, de ahí que se elija dicho sistema. El otro sistema a estudiar será Windows 7, de ahí que sea también objeto de estudio.

En el sistema operativo UNIX, la gestión de memoria ha variado de las versiones antiguas a las actuales. Antes, UNIX se basaba sólo en el intercambio (swapping) donde se empleaban particiones variables sin ningún tipo de esquema de memoria virtual. Las versiones actuales se basan en la memoria virtual paginada, utilizando para ello la paginación combinado con el intercambio. Las direcciones lógicas generadas por un programa se dividen en un número de páginas con el mismo tamaño. Este tamaño varía dependiendo de la versión, utilizándose en versiones anteriores tamaños de 512 bits o 1024 bits. Hoy en día, con las CPUs actuales el tamaño de página en los equipos a 32 bits es de 4 KB, por lo que el espacio de direcciones es de 2 elevado a 32 bits (4 GB). Respecto a la paginación, ya se ha tratado en el punto 4.2.1., UNIX utiliza las tablas de páginas, el descriptor del bloque donde se almacena la información para acceder a la página en memoria secundaria y los marcos de página que guarda información acerca del estado de la página, el número de procesos que referencia al marco y el dispositivo que contiene la copia de la página. Los marcos no asignables a un proceso son marcos libres asignables a cualquier proceso. El sistema define el número mínimo de marcos libres, que comprueba periódicamente. Si en un instante no se alcanza dicho límite, un proceso paginador envejece las páginas. Toda referencia a una página pone a cero la edad de la página. Si la página pasa una edad, la página pasa a estado libre. La página de un marco libre puede ser rescatada en una referencia si el marco no hubiera sido asignado antes. En situaciones donde hay mucha demanda por parte de los procesos, puede ocurrir que el paginador no sea capaz de conseguir marcos libres a la velocidad necesaria. Entonces es cuando se produce el swapping, mediante el cual se saca algún proceso de la memoria principal y se pasa a la memoria secundaria (swap out). En cambio cuando existe espacio en la memoria principal, se intercambian los procesos a memoria copiando desde el área de intercambio (swap in). Los criterios de elección se basan en el estado del proceso, su prioridad, el tamaño del programa y el tiempo que lleva en memoria. Para soportar swapping se requiere un espacio de intercambio en almacenamiento secundario, normalmente en un disco. Se puede utilizar un dispositivo específico, una partición del disco o incluso compartir la misma partición del sistema de ficheros. En los sistemas UNIX se suele utilizar una partición del disco para ello.En los sistemas UNIX se puede observar como en memoria se carga todo lo que se pueda. Es decir, se utiliza la memoria como caché de datos. Esto se utiliza para optimizar el sistema y hacerlo más rápido. En memoria se carga todos los datos a los que tenga que acceder la CPU, por lo que si ésta tiene los datos en memoria en vez de en el disco, la rapidez de acceso a los mismos será mayor, por lo que el rendimiento aumenta. Ello hace que se optimice la mayor cantidad de memoria principal disponible, ya que el uso de la misma es del 100%. En cuanto, un proceso requiera de memoria se utilizará los mecanismos de swapping ya descritos liberando la memoria utilizada para caché.

Gestión de almacenamiento en Windows

Los procesos dentro de Windows utilizan un espacio de direcciones
de 32 bits que permite habilitar un espacio de direcciones de hasta 4 gigabytes
de direcciones, o 8 terabytes en el caso de los sistemas de 64 bits. Cuando
todos los procesos que se ejecutan en el sistema requieren de más memoria
que la disponible, Windows utiliza la alternancia entre la memoria virtual (determinado
por un archivo de paginación) y la memoria
física, que al igual
que en UNIX recibe el nombre de swapping. Este intercambio se realiza no de
bytes a bytes, sino de página a página, que en Windows son bloques
de 4 KB donde se almacenan los datos de los procesos. De ahí que toda
la memoria esté paginada, tanto la física como la virtual. La
física en forma de marcos de página y la virtual en forma de páginas.
Además, Windows dispone de tablas de páginas que son las que apuntan
a las propias páginas, y los punteros de estas tablas se almacenan a
su vez en un directorio de páginas. Cada proceso dispone sólo
de un directorio. l espacio de direcciones para un proceso es el conjunto de
direcciones de memoria virtual que puede utilizar. El espacio de direcciones
para cada proceso es privado y no se puede acceder por otros procedimientos,
a menos que se comparta. Una dirección virtual no representa la ubicación
física real de un objeto en la memoria, sino que el sistema mantiene
una tabla de páginas para cada proceso. El sistema traduce la dirección
virtual a una dirección física mediante diferentes algoritmos,
lo que hace que no se pueda acceder a las posiciones de otros procesos porque
no es posible hacer referencia a dichas posiciones. A diferencia de los otros
sistemas, las páginas pueden estar en tres estados; libre, donde no puede
ser accedida por ningún proceso pero sí reservada o encargada;
reservada, es un espacio de dirección virtual fijada para usos futuros;
encargada, aquella que ha sido asignada a un espacio físico, ya sea en
memoria física o virtual.

 

 

Autor:

Caribay Osorio

 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter