# data[].attributes.body
A Microsoft começou o desenvolvimento de um Gerenciador de Interface (subsequente renomeado Microsoft Windows) em setembro de 1981.

O Windows só começa a ser tecnicamente considerado como um SO a partir da versão Windows NT, lançada em Agosto de 1993.

O que havia antes eram sistemas gráficos sendo executados sobre alguma versão dos sistemas compatíveis com DOS, como MS-DOS, PC-DOS ou DR-DOS. Somente o MS-DOS era produzido pela própria Microsoft.

O MS-DOS é um sistema operativo que não dispõe de interface gráfica, funciona através de comandos de texto introduzidos no teclado pelo utilizador.

O Windows surgiu inicialmente como uma interface gráfica para MS-DOS, dessa forma, permitia correr programas em modo gráfico, o que permitiu a utilização do mouse em computadores de tipo IBM-PC. Atualmente o Sistema Operacional está na versão Windows 11.

# data[].attributes.body
O que tornou o Windows um padrão de uso foi o acordo feito entre a Microsoft e os fabricantes de computadores. Eles já saíam de fábrica juntamente com o sistema operacional da Microsoft e, devido à popularidade dos computadores, a Microsoft conseguiu atingir um grande número de usuários.

Para usar o Windows, é necessário adquirir a licença da Microsoft, que é paga por computador que vai utilizá-la. O código-fonte do Windows é restrito apenas aos desenvolvedores do sistema operacional. O Windows foi escrito em linguagem C e algumas partes em C++ e Assembler.

# data[].attributes.body
A arquitetura do Windows é dividida em camadas, são elas: HAL, núcleo e executivo, oferecidas em modo supervisor. O conjunto de subsistemas, serviços e aplicações são oferecidos em modo usuário, como a biblioteca do sistema.

A HAL esconde de outros componentes certas diferenças de hardware. A camada do núcleo gerencia as CPUs de modo que elas suportem multithreading e sincronização, e a camada executiva implementa a maioria dos serviços do modo núcleo.

# data[].attributes.body
Os objetos mais importantes no Windows são processos, threads e seções. Os processos possuem espaços de endereçamento virtual e são contêineres para os recursos.  Threads são a unidade de execução e são escalonados pela camada do núcleo utilizando um algoritmo de prioridade no qual o thread pronto de mais alta prioridade sempre é executado, realizando a preempção dos threads de prioridade mais baixa conforme necessário.

# data[].attributes.body
O gerenciamento de processador do Windows fornece serviços para criação, exclusão ou uso de processos e threads. O gerenciador não tem ciência das relações pai-filho ou das hierarquias de processos e não está envolvido no scheduling.

O Windows pode agrupar processos em tarefas com o intuito de aplicar restrições a eles e aos threads que eles contêm, como limitar o uso de recursos por meio da cota compartilhada.

A cada interrupção, exceção ou chamada de sistema, o escalonador pode reavaliar todas as tarefas da fila de prontas e decidir se mantém ou substitui a tarefa atualmente em execução.

# data[].attributes.body
O gerenciador de memória no Windows controla quais partes da memória estão sendo utilizadas e quais não estão. Além disso, o gerenciador de memória é responsável por alocar espaço em memória aos processos que serão executados e liberar as posições de memória ocupadas quando os processos são finalizados.

A memória física recebe o que o Windows julga ser essencial, como o próprio sistema operacional e os aplicativos que o usuário estiver utilizando no momento. O remanescente, sendo aquilo que o Windows julga que não será usado com certa urgência, ficará na memória virtual.

A memória virtual também é utilizada quando se esgota por completo o espaço disponível na memória física. Nesta situação, a memória virtual desempenha um papel de extensão da memória principal.

Sendo assim, o gerenciador de memória é responsável por controlar o swapping presente na execução de programas em andamento. O swapping é a movimentação de processos da memória física para o disco e vice-versa.

Para otimizar o uso de memória, o sistema mantém diversos tipos de listas de páginas. Essas listas de páginas são alimentadas por meio da redução dos conjuntos de trabalho utilizando-se fórmulas complexas que tentam reutilizar páginas físicas que não são referenciadas há muito tempo.

O gerenciador de cache administra os endereços virtuais no núcleo, que podem ser utilizados para mapear arquivos para a memória, melhorando drasticamente o desempenho da E/S para muitas aplicações, já que as operações de leitura podem ser atendidas sem acessos ao disco.

# data[].attributes.body
O Windows emprega três principais sistemas de arquivos: O NTFS, o FAT e o ReFS.

FAT:

O FAT (Tabela de Alocação de Ficheiros) consiste no setor de descrição de uma tabela de alocação de blocos do sistema de arquivos e no espaço de armazenamento simples para armazenar arquivos e pastas. Os arquivos no FAT são armazenados em diretórios. Cada diretório é uma matriz de registros de 32 bytes.

NFTS:

O NTFS (New Technology File System) baseia-se em uma tabela mestre que possui um registro por arquivo ou diretório. Todos os metadados em um sistema de arquivos NTFS também são parte de um arquivo NTFS. Cada arquivo possui múltiplos atributos, que tanto podem estar no registro da MFT quanto não estarem residentes. O NTFS suporta Unicode, compactação, uso de diário, criptografia e outros recursos.

ReFS:

O ReFS (Sistema de Arquivos Resiliente) tem uma arquitetura de sistema de arquivos totalmente diferente de outros sistemas de arquivos do Windows, é organizada principalmente na forma de B+-tree. O ReFS foi projetado para ser mais resiliente à corrupção de dados, melhor desempenho para determinadas cargas de trabalho e escala melhor para sistemas de arquivos muito grandes.

# data[].attributes.body
O Linux foi criado tendo por base no padrão POSIX (Portable Operating System Interface Unix), esse padrão foi desenvolvido pelo IEEE (Instituto de Engenheiros Elétrico Eletrônicos) para uniformizar as características dos sistemas baseados no Unix.

Sendo assim, podemos dizer que o Linux é um UNIX, mas não que ele é o UNIX. Veja que o Unix é um marca registrada do Unix Lab, todos os sistemas baseados de alguma forma nele são chamados de Unix, porém não é o Unix em si, somente baseado.

Em 1983 Richard Stallman fundou a Free Software Foundation (FSF) cujo projeto GNU (Gnu is not Unix) tinha por finalidade criar um clone melhorado e livre do sistema operacional Unix, mas que não utiliza-se seu código-fonte.

Nessa época vários esforços independentes para desenvolver clones do UNIX estavam em andamento. O Dr. Andrew Stuart Tanenbaum desenvolveu o Minix como instrumento de ensino baseado no processador Intel 8086, por ser comum e barato. Entretanto, o 8086 não dispunha de memória virtual e só endereçava 1MB de cada vez. Isso era um enorme empecilho para um sistema operacional moderno e multitarefa.

Linus Benedict Torvalds percebeu que o Intel 80386 era o único microprocessador capaz de executar um clone do Unix, mesmo que o 80386 não fosse barato, ele era o único disponível. Sua opção por esse processador foi correta, garantindo futuramente que seu desenvolvimento ganhasse novos voluntários.

Por volta de 1991, o sistema GNU estava quase pronto, exceto pelo kernel. Ao mesmo tempo, Linus Torvalds havia criado um kernel compatível com as aplicações do projeto GNU inspirado no Minix, um sistema Unix desenvolvido por Andy Tanenbaum. A esse kernel foi dado o nome de Linux.

# data[].attributes.body
O mascote oficial do sistema é o pinguim. Simplesmente pelo fato de o Linus Torvalds gostar de pinguins. Em uma discussão em grupos, ele declarou que tinha simpatia pelo animal. Isso bastou para o mundo adotá-lo como o símbolo do Linux. O nome dele é Tux.

# data[].attributes.body
O projeto GNU foi lançado em Setembro de 1983 por Richard M. Stallman para criar um Sistema Operacional completo de Software Livre. Stallman fundou a "Free Software Foundation" (Fundação de Software Livre) em Outubro de 1985 para suportar aspectos administrativos, legais e organizacionais do projecto GNU e também para difundir o uso e conhecimento do Software Livre.

O nome do projeto GNU é resultado do acrônimo redundante "GNU's Not Unix."  Software livre se refere à liberdade dos usuários executarem, copiarem, distribuírem, estudarem, modificarem e aperfeiçoarem o software. Esses direitos são garantidos por uma licença especial, a GPL (General Public License), que garante que o software utilizado seja denominado Software Livre.

O projeto GNU consiste em inúmeros pequenos sub-projetos mantidos por voluntários ou empresas ou combinações destas duas. O projeto GNU não é somente desenvolvimento e distribuição de alguns softwares livres úteis. O coração do projeto GNU é uma ideia: que software deve ser livre, e que a liberdade do usuário vale a pena ser defendida.

# data[].attributes.body
Uma distribuição Linux é um sistema operacional Unix-like incluindo o kernel Linux e outros softwares de aplicação, formando um conjunto.

Há basicamente duas formas de distribuições:

As mantidas por organizações comerciais, como a RedHat, Ubuntu, SUSE, etc.

As mantidas por comunidades, como o Debian, Gentoo, Slackware, CentOS, etc.

Há distribuições que servem de base para outras distribuições, chamadas de meta distribuições. Por exemplo o Debian: Ubuntu, linuxmint.

# data[].attributes.body
Linux é um termo utilizado para se referir a sistemas operacionais que utilizam o kernel Linux. O Linux foi escrito em linguagem Assembler, mas depois foi reescrito em linguagem C. Suporte a multiplataformas tais como: SPARC, ALPHA, PowerPC, ARM, Intel, sejam RISC ou CISC. Conectividade com outros sistemas operacionais como: Apple (MAC-OS), Sun (Solaris), ALPHA (True-64) e Microsoft (Windows).

# data[].attributes.body
O sistema do Linux é dividido em três partes: o kernel, as bibliotecas do sistemas e os utilitários do sistema. Todo o código do kernel do Linux é executado em modalidade privilegiada e não há código de modalidade de usuário embutido no kernel.

O Linux possui três interfaces principais: o shell, a biblioteca C e as chamadas de sistema. Além disso, uma interface de usuário gráfica é usada muitas vezes para simplificar a interação do usuário com o sistema.

O kernel é o responsável por todas as abstrações importantes do sistema operacional, as bibliotecas definem as funções por meio das quais as aplicações podem interagir com o kernel e os utilitários são programas que suprem as deficiências do sistema operacional auxiliando em tarefas de gerenciamento.

# data[].attributes.body
O Linux não distingue processo de thread. Na verdade, o Linux utiliza o relacionamento pai-filho para se referir ao fluxo de controle dentro de um programa.

O sistema fornece para cada processo um código PID (Process ID) que o identificará. Os processos podem criar subprocessos, levando a uma árvore de processos.

Um processo pode criar filhos. Um processo que cria filhos é chamado processo pai e os filhos são threads. As threads são linhas de execução do processo pai que compartilham recursos com o processo que o criou.

Os processos filhos são mortos quando o processo pai é morto. Os processos filhos que não finalizam quando o processo pai é finalizado são chamados de processos zumbi.

# data[].attributes.body
O gerenciamento de processador no Linux trata o processador como um recurso compartilhado entre usuários externos e processos internos.

Os processos no Linux são preemptivos, significa que quando um processo entra no estado pronto o kernel vai checar se existe alguma prioridade maior do que o processo corrente. Caso exista, o processo corrente é interrompido e o que tem  maior prioridade começa a rodar.

Existem dois tipos de prioridades: Estática e Dinâmica. A prioridade de um processo no Linux está em constante alteração, o escalonador se mantém informado sobre o que os processos estão fazendo e assim torna-se possível ajustar a prioridade dividindo o tempo da CPU em fatias.

Dessa maneira os processos que ficaram proibidos de utilizar o CPU por um longo intervalo de tempo têm maior prioridades e os processos que passaram um longo período dentro do CPU têm menor prioridade.

# data[].attributes.body
O gerenciamento da memória no Linux tem dois componentes: O primeiro lida com a alocação e a liberação de memória física. O segundo manipula a memória virtual, que é a memória mapeada para o espaço de endereçamento de processos em execução.

O Linux conta com memória virtual paginada, isso significa que podemos ter programas em execução cujo tamanho é maior que a memória física disponível para executá-los.

O sistema operacional passa a ser responsável por manter na memória as partes dos programas efetivamente em uso, deixando o resto no disco rígido.

No Linux, processos que estão em execução têm prioridade na memória, quando termina um processo e havendo espaço na memória, ficam resíduos desse processo para uma futura volta desse processo ser mais rápida.

Os dados não são apagados imediatamente após o encerramento da execução. Isso garante maior agilidade na execução dos processos.

Caso seja necessário mais memória do que a disponível fisicamente, o kernel pode mover páginas pouco usadas da memória para o disco, dessa forma, as páginas devem ser marcadas como presentes ou ausentes na RAM (swap).

# data[].attributes.body
O Linux fornece algumas camadas de abstração para a gerência de arquivos. Essas camadas de abstração permitem que sejam utilizados múltiplos sistemas de arquivos em múltiplos dispositivos de armazenamento. Em linhas gerais, tudo no Linux um arquivo, o que pode variar dependendo do seu tipo.

A identificação dos objetos de um sistema de arquivo no Linux é conhecida como inode. Ele carrega as informações de onde o objeto está localizado no disco, informações de segurança, data e hora de criação e última modificação dentre outras. Quando criamos um sistema de arquivos no Linux, cada dispositivo tem um número finito de inodes que será diretamente proporcional ao número de arquivos que este dispositivo poderá acomodar.

O sistema de arquivos é hierárquico com diretórios pai e filho, seguindo o padrão Filesystem Hierarchy Standard ou FHS. Todos os discos são montados em uma única árvore de diretórios começando em uma raiz única. São alguns exemplos de sistemas de arquivos implementados para o Linux: EXT3, EXT4 XFS, NFS e JFS.