Sistemes operatius: tres peces fàcils. Part 2: Abstracció: procés (traducció)

Introducció als sistemes operatius

Hola Habr! M'agradaria cridar la vostra atenció una sèrie d'articles-traduccions d'una literatura interessant al meu entendre: OSTEP. Aquest material tracta bastant profundament el treball dels sistemes operatius semblants a Unix, és a dir, el treball amb processos, diversos programadors, memòria i altres components similars que conformen un sistema operatiu modern. Podeu veure l'original de tots els materials aquí aquí. Si us plau, tingueu en compte que la traducció es va fer de manera poc professional (molt lliure), però espero haver conservat el sentit general.

Els treballs de laboratori sobre aquest tema es poden trobar aquí:

Altres parts:

També pots consultar el meu canal a telegrama =)

Vegem l'abstracció més fonamental que el sistema operatiu proporciona als usuaris: el procés. La definició del procés és bastant simple: ho és programa en execució. El programa en si és una cosa sense vida situada al disc: és un conjunt d'instruccions i possiblement algunes dades estàtiques a l'espera de ser llançades. És el sistema operatiu que pren aquests bytes i els executa, transformant el programa en alguna cosa útil.
Molt sovint, els usuaris volen executar més d'un programa alhora, per exemple, podeu executar un navegador, un joc, un reproductor multimèdia, un editor de text i similars al vostre ordinador portàtil. De fet, un sistema típic pot executar desenes o centenars de processos simultàniament. Aquest fet fa que el sistema sigui més fàcil d'utilitzar, mai us haureu de preocupar de si la CPU és lliure, només heu d'executar programes.

Això planteja el problema: com proporcionar la il·lusió de moltes CPU? Com pot el sistema operatiu crear la il·lusió d'un nombre gairebé infinit de CPU, encara que només tingueu una CPU física?

El sistema operatiu crea aquesta il·lusió mitjançant la virtualització de la CPU. En iniciar un procés, després aturar-lo, iniciar un altre procés, etc., el sistema operatiu pot mantenir la il·lusió que hi ha moltes CPU virtuals, quan en realitat hi haurà un o més processadors físics. Aquesta tècnica s'anomena divisió dels recursos de la CPU per temps. Aquesta tècnica permet als usuaris executar tants processos concurrents com vulguin. El cost d'aquesta solució és el rendiment, ja que si la CPU és compartida per diversos processos, cada procés es processarà més lentament.
Per implementar la virtualització de la CPU, i sobretot per fer-ho bé, el sistema operatiu necessita suport tant de baix nivell com d'alt nivell. Es diu suport de baix nivell mecanismes són mètodes o protocols de baix nivell que implementen la part requerida de la funcionalitat. Un exemple d'aquesta funcionalitat és el canvi de context, que dóna al sistema operatiu la possibilitat d'aturar un programa i executar un altre programa al processador. Aquesta divisió de temps s'implementa en tots els sistemes operatius moderns.
A més d'aquests mecanismes hi ha una mica de lògica integrada al sistema operatiu, en forma de "polítiques". Política és un determinat algorisme de presa de decisions per al sistema operatiu. Aquestes polítiques, per exemple, decideixen quin programa s'ha de llançar primer (a partir d'una llista d'ordres). Així, per exemple, aquest problema es resoldrà mitjançant una política anomenada planificador (política de programació) i a l'hora d'escollir una solució, es guiarà per dades com ara: historial d'inici (quin programa s'ha llançat més llarg en els últims minuts), quina càrrega porta aquest procés (quins tipus de programes s'han llançat), mètriques de rendiment (si el sistema està optimitzat per a la interacció interactiva o per al rendiment) i així successivament.

Abstracció: procés

L'abstracció d'un programa en execució executat pel sistema operatiu és el que anomenem procés. Com s'ha esmentat anteriorment, un procés és simplement un programa en execució, en qualsevol període de temps instantani. Un programa amb el qual podem obtenir informació resumida de diversos recursos del sistema als quals accedeix o afecta aquest programa durant la seva execució.
Per entendre els components del procés, cal entendre els estats del sistema: què pot llegir o canviar el programa durant el seu funcionament. En qualsevol moment, cal entendre quins elements del sistema són importants per a l'execució del programa.
Un dels elements evidents de l'estat del sistema que inclou el procés és la memòria. Les instruccions es troben a la memòria. Les dades que el programa llegeix o escriu també es troben a la memòria. Així, la memòria que pot adreçar un procés (anomenada espai d'adreces) forma part del procés.
També formen part de l'estat del sistema els registres. Moltes instruccions estan destinades a canviar el valor dels registres o llegir-ne el valor, i així els registres també esdevenen una part important del funcionament del procés.
Cal tenir en compte que l'estat de la màquina també es forma a partir d'alguns registres especials. Per exemple, IP - punter d'instruccions — un punter a la instrucció que el programa està executant actualment. També hi ha punter de pila i relacionat amb ell punter de marc, que s'utilitzen per gestionar: paràmetres de funció, variables locals i adreces de retorn.
Finalment, els programes sovint accedeixen a la ROM (memòria de només lectura). Aquesta informació d'"E/S" (entrada/sortida) hauria d'incloure una llista dels fitxers oberts actualment pel procés.

API de procés

Per tal de millorar la nostra comprensió de com funciona el procés, estudiem exemples de trucades al sistema que s'han d'incloure a qualsevol interfície del sistema operatiu. Aquestes API estan disponibles d'una forma o una altra a qualsevol sistema operatiu.

Create (creació): el sistema operatiu ha d'incloure algun mètode que us permeti crear nous processos. Quan introduïu una ordre al terminal o inicieu una aplicació fent doble clic a una icona, s'envia una trucada al sistema operatiu per crear un procés nou i, a continuació, iniciar el programa especificat.
Esborrat: Com que hi ha una interfície per crear un procés, el sistema operatiu també hauria de proporcionar la capacitat de forçar l'eliminació d'un procés. La majoria dels programes s'iniciaran i finalitzaran de manera natural mentre s'executen. En cas contrari, l'usuari voldria poder matar-los i, per tant, seria útil una interfície per aturar el procés.
Esperar (espera): De vegades és útil esperar que finalitzi un procés, de manera que es proporcionen algunes interfícies que ofereixen la possibilitat d'esperar.
Control varis (controls diversos): a més de matar i esperar el procés, també hi ha altres mètodes de control diferents. Per exemple, la majoria dels sistemes operatius ofereixen la possibilitat de congelar un procés (aturar la seva execució durant un període determinat) i després reprendre-lo (continuar amb l'execució)
Estat (estat): hi ha diverses interfícies per obtenir informació sobre l'estat d'un procés, com ara quant de temps s'està executant o en quin estat es troba actualment.

Sistemes operatius: tres peces fàcils. Part 2: Abstracció: procés (traducció)

Creació del procés: Detalls

Una de les coses interessants és com es transformen exactament els programes en processos. Sobretot com el sistema operatiu recull i executa el programa. Com es crea exactament el procés.
En primer lloc, el sistema operatiu ha de carregar el codi del programa i les dades estàtiques a la memòria (a l'espai d'adreces del procés). Els programes normalment es troben en un disc o unitat d'estat sòlid en algun format executable. Per tant, el procés de càrrega del programa i dades estàtiques a la memòria requereix que el sistema operatiu sigui capaç de llegir aquests bytes del disc i col·locar-los en algun lloc de la memòria.

En els primers sistemes operatius, el procés de càrrega es feia amb ganes, la qual cosa significa que tot el codi es carregava a la memòria abans que s'iniciés el programa. Els sistemes operatius moderns ho fan de manera mandrosa, és a dir, carregant fragments de codi o dades només quan el programa els requereix durant la seva execució.

Un cop el codi i les dades estàtiques s'han carregat a la memòria del sistema operatiu, hi ha algunes coses més que cal fer abans que el procés pugui executar-se. S'ha d'assignar una certa quantitat de memòria per a la pila. Els programes utilitzen la pila per a variables locals, paràmetres de funció i adreces de retorn. El sistema operatiu assigna aquesta memòria i la dóna al procés. La pila també es pot assignar amb alguns arguments, concretament omple els paràmetres de la funció main(), per exemple amb una matriu d'argc i argv.

El sistema operatiu també pot assignar una mica de memòria al munt del programa. Els programes utilitzen l'emmagatzematge dinàmic per sol·licitar explícitament dades assignades dinàmicament. Els programes demanen aquest espai cridant la funció malloc () i l'esborra explícitament cridant la funció gratuït (). El munt és necessari per a estructures de dades com ara fulls enllaçats, taules hash, arbres i altres. Al principi, s'assigna una petita quantitat de memòria al munt, però amb el temps, a mesura que s'executa el programa, el munt pot sol·licitar més memòria mitjançant la crida de l'API de la biblioteca malloc(). El sistema operatiu participa en el procés d'assignació de més memòria per ajudar a satisfer aquestes trucades.

El sistema operatiu també realitzarà tasques d'inicialització, especialment les relacionades amb l'E/S. Per exemple, als sistemes UNIX, cada procés té per defecte 3 descriptors de fitxers oberts, per a l'entrada, sortida i error estàndard. Aquestes nanses permeten als programes llegir les entrades del terminal i mostrar informació a la pantalla.

Així, carregant codi i dades estàtiques a la memòria, creant i inicialitzant la pila i fent altres treballs relacionats amb la realització de tasques d'E/S, el sistema operatiu prepara l'etapa per a l'execució del procés. Finalment, queda una darrera tasca: executar el programa a través del seu punt d'entrada, anomenada funció main(). En executar la funció main(), el sistema operatiu transfereix el control de la CPU al procés acabat de crear, de manera que el programa comença a executar-se.

Estat del procés

Ara que entenem una mica què és un procés i com es crea, enumerem els estats del procés en què es pot trobar. En la seva forma més simple, un procés pot estar en un d'aquests estats:
Running. Quan s'executa, el procés s'executa al processador. Això vol dir que s'estan executant instruccions.
Llest. En l'estat llest, el procés està a punt per executar-se, però per algun motiu el sistema operatiu no l'executa en el moment especificat.
Bloquejat. En l'estat bloquejat, un procés realitza algunes operacions que impedeixen que estigui llest per executar-se fins que es produeixi algun esdeveniment. Un exemple comú és quan un procés inicia una operació d'E/S, es bloqueja perquè un altre procés pugui utilitzar el processador.

Sistemes operatius: tres peces fàcils. Part 2: Abstracció: procés (traducció)

Podeu imaginar aquests estats en forma de gràfic. Com podem veure a la imatge, l'estat del procés pot canviar entre RUNNING i READY a criteri del SO. Quan l'estat d'un procés canvia de READY a RUNNING, vol dir que el procés s'ha programat. En la direcció oposada, eliminada del disseny. En el moment en què un procés es BLOQUEA, per exemple, inicio una operació d'IO, el sistema operatiu el mantindrà en aquest estat fins que es produeixi algun esdeveniment, per exemple, la finalització de l'IO. en aquest moment la transició a l'estat READY i possiblement immediatament a l'estat RUNNING si el SO ho decideix.
Vegem un exemple de com es mouen dos processos per aquests estats. Per començar, imaginem que tots dos processos s'estan executant i cadascun només utilitza la CPU. En aquest cas, els seus estats es veuran així.

Sistemes operatius: tres peces fàcils. Part 2: Abstracció: procés (traducció)

A l'exemple següent, el primer procés, després d'un temps d'execució, sol·licita IO i entra a l'estat BLOCKED, permetent que s'executi un altre procés (FIGURA 1.4). El sistema operatiu veu que el procés 0 no està utilitzant la CPU i inicia el procés 1. Mentre el procés 1 s'executa, IO es completa i l'estat del procés 0 canvia a READY. Finalment, el procés 1 s'ha completat, i un cop finalitzat, el procés 0 comença, executa i acaba el seu treball.

Sistemes operatius: tres peces fàcils. Part 2: Abstracció: procés (traducció)

Estructura de dades

El sistema operatiu en si és un programa i, com qualsevol altre programa, té algunes estructures de dades clau que fan un seguiment de diverses peces d'informació rellevants. Per fer un seguiment de l'estat de cada procés, el sistema operatiu en admetrà alguns llista de processos per a tots els processos en estat PREPARAT i alguna informació addicional per fer un seguiment dels processos que s'estan executant actualment. A més, el sistema operatiu hauria de supervisar els processos bloquejats. Un cop finalitzada l'IO, el sistema operatiu ha de despertar el procés requerit i posar-lo en un estat a punt per executar-se.

Per exemple, el sistema operatiu ha de preservar l'estat dels registres del processador. En el moment que el procés s'atura, l'estat dels registres s'emmagatzema a l'espai d'adreces del procés, i en el moment en què continua el seu funcionament, es restableixen els valors dels registres i així es continua amb l'execució d'aquest procés.

A més dels estats preparats, bloquejats i en execució, hi ha altres estats. De vegades, en el moment de la creació, un procés pot estar en estat INIT. Finalment, un procés es pot posar en estat FINAL quan ja s'hagi completat, però la seva informació encara no s'ha esborrat. En sistemes UNIX, aquest estat s'anomena procés zombi. Aquest estat és útil per als casos en què un procés principal vol conèixer el codi de retorn d'un fill, per exemple, normalment 0 indica un èxit i 1 un error, però els programadors poden emetre codis de sortida addicionals per indicar diferents problemes. Quan el procés pare finalitza, fa una crida al sistema final, com ara wait(), per esperar que el procés fill acabi i indicar al sistema operatiu que pot esborrar qualsevol dada associada al procés finalitzat.

Sistemes operatius: tres peces fàcils. Part 2: Abstracció: procés (traducció)

Punts clau de la conferència:

procés — l'abstracció principal d'un programa en execució al sistema operatiu. En qualsevol moment, un procés es pot descriure pel seu estat: el contingut de la memòria al seu espai d'adreces, el contingut dels registres del processador, inclòs el punter d'instruccions i el punter de pila, i la informació d'IO, com ara els fitxers oberts que s'estan llegint o escrivint.
API de procés consisteix en trucades que els programes poden fer als processos. Normalment són trucades de creació, supressió o altres.
● El procés es troba en un dels molts estats, inclosos en execució, llest, bloquejat. Diversos esdeveniments com ara la programació, les excepcions de la programació o les esperes poden canviar l'estat d'un procés d'un a un altre.
Llista de processos conté informació sobre tots els processos del sistema. Cada entrada s'anomena bloc de control de processos, que en realitat és una estructura que conté tota la informació necessària sobre un procés concret. 

Font: www.habr.com

Afegeix comentari