Un proceso es la unidad básica de asignación de recursos y planificación en un sistema operativo. Representa la ejecución de un programa, siendo una entidad activa ("viva"), a diferencia del programa que es simplemente código almacenado en disco ("muerto").
Algoritmos de planificación de procesos
- FIFO (First In First Out): Beneficia processo largos, perjudica cortos
- SJF (Shortest Job First): Favorece procesos cortos, desfavorece largos
- Round Robin con colas multinivel: Divide el tiempo en segmentos con prioridades, permitiendo equilibrio
Estados de un proceso
Los procesos transitan entre tres estados principales: listo, en ejecución y bloqueado.
Creación de procesos en Python
Método básico usando Process
from multiprocessing import Process
import time
def tarea_secundaria(nombre):
print(f'Proceso secundario {nombre} iniciado')
time.sleep(2)
print(f'Proceso {nombre} finalizado')
if __name__ == '__main__':
proc = Process(target=tarea_secundaria, args=('proceso1',))
proc.start()
print('Proceso principal continuando')
Método orientado a objetos
from multiprocessing import Process
class MiProceso(Process):
def run(self):
print('Proceso personalizado ejecutándose')
# Lógica del proceso
if __name__ == '__main__':
mp = MiProceso()
mp.start()
Comunicación entre procesos
Los procesos no comparten memoria, requiriendo mecanismos especiales para comunicación:
Uso de colas (Queue)
from multiprocessing import Queue
cola = Queue(maxsize=3)
cola.put('mensaje1')
print(cola.get()) # Recupera 'mensaje1'
Modelo productor-consumidor
from multiprocessing import Process, Queue
import random
def productor(cola):
for i in range(5):
item = f'producto_{i}'
cola.put(item)
def consumidor(cola):
while True:
item = cola.get()
print(f'Consumiendo {item}')
if __name__ == '__main__':
q = Queue()
p = Process(target=productor, args=(q,))
c = Process(target=consumidor, args=(q,))
p.start()
c.start()
Sincronización con Lock
from multiprocessing import Process, Lock
def tarea_con_recurso(lock, recurso):
lock.acquire()
try:
# Sección crítica
recurso.value += 1
finally:
lock.release()
Procesos especiales
- Procesos zombis: Procesos terminados que conservan identificador
- Procesos huérfanos: Procesos cuyo padre terminó antes
- Procesos demonio: Terminan cuando el proceso principal finaliza