Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

ASO U1 Procesos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 25

UNIDAD 1.

GESTIÓN DE PROCESOS
1. Procesos
Un proceso es un programa o un fragmento de programa en ejecución. Para que un programa se
ejecute, el SO debe crear un proceso para él.

Cada proceso necesita una serie de recursos (tiempo de uso de CPU, espacio en memoria,
dispositivos de E/S, etc.), y es el sistema operativo el encargado de proporcionárselos.

Los sistemas operativos modernos son multitarea y multiusuario, esto implica que múltiples
procesos pueden ejecutarse simultáneamente sin interferirse unos con los otros. Las obligaciones
del SO como gestor de procesos son:

• Creación y eliminación de procesos.


• Planificación de procesos (procurando la ejecución de múltiples procesos maximizando la
utilización del procesador).
• Establecimiento de mecanismos para la sincronización y comunicación de procesos.
• Manejo de bloqueos mutuos.

Aunque dos procesos estén asociados al mismo programa, se consideran dos secuencias de
ejecución separadas, cada una de las cuales se considera un proceso. Llamamos traza de un
proceso al listado de la secuencia de instrucciones que se ejecutan en el proceso.

Prácticamente todo lo que se está ejecutando en el sistema en cualquier momento es un proceso,


incluyendo el shell, los comandos ejecutados en la terminal, la interfaz gráfica, la pila de protocolos
de la red, etc.

Un proceso está formado por :


• Sección de texto (código del programa, instrucciones).
• Actividad actual, representada por:
◦ Valor del contador de programa.
◦ Contenido de registros del procesador.
◦ Pila (stack), que contiene datos temporales (parámetros de subrutinas, direcciones de
retorno y variables locales).
◦ Sección de datos, que contiene variables globales y memoria dinámica.

Cuando se crea un proceso, se le asocia un paquete de información


denominado Bloque de Control de Proceso (PCB), que le acompaña
durante toda su vida. En este BCP se recogen datos del proceso como son:

• Su estado actual.
• Su PID (número identificador de proceso).
• Valores de registros asociados a él, como el contador de programa,
los punteros, acumuladores, registros, etc.
• Valores de los recursos asignados: espacio en memoria, archivos,
E/S, tiempo consumido, prioridad del proceso, etc.

1
Todos los procesos, desde su creación, tendrán la capacidad de comunicarse y sincronizarse con
otros procesos y con recursos del sistema. Este hecho da lugar a diferentes tipos de procesos:

• Independientes: no se comunican con otros procesos. Estos tipos de procesos apenas


existen.
• Cooperativos: se comunican y sincronizan para realizar una actividad común.
• Competitivos: necesitan hacer uso del mismo recurso y, por consiguiente, competirán por
él.

En cualquier caso, la ejecución de los procesos exigirá concurrencia, cualidad que deberá gestionar
el sistema operativo gracias a técnica denominada multiprogramación, que permite que dos o más
procesos puedan ejecutarse "a la vez".

2. Estados de un proceso
Un proceso, a lo largo de su vida, cambia de estado. En concreto, un proceso puede estar en uno de
los siguientes estados:
• Nuevo (new): Momento en el que se está creando el proceso.
• Preparado (ready): Está esperando a que se le asigne la CPU (un procesador).
• En ejecución (running): Se está ejecutando en la CPU.
• Bloqueado o en espera (waiting): Está a la espera de que suceda un evento.
• Terminado (terminated): Finaliza su ejecución. Muere.

Además de estos estados, en algunos sistemas también existe un estado denominado suspendido
(suspend), que se produce cuando un proceso se suspende y es desplazado a memoria secundaria.
En esta situación, el proceso puede quedar a la espera de un evento (waiting suspend) o suspendido
temporalmente pero listo para ejecutarse (ready suspend).

Un proceso puede cambiar de estado cuantas veces sea necesario, pero nunca puede estar en más de
un estado a la vez.

El objetivo final de un proceso es procesarse, es decir, estar en ejecución durante el tiempo que sea
necesario para ser procesado. Sin embargo, un procesador sólo puede ejecutar un proceso a la vez.
Por ello, se necesitan mecanismos para que los diferentes procesos que compiten por la CPU
puedan hacerlo de la forma más eficiente y beneficiosa para el sistema.

3. Creación de procesos
La creación de un proceso se hace a través de la llamada al sistema "crear proceso" desde otro
proceso denominado proceso padre. El proceso resultante se denomina proceso hijo.

Como se puede deducir, debe existir un proceso inicial con la capacidad de pedir al sistema que se
cree un proceso. Este proceso creador es de vital importancia en los sistemas operativos y
constituye la raíz del árbol de procesos.

Los procesos se marcan en su creación con un número único llamado identificador de proceso
(PID), que es un entero positivo entre 0 y 65535. Salvo el proceso raíz, todos los procesos llevan
dos números:

2
• El PID (Process Identifier) que lo identifica a él.
• El PPID (Parent Process Identifier) que identifica a su padre.

Después de que un proceso genera un hijo, ambos continúan ejecutándose desde el punto en el que
se hizo la creación.

4. Terminación de procesos
Generalmente un proceso finaliza su ejecución cuando pasa al estado terminado y le pide al sistema
que lo elimine utilizando la llamada al sistema "exit".

Los procesos hijos pueden ser eliminados cuando el proceso padre quiera. Esto se denomina matar
un proceso y es habitual cuando:

• El hijo se excede en el uso de los recursos asignados.


• La tarea que se asignó al hijo ya no se necesita.
• El proceso padre quiere terminar y el sistema operativo no permite que los hijos continúen
sin el padre.

Hay que prestar especial atención al hecho de que un proceso no debería terminar hasta que todos
sus hijos lo hagan. Sin embargo, las operaciones sobre procesos no son fiables al 100% y se pueden
dar anomalías en la gestión de los procesos:

