A “memória disponível” que um sistema operacional informa aos processos filhos

1

Eu estou querendo saber como os sistemas operacionais permitem que os processos filhos saibam quanta memória disponível existe.

Digamos que o computador inteiro tenha 1GB de memória RAM embutida. A operação é executada e usa 100MB (não tenho idéia do quanto um sistema operacional realmente usa). Então restam 900MB.

Em seguida, você executa 10 programas. Cada programa cria 10 processos filhos. A questão é, o que esses processos pai e filho vêem como a memória total disponível para eles.

Como uma segunda parte da pergunta para torná-la um pouco mais complexa, diga que os aplicativos estão em execução há algum tempo e agora há 500MB disponíveis no computador (digamos, o sistema operacional usou 100MB a mais e os aplicativos usados 300MB a mais, para chegar a este nível de 500MB à esquerda). A questão agora é o que esses processos pai e filho vêem como a memória disponível neste momento. Se é o mesmo de antes, ou diferente, e como é diferente.

O motivo da pergunta é porque eu li sobre a Memória Virtual que diz:

virtual memory [is a] technique that provides an "idealized abstraction of the storage resources that are actually available on a given machine" which "creates the illusion to users of a very large (main) memory."

Então, basicamente, parece que cada processo no caso (1) será informado "você tem 1 GB de memória disponível" ou "você tem 900 MB de memória disponível". Eu não tenho certeza do que ele realmente diria, se diz o total em todo o computador, ou o total - o uso do sistema operacional.

Então, para o caso (2), seria lido "1GB disponível", "900MB disponível", "600MB disponível" ou "500MB disponível". Mesma situação, não sei o que diria.

Também pode ser diferente desses valores. O sistema operacional poderia, de alguma maneira, aproximar a memória disponível para cada um dos 100 processos filhos, dividindo-os talvez de maneira uniforme. Portanto, se houver 500 MB no computador, isso significaria que cada processo seria informado "você tem 500/100 == 5 MB de espaço disponível". Mas então, se este for o caso, se um processo consumisse 5MB e ainda houvesse 495MB, perguntando se seria permitido começar a usá-lo e receber um novo número do que está disponível. É por isso que eu não acho que isso é como normalmente é feito, e parece que o sistema operacional diria provavelmente o que está disponível no computador como um todo (então 1GB ).

Além disso, a razão pela qual eu acho que sempre diria "1GB" é porque não tenho certeza se há uma maneira de determinar quanta memória um único processo está usando (ou se o sistema operacional sabe quanta memória é usando). Se o SO sabe o quanto ele está usando, então parece que ele reportaria 900MB.

Outra parte da confusão é que, se o uso da memória está mudando constantemente, e o SO informa a cada processo qual é a memória total - a memória usada, então você teria que verificar constantemente a quantidade de memória disponível se estivesse para tentar acessar mais memória. Ou seja, você não pode armazenar em cache o uso de memória quando o programa é iniciado. Pode ser que o programa, ocioso por algumas horas, comece com 100MB de memória "no computador", mas depois disso, enquanto ele verifica novamente para encontrar "oh wait there is only 5MB available". Por alguma razão, isso parece um comportamento indesejável, mas não tenho certeza.

Qualquer ajuda na compreensão geral de como um sistema operacional informa a criança sobre a quantidade de memória disponível em diferentes momentos seria útil. Obrigado.

    
por Lance Pollard 22.08.2018 / 05:27

2 respostas

1

O sistema operacional não "informa" o programa sobre memória livre.

Todo programa opera em sua própria área de memória virtual, onde tem acesso a (o que ele vê) todo o espaço de endereço de memória potencial permitido. Para um processo de 32 bits, o que ele conhece como "a memória" é todo o 4GB de memória endereçável, para 64 bits o espaço é muito maior. O processo pode alocar memória daquela área, que então informa ao sistema operacional que ele precisa retornar áreas desse espaço de endereço com memória física para que possa ser lido e gravado, mas o programa tem (em teoria) tanta memória quanto quer.

Em um sistema com apenas 1 GB de RAM, isso significa que, quando a memória física está cheia, o sistema operacional começa a enviar dados para o arquivo ou partição de troca. Isso é feito sem o envolvimento do processo real cuja memória está sendo paginada. Se o processo tentar acessar a memória paginada, o sistema operacional interromperá o processo, retornará os dados do disco e retomará o processo.

Um programa pode consultar quanta RAM física é livre, para que eles possam se limitar em situações de pouca memória, mas eles não são artificialmente limitados pelo sistema operacional a menos que ele fique sem RAM física e espaço de troca, caso em que o programa simplesmente obterá um erro ao tentar alocar memória.

    
por 22.08.2018 / 09:46
1

Uma das grandes vantagens da execução em um SO moderno é que os aplicativos não precisam saber quanta RAM está no sistema ou quanto está disponível. Na verdade, a maioria dos aplicativos ignora os detalhes da RAM, quantos núcleos a CPU possui, o tamanho e o número de unidades físicas, se o computador está conectado a uma rede ou à Internet e muito mais. Isto é como deveria ser. O sistema operacional foi projetado para ser usado dessa maneira.

O sistema operacional fornece aos aplicativos um ambiente virtualizado padrão que é independente do hardware. Em vez de acessar diretamente a RAM, os aplicativos acessam apenas um espaço de endereço virtual que é independente do tamanho da RAM. Para uma aplicação, é isso que é memória. A RAM é apenas uma otimização de desempenho (com a tecnologia atual é necessária) e um detalhe de implementação. Partes do código e dos dados do aplicativo estarão na RAM, no arquivo de paginação ou nos arquivos originais. Isso pode mudar de acordo com as necessidades do aplicativo e disponibilidade de recursos. Esses detalhes são gerenciados pelo sistema operacional e são invisíveis para o aplicativo que não conseguiu descobrir, mesmo que quisesse.

Para aplicativos que precisam dessas informações, detalhes de hardware podem ser solicitados no sistema operacional, mas poucos o fazem. Na maior parte, apenas os utilitários do sistema precisam dessa informação. A maioria das aplicações tem tão pouca necessidade para isso quanto o motorista médio precisa saber sobre o tempo de ignição ou misturas de combustível.

Tudo isso é para o bem. Isso significa que os desenvolvedores de aplicativos podem dedicar seu tempo aos requisitos do aplicativo sem ter que lidar com os detalhes confusos do hardware em que está sendo executado. Isso é o que o sistema operacional é para. Isso significa que um aplicativo escrito corretamente projetado para o Windows 95 com 4 MB de RAM pode ser executado em um sistema Windows 10 moderno com muitos GB de RAM. E o aplicativo funciona da mesma forma e não percebe a diferença. Nem todas as aplicações são tão bem escritas. É claro que o sistema moderno terá melhor desempenho e fornecerá muito mais recursos ao usuário, mas o aplicativo não sabe nada disso.

Isso significa muito trabalho para projetistas e desenvolvedores de sistemas operacionais, mas muitos milhões de usuários obtêm os benefícios.

    
por 22.08.2018 / 19:04