Els processos dins un sistema operatiu

El nostre ordinador fa moltes tasques alhora sense que ho sapiguem, però realment sabem com ho fa? En aquest post és el que explorarem, des de què és un procès fins per on pot passar abans d’acabar.

Un procès és una instància d’un programa que està en execució. Per això primer reculem una mica. Un programa s’escriu en llenguatge d’alt nivell i desprès es compila, convertint-lo a binari. Per tant, un procès és un programa (binari) en execució. Diem que és una instància perquè podem tenir varis processos basats en el mateix programa. A més, a un procès se li assignen recursos perquè es pugui executar.

A més, un procès té almenys un fil o thread, que és al seva unitat mínima d’execució. Els threads que estan dins el mateix procès comparteixen el mateix espai de memòria, amb el que es poden comunicar.

En un ordinador només es pot executar un procès alhora per cada nucli, però avui dia tenim molts processos per executar.

Hi ha dos tipus principals de sistemes multitasca: preemptive multitasking i cooperative multitasking.

En el model preemptive multitasking el sistema operatiu és qui controla quins processos s’executen, mentre que en el model cooperative multitasking són els propis processos els que controlen el temps que utilitzen la CPU.

En aquest post ens centrarem en el primer, ja que és el més comú. En aquest tipus de sistemes, el sistema operatiu (concretament l’scheduler) dona temps de CPU a cada procès (time sharing), alternant-los i donant una sensació de multitasca real a l’usuari.

El preemptive multitasking també evita l’starving, és a dir, evita que processos no rebin mai recursos perquè aquests estiguin sempre ocupats.

A més, el model de preemptive multitasking permet que si entra un procès més prioritari, el sistema pugui interrompre el que estigui en execució i córrer aquest procès inmediatament.

L’scheduler pot estar basat en diferents algorismes, segons el que interessi a l’usuari del sistema operatiu, i operarà basat en això.

Els estats que pot tenir un procès són:

  • NEW

    El procès es crea. Això comporta donar-li un PID (Process ID), assignar-li recursos i inicialitzar el PCB del procès.

  • READY

    El procès està llest per executar-se i es troba a la cua esperant a que l’scheduler li assigni la CPU.

  • RUNNING

    El procès està en execució, és a dir, el procès utilitza la CPU per executar les seves instruccions.

  • WAITING

    El procès està en espera d’un event (com de l’entrada de dades via E/S o d’algun senyal), pel que no executa res (està bloquejat).

  • TERMINATED

    El procès ha acabat la seva execució. Pot ser perquè ja ha acabat les seves tasques, perquè ha rebut un senyal d’acabar o per algun error. En qualsevol cas, el nucli del sistema allibera els recursos que tenia aquest procès i n’elimina el seu PCB.

Llavors el cicle de vida d’un procès seria així:

On primer es crea (NEW). Un cop creat, està llest per executar (READY), quan l’scheduler decideix l’executa (RUNNING) i aquí pot prendre diversos camins:

  • Pot continuar la seva execució normal i finalitzar la execució, arribant a l’estat TERMINATED.

  • Pot ser interromput per un procès més prioritari, pel que tornaria a l’estat de READY esperant que aquest procès acabi i tornar a executar-se.

  • Pot dependre d’un event per seguir la seva execució (com per exemple una entrada de dades per teclat), on quedaria WAITING per aquesta entrada fins que se li donés, quan tornaria a l’estat de READY.

Cada procès està representat al sistema per un PCB, que conté informació com:

  • Número de procès (PID)

  • Estat del procès

  • Comptador del programa (Program Counter, PC)

  • Registres de CPU

Això permet que si un procès és interromput, quan torni a executar-se pugui restaurar el seu estat anterior i seguir les seves instruccions des d’on s’hagi quedat.

Quan un procès és interromput, parlem d’un context switch. Això comporta:

  • Guardar l’estat del procès actual (a la PCB, com s’ha explicat).

  • Restaurar un altre procès.

Durant el temps que dura el context switch el processador no executa més processos.

A més aquest procès és costós, pel que els sistemes intenten optimitzar-lo.

Els processos que s’executen alhora al sistema poden ser independents o cooperatius:

  • Independents

    No afecten ni són afectats per altres processos en execució.

  • Cooperatius

    Poden afectar i ser afectats per altres processos en execució.

Per tant, els processos que comparteixen dades amb altres són processos cooperatius.

Els processos cooperatius necessiten un mecanisme de comunicació entre processos (Inter-Process Communication, IPC), que té diferents models. Alguns dels principals són:

  • Shared memory

    S’estableix una regió de memòria on els processos podran escriure-hi i llegir-hi informació.

  • Message passing

    La comunicació es produeix intercanviant missatges entre processos (el procès envia un missatge al kernel i el kernel el reenvia al procès destí).

  • Sockets de xarxa

    Els sockets són endpoints per la comunicació, sobretot utilitzats en esquemes client-servidor. Un socket s’identifica amb IP i port.

  • REMOTE Procedure Calls (RPC)

    L’RPC és un mètode molt útil quan volem comunicar processos que es troben en altres equips de la mateixa xarxa. Bàsicament és una mena d’abstracció que “amaga” al procès emissor si el receptor és local o remot.

Per últim, mencionaré algunes utilitats per poder monitorejar i gestionar processos, com són:

  • ps o top a Linux.

  • Administrador de tasques a Windows.

  • Monitor d’activitat a macOS

I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!