• Procesos huérfanos. Se denominan así a los procesos que quedan en el sistema cuando su
padre ha finalizado.
• Procesos zombies. Son procesos que han finalizado pero su padre los mantiene como vivos.
Este tipo de procesos suelen ser fruto de errores de programación o de fallos del sistema. Al
contrario que los procesos huérfanos, los zombies no son adoptados por el proceso inicial
sino que tienden a eliminarse para evitar el consumo de recursos.

5. Modelos de proceso
La forma en que un sistema se organiza para gestionar sus procesos da lugar al modelo de proceso.
Los sistemas operativos actuales pueden seguir los siguientes modelos:

Modelo de 2 estados. Es el modelo más simple. El proceso, tras crearse pasa al estado no-
ejecutado, a la espera de entrar en ejecución. Cuando entra en ejecución, puede ejecutarse por
completo (y morir) o hacerlo por partes.

3
Modelo de 3 estados. El modelo anterior es ideal para procesos sin prioridades y que siempre estén
listos para ejecutarse. Sin embargo, esto no siempre sucede y algunos pueden necesitar esperar por
un suceso (que esté listo un archivo, que esté disponible un dispositivo de E/S,..). Para ello, en este
nuevo modelo se divide el estado no-ejecutado en dos: preparado y bloqueado, cada uno con su
propia cola de procesos.

Modelo de 5 estados.
Para mejorar la gestión de los procesos, al modelo anterior se le añaden dos estados extremos:
nuevo y terminado, encargados de controlar los procesos existentes en el sistema (en nuevo se dan
de alta y en terminado se dan de baja).

Modelo de 7 estados. Los procesos a la espera de ser ejecutados residen en memoria principal (en
las colas de preparado y bloqueado). Para evitar que la RAM se colapse se hace una variación en el
modelo anterior, creando unas colas similares a las ya existentes pero en memoria secundaria. Esto
da lugar a los estados suspendido-bloqueado y suspendido-preparado. Entre las correspondientes
colas se produce una operación de intercambio cada vez que se pasa un proceso de una a otra. Hay
que tener en cuenta que esta operación consume recursos y tiempo de CPU.

4
6. Cambio de contexto
El proceso pasa gran parte de su vida esperando ser ejecutado. Cuando un proceso en ejecución ha
de dejar paso a otro proceso, pero su tarea no ha sido completada, se espera que la próxima vez que
se ejecute continúe donde lo había dejado. Esta operación es conocida como cambio de contexto
(context switch).

El cambio de contexto consiste en interrumpir la ejecución de un proceso para comenzar o


continuar la ejecución de otro, por ello el proceso a cambiar debe ser desalojado de la CPU. Toda la
información relativa al estado del proceso ha de ser almacenada para en su PCB para más tarde.

De forma un poco esquemática, en el cambio de contexto:


• El proceso saliente guarda todos sus valores asociados en el PCB.
• Se guardan los valores de los registros y direcciones de memoria implicados en el proceso
en ese momento.
• Se cambia de estado el proceso.
• Se cambia de estado al proceso entrante.
• Se cargan los valores de los registros y direcciones de memoria asociados al proceso.

Todas estas operaciones son gestionadas y supervisadas por el procesador, lo cual quiere decir que
en el tiempo que dura el cambio de contexto no se puede ejecutar ningún otro proceso. Por ello, es
muy importante que el cambio de contexto se realice lo más rápidamente posible, ya que es tiempo
perdido.

Cuando el cambio de contexto se hace sin salir de memoria principal, el tiempo y los recursos
empleados no son excesivos; pero en los cambios de contexto entre memoria principal y secundaria
la situación cambia, siendo más lenta y costosa.

La técnica de cambiar de contexto es útil cuando se quiere dar tiempo de ejecución a todos los
procesos, pero un uso excesivo del cambio de contexto puede ser contraproducente ya que el
procesador estaría más tiempo ocupándose de las acciones asociadas a los cambios de contexto que
a la ejecución de los procesos que se intercambian.

5
7. Planificación de procesos
Los procesos no se ejecutan en cualquier orden, sino que siguen un orden establecido por el sistema
operativo. La forma en la que el sistema operativo gestiona los procesos es lo que se conoce como
planificación y la herramienta que lo hace recibe el nombre de planificador (en inglés, scheduler).

La misión del planificador es:


• Garantizar que cada proceso tiene acceso al recurso en su justa medida.
• Explotar el recurso, manteniéndolo ocupado el máximo tiempo posible.
• Reducir todo lo posible los tiempos de espera de los diferentes procesos.

La dificultad de la planificación radica en que no se puede saber, a priori, qué procesos estarán
compitiendo por un recurso ni tampoco el contexto que se generaría en caso de concedérselo. Por
ello, para controlar el acceso de los procesos a los recursos, el planificador puede seguir dos tipos
de política:

• Política no expropiativa: Una vez que el proceso accede al recurso, se permite que haga
uso de él hasta que ya no lo necesite.
• Política expropiativa: Se proporciona acceso al recurso para un proceso pero, en un
determinado momento, se puede ceder el recurso a otro proceso diferente, para lo cual se le
retirará el acceso al primero (pasando a estado suspendido, bloqueado o preparado).

La política expropiativa es mucho más justa cuando existen procesos muy diferentes, ya que
permite, por regla general, que ningún proceso acapare el recurso. Por otro lado, es más compleja y
consume más recursos.

8. Niveles de planificación
La planificación es demasiado compleja como para realizarse en una única fase. Los sistemas
operativos, en general, disponen de tres niveles de planificación, cada uno con su planificador:

• Planificación a largo plazo (nivel alto): Llamada también "planificación de admisión", ya


