
Estou me perguntando como os sistemas operacionais permitem que os processos filhos saibam quanta memória disponível existe.
Digamos que todo o computador tenha 1 GB de memória RAM integrada. O sistema operacional roda e usa 100 MB (não tenho ideia de quanto um sistema operacional realmente usa). Portanto, restam 900 MB.
Então você executa 10 programas. Cada programa cria 10 processos filhos. A questão é: o que esses processos pai e filho veem como a memória total disponível para eles.
Como segunda parte da pergunta para torná-la um pouco mais complexa, digamos que os aplicativos já estão em execução há algum tempo e agora há 500 MB disponíveis no computador (digamos que o sistema operacional usou mais 100 MB e os aplicativos usaram mais 300 MB, para chegar a este nível de 500 MB restantes). A questão agora é o que esses processos pai e filho veem como memória disponível neste momento. Se é igual a antes, ou diferente, e como é diferente.
A razão para a pergunta é porque eu li sobreMemória virtualquais Estados:
memória virtual[é uma] técnica que fornece uma "abstração idealizada dos recursos de armazenamento que estão realmente disponíveis em uma determinada máquina" que "cria a ilusão para os usuários de uma memória (principal) muito grande".
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". Não tenho certeza do que realmente diria, se dissesse ototalem todo o computador ou no total - o uso do sistema operacional.
Então, para o caso (2), seria "1GB disponível", "900MB disponível", "600MB disponível" ou "500MB disponível". Mesma situação, não tenho certeza do que diria.
Também pode ser diferente desses valores. O sistema operacional poderia de alguma forma aproximar a memória disponível para cada um dos 100 processos filhos, talvez dividindo-a igualmente. Portanto, se restarem 500 MB no computador, isso significaria que cada processo receberia "você tem 500/100 == 5 MB de espaço disponível". Mas então, se for esse o caso, se um processo consumisse 5 MB e ainda restassem 495 MB, estou me perguntando se seria permitido começar a usar isso e receber um novo número do que está disponível. É por isso que não acho que seja assim que normalmente é feito, e sim, parece que o sistema operacional diriaprovavelmenteo que está disponível no computadorcomo um todo(então 1 GB).
Além disso, acho que sempre diria "1 GB" porque não tenho certeza se existe uma maneira de determinar quanta memória um único processo está usando (ou se o sistema operacional sabe quanta memória está usando). Se o sistema operacionalfazsabe quanto ele está usando, então parece que ele reportaria 900 MB.
Outra parte da confusão é que, se o uso da memória estiver mudando constantemente, e o sistema operacional informar a cada processo qual é a memória total - a memória usada, então você teria que verificar constantemente quanta memória está disponível se tentasse acessar mais memória. Ou seja, você não poderia armazenar em cache o uso da memória quando o programa fosse iniciado. Pode ser que o programa, parado por algumas horas, comece com 100 MB de memória "no computador", mas depois disso ele verifica novamente para descobrir "ah, espere, há apenas 5 MB disponíveis". Por alguma razão, isso parece um comportamento indesejável, mas não tenho certeza.
Qualquer ajuda para entender geralmente como um sistema operacional informa ao filho processa quanta memória disponível existe em diferentes momentos seria útil. Obrigado.
Responder1
O sistema operacional não "diz" nada ao programa sobre memória livre.
Cada programa opera em sua própria área de memória virtual onde tem acesso (ao que vê como) todo opotencialespaço de endereço de memória permitido. Para um processo de 32 bits, o que é conhecido como "memória" são todos os 4 GB de memória endereçável; para 64 bits, o espaço é muito maior. O processo pode alocar memória daquela área, o que então informa ao sistema operacional que ele precisa proteger á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 ele quer.
Em um sistema com apenas 1 GB de RAM, isso significa que quando a memória física estiver cheia, o sistema operacional começará a enviar dados para o arquivo ou partição de troca. Isto é 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, extrairá os dados do disco e continuará o processo.
Um programa podeconsultaquanta RAM física está livre, para que eles possam se limitar em situações de pouca memória, mas não são limitados artificialmente pelo sistema operacional, a menos que fique sem RAM física e espaço de troca, caso em que o programa simplesmente obterá um erro ao tentar para alocar memória.
Responder2
Uma das grandes vantagens de rodar em um sistema operacional moderno é que os aplicativos não precisam saber quanta RAM existe no sistema ou quanto está disponível. Na verdade, a maioria dos aplicativos ignora completamente 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. É assim que deveria ser. O sistema operacional foi projetado para ser usado dessa forma.
O sistema operacional fornece aos aplicativos um ambiente virtualizado padrão independente do hardware. Em vez de acessar diretamente a RAM, os aplicativos acessam apenas um espaço de endereço virtual independente do tamanho da RAM. Para um aplicativo, isso é memória. 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 da aplicação e disponibilidade de recursos. Esses detalhes são gerenciados pelo sistema operacional e são invisíveis para o aplicativo que não conseguiria descobrir mesmo que quisesse.
Para aplicativos que precisam dessas informações, detalhes de hardware podem ser solicitados ao sistema operacional, mas poucos o fazem. Na maioria das vezes, apenas os utilitários do sistema precisam dessas informações. A maioria das aplicações tem tão pouca necessidade disso quanto o motorista médio precisa saber sobre o ponto de ignição ou as 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 no qual ele está sendo executado. É para isso que serve o sistema operacional. Isso significa que um aplicativo escrito corretamente e projetado para 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 todos os aplicativos são tão bem escritos. É claro que o sistema moderno terá um desempenho melhor e fornecerá muito mais recursos ao usuário, mas o aplicativo não sabe nada sobre isso.
Isso significa muito trabalho para designers e desenvolvedores de sistemas operacionais, mas muitos milhões de usuários colhem os benefícios.