Escrito por
Mateus Almeida
em
Resumo SO 1
Um SO pode ser dividido em 4 compenentes:
- Hardware;
- SO;
- Programas de aplicativos;
- Usuários.
Middleware: conjunto de estruturas de software que fornece serviços adicionais para desenvolvedores de aplicativos.
Bit de modalidade: bit de controle de mudança de acesso (0 - kernel, 1 - usuário). Tem como finalidade de, ao realizar uma syscall, o bit vira 0 e vai para o modo kernel, realiza os procedimentos e retorna, chamando outra syscall, transformando o bit em 1 para a modalidade de usuário.
Baseado em gerenciamento de processos, um SO é responsável por:
- Escalonar processos;
- Criar e excluir processos;
- Suspender e retomar contexto de processos;
- Sincronização;
- Comunicação.
Baseado em gerenciamento de memória, um SO é responsável por:
- Alocar, desalocar e realocar espaço de memória;
- Controle de acesso da memória para alocação correta e gerenciamento de quais processos estão usando quais regiões da memória;
- Gerenciamento de memória virtual / virtualização.
Baseado em gerenciamento de armazenamento, um SO é responsável por:
- Gerenciamento de arquivos e diretórios (criar, apagar, copiar, etc);
- Mapear arquivos na memória secundária;
- Fazer backup de arquivos.
Baseado em gerenciamento de disco, um SO é responsável por:
- Gerenciamento de espaço livre;
- Alocar espaço de armazenamento;
- Fazer escalonamento do disco.
APIS: API Windows, WIN32, POSIX, API JAVA.
Categorias de chamadas de sistema:
- Controle de processos;
- Comunicação;
- Proteção;
- Manipulação de arquivos e dispositivos;
- Manipulação de dados.
Estados do processo:
- Novo: cria um novo processo;
- Em execução: o processo está sendo executado;
- Em espera: esperando a liberação de outro processo, para assim ser executado;
- Pronto: processo ocioso para execução na fila de prontos;
- Concluído: terminação do processo.
Existem dois tipos de comunicação interprocessos: passagem de mensagem e memória compartilhada. Na passagem de mensagem temos a passagem direta, indireta, simétrica e assimétrica. Na memória compartilhada, temos uma região de memória (Ex: variável) que tem seu recurso consumido por mais processos.
- Direta: link direto do receptor pro destinatário (Tunel ssh);
- Indireta: link indireto do receptor pro destinatário (Proxy);
- Sincrona: tanto o receptor quanto o destinatário precisam informar o nome um do outro como argumento;
- Assincrono: somente o receptor precisa informar quem é o destinatário, o destinatário não se importará de qual receptor a mensagem irá chegar.
Existem maneiras de implementar o send() e o receive():
- Blocking send: o processo remetente é bloqueado até a mensagem ser recebida pelo destinatário;
- Non-blocking send: o processo remetente envia a mensagem normalmente sem ser bloqueado;
- Blocking receive: o processo receptor fica bloqueado até a mensagem chegar;
- Non-blocking receive: o processo receptor recebe a mensagem sem ser bloqueado.
#define BUFFER_SIZE 10000
int BUFFER_AUX = 0;
void producer (void R) {
while (1) {
if (BUFFER_AUX < BUFFER_SIZE) {
BUFFER_AUX++;
}
consumer(R); // next consumer
}
}
void consumer (void R) {
while (1) {
if (BUFFER_AUX > 0) {
BUFFER_AUX--;
}
producer() // next producer
}
}
Os benefícios de programas multithread podem ser classificados em 4 categorias:
- Capacidade de resposta;
- Compartilhamento de recursos;
- Economia;
- Escalabilidade.
Em geral, 5 áreas apresentam desafios para a programação de sistemas multicore:
- Identificação de tarefas;
- Equilíbrio;
- Divisão de dados;
- Dependência de dados;
- Teste e depuração.