que es la que determina qué trabajos se admiten para su procesamiento y, por consiguiente,
se cargan en memoria.
• Planificación a medio plazo (nivel medio): Gestiona el estado de suspensión de los
procesos. Esta operación recibe el nombre de intercambio (o swapping). Es muy típica en
sistemas Linux, donde incluso existe una partición específica para este fin.
• Planificación a corto plazo (nivel bajo): También llamada despachador (dispatcher).
Estipula qué procesos en estado preparado pasarán a ejecución. Debe ser una planificación
sencilla y breve, ya que se ejecutará muchas veces.

6
9. Algoritmos de planificación
Los planificadores funcionan aplicando algoritmos de gestión. De entre todos los existentes,
destacamos estos:

• Algoritmo por prioridades.


A cada proceso se le asigna una prioridad según la cual se ejecutan. Este algoritmo tiene el
inconveniente de que los procesos con prioridad baja pueden relegarse en el tiempo.

• Algoritmo FCFS (Fisrt Come First Served).


Utiliza una estructura de cola en la que los procesos se ejecutan según entran en ella.Aquí, los
procesos demasiado largos harían esperar al resto de procesos hasta que termine de ejecutarse.

7
• Algoritmo SJF (Shortest Job First).
Intenta reparar el problema de FCFS pero, en este caso, los procesos largos se ven desfavorecidos y
pueden retrasarse en su ejecución continuamente.

Una vez que el proceso entra en ejecución, se ejecuta por completo, aunque haya en cola procesos
más cortos.

• Algoritmo SRT (Shortest Remaining Time).


Es una versión expropiativa de SJF, donde se tiene en cuenta también los procesos de la cola.

En el caso de que existan procesos en cola más cortos, se expropia el proceso en ejecución y se
ejecutaría el de la cola.

8
• Algoritmo RR (Round Robin).
Utiliza una organización en cola circular: Los procesos se ejecutan en cola y cuando acaba el último
se sigue con el primero. A cada proceso se le asigna un tiempo de uso de CPU denominado cuanto.

El problema de este algoritmo está en la fijación del cuanto, ya que cuantos demasiado largos
degeneran en FCFS y cuantos demasiado cortos disminuirían el rendimiento por los continuos
cambios de contexto de los procesos.

Como se puede observar, cada algoritmo tiene sus ventajas y sus inconvenientes. En la práctica se
utiliza un sistema híbrido de varias colas en las que se aplican diferentes algoritmos según las
necesidades y el momento concreto con la finalidad de optimizar los recursos y los tiempos de
respuesta del sistema.

9
10. Hilos de ejecución (Threads)
El manejo de los procesos resulta bastante complejo. Con el avance tecnológico producido en los
microprocesadores con la introducción de los núcleos surgió el concepto de hilo (thread) o
proceso ligero. Con la introducción de los hilos, los procesos pasan a denominarse procesos
pesados.

Un hilo es la parte de un proceso que puede ser ejecutada de forma independiente. De esta
manera, un proceso estará constituido por al menos, un hilo, existiendo la posibilidad de que
tenga varios.

La capacidad (del sistema operativo) de mantener varios hilos de ejecución dentro del mismo
proceso se conoce con el nombre de multihilo. Si no existe, entonces se habla de monohilo. En
general, todos los sistemas operativos modernos son multihilo.

Trabajar a nivel de hilos tiene grandes ventajas sobre hacerlo a nivel de procesos: Al tratarse de
entidades mucho más ligeras, los tiempos empleados para su manejo (creación, terminación, cambio
de estado y de contexto) son mucho menores respecto a los procesos. El tiempo para crear un hilo
es mucho menor que para crear un proceso.

Los hilos hacen más rápida la comunicación entre procesos, ya que al compartir memoria y
recursos, se pueden comunicar entre sí sin invocar el núcleo del SO.

11. Estructura de un hilo


De forma muy simple podemos decir que un hilo sigue la siguiente estructura:

• Bloque de control del hilo: Similar al PCB pero específico para el hilo.
• Pila de ejecución: Estructura que contiene la información de estado del hilo (punteros,
registros, etc.).
Teniendo esto en cuenta y aplicándolo a los diferentes tipos de procesos:

➔ Procesos monohilo.
En este tipo de procesos no existe el concepto de hilo como tal y la representación del proceso es
similar a la explicada al comienzo de la unidad.
➔ Procesos multihilo.

10
Sólo existe un BCP y un espacio de direcciones asociadas al proceso pero, para cada hilo, hay un
bloque de control y una pila de ejecución separados.
Dentro de un mismo proceso los hilos comparten código, datos y recursos del sistema.
Los hilos están pensados para que no sean independientes entre sí. De este modo, es posible que un
hilo pueda acceder a la pila de otro hilo y modificarla. En esta interacción y en el tiempo que se
emplea en ella (mucho menor que la comunicación entre procesos) reside, fundamentalmente, su
potencialidad.

12. Estados de un hilo


Los hilos siguen el diagrama de 3 estados que se explicó para los procesos.

Sobre los hilos se pueden realizar las siguientes operaciones:

• Crear: en general, al crear un proceso se crea también un hilo para ese proceso que se
colocará en la cola de preparados. De ese hilo pueden salir nuevos hilos (hilos hijos).
• Terminar: cuando se termina un hilo, se libera todo lo asociado a él (el bloque y su pila).
• Bloquear: sucede cuando un hilo necesita esperar a que suceda un evento. Se comporta
como si fuera un proceso, pasando al estado bloqueado y cediendo el procesador a otro hilo.
Puede darse el caso de que el bloqueo de un hilo conlleve el bloqueo de todo el proceso, es
decir, de todos los hilos que componen el proceso.
• Desbloquear: ocurre cuando el evento por el que se esperaba sucede y el hilo pasa a la cola
de preparados. Al igual que antes, si un hilo bloqueaba todo su proceso, el desbloqueo de un
hilo puede conllevar el desbloqueo de todo el proceso, es decir, de todos los hilos que
componen el proceso.

