Sistemas operativos: tres pezas fáciles. Parte 1: Introdución (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í:
- orixinal: pages.cs.wisc.edu/~remzi/OSTEP/Homework/homework.html
- orixinal: github.com/remzi-arpacidusseau/ostep-code
- a miña adaptación persoal: github.com/bykvaadm/OS/tree/master/ostep

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

Funcionamento do programa

Que ocorre cando se executa un programa? Un programa en execución fai unha cousa sinxela: executa instrucións. Cada segundo, millóns e posiblemente miles de millóns de instrucións son recuperadas polo procesador da memoria RAM, á súa vez decodifica (por exemplo, recoñece a que tipo pertencen estas instrucións) e execútaas. Isto podería ser engadir dous números, acceder á memoria, comprobar unha condición, ir a unha función, etc. Despois da execución dunha instrución, o procesador procede á execución doutra. E así instrución tras instrución, execútanse ata que remata o programa.
Este exemplo considérase naturalmente simplificado; de feito, para acelerar o procesador, o hardware moderno permítelle executar instrucións sen quenda, calcular posibles resultados, executar instrucións simultaneamente e trucos similares.

Modelo de cálculo de Von Neumann

A forma simplificada de traballo que describimos é semellante ao modelo de cálculo de Von Neumann. Von Neumann é un dos pioneiros dos sistemas informáticos, tamén é un dos autores da teoría de xogos. Mentres o programa está en execución, teñen lugar outros eventos, moitos outros procesos e lóxica de terceiros funcionan, cuxo obxectivo principal é simplificar o lanzamento, operación e mantemento do sistema.
Hai un conxunto de software que se encarga de facer que os programas sexan fáciles de executar (ou incluso de permitir que se executen varios programas ao mesmo tempo), que permite que os programas compartan a mesma memoria e se comuniquen con diferentes dispositivos. Este conxunto de software (software) denomínase esencialmente sistema operativo e as súas tarefas inclúen supervisar que o sistema funciona correctamente e de forma eficiente, así como garantir a facilidade de xestión deste sistema.

Sistema operativo

Un sistema operativo, abreviado como SO, é un conxunto de programas interrelacionados deseñados para xestionar os recursos informáticos e organizar a interacción do usuario cun ordenador..
O sistema operativo alcanza a súa eficacia en primeiro lugar, a través da técnica máis importante: a técnica virtualización. O SO interactúa cun recurso físico (procesador, memoria, disco, etc.) e transfórmao nunha forma máis xeral, máis potente e máis fácil de usar. Polo tanto, para unha comprensión xeral, pode comparar de xeito moi groso o sistema operativo cunha máquina virtual.
Co fin de permitir aos usuarios dar comandos ao sistema operativo e utilizar así as capacidades da máquina virtual (como executar un programa, asignar memoria, acceder a un ficheiro, etc.), o sistema operativo proporciona unha interface chamada API (interfaz de programación de aplicacións) e á que pode realizar chamadas (chamada). Un sistema operativo típico permite realizar centos de chamadas ao sistema.
Finalmente, dado que a virtualización permite executar varios programas (compartindo así a CPU) e acceder simultaneamente ás súas instrucións e datos (compartindo memoria) e acceder a discos (compartindo así dispositivos de E/S). ), o sistema operativo tamén se denomina xestor de recursos. Cada procesador, disco e memoria é un recurso do sistema, e así un dos roles do sistema operativo convértese na tarefa de xestionar estes recursos, facéndoo de forma eficiente, honesta ou viceversa, dependendo da tarefa para a que este sistema operativo está deseñado.

Virtualización da CPU

