Sistemas operativos: tres pezas fáciles. Parte 2: Abstracción: Proceso (tradución)

Introdución aos Sistemas Operativos

Ola Habr! Gustaríame chamarlle á súa atención unha serie de artigos-traducións dunha literatura interesante na miña opinión: OSTEP. Este material discute con bastante profundidade o traballo dos sistemas operativos tipo Unix, é dicir, o traballo con procesos, varios programadores, memoria e outros compoñentes similares que constitúen un sistema operativo moderno. Podes ver o orixinal de todos os materiais aquí aquí. Teña en conta que a tradución foi feita de forma non profesional (con bastante liberdade), pero espero manter o significado xeral.

Os traballos de laboratorio sobre este tema pódense consultar aquí:

Outras partes:

Tamén podes consultar a miña canle en telegrama =)

Vexamos a abstracción máis fundamental que o SO proporciona aos usuarios: o proceso. A definición do proceso é bastante sinxela - é programa en execución. O programa en si é unha cousa sen vida situada no disco: é un conxunto de instrucións e posiblemente algúns datos estáticos á espera de ser lanzado. É o SO o que toma eses bytes e os executa, transformando o programa en algo útil.
Na maioría das veces, os usuarios queren executar máis dun programa ao mesmo tempo, por exemplo, pode executar un navegador, xogo, reprodutor multimedia, editor de texto e similares no seu portátil. De feito, un sistema típico pode executar decenas ou centos de procesos simultaneamente. Este feito fai que o sistema sexa máis doado de usar, nunca tes que preocuparte por se a CPU está libre, só tes que executar programas.

Isto suscita o problema: como proporcionar a ilusión de moitas CPUs? Como pode o sistema operativo crear a ilusión dun número case infinito de CPU, aínda que só teñas unha CPU física?

O SO crea esta ilusión a través da virtualización da CPU. Ao iniciar un proceso, despois detelo, iniciar outro proceso, etc., o SO pode manter a ilusión de que hai moitas CPU virtuais, cando en realidade haberá un ou máis procesadores físicos. Esta técnica chámase división dos recursos da CPU por tempo. Esta técnica permite aos usuarios executar tantos procesos concorrentes como queiran. O custo desta solución é o rendemento, xa que se a CPU é compartida por varios procesos, cada proceso procesarase máis lentamente.
Para implementar a virtualización da CPU, e especialmente para facelo ben, o SO necesita soporte tanto de baixo nivel como de alto nivel. Chámase apoio de baixo nivel mecanismos son métodos ou protocolos de baixo nivel que implementan a parte requirida da funcionalidade. Un exemplo desta funcionalidade é o cambio de contexto, que lle dá ao sistema operativo a posibilidade de deter un programa e executar outro no procesador. Esta división de tempo está implementada en todos os sistemas operativos modernos.
Ademais destes mecanismos hai algunha lóxica integrada no SO, en forma de "políticas". Política é un determinado algoritmo de toma de decisións para o sistema operativo. Tales políticas, por exemplo, deciden que programa se debe iniciar (a partir dunha lista de comandos) primeiro. Así, por exemplo, este problema resolverase mediante unha política chamada planificador (política de programación) e á hora de escoller unha solución, guiarase por datos tales como: historial de inicio (que programa foi lanzado máis longo nos últimos minutos), que carga leva este proceso (que tipos de programas se lanzaron), métricas de rendemento (se o sistema está optimizado para a interacción interactiva ou para o rendemento ) etc.

Abstracción: proceso

A abstracción dun programa en execución executado polo sistema operativo é o que chamamos proceso. Como se mencionou anteriormente, un proceso é simplemente un programa en execución, en calquera período de tempo instantáneo. Un programa co que podemos obter información resumida de diversos recursos do sistema aos que este programa accede ou afecta durante a súa execución.
Para comprender os compoñentes do proceso, cómpre comprender os estados do sistema: o que o programa pode ler ou cambiar durante o seu funcionamento. En calquera momento, cómpre comprender que elementos do sistema son importantes para a execución do programa.
Un dos elementos obvios do estado do sistema que inclúe o proceso é pai. As instrucións sitúanse na memoria. Os datos que le ou escribe o programa tamén se localizan na memoria. Así, a memoria que un proceso pode dirixir (chamada espazo de enderezos) forma parte do proceso.
Tamén forman parte do estado do sistema os rexistros. Moitas instrucións teñen como obxectivo cambiar o valor dos rexistros ou ler o seu valor, polo que os rexistros tamén se converten nunha parte importante do funcionamento do proceso.
Nótese que o estado da máquina tamén se forma a partir dalgúns rexistros especiais. Por exemplo, IP - punteiro de instrucións — un punteiro á instrución que o programa está a executar actualmente. Tamén hai punteiro de pila e relacionados con el punteiro de marco, que se utilizan para xestionar: parámetros de función, variables locais e enderezos de retorno.
Finalmente, os programas adoitan acceder á ROM (memoria de só lectura). Esta información de "E/S" (entrada/saída) debería incluír unha lista de ficheiros abertos actualmente polo proceso.