Como se ve, los hilos tienen un comportamiento estacional similar a los procesos. Este hecho unido
a que los hilos son mucho más ligeros que los procesos, hace que los tiempos de creación,
terminación y cambios de estado (y de contexto) sean mucho más reducidos, con lo que se gana en
eficiencia.

13. Interrupciones y excepciones.


Durante el transcurso ordinario de la ejecución de procesos pueden darse dos situaciones especiales:

• Interrupción. Se produce cuando se quiere que la CPU deje de ejecutar el proceso en curso
y pase a realizar otra función de quien hace la interrupción. Cuando la CPU realiza esa

11
función se dice que está atendiendo la interrupción. Las interrupciones pueden darse a dos
niveles:
◦ Nivel de software: El usuario realiza una llamada al sistema (para hacer uso de un
recurso del núcleo).
◦ Nivel de hardware: Un dispositivo (hardware) requiere la atención de la CPU para
ejecutar su driver.
Cuando se produce una interrupción se pasa el control al sistema operativo, quien salva el contexto
del proceso que se estaba ejecutando y se analiza la interrupción. Las interrupciones están
catalogadas y el sistema operativo dispone de rutinas especiales para manipular cada tipo de
interrupción. Una vez se ha atendido la interrupción la CPU continúa con su anterior tarea.

• Excepción. La excepción es un tipo de interrupción provocada por la propia CPU a causa de


un error en la ejecución del proceso en activo como puede ser la realización de operaciones
no permitidas, códigos de operación mal expresados, direcciones de memoria fuera de
rango, etc.

14. Demonios
Existe un tipo muy particular de proceso que recibe el nombre de demonio. Un demonio es un
proceso que se ejecuta en segundo plano sin necesidad alguna de interacción con el usuario.

En los sistemas Windows los demonios son denominados servicios, pues su finalidad es ofrecer un
servicio al usuario.

Los demonios no disponen de interfaz, ni gráfica ni textual, ya que no necesitan comunicarse con el
usuario. Tampoco hacen uso de los dispositivos de E/S comunes para notificar resultados o errores.
En su lugar, vuelcan toda esta información en un archivo LOG o la comunican a otros demonios
encargados de recopilar este tipo de datos.

Los demonios pueden iniciarse, detenerse y reiniciarse.

15. Gestión de procesos en Windows.


La gran parte de las operaciones de gestión de procesos en Windows se hace desde el
Administrador de tareas. Esta herramienta es accesible desde la combinación de teclas:
• Pulsando la combinación de teclas CTRL+ALT+SUPR y seleccionando “Administrador de
tareas”.
• Pulsando la combinación de teclas CTRL+MAYUS+ESC.
• Desde la ventana “Ejecutar…” (WIN+R) escribiendo taskmgr.exe y pulsando “Ejecutar”.
Botón derecho sobre la barra de tareas o el botón de “Inicio”, opción “Administrador de
tareas”.

A través de la pestaña Procesos podemos gestionar los procesos que están activos en el sistema.
Por defecto sólo se muestran los procesos iniciados por el usuario pero podemos visualizar todos
activando la opción "Mostrar procesos de todos los usuarios".

Para incluir o modificar las columnas de datos de cada proceso iremos a Ver > Seleccionar
columnas y escogeremos los campos que nos convengan.

12
Para cada proceso podemos realizar, entre otras, las siguientes acciones (haciendo clic derecho
sobre él):

• Terminar el proceso: pasa el proceso a estado terminado.


• Finalizar el árbol de procesos: pasa a estado terminado el proceso y todos los procesos
relacionados con él.
• Establecer su prioridad: permite cambiar la prioridad del proceso, existiendo varios niveles a
elegir.
• Establecer afinidad: da la opción de asociar el proceso a una CPU (en el caso de equipos con
varias CPUs).
• Ir al servicio: nos lleva a la pestaña Servicios y resalta aquellos que están asociados a este
proceso.

13
Mediante la pestaña Servicios podemos administrar los servicios del sistema. En el listado
aparecen todos los servicios, tanto si están en activo como si no. No es posible cambiar la
información que se muestra sobre el servicio, como sucedía con los procesos. Sobre cada servicio se
pueden realizar estas acciones (clic derecho sobre él):

• Iniciar el servicio: pasa el servicio a estado "En ejecución".


• Detener el servicio: pasa el servicio a estado "Detenido".
• Ir al proceso: nos lleva a la pestaña Procesos y resalta aquel al que está asociado.

I. Gestión de procesos en Windows Powershell

Es frecuente que, la mayoría de los usuarios de Windows, utilicen exclusivamente su interfaz


gráfica. Algunos, ni siquiera saben que hay otra alternativa… Y Windows no tiene una, sino dos: La

14
línea de comandos clásica (CMD.EXE) y otra, más avanzada, que ofrece Microsoft de forma
gratuita desde 2006 y que en la actualidad se incluye de forma predeterminada en todos sus sistemas
operativos: PowerShell.

(a) Consultar procesos


Para obtener la lista con todos los procesos que se están ejecutando en ese momento en el equipo,
basta con utilizar el cmdlet Get-Process sin argumentos:

Get-Process

Si la salida es demasiado larga y no cabe en la ventana, puedes ir mostrando poco a poco con el
comando more:
Get-Process | more

Si necesitamos sólo algunos de los procesos, podemos establecer un filtro. Por ejemplo, por su
nombre:
Get-Process -Name fi*

Para incluir el nombre del usuario en la salida, modificaremos el comando anterior:

Get-Process -Name fi* -IncludeUserName

Si necesitamos información detallada sobre un proceso, o un grupo de procesos, podemos enviar la


salida de Get-Process a Format-List, que se encarga de formatear la salida de las propiedades de un
objeto de modo que cada una aparezca en una nueva línea.

En nuestro caso, si queremos ver todas las propiedades del proceso explorer, escribiremos algo
como esto:
Get-Process -Name explorer | Format-List *