Considere o seguinte programa:
(https://www.youtube.com/watch?v=zDwT5fUcki4&feature=youtu.be)

Sistemas operativos: tres pezas fáciles. Parte 1: Introdución (tradución)

Non realiza ningunha acción especial, de feito, o único que fai é chamar unha función xirar(), cuxa tarefa é percorrer a comprobación de tempo e regresar despois de que transcorra un segundo. Así, repite indefinidamente a cadea que o usuario pasou como argumento.
Imos executar este programa e pasarlle o carácter "A" como argumento. O resultado non é especialmente interesante: o sistema simplemente executa un programa que mostra periodicamente o carácter "A".
Agora imos probar a opción cando se están executando moitas instancias do mesmo programa, pero saíndo letras diferentes para que sexa máis claro. Neste caso, o resultado será algo diferente. A pesar de que temos un procesador, o programa execútase simultaneamente. Como ocorre? Pero resulta que o sistema operativo, non sen a axuda das capacidades de hardware, crea unha ilusión. A ilusión de que o sistema ten varios procesadores virtuais, convertendo un único procesador físico nun número teoricamente infinito e, polo tanto, permite que aparentemente programas se executen simultaneamente. Esta ilusión chámase Virtualización da CPU.
Esta imaxe suscita moitas preguntas, por exemplo, se varios programas queren executarse ao mesmo tempo, cal se lanzará? As "políticas" do SO son as responsables desta cuestión. As políticas úsanse en moitos lugares do SO e responden a preguntas coma esta, e son os mecanismos básicos que implementa o SO. De aí o papel do SO como xestor de recursos.

Virtualización da memoria

Agora vexamos a memoria. O modelo físico de memoria nos sistemas modernos represéntase como unha matriz de bytes.. Para ler desde memoria, cómpre especificar enderezo da célulapara acceder a ela. Para escribir ou actualizar datos, tamén debes especificar os datos e o enderezo da cela onde escribirlos.
Accédese á memoria constantemente durante a execución do programa. Un programa almacena toda a súa estrutura de datos na memoria e accede a ela executando varias instrucións. As instrucións, pola súa banda, tamén se almacenan na memoria, polo que tamén se accede a ela para cada solicitude da seguinte instrución.

chamada malloc().

Considere o seguinte programa, que asigna unha rexión de memoria mediante a chamada malloc () (https://youtu.be/jnlKRnoT1m0):

Sistemas operativos: tres pezas fáciles. Parte 1: Introdución (tradución)

O programa fai varias cousas. Primeiro, asigna algo de memoria (liña 7), despois imprime o enderezo da cela asignada (liña 9), escribe cero no primeiro slot da memoria asignada. A continuación, o programa entra nun bucle no que aumenta o valor almacenado na memoria no enderezo da variable "p". Tamén imprime o propio ID do proceso. O ID do proceso é único para cada proceso en execución. Despois de lanzar varias copias, atoparemos un resultado interesante: no primeiro caso, se non fai nada e só executa varias copias, os enderezos serán diferentes. Pero isto non entra na nosa teoría! Correcto, xa que as distribucións modernas teñen a aleatorización da memoria activada por defecto. Se está desactivado, obtemos o resultado esperado: coincidirán os enderezos de memoria de dous programas en execución simultánea.

Sistemas operativos: tres pezas fáciles. Parte 1: Introdución (tradución)

Como resultado, resulta que dous programas independentes funcionan cos seus propios espazos de enderezos privados, que á súa vez son mapeados polo sistema operativo na memoria física.. Polo tanto, o uso de enderezos de memoria dentro dun programa non afectará a outros de ningún xeito, e cada programa parece que ten a súa propia memoria física, totalmente entregada a el. A realidade, con todo, é que a memoria física é un recurso compartido xestionado polo sistema operativo.

Consistencia

Outro dos temas importantes dentro dos sistemas operativos é − consistencia. Este termo úsase cando se fala de problemas no sistema que poden ocorrer ao traballar con moitas cousas ao mesmo tempo dentro do mesmo programa. Os problemas de coherencia xorden incluso dentro do propio sistema operativo. Nos exemplos anteriores de virtualización de memoria e procesador, decatámonos de que o SO xestiona moitas cousas ao mesmo tempo: inicia o primeiro proceso, despois o segundo, etc. Como se viu, este comportamento pode levar a algúns problemas. Así, por exemplo, os programas multifíos modernos experimentan tales dificultades.

Considere o seguinte programa:

Sistemas operativos: tres pezas fáciles. Parte 1: Introdución (tradución)

O programa na función principal crea dous fíos usando a chamada pthread_create(). Neste exemplo, un fío pode considerarse como unha función que se executa no mesmo espazo de memoria xunto con outras funcións, con máis dunha función executada ao mesmo tempo. Neste exemplo, cada fío inicia e executa a función worker() que á súa vez simplemente incrementa a variable,.

Imos executar este programa cun argumento de 1000. Como xa adiviñaches, o resultado debería ser 2000 porque cada fío incrementou a variable 1000 veces. Non obstante, non todo é tan sinxelo. Tentemos executar o programa cunha orde de magnitude máis repeticións.

Sistemas operativos: tres pezas fáciles. Parte 1: Introdución (tradución)

Ao introducir un número, por exemplo, 100000, esperamos ver a saída como o número 200000. Non obstante, se executamos o número 100000 varias veces, non só non veremos a resposta correcta, senón que tamén obteremos diferentes respostas incorrectas. A resposta reside no feito de que para aumentar o número son necesarias tres operacións: extraer o número da memoria, incrementalo e, a continuación, escribir o número. Dado que todas estas instrucións non se executan atómicamente (todas ao mesmo tempo), poden ocorrer cousas estrañas coma esta. Este problema chámase na programación condición de carreira. Cando forzas descoñecidas nun momento descoñecido poden afectar o rendemento de calquera das túas operacións.

Fonte: www.habr.com

Engadir un comentario