API de proceso

Para mellorar a nosa comprensión de como funciona o proceso, imos estudar exemplos de chamadas ao sistema que deberían incluírse en calquera interface do sistema operativo. Estas API están dispoñibles nunha ou outra forma en calquera SO.

crear (creación): o SO debe incluír algún método que lle permita crear novos procesos. Cando introduce un comando no terminal ou inicia unha aplicación facendo dobre clic nunha icona, envíase unha chamada ao sistema operativo para crear un novo proceso e, a continuación, iniciar o programa especificado.
Eliminar: Dado que hai unha interface para crear un proceso, o SO tamén debería proporcionar a capacidade de forzar a eliminación dun proceso. A maioría dos programas comezarán e finalizarán por conta propia mentres se executan. En caso contrario, o usuario gustaríalle poder matalos e, polo tanto, sería útil unha interface para deter o proceso.
Espere (esperando): ás veces é útil esperar a que se complete un proceso, polo que se proporcionan algunhas interfaces que ofrecen a posibilidade de esperar.
Control Varios (varias controles): Ademais de matar e esperar polo proceso, tamén hai outros métodos de control diversos. Por exemplo, a maioría dos sistemas operativos ofrecen a posibilidade de conxelar un proceso (deter a súa execución durante un período determinado) e despois retomalo (continuar coa execución)
Estado (estado): existen varias interfaces para obter información sobre o estado dun proceso, como o tempo que estivo en execución ou o estado no que se atopa actualmente.

Sistemas operativos: tres pezas fáciles. Parte 2: Abstracción: Proceso (tradución)

Proceso de creación: detalles

Unha das cousas interesantes é como exactamente os programas se transforman en procesos. Especialmente como o sistema operativo recolle e executa o programa. Como se crea exactamente o proceso.
En primeiro lugar, o sistema operativo debe cargar o código do programa e os datos estáticos na memoria (no espazo de enderezos do proceso). Os programas adoitan estar situados nun disco ou unidade de estado sólido nalgún formato executable. Así, o proceso de carga de programas e datos estáticos na memoria require que o sistema operativo poida ler eses bytes do disco e colocalos nalgún lugar da memoria.

Nos primeiros sistemas operativos, o proceso de carga facíase con ansia, o que significa que todo o código foi cargado na memoria antes de que se lanzase o programa. Os sistemas operativos modernos fano con preguiza, é dicir, cargando anacos de código ou datos só cando o programa os require durante a súa execución.

Unha vez que se cargan o código e os datos estáticos na memoria do sistema operativo, hai que facer algunhas cousas máis antes de que o proceso poida executarse. Débese asignar algunha cantidade de memoria para a pila. Os programas usan a pila para variables locais, parámetros de función e enderezos de retorno. O SO asigna esta memoria e dálla ao proceso. A pila tamén se pode asignar con algúns argumentos, concretamente enche os parámetros da función main(), por exemplo cunha matriz de argc e argv.

O sistema operativo tamén pode asignar algo de memoria ao montón do programa. O montón é usado polos programas para solicitar de forma explícita datos asignados de forma dinámica. Os programas solicitan este espazo chamando á función malloc () e límpao explícitamente chamando á función libre (). O montón é necesario para estruturas de datos como follas vinculadas, táboas hash, árbores e outros. Nun primeiro momento, unha pequena cantidade de memoria está asignada ao montón, pero co tempo, a medida que se executa o programa, o montón pode solicitar máis memoria a través da chamada API da biblioteca malloc(). O sistema operativo está implicado no proceso de asignación de máis memoria para axudar a satisfacer estas chamadas.

O sistema operativo tamén realizará tarefas de inicialización, especialmente as relacionadas coa E/S. Por exemplo, nos sistemas UNIX, cada proceso ten por defecto 3 descritores de ficheiros abertos, para entrada, saída e erro estándar. Estes controladores permiten que os programas lean entradas desde o terminal e mostren información na pantalla.

Así, ao cargar código e datos estáticos na memoria, crear e inicializar a pila e realizar outros traballos relacionados coa realización de tarefas de E/S, o SO prepara a etapa para a execución do proceso. Finalmente, queda unha última tarefa: executar o programa a través do seu punto de entrada, chamado función main(). Ao executar a función main(), o sistema operativo transfire o control da CPU ao proceso recén creado, polo que o programa comeza a executarse.

Estado do proceso