Si queremos personalizar los atributos a mostrar en formato tabla, podemos escribir:


Get-Process -Name explorer | Format-Table Id,ProcessName,PriorityClass

Para ordenar los procesos por un determinado campo, podemos utilizar:


Get-Process | Sort-Object -Property Id

En el caso de querer obtener el número de procesos, ejecutaremos:


Get-Process | Measure-Object

Para aplicar condiciones más complejas, por ejemplo obtener los procesos con Id mayor a 500.
Get-Process | Where-Object {$_.Id -gt 500}

(b) Detener un proceso


Cuando necesitamos forzar la detención de un proceso que está ejecutándose, podemos recurrir al
cmdlet Stop-Process. Por ejemplo, podríamos escribir la siguiente orden para detener el navegador:

Stop-Process -name firefox*

15
Esto detendrá todos los procesos cuyo nombre comience por el texto firefox.

Otra forma sería utilizar el argumento -id y el número de proceso. Por ejemplo, si el Bloc de notas
se está ejecutando con el ID 6928, para detenerlo:

Stop-Process -id 6928

Incluso podemos hacer que el cmdlet nos pida confirmación antes de parar el proceso. Para ello,
basta con utilizar el argumento -Confirm:

Stop-Process -name Calculator -Confirm


Stop-Process -Id 3952 -Confirm -PassThru

Debemos tener en cuenta que para detener algunos procesos deberemos tener permisos
administrativos.

Podemos almacenar el proceso en una variable y después la utilizaremos para detenerlo:

$p = Get-Process -Name "calc"


Stop-Process -InputObject $p

También podemos encadenar la salida de Get-Process con la entrada de Stop-Process:


Get-Process -Name “calc” | Stop-Process

(c) Iniciar un nuevo proceso


Para iniciar uno o mas procesos, podemos utilizar el cmdlet Start-Process incluyendo a continuación
el nombre de un programa o de un script. Incluso podemos indicar un archivo que se encuentre
asociado a un determinado programa del sistema.

De este modo, podríamos ejecutar el Bloc de notas escribiendo una orden como esta:

Start-Process notepad.exe
Start-Process -Filepath win32calc -WindowStyle Maximized

Como es lógico, si el ejecutable no se encuentra en la ruta predeterminada del sistema, deberemos


incluir también su ruta absoluta.

Para el caso de los servicios, PowerShell nos proporciona los siguientes cmdlets:
Get-Service
Stop-Service
Start-Service
Suspend-Service

16. Gestión de procesos en Linux


Linux no hace una distinción tan clara como Windows entre procesos y demonios. De hecho, la
gestión de procesos y la de demonios sigue las mismas directrices.

16
Antes de abordar la gestión de los procesos en sistemas Linux conviene tratar un concepto bastante
interesante: El plano de un proceso. Cuando el usuario está interactuando con un proceso, se dice
que este proceso está en primer plano. Cuando el proceso se ejecuta "en silencio", sin necesidad de
que el usuario interactúe con él se dice que el proceso está en segundo plano. Un ejemplo típico de
procesos en segundo plano son los demonios.

Sólo un proceso puede estar en primer plano en un momento dado. Por el contrario, en segundo
Por otro lado, un proceso puede pasarse de primer plano a segundo plano, y viceversa, cuantas
veces se desee.

I. Linux. Gestión de procesos por interfaz gráfico


Linux proporciona una herramienta similar al Administrador del sistema de Windows llamada
Monitor del sistema.

La pestaña Procesos muestra todos los procesos (incluidos los demonios) que están asociados al
usuario. A través de la opción Ver del Monitor del sistema podemos seleccionar otro criterio de
visualización, pudiendo mostrar todos los procesos del sistema o solamente aquellos que están en
estado activo.

Para cada proceso, se pueden aplicar una serie de operaciones de entre las que destacamos estas:

• Detener el proceso: pasa el proceso a estado suspendido.


• Continuar el proceso: reanuda un proceso que estaba detenido.
• Finalizar el proceso: pasa el proceso a estado terminado.
• Matar el proceso: pasa el proceso a estado terminado de forma inmediata.
• Cambiar la prioridad: permite variar la prioridad del proceso siendo 0 la prioridad normal
y pudiendo oscilar entre los valores -20 (máxima prioridad) y 19 (mínima prioridad).

En la opción Ver también podemos activar la funcionalidad Dependencias. Al hacerlo, en el listado


también se muestran los procesos hijo. Aquellos procesos que tienen procesos hijo asociados
aparecen con un triángulo a su izquierda sobre el que se puede pinchar para mostrarlos/ocultarlos.
Sobre los procesos hijo se pueden realizar las mismas operaciones que sobre los procesos padre.

II. Linux. Gestión de procesos por línea de comandos.


Las principales acciones que pueden realizarse sobre procesos desde la línea de comandos son estas:

(a) Comando ps
El comando ps (abreviatura de Process Status) muestra un listado con el estado de los procesos.
Lee la información de los archivos que se encuentran en /proc. Tiene una gran cantidad de opciones
(man ps o ps –help).

Esta orden admite opciones de las versiones ps propias de System V (precedidas por un guión), de
BSD (sin guiones) y de GNU (precedidas por dos guiones).

• Salida estándar de ps. Muestra todos los procesos lanzados por el usuario en la consola
actual.
#ps

17
PID TTY TIME CMD
22473 pts/0 00:00:00 find
25510 pts/0 00:00:00 ps
31026 pts/0 00:00:00 bash

• Ver todos los procesos del sistema (en formato completo)


#ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Apr05 ? 00:00:28 /sbin/init showopts
root 2 0 0 Apr05 ? 00:00:00 [kthreadd]
root 3 2 0 Apr05 ? 00:00:57 [ksoftirqd/0]
root 5 2 0 Apr05 ? 00:00:00 [kworker/0:0H]
root 7 2 0 Apr05 ? 00:00:00 [migration/0]
root 8 2 0 Apr05 ? 00:00:00 [rcuc/0]

