Está en la página 1de 14

Resumen de S.

O (Segundo Cuatrimestre)

Máquinas virtuales:
El concepto de virtualización hace referencia a una tecnología que permite la ejecución
de varias máquinas virtuales sobre una máquina física con el objetivo de aprovechar al
máximo los recursos de un sistema.

La paravirtualización es una técnica de programación informática que permite virtualizar


por software sistemas operativos.

La virtualización asistida por hardware consiste básicamente en emular mediante


máquinas virtuales, los componentes de hardware. Con ello, el sistema operativo no se
ejecuta sobre el hardware real, sino sobre el virtual.

Un hypervisor o monitor de máquina virtual es una capa de software para realizar una
virtualización de hardware que permite utilizar, al mismo tiempo, diferentes sistemas
operativos en una misma computadora.

Prompt:
Cuando inician sesión, les aparece el “prompt”, este lo coloca el intérprete de comandos, el
prompt invita al usuario a ingresar comandos, ej: “#”.

Intérprete de comandos:
El intérprete de comandos se encarga de analizar lo ingresado por el usuario en el prompt, y
en el caso de un comando ejecutable de un programa, lo ubican en los directorios que tiene
variable de entorno “path”.

Variables de entorno:
Las variables de entorno, son variables del S.O que guardan información para el entorno de
trabajo de los usuarios.

Ejecutables:
Los programas ejecutables en linux pueden ser:
● Binarios
○ i386(32 bits)
○ arm arch 64
○ x86_64 (64 bits)

● Scripts: Es un archivo de texto que contiene una serie de instrucciones y comandos


que un programa intérprete debe leerlo y ejecutarlo.

Consolas virtuales:
Una consola en linux comprende una pantalla y un teclado.
● Como linux es un sistema multiusuario, es decir pueden usarlo más de un usuario a
la vez, posee lo que se denominan consolas virtuales, las cuales se pueden acceder
con las combinaciones de teclas: CTRL + Fn
● A las consolas virtuales se las designan /dev/ttyX donde X representa el número de
consola.

Consolas en linux:
Las consolas de linux tienen una entrada estándar (stdin), una salida estándar (stdout), y
una salida de error (stderr).

El S.O de linux usa un intérprete de comandos, por defecto el bash, el cual es un intérprete
entre el usuario y el S.O linux ya que permite interactuar con él.

Archivos y directorios en linux:


Para linux todo lo ve como un archivo, a los dispositivos de hardware también los ve como
archivos. A los archivos se los puede leer y escribir, con lo cual se puede acceder a los
dispositivos de hardware como si fueran archivos, para enviar o recibir datos.

Los archivos se guardan en directorios, los cuales para la teoría de S.O los directorios son
archivos que contienen archivos en su interior.

Sistema jerárquico del sistema de archivos(fms):


En linux hay un directorio principal que contiene todos los directorios del sistema de
archivos de linux, a este se lo denomina directorio raíz y se los designa con “/”.

La estructura de directorios en el directorio raíz de linux posee una jerarquía donde cada
directorio posee una función.

Diferentes directorios de linux y sus funciones:

● Bin: aplicaciones binarias básicas que pueden usar todos los usuarios.
● Boot: se encuentra el kernel de linux, y además el gestor de arranque de linux.
● Dev: se encuentran los archivos que hacen referencia a los dispositivos de hardware
del sistema.
● Etc: se encuentran los archivos de configuración del S.O y aplicaciones.
● Home: directorios personales de los usuarios del sistema.
● Lib: archivos de librería de funciones, necesarias para la ejecución de los
programas, y además se encuentran los módulos controladores de los dispositivos.
● Media: se encuentran los puntos de montaje para medios removibles (pendrive).
● Mnt: punto de montaje para sistemas de archivos, similar a media.
● Opt: para instalar aplicaciones opcionales de terceros.
● Proc: directorio dinámico que contiene información sobre el estado del sistema.
● Root: directorio personal root.
● Sbin: aplicaciones binarias que son importantes para el inicio, funcionamiento y
apagado del sistema.
● Srv: guarda información y datos que es servida en los servidores instalados en el
sistema.
● Tmp: archivos y directorios temporales del sistema y aplicaciones.
● Usr: se encuentran todas las aplicaciones y utilitarios que los usuarios pueden usar.
● Var: archivos con información del sistema o aplicaciones, que se guardan, como
registros(logs).