Agora que entendemos algo de que é un proceso e como se crea, imos enumerar os estados do proceso nos que pode estar. Na súa forma máis sinxela, un proceso pode estar nun destes estados:
Carreira. Cando se executa, o proceso execútase no procesador. Isto significa que se están executando instrucións.
Rematado. No estado listo, o proceso está listo para executarse, pero por algún motivo o sistema operativo non o executa no momento especificado.
Bloqueado. No estado bloqueado, un proceso realiza algunhas operacións que impiden que estea listo para executarse ata que se produza algún evento. Un exemplo común é cando un proceso inicia unha operación de E/S, queda bloqueado para que algún outro proceso poida usar o procesador.

Sistemas operativos: tres pezas fáciles. Parte 2: Abstracción: Proceso (tradución)

Podes imaxinar estes estados en forma de gráfica. Como podemos ver na imaxe, o estado do proceso pode cambiar entre RUNNING e LISTO a criterio do SO. Cando o estado dun proceso cambia de LISTO a EN EXECUCIÓN, significa que o proceso foi programado. Na dirección oposta - eliminado do deseño. No momento en que un proceso queda BLOQUEADO, por exemplo, inicio unha operación de E/S, o SO manterao neste estado ata que se produza algún evento, por exemplo, a finalización do E/S. neste momento a transición ao estado LISTO e posiblemente inmediatamente ao estado RUNNING se o SO así o decide.
Vexamos un exemplo de como dous procesos se moven por estes estados. Para comezar, imaxinemos que ambos procesos están en execución, e cada un está usando só a CPU. Neste caso, os seus estados serán así.

Sistemas operativos: tres pezas fáciles. Parte 2: Abstracción: Proceso (tradución)

No seguinte exemplo, o primeiro proceso, despois dun tempo de execución, solicita IO e entra no estado BLOQUEADO, permitindo que se execute outro proceso (FIGURA 1.4). O SO ve que o proceso 0 non está usando a CPU e inicia o proceso 1. Mentres o proceso 1 se está a executar, IO complétase e o estado do proceso 0 cambia a LISTO. Finalmente, o proceso 1 completouse e, ao rematar, o proceso 0 inicia, executa e remata o seu traballo.

Sistemas operativos: tres pezas fáciles. Parte 2: Abstracción: Proceso (tradución)

Estrutura de datos

O propio sistema operativo é un programa e, como calquera outro programa, ten algunhas estruturas de datos clave que fan un seguimento de varias pezas de información relevantes. Para rastrexar o estado de cada proceso, o SO admitirá algúns lista de procesos para todos os procesos no estado LISTO e algunha información adicional para rastrexar os procesos que se están executando actualmente. Ademais, o sistema operativo debería supervisar os procesos bloqueados. Despois de completar IO, o sistema operativo debe activar o proceso necesario e poñelo nun estado listo para executarse.

Por exemplo, o SO debe preservar o estado dos rexistros do procesador. No momento en que se detén o proceso, o estado dos rexistros almacénase no espazo de direccións do proceso e, no momento en que continúa o seu funcionamento, os valores dos rexistros son restaurados e así continúa a execución deste proceso.

Ademais dos estados listos, bloqueados e en execución, hai outros estados. Ás veces, no momento da creación, un proceso pode estar no estado INIT. Finalmente, un proceso pódese colocar no estado FINAL cando xa estea completado, pero a súa información aínda non foi borrada. Nos sistemas UNIX este estado chámase proceso zombie. Este estado é útil para os casos nos que un proceso principal quere coñecer o código de retorno dun fillo, por exemplo, normalmente 0 indica un éxito e 1 un erro, pero os programadores poden emitir códigos de saída adicionais para sinalar diferentes problemas. Cando o proceso pai finaliza, fai unha chamada final ao sistema, como wait(), para esperar a que finalice o proceso fillo e sinalar ao SO que pode borrar calquera dato asociado ao proceso finalizado.

Sistemas operativos: tres pezas fáciles. Parte 2: Abstracción: Proceso (tradución)

Puntos clave da charla:

proceso — a abstracción principal dun programa en execución no SO. En calquera momento, un proceso pódese describir polo seu estado: o contido da memoria no seu espazo de enderezos, o contido dos rexistros do procesador, incluído o punteiro de instrucións e o de pila, e información de E/S, como os ficheiros abertos que se leen ou se escriben.
API de proceso consiste en chamadas que os programas poden facer aos procesos. Normalmente estas son chamadas de creación, eliminación ou outras.
● O proceso está nun dos moitos estados, incluíndo en execución, listo ou bloqueado. Varios eventos como a programación, as excepcións da programación ou as esperas poden cambiar o estado dun proceso dun a outro.
Lista de procesos contén información sobre todos os procesos do sistema. Cada entrada nel chámase bloque de control de procesos, que en realidade é unha estrutura que contén toda a información necesaria sobre un proceso específico. 

Fonte: www.habr.com

Engadir un comentario