• Mostrar los procesos en estilo BSD


#ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 21397 0.0 6.6 1025260 132240 ? Sl Apr20 2:43 /usr/lib64/firefox/firefox
root 21427 0.0 0.2 261396 4028 ? Sl Apr20 0:00 /usr/lib/at-spi2/at-spi-bus-launcher
root 21434 0.0 0.4 292912 9100 ? Sl Apr20 0:00 /usr/lib/mozilla/kmozillahelper

• Visualizar procesos con sus respectivos threads (hilos)


#ps -eLf
UID PID PPID LWP C NLWP STIME TTY TIME CMD
root 21397 7027 21397 0 33 Apr20 ? 00:01:37 /usr/lib64/firefox/firefox
root 21397 7027 21409 0 33 Apr20 ? 00:00:00 /usr/lib64/firefox/firefox
root 21397 7027 21410 0 33 Apr20 ? 00:00:00 /usr/lib64/firefox/firefox
root 21397 7027 21413 0 33 Apr20 ? 00:00:00 /usr/lib64/firefox/fire

• Personalizar los atributos a mostrar de los procesos.


#ps axo user,stat,pid,pcpu,comm
USER STAT PID %CPU COMMAND
root Ss 1 0.0 systemd
root S 2 0.0 kthreadd
root S 3 0.0 ksoftirqd/0
root S< 5 0.0 kworker/0:0H
root S 7 0.0 migration/0
root S 8 0.0 rcuc/0
root S 9 0.0 rcub/0

Otras opciones de ps:


• ps -o campo1,campo2,… Mostrar procesos en formato definido por el usuario.
• ps -p PID: Seleccionar procesos por un determinado PID.
• ps -u usuario: Seleccionar procesos de un determinado usuario.
• ps -f: Mostrar procesos con información detallada.
• ps -F: Mostrar procesos con información detallada y extendida.
• ps axjf: Mostrar un árbol jerárquico con la ruta del programa al que pertenece el proceso.
• ps -t 3: Mostrar los procesos asociados a la terminal 3 ps t3

18

Las opciones que podemos aplicar a ps no van más allá de mostrar la información de una u otra
forma, más o menos extensa, o como ya sabemos, filtrar los resultados con grep. Sea cual sea el
método de muestra que elijamos, siempre habrá dos constantes, el PID y el comando o nombre del
programa. Aquí un ejemplo de filtrado sobre ps para obtener únicamente los procesos pertenecientes
a bash.

ps aux | grep bash

SALIDA COMANDO PS
En las columnas que devuelve ps podemos encontrar:
Columnas salida PS
PID Process ID, número único o de identificación del proceso.
PPID Parent Process ID, padre del proceso
UID User ID, usuario propietario del proceso
TTY Terminal asociada al proceso, si no hay terminal aparece entonces un '?'
TIME Tiempo de uso de cpu acumulado por el proceso
CMD El nombre del programa o comando que inició el proceso
RSS Resident Size, tamaño de la parte residente en memoria en kilobytes
SIZE Tamaño virtual de la imagen del proceso
NI Nice, valor nice (prioridad) del proceso, un número positivo significa menos tiempo
de procesador y negativo más tiempo (-19 a 19)
PCPU Porcentaje de CPU utilizado por el proceso
STIME Starting Time, hora de inicio del proceso
STAT Status del proceso (ver siguiente tabla)

Estados de un proceso
R Runnable, en ejecución.
S Sleeping, proceso en ejecución pero sin actividad por el momento, o esperando por
algún evento para continuar (durmiendo por menos de 20 segundos).
T sTopped, proceso detenido totalmente, pero puede ser reiniciado
Z Zombie, difunto, proceso que por alguna razón no terminó de manera correcta, no debe
haber procesos zombies
D uninterruptible sleep, son procesos generalmente asociados a acciones de IO del sistema
X dead, muerto, proceso terminado pero que sigue apareciendo, igual que los Z no
deberían verse nunca
I Idle (proceso durmiendo durante más de 20 segundos)

(b) Comando pstree


El comando pstree es una variante de ps en la que los procesos se muestran en forma de árbol.
• Salida estándar de pstree (igual que pstree –G)
•  Mostrar ramas del árbol de procesos correspondientes a un usuario. (pstree usuario)

19
(c) Comando top
Top es otro gestor de procesos integrado en la mayoría de sistemas Linux. Mientras que ps nos
muestra un listado de procesos estático, es decir, nos informa de los procesos, nombres, usuarios o
recursos que se están usando en el momento de la petición; top nos da un informe en tiempo real de
los mismos.

Las primeras cinco filas muestran la siguiente información:


• Fila 1: Hora actual, tiempo que ha estado el sistema encendido, Número de usuarios, Carga
media en intervalos de 5, 10 y 15 minutos respectivamente.
• Fila 2: La segunda línea muestra el total de tareas y procesos, los cuales pueden estar en
diferentes estados.
• Fila 3. Esta línea nos muestra los porcentajes de uso del procesador diferenciado por usos.
◦ us (usuario): tiempo de CPU de usuario.
◦ sy (sistema): tiempo de CPU del kernel.
◦ id (inactivo): tiempo de CPU en procesos inactivos.
◦ wa (en espera): tiempo de CPU en procesos en espera.
◦ hi (interrupciones de hardware): interrupciones de hardware.
◦ si (interrupciones de software): tiempo de CPU en interrupciones de software.
• Fila 4. Cantidad de memoria total en el sistema, la que está siendo utilizada, la que queda
libre y la utilizada para buffers.
• Fila 5. Tamaño de la memoria de intercambio swap, la que está siendo utilizada, la que
queda libre y memoria en caché.
• Resto de filas: Muestran información sobre los procesos.
Los comandos que se pueden ejecutar directamente sobre esta pantalla son:
• q: Sale de top.
• s: Determina el retardo, en segundos, entre cada actualización de la pantalla. Por defecto se
encuentra establecido en 3 segundos.

20
• f: permite determinar las columnas que se van a mostrar de cada proceso. Los campos a
mostrar están marcados con un *.
• o: permite ordenar los procesos por una determinada columna.

(d) Comando kill


El comando kill permite enviar señales a los procesos para cambiar su estado.

Enviar una señal a un proceso utilizando el nombre de la señal.


kill -nombreseñal PID

Enviar una señal a un proceso utilizando el número de la señal


kill –numeroseñal PID

Si no se define una señal, por defecto se envía la señal 15 (SIGTERM), que corresponde con la
solicitud de terminación del proceso.

Con el comando siguiente podemos ver la lista de todas las señales que podemos enviar a un
proceso.
kill -l

Se puede hacer referencia a la señal a través de su nombre o de su número identificador. Las


principales señales que se utilizan son estas:

1: SIGHUP - Hang up. 2: SIGINT - Interrumpir el 3: SIGQUIT - Salir del proceso.


proceso. ([Ctrl]+[\])
9: SIGKILL - Terminar el 15: SIGTERM - Terminar el 18: SIGCONT - Continuar la
proceso (forzado). proceso (solicitado) ejecución.
19: SIGSTOP - Detener el 20: SIGSTP - Como SIGSTOP.
proceso. ([Ctrl]+[C]) ([Ctrl]+[Z])

En el caso de encontrarnos ante un proceso que “no quiere cerrarse” por la vía diplomática que le
ofrecemos con TERM, pasaremos a eliminar dicho proceso por la fuerza ejecutando el comando kill
con el siguiente argumento:

kill –KILL PID


kill -9 PID

El comando kill además de para finalizar procesos, también podemos usarlo para reiniciar ciertos
servicios. Uno de los que más necesita reiniciarse suele ser Apache. La mayoría de ellos responde al
argumento ‘HUP’ (Hang up) de kill. Mediante el siguiente comando, el servicio perteneciente a
Apache, se reiniciará y volverá a cargar el fichero de configuración, permitiéndonos ver si los
cambios han surtido efecto y volviendo a dar servicio a los usuarios.

kill –HUP PID_Apache


(e) Comando pkill
Si conocemos el nombre exacto del proceso también podemos usarlo en el lugar en el que
usaríamos el PID. Para esto usaremos ‘pkill’ en lugar de kill, que funciona exactamente igual, pero

21
preparado para trabajar con nombres de proceso en lugar de con PID. Es decir estos dos comandos
harán exactamente lo mismo:
kill -9 3484
pkill -9 gedit

(f) Comando killall


' killall ' es una variante del comando kill con el que enviaremos la misma señal a todos los procesos
pertenecientes a un programa. Por ejemplo:
killall firefox

(g) Comando nice


El comando nice se emplea para cambiar la prioridad de un proceso cuando se inicia su ejecución.
Por defecto el valor de la prioridad es 0. Sólo los usuarios root tienen privilegios para asignar
prioridades negativas.
nice –n prioridad proceso

El comando renice permite cambiar la prioridad de un proceso sin necesidad de detenerlo.


renice prioridad PID

(h) Comando jobs


El comando jobs se utiliza para mostrar el estado de los trabajos activos. Un trabajo en Linux es un
comando que se ha ejecutado desde de la terminal y aún no ha finalizado. En otras palabras un
trabajo es un proceso que depende y está gestionado por la terminal.

Interpretación de las líneas de salida:


[x]Número de trabajo
+, -+ es proceso en primer plano y – es proceso en segundo plano
EstadoEjecutando, Detenido
ProcesoNombre del proceso

(i) Cancelar y suspender un trabajo que corre en primer plano


Si queremos cancelar o suspender el trabajo que está en ejecución lo podemos hacer del siguiente
modo.
• Para cancelar el trabajo tan solo tenemos que presionar la combinación de teclas Ctrl+C
$ sleep 1000
^C

• Para suspender el trabajo, con el fin de poderlo reanudar más tarde, tendremos que
presionar la combinación de teclas Ctrl+Z
$ sleep 1000
^Z
[1]+ Detenido sleep 1000

22
(j) Operador &
El operador & se utiliza para pasar un proceso a segundo plano.
gedit &
(k) Comando nohup
El comando nohup se usa para pasar un proceso a segundo plano haciéndolo inmune a los hangup
(cuelgues). De una forma simple, se evita que el proceso se cuelgue cuando se cierra la consola.
nohup proceso

(l) Comandos fg y bg
Cuando un proceso está detenido, se pueden utilizar los comandos fg (foreground) y bg
(background) para lanzarlo en primer plano o en segundo plano, respectivamente.

En lugar de utilizar el PID se hace uso del número del trabajo, que es visible ejecutando el comando
jobs.

Pasar un proceso a segundo plano. (bg %numerotrabajo)

Pasar un proceso a primer plano . (fg %numerotrabajo)

17. Inicio del sistema. Niveles de ejecución.


La puesta en marcha del sistema operativo es una secuencia de operaciones que se varía de unos
sistemas operativos a otros. Todos tienen en común la ejecución de una serie de procesos que
constituirán la base del sistema. Estos procesos posteriormente residirán en memoria y generarán
nuevos subprocesos para ofrecer otras funcionalidades.

De entre todos los sistemas operativos disponibles, vamos a estudiar cómo es el proceso de inicio
para sistemas Windows y para sistemas Linux.

Es conveniente resaltar que el proceso de inicio del sistema operativo, incluso tratándose del mismo
tipo de sistema operativo, puede variar de unas versiones a otras e incluso es dependiente del tipo de
procesador para el que se instala (x86 o x64).

I. Inicio del sistema en Windows.


La secuencia de inicio se produce primordialmente en segundo plano, constando de cinco fases:

• Secuencia previa al inicio.


Comienza cuando se enciende el equipo, antes de que se inicie el sistema operativo, y en ella tiene
lugar el POST y el paso a la carga y ejecución del MBR.

• Secuencia de inicio.
Se ejecuta el gestor de arranque (BOOTMGR) y se seleccionará el sistema operativo para iniciar.
Posteriormente se hará una detección del hardware instalado.

• Secuencia de carga del núcleo.

23
Se invoca al archivo WINLOAD.EXE para que cargue el archivo NTOSKRNL.EXE, que está
considerado como el núcleo del sistema operativo. También se carga el archivo HAL.DLL, capa
intermedia entre el núcleo de Windows y el hardware.
Tras la carga de HAL se realiza la carga de la clave del registro HKEY_LOCAL_MACHIME\
SYSTEM. El contenedor SELECT determina qué controlador debe cargar y el contenedor
CONTROLSET proporciona los datos de configuración utilizados para controlar el sistema
(controladores, servicios,…).

• Secuencia de inicio del núcleo.


Coincide con la aparición del logotipo de Windows. Realmente, durante este tiempo se llevan a
cabo varias tareas entre las que destacamos la creación de la clave HARDWARE en el registro con
los datos recogidos en la fase de detección de hardware y la inicialización de los servicios y de los
controladores de dispositivos.

Esta secuencia finaliza con la inicialización del subsistemas y servicios de orden superior y el
lanzamiento del subsistema Win32 (en sistemas x64 el subsistema es WoW), encargado de habilitar,
entre otros, el interfaz de usuario, que comienza con el proceso WINLOGON.

• Secuencia de inicio de sesión.


WINLOGON inicia la autoridad de seguridad local (LSASS.EXE), momento en el que aparece la
pantalla de identificación de usuario (según esté configurada).

II. Inicio del sistema en Linux. Niveles de ejecución.

La secuencia de inicio en sistemas Linux sigue un esquema muy similar al explicado para
Windows:

• Secuencia previa al inicio.


Comienza cuando se enciende el equipo, antes de que se inicie el sistema operativo, y en ella tiene
lugar el POST y el paso a la carga y ejecución del MBR.

• Secuencia de inicio.
Se ejecuta el gestor de arranque (GRUB...) y se seleccionará el sistema operativo para iniciar.
Posteriormente se hará una detección del hardware instalado.

• Secuencia de carga del núcleo.


El gestor de arranque se encargará, al final de su ejecución, de cargar el kernel en memoria.

• Secuencia de inicio del núcleo.


Se comienza la ejecución del kernel descomprimiéndose a sí mismo. Tras esta operación se realizan
operaciones básicas como pueden ser la detección de la CPU y otros dispositivos, la inicialización
del sistema gestor de memoria, el montaje del sistema de archivos,… Como última operación de
esta fase se llama al proceso padre init (con UID 0).

• Secuencia de inicio de sesión.


A partir de ahora todas las operaciones dependerán del proceso init. Este proceso lanza los procesos
contenidos en el fichero /etc/inittab, que contiene las instrucciones para crear lo que se denominan
las getty (entradas que especifican la forma en que un usuario debe loguearse). Al menos debe
existir una getty que se encargue de preguntar por el usuario y lance el proceso /bin/login.

24
Posteriormente se ejecuta el comando /etc/rc.sysinit para realizar un inicio básico del sistema,
ejecutando los procesos asociados al nivel de ejecución establecido.

El nivel de ejecución (runlevel), determina qué grupo de procesos se van a ejecutar cuando se inicie
el sistema en ese nivel.

Existen varias convenciones en cuanto al número de runlevels, siendo lo más frecuente asumir que
existen 7, de los que el 0, el 1 y el 6 están reservados. El resto de niveles pueden personalizarse.

Si el usuario no especifica un nivel de runlevel, se cargará el sistema empleando el runlevel por


defecto.

En las distribuciones de Linux que no disponen de systemctl, el archivo /etc/inittab se usa para
establecer el valor por defecto de run level del sistema. Este será el valor con el que el sistema
iniciará. Las aplicaciones que son iniciadas por el proceso init se encuentran en /etc/rc.d
En este directorio encontramos una carpeta para cada run level rc0.d, rc1.d, etc.
Los 7 niveles de ejecución (runlevels) estándar
Nivel de Nombre o
Descripción
ejecución denominación
0 Halt Cierre del sistema (Apagado).
No configura la interfaz de red o los demonios de inicio, ni
Modo de usuario
permite que ingresen otros usuarios que no sean el usuario root,
1 único
sin contraseña. Este nivel de ejecución permite reparar
(Monousuario)
problemas, o hacer pruebas en el sistema.
2 Multiusuario Multiusuario sin soporte de red.
Multiusuario con
3 Inicia el sistema normalmente.
soporte de red.
4 No definido Personalizable por el usuario.
Multiusuario gráfico
5 Similar al nivel de ejecución 3 + GUI.
(X11)
6 Reinicio Se reinicia el sistema.

La mayoría de servidores Linux no disponen de interfaz gráfica, por tanto inician con runlevel 3.
Los sistemas con interfaz gráfica inician con runlevel 5.

En el caso de las distribuciones que implementan systemctl, los runlevel reciben el nombre de
targets. En estos sistemas, el cambio de target se realiza de la siguiente forma:

systemctl get-default → Para obtener el target por defecto asignado

systemctl set-default runlevel5.target → Para asignar el target por defecto al valor 5


systemctl set-default graphical.target → Para asignar el target por defecto al valor 5

systemctl set-default runlevel3.target → Para asignar el target por defecto al valor 3


systemctl set-default multi-user.target → Para asignar el target por defecto al valor 3

25

También podría gustarte