Permisos en linux:
Los permisos pueden ser de tipo:
● R
● W
● X

Si son archivos:
● R = read = leer
● W = write = escribir
● X = execute = ejecutar

Si son directorios:
● R = read = listar
● W = write = escribir en el directorio
● X = execute = ingresar al directorio

Ejemplo:
“ -rw-r--r--”

El primer carácter da a entender el tipo de archivo.


● “-” = archivo
● “d” = directorio
● “l” = enlace

Los 2-4 caracteres describen los permisos del propietario.


Los 5-7 caracteres describen los permisos del grupo asignado.
Los 8-10 caracteres describen los permisos del resto.

Comandos en linux:

Sintaxis de comandos en linux:

Típicamente un comando en linux posee la siguiente sintaxis:


#<nom.comando/ejecutable> <args>
Los argumentos son opciones que me da el comando o programa ejecutable para poder
cambiar o decirle de qué manera quiero que realice la tarea.

Las opciones como argumentos a un comando o programa en linux se especifican de la


siguiente manera:

“ - <una letra “
“ -- <una palabra> “

Lista de comandos:

Inicio de sesión: login <nom.usr>

Cerrar session: logout

Pedir ayuda: #<nom.comado> --help

Manuales en línea: #man <nom.comando>

Listar el contenido de un directorio: #ls


Listar el contenido de un directorio con todos los archivos ocultos y en formato long:
#ls -a -l

Ver el directorio actual: #pwd

Moverse entre directorios:


#cd <ruta al destino>

“ . “ → directorio actual
“ .. “ → directorio inmediato superior

Crear directorios: #mkdir <nom.dir>


Borrar directorios: #rmdir <nom.dir>

Copiar un archivo: #cp <nom.archivo> <destino>

Borrar un archivo: #rm <nom.archivo>

Mover un archivo / renombrar un archivo: #mv <nom.archivo> <destino>

Borrar directorios que no esten vacios: #rm -fr <nom.dir>

Cambio de permisos:
#chmod <opciones de permisos> <nom.archivo o dir>
Opciones de permisos:

u = propietario
g= grupo
o = otros
a = todos

+ = agregar
- = sacar
“=” = igualar

R = read = leer
W = write = escribir
X = execute = ejecutar

ej: #chmod a+x <nom.archivo>


#chmod a=u <nom.archivo>

Permisos con sistema octal, por medio de pesos:

R=4
W=2
X=1

ej: #chmod 644 <nom.archivo>

Agregar usuarios: #adduser <nom_usr>


Agregar una contraseña: #passwd <nom_usr>

Los usuarios se guardan en el directorio: /etc/passwd


y las contraseñas encriptadas se guardan en /etc/shadow

Visualizar contenido de archivos o concatenar archivos:


#cat <nom_archivo> <nom_archivo>

Redireccionamiento de entradas / salidas de comandos:

● Redireccionamiento de e/s de un comando a un archivo:


○ Redireccionamiento destructivo de stdout:
■ # <comando> > <nom_archivo>

○ Redireccionamiento no destructivo de stdout:


■ #<comando> >> <nom_archivo>

○ Redireccionamiento de stderr:
■ #<comando> &> <nombre_archivo>
○ Redireccionamiento de stdin:
■ #<comando> < <nombre_archivo>

● Redireccionamiento de e/s de un comando a otro:


○ #<comando> | <comando>

Comando More: Muestra el contenido de un archivo, pero pausa el contenido mostrado en


una pantalla a la vez, y con la tecla barra espaciadora avanza de a una pantalla a la vez.
Ej: #ls -al /etc | more

Comando less: permite pausar la pantalla, pero además permite avanzar no solo hacia
adelante , sino que también hacia atrás.
Ej: #ls -al /etc | less

Comando grep: se usa para buscar una cadena de caracteres (string).


Ej: #cat <nom_archivo> | grep <string>

Comando sort: ordena alfabéticamente el contenido ingresado por su stdin y lo muestra


por su stdout.
Ej: #cat <nom_archivo> | sort

Creación de un archivo de texto con cat: #cat > <nom_archivo>

Bash scripting: El bash script es un archivo de texto que contiene secuencias de


comandos de linux, que posibilitan hacer una tarea; dichos comandos se ejecutan
secuencialmente.

Todo bash script debe comenzar con: #!/bin/sh

Instalar programas en linux:


● Código fuente:
○ configurar, compilar e instalar

● Paquetes de software:
○ Gestor de paquetes

Los paquetes de software en linux es un archivo que contiene en su interior todos los
archivos necesarios y propios de sus aplicaciones, con instrucciones de a donde se deben
instalar, y qué configuración debe tener.

El formato de los paquetes cambia de una distribución a otra.


Los paquetes son instalados y desinstalados por medio de un gestor de paquetes, este
gestor cambia de distribución en distribución, para el caso de CentOS se usa “Yum”, para el
caso de ubuntu se usa “apt-get”.

Para buscar y bajar un paquete de software, el gestor de paquetes busca los mismos en sus
repositorios espejo de la distribución de linux instalada.

Los tipos de software que se puede encontrar en los repositorios depende de cómo cada
distribución maneja el tema de las licencias.

Una ventaja de usar los gestores de paquetes es que el mismo resuelve las dependencias
para la instalación de un paquete de software, las dependencias son otros paquetes
necesarios para el correcto funcionamiento de un software.

Aunque los comprimidos con el código fuente tiene la ventaja de la libre configuración a
nivel código.

Gestión de paquetes de CentOS: para actualizar el sistema, utilizando el software


instalado de una distribución CentOS se hace: #yum update

Comando para instalar un programa: #yum install <nombre_programa>

Listar los grupos de paquetes disponibles: #yum group list

Instalar un grupo de paquetes: #yum group install “<nombre>”

Buscar un paquete en yum: #yum search <nombre de paquete>

Para buscar que paquete provee un archivo en particular: #yum provides <nom.arch>

Archivos comprimidos en linux:


● Con gzip:
○ Comprimir:
■ #gzip <nombre_archivo> <nombre_archivo2>
■ #gzip <nombre_archivo> > <nombre_archivo.gz>

○ Descomprimir:
■ #gzip -d <nombre_archivo.gz>
■ #gunzip <nombre_archivo>

● Con bzip2:
○ Comprimir:
■ #bzip2 -c <nombre_archivo> > <nombre_archivo.bz2>

○ Descomprimir:
■ #bzip2 -d <nombre_archivo>
■ #bunzip2 <nombre_archivo.gz>

Iniciar interfaz gráfica en linux: #startx

La interfaz gráfica en linux posee dos partes:


● Servidor X: Interfaz hacia la placa de video, teclado y mouse.

● Cliente X: Aplicaciones que usan la interfaz que provee el servidor X:

○ Gestor de ventanas: tamaño de ventana, botones marco, desplazamiento,


minimizar, maximizar.

○ Gestor de Escritorio: Menú inicio, barra de tareas, iconos.


■ Gnome
■ KDE

Para descomprimir un archivo se usa: #tar -xzvf <archivo.tar.gz>

Para crear archivos con tar se usa:


#tar -cvzf <archivo.tar.gz> <ruta>

Para concatenar con tar se usa: #tar -cvf <nom_arch.tar> <nom_dir>

Para configurar el código fuente como el usuario desee: #./configure <args>

Compilar el programa: #make

Instalar el programa: #make install

Para limpiar el directorio donde configuran y compulan un programa en código


fuente: #make clean o se puede hacer: #make distclean

Para mostrar todos los procesos del usuario se usa: #ps

Para mostrar todos los procesos del sistema se usa: #ps -ax

Para matar/terminar un proceso se: #kill <PID>

Una vez que linux bootea se ejecuta el primer proceso con PID 1, el cual es el servicio o
demonio “systemd”.

Un servicio es un programa que ejecuta el sistema operativo para proveer un servicio, por
ejemplo funcionalidad de red, en linux los servicios o demonios se identifican por tener una
“d” al final del nombre.
Para controlar servicios se usan los comandos systemctl.
-status
-start
-stop
-restart

EJ: #systemctl stop NetworkManager

Niveles de inicio:
- Poweroff.target
- resure.target
- multi-user.target
- graphical.target
- reboot.target

Para saber el nivel de inicio por defecto se usa: #systemctl get-default

Para cambiar temporalmente el nivel de inicio se usa: #systemctl <target>

Para cambiarlo permanentemente se usa: #systemctl set-default <target>

Ver espacio libre en disco: #df


Visualizar la utilización de memoria física y virtual: #free

Proceso de arranque de linux:

1- Encendido de la computadora.
2- Cargar el S.O.
3- ejecutar el S.O

1-
Al encender la computadora, si las condiciones eléctricas son adecuadas, se saca al
procesador del reset, al salir del reset el micro siempre va a ejecutar la instrucción que se
encuentre en la dirección 0xf f f f f f f f 0.

En esta dirección de memoria se encuentra la primera instrucción de la bios, y es una


instrucción que forma parte de las rutinas POST.

Si el POST encuentra un error se detiene la rutina que encontró problemas en el hardware y


avisa por medio de pitidos del buzzer o por el parlante del mother, y aveces por medio de un
código hexadecimal, que indica en qué rutina POST encontro un error.

Si las rutinas POST pasan bien las pruebas de hardware el BIOS pasa a configurar el
hardware según la configuración del BIOS setup.
2- Carga del S.O

Al terminar de configurar el hardware, la bios pasa a buscar, para cargar en memoria, el


primer programa que encuentra en el 1er sector de la primera unidad de almacenamiento
configurada para arranque.

El primer sector es el mbr (master boot record), los sectores de un disco poseen 512 bytes,
y en el mbr se encuentra:

- El programa de arranque (446 bytes).


- Tabla de particiones.

En el caso particular de linux, el programa de arranque que se ubica en el mbr es parte del
programa LILO u GRUB. Se ubica una parte ya que estos programas poseen un tamaño
mayor a 446 bytes, con lo cual en el mbr se ubica una primera parte(llamada “stage 1”).

El bios carga este programa en memoria y le pasa el control al cpu.

Esta primera etapa va a ir a buscar el resto del programa de arranque ya sea LILO o GRUB
a este se lo llama etapa o stage 2.

El resto del código para la etapa 2 generalmente y típicamente se ubica en los 62 sectores
restantes desde el MBR.

En la versión más nueva de GRUB, el GRUB 2, la que sería la etapa 2 se lo menciona como
etapa 1.5; y la etapa 2 se completa al buscar en la partición de linux donde se encuentra el
directorio /boot el resto de programa del programa de arranque.
Esto es debido a que GRUB 2 posee mayores capacidades que LILO y el GRUB original,
como por ejemplo cargar otros S.O con distintos sistemas de archivos.

3- Ejecutar el S.O

Una vez cargado el LILO o GRUB este irá a buscar el kernel selecciona en el menú de
arranque en el directorio /boot de la partición donde se encuentra el linux seleccionado; para
esto el LILO o GRUB se basa en los drivers que posee el bios para acceder a los discos.

Una vez cargado el kernel en memoria, hasta que el cpu lo ejecuta.

El kernel está en un formato comprimido, por lo tanto se descomprime y se empieza a


ejecutar.

Lo primero que hace el kernel es configurar el entorno de hardware de ejecución:


- pasar de modo real a modo protegido.
- activar la paginacion y segmentacion de memoria.
- etc.
Luego, levanta los módulos (drivers) para el hardware de la computadora(el kernel sabe que
hardware posee la computadora, gracias a una lista que crea el bios en su arranque).

Activo el planificador de corto plazo y ejecuta el primer proceso(pid 1), originalmente el init,
actualmente el systemd.

A su vez el systemd levanta otros programas por medio de scripts que se encuentran en
/etc/sysconfig, cuando se usaba init se ejecutaban programas por medio de scripts ubicados
en /etc/initd siendo el último en ejecutar el programa login para iniciar sesión.

Gestión de memoria:
En la gestión o administración de memoria se debe garantizar una correcta operación que
proteja al sistema operativo de los posibles accesos por parte de los procesos de los
usuarios y que también proteja a los procesos usuarios de otros, esta protección se debe
dar por parte del hardware, el encargado de esta protección es el MMU.

Dirección lógica: indica una posición relativa al comienzo del programa. Las instrucciones
del programa contienen solo direcciones lógicas.

Dirección física: es la posición actual en la memoria principal.

Cuando el procesador ejecuta un proceso, automáticamente convierte las direcciones


lógicas en físicas sumando a cada dirección lógica la posición de comienzo actual del
proceso, llamada dirección base.

Protección de memoria:

El sistema operativo, que se ejecuta en modo kernel, tiene acceso no restringido a la


memoria tanto del sistema operativo como de los usuarios. Esto permite al sistema
operativo cargar los programas de los usuarios en la memoria de los usuarios, volcar dichos
programas en caso de error, leer y modificar parámetros de las llamadas al sistema, etc.

Podemos proporcionar esta protección utilizando dos registros, usualmente una base y un
límite. El registro base almacena la dirección de memoria física legal más pequeña,
mientras que el registro límite especifica el tamaño del rango.

La protección del espacio de memoria se consigue haciendo que el hardware de la CPU


compare todas las direcciones generadas en modo usuario con el contenido de esos
registros. Cualquier intento, por parte de un programa que se esté ejecutando en modo
usuario, de acceder a la memoria del sistema operativo o a la memoria de otros usuarios
hará que se produzca una interrupción hacia el sistema operativo, que tratará dicho intento
como un error fatal. Este esquema evita que un programa de usuario modifique (accidental
o deliberadamente) el código y las estructuras de datos del sistema operativo o de otros
usuarios.

Registro de reubicación: representa la primera dirección física del mapa de memoria del
proceso.

Esto se puede observar como que me desplazó una cantidad igual a la dirección lógica,
desde la posición inicial dada por la dirección física que contiene el registro de reubicación.

Esta dirección lógica también se la puede considerar como “desplazamiento” u “offsets” que
indica cuánto me tengo que desplazar desde el inicio del mapa de memoria.

Reasignación de memoria:

Reasignación en tiempo de compilación: Esta reasignación se da cuando se conoce


donde estarán ubicadas en memoria física del programa, toda referencia en un programa a
la memoria es una dirección física.

En caso de no conocerse donde se ubicaran estas direcciones de memoria se utilizaran


otros dos métodos más.

Reasignación en tiempo de carga: Esta reasigna las direcciones físicas al momento de


cargar el proceso en memoria ram.

Esta posee la clara desventaja que una vez que el proceso sea cargado en memoria no
podrá ser reasignado/movido/desplazado en la memoria.

Reasignación en tiempo de ejecución: el S.O con ayuda del hardware va realizando la


traducción o reasignación de las direcciones lógicas que hay en el mapa de memoria del
proceso cargado en la memoria ram a direcciones físicas.

Este método nos da la ventaja de mover el mapa de memoria y dividirlo.

En el caso de la reasignación en tiempo de compilación o de carga, la CPU trabaja con


direcciones físicas, por lo que no se requiere de realizar el mapeo.

Pero puede ser que se requiera realizar protección de memoria en esta situación, para esto
la MMU utiliza 2 registros: registro base y el registro límite.

El registro contiene la primera dirección física donde comienza el área de memoria donde
fue cargado el mapa de memoria.

Swapping:

El swapping se produce cuando no hay suficiente memoria.


Cuando hay uno o varios procesos en espera de entrada o salida, lo que se hace es agarrar
su mapa de memoria y colocarlo en el disco.

En Windows se guarda en pagefile.sys y en Linux en una partición.

Al esquema de swapping también se le llama esquema de memoria virtual. Se le dice así


porque parece que hay más memoria de la que realmente tengo.

El esquema más simple para definir particiones en la memoria disponible es utilizar


particiones de tamaño fijo. Aunque las particiones son de tamaño fijo, no todas tienen igual
tamaño. Cuando un proceso se introduce en memoria, se sitúa en la partición disponible
más pequeña que puede incluirlo. Incluso con el uso de particiones de distintos tamaños, se
desperdiciará memoria. En la mayoría de los casos, un proceso no necesitará exactamente
la memoria que proporciona una partición.

Una posibilidad más eficiente consiste en utilizar particiones de tamaño variable. Cuando un
proceso se introduce en memoria, se le asigna exactamente la memoria que necesita y no
más. El método empieza bien, pero eventualmente puede llevar a situaciones en las que
hay muchos huecos pequeños en memoria. A medida que pasa el tiempo, la memoria se
fragmenta más y más, y empeora su utilización. Una técnica para solucionar este problema
es la compactación: de vez en cuando, el sistema operativo desplaza los procesos en
memoria para juntar toda la memoria libre en un bloque. Este es un procedimiento que
consume parte del tiempo del procesador.

Tanto la estrategia de primer ajuste como la de mejor ajuste para la asignación de memoria
sufren del problema denominado fragmentación externa. A medida que se cargan procesos
en memoria y se los elimina, el espacio de memoria libre se descompone en una serie de
fragmentos de pequeño tamaño. El problema de la fragmentación externa aparecer cuando
hay un espacio de memoria total suficiente como para satisfacer una solicitud, pero esos
espacios disponibles no son contiguos; el espacio de almacenamiento está fragmentado en
un gran número de pequeños agujeros.
Se descompone la memoria física en bloques de tamaño fijo y asignar la memoria en
unidades basadas en el tamaño de bloque. Con esta técnica, la memoria asignada a un
proceso puede ser ligeramente superior a la memoria solicitada. La diferencia entre los dos
valores será la fragmentación interna, es decir, la memoria que es interna a una partición
pero que no está siendo utilizada.

Tanto las particiones de tamaño fijo como las de tamaño variable son ineficaces en el
aprovechamiento de la memoria. Supóngase, no obstante, que la memoria se divide en trozos
iguales de tamaño fijo y relativamente pequeño, y que cada proceso también se divide en
pequeños trozos de tamaño fijo. Después los trozos de un programa, conocidos como
páginas, se podrían asignar a los trozos de memoria disponibles, conocidos como marcos
(frames). Entonces, el espacio de memoria desperdiciado por un proceso es, como mucho,
una fracción de la última página.

La segmentación consiste en dividir en múltiples espacios de memoria o segmentos el


mapa de memoria de un proceso de manera de agrupar en los mismos el código del
programa y los distintos tipos de datos con los que se trabajan con el proceso.
El sistema operativo mantiene una tabla de páginas para cada proceso. La tabla de páginas
indica el marco que aloja a cada página del proceso. Dentro del programa, cada dirección
lógica está constituida por un número de página y una dirección relativa dentro de la página.

La memoria principal se divide en muchos marcos pequeños de igual tamaño. Cada proceso
se divide en páginas del tamaño de los marcos: los procesos más pequeños necesitan menos
páginas, los procesos mayores necesitan más. Cuando un proceso se lleva a memoria, sus
páginas se cargan en los marcos disponibles y la tabla de páginas se actualiza.

Paginación por demanda: Con el uso de la paginación, se dispone de sistemas con


multiprogramación verdaderamente efectivos. Es más, la sencilla táctica de dividir el
proceso en páginas llevó al desarrollo de otro concepto decisivo: la memoria virtual. La
paginación por demanda, simplemente significa que cada página de un proceso se
introduce en memoria solo cuando se necesita (es decir, cuando se solicita o demanda).

Sería claramente un derroche cargar todas las páginas del proceso cuando solo se
utilizarán unas pocas antes de que el proceso se suspenda. Podemos hacer un mejor uso
de la memoria cargando solo unas pocas páginas. Después, si el programa salta a una
instrucción de una página que no está en memoria principal, o si el programa hace
referencia a un dato de una página que no está en memoria, se produce un fallo de página.
Esto indica al sistema operativo que debe cargar la página deseada.

La mayoría de los esquemas de memoria virtual hacen uso de una caché especial para los
elementos de la tabla de páginas, llamada usualmente buffer de traducción anticipada (TLB,
Translation Lookaside Buffer). Este buffer funciona de la misma manera que una memoria
caché y contiene aquellos elementos de la tabla de páginas a los que se ha accedido más
recientemente.

También podría gustarte