Sistemes operatius: tres peces fàcils. Part 1: introducció (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í:
- original: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- original: github.com/remzi-arpacidusseau/ostep-code
- La meva adaptació personal: github.com/bykvaadm/OS/tree/master/ostep

També pots consultar el meu canal a telegrama =)

Funcionament del programa

Què passa quan s'executa un programa? Un programa en execució fa una cosa senzilla: executa instruccions. Cada segon, el processador recupera milions i fins i tot milers de milions d'instruccions de la memòria RAM, al seu torn les descodifica (per exemple, reconeix a quin tipus pertanyen aquestes instruccions) i les executa. Això podria ser afegir dos números, accedir a la memòria, comprovar una condició, saltar a una funció, etc. Després de l'execució d'una instrucció, el processador passa a l'execució d'una altra. Així, instrucció rere instrucció, s'executen fins que s'acaba el programa.
Aquest exemple es considera, naturalment, simplificat; de fet, per accelerar el processador, el maquinari modern us permet executar instruccions fora del torn, calcular possibles resultats, executar instruccions simultàniament i trucs similars.

Model de càlcul de Von Neumann

La forma simplificada de treball descrita per nosaltres és similar al model de càlcul de Von Neumann. Von Neumann és un dels pioners dels sistemes informàtics, també és un dels autors de la teoria de jocs. Mentre el programa s'executa, tenen lloc un munt d'altres esdeveniments, molts altres processos i la lògica de tercers funcionen, l'objectiu principal dels quals és simplificar el llançament, el funcionament i el manteniment del sistema.
Hi ha un conjunt de programari que s'encarrega de fer que els programes siguin fàcils d'executar (o fins i tot permetre que s'executin diversos programes al mateix temps), que permet que els programes comparteixin la mateixa memòria i es comuniquin amb diferents dispositius. Aquest conjunt de programari (programari) s'anomena essencialment sistema operatiu i les seves tasques inclouen supervisar que el sistema funciona correctament i eficaçment, així com garantir la facilitat de gestió d'aquest sistema.

Sistema operatiu

Un sistema operatiu, abreujat com a SO, és un conjunt de programes interrelacionats dissenyats per gestionar els recursos informàtics i organitzar la interacció de l'usuari amb un ordinador..
El sistema operatiu aconsegueix la seva eficàcia en primer lloc, mitjançant la tècnica més important: la tècnica virtualització. El sistema operatiu interactua amb un recurs físic (processador, memòria, disc, etc.) i el transforma en una forma més general, més potent i més fàcil d'utilitzar. Per tant, per a una comprensió general, podeu comparar de manera molt aproximada el sistema operatiu amb una màquina virtual.
Per permetre als usuaris donar ordres al sistema operatiu i utilitzar així les capacitats de la màquina virtual (com ara executar un programa, assignar memòria, accedir a un fitxer, etc.), el sistema operatiu proporciona una interfície anomenada API (interfície de programació d'aplicacions) i a la qual podeu fer trucades (trucada). Un sistema operatiu típic permet fer centenars de trucades al sistema.
Finalment, com que la virtualització permet executar diversos programes (compartint així la CPU) i accedir simultàniament a les seves instruccions i dades (compartint memòria), i accedir als discs (compartint així dispositius d'E/S). ), el sistema operatiu també s'anomena gestor de recursos. Cada processador, disc i memòria és un recurs del sistema, i així una de les funcions del sistema operatiu es converteix en la tasca de gestionar aquests recursos, fent-ho de manera eficient, honesta, o viceversa, en funció de la tasca per a la qual aquest sistema operatiu. està dissenyat.

Virtualització de la CPU

Considereu el programa següent:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Sistemes operatius: tres peces fàcils. Part 1: introducció (traducció)

No realitza cap acció especial, de fet, l'únic que fa és cridar una funció girar(), la tasca del qual és fer un cicle a través de la comprovació del temps i tornar després d'haver passat un segon. Així, repeteix indefinidament la cadena que l'usuari ha passat com a argument.
Executem aquest programa i passem-li el caràcter "A" com a argument. El resultat no és especialment interessant: el sistema simplement executa un programa que mostra periòdicament el caràcter "A".
Ara provem l'opció quan s'executen moltes instàncies del mateix programa, però sortint diferents lletres per fer-ho més clar. En aquest cas, el resultat serà una mica diferent. Tot i que tenim un processador, el programa s'executa simultàniament. Com passa? Però resulta que el sistema operatiu, no sense l'ajuda de les capacitats del maquinari, crea una il·lusió. La il·lusió que el sistema té múltiples processadors virtuals, convertint un únic processador físic en un nombre teòricament infinit i permetent així que els programes aparentment s'executin simultàniament. Aquesta il·lusió es diu Virtualització de la CPU.
Aquesta imatge planteja moltes preguntes, per exemple, si es volen executar diversos programes al mateix temps, quin es llançarà? Les "polítiques" del sistema operatiu són les responsables d'aquesta pregunta. Les polítiques s'utilitzen en molts llocs del sistema operatiu i responen a preguntes com aquesta, i són els mecanismes bàsics que implementa el sistema operatiu. D'aquí el paper del sistema operatiu com a gestor de recursos.

Virtualització de la memòria

Ara mirem la memòria. El model físic de memòria en els sistemes moderns es representa com una matriu de bytes.. Per llegir des de la memòria, cal especificar adreça cel·lularper accedir-hi. Per escriure o actualitzar dades, també cal especificar les dades i l'adreça de la cel·la on escriure-les.
S'accedeix a la memòria constantment durant l'execució del programa. Un programa emmagatzema tota la seva estructura de dades a la memòria i hi accedeix executant diverses instruccions. Les instruccions, per la seva banda, també s'emmagatzemen a la memòria, de manera que també s'hi accedeix per a cada sol·licitud de la següent instrucció.

crida a malloc().

Considereu el programa següent, que assigna una regió de memòria mitjançant la trucada malloc () (https://youtu.be/jnlKRnoT1m0):

Sistemes operatius: tres peces fàcils. Part 1: introducció (traducció)

El programa fa diverses coses. Primer, assigna una mica de memòria (línia 7), després imprimeix l'adreça de la cel·la assignada (línia 9), escriu zero a la primera ranura de la memòria assignada. A continuació, el programa entra en un bucle en el qual augmenta el valor emmagatzemat a la memòria a l'adreça de la variable "p". També imprimeix l'ID del procés. L'ID del procés és únic per a cada procés en execució. Després d'haver llançat diverses còpies, ens trobarem amb un resultat interessant: en el primer cas, si no feu res i només feu diverses còpies, les adreces seran diferents. Però això no entra sota la nostra teoria! Correcte, ja que les distribucions modernes tenen l'aleatorització de memòria activada per defecte. Si està desactivat, obtenim el resultat esperat: les adreces de memòria de dos programes que s'executen simultàniament coincidiran.

Sistemes operatius: tres peces fàcils. Part 1: introducció (traducció)

Com a resultat, resulta que dos programes independents funcionen amb els seus propis espais d'adreces privades, que al seu torn són mapejats pel sistema operatiu a la memòria física.. Per tant, l'ús d'adreces de memòria dins d'un programa no afectarà els altres de cap manera, i cada programa sembla que té la seva pròpia peça de memòria física, totalment cedida. La realitat, però, és que la memòria física és un recurs compartit gestionat pel sistema operatiu.

Coherència

Un altre dels temes importants dins dels sistemes operatius és − consistència. Aquest terme s'utilitza quan es parla de problemes en el sistema que es poden produir quan es treballa amb moltes coses al mateix temps dins del mateix programa. Els problemes de coherència sorgeixen fins i tot dins del propi sistema operatiu. En els exemples anteriors de virtualització de memòria i processador, ens vam adonar que el sistema operatiu gestiona moltes coses al mateix temps: inicia el primer procés, després el segon, i així successivament. Com va resultar, aquest comportament pot provocar alguns problemes. Així, per exemple, els programes moderns multifils experimenten aquestes dificultats.

Considereu el programa següent:

Sistemes operatius: tres peces fàcils. Part 1: introducció (traducció)

El programa de la funció principal crea dos fils mitjançant la trucada pthread_create(). En aquest exemple, un fil pot ser pensat com una funció que s'executa al mateix espai de memòria juntament amb altres funcions, amb clarament més d'una funció que s'executa al mateix temps. En aquest exemple, cada fil comença i executa la funció worker() que al seu torn simplement augmenta la variable,.

Executem aquest programa amb un argument de 1000. Com haureu endevinat, el resultat hauria de ser 2000 perquè cada fil ha incrementat la variable 1000 vegades. Tanmateix, no tot és tan senzill. Intentem executar el programa amb un ordre de magnitud més repeticions.

Sistemes operatius: tres peces fàcils. Part 1: introducció (traducció)

En introduir un nombre, per exemple, 100000, esperem veure la sortida com el número 200000. Tanmateix, si executem el número 100000 diverses vegades, no només no veurem la resposta correcta, sinó que també obtindrem diferents respostes incorrectes. La resposta rau en el fet que per augmentar el nombre, es requereixen tres operacions: extreure el nombre de la memòria, incrementar-lo i després escriure el nombre de nou. Com que totes aquestes instruccions no s'executen atòmicament (totes alhora), poden passar coses estranyes com aquesta. Aquest problema s'anomena en programació condició de carrera. Quan forces desconegudes en un moment desconegut poden afectar el rendiment de qualsevol de les vostres operacions.

Font: www.habr.com

Afegeix comentari