- No terminal digite:
$ git clone https://github.com/andrewlucasgs/ProjetoEDA1.git
$ cd ProjetoEDA1
$ gcc MemoryManager.c -o MemoryManager -pthread
$ ./MemoryManager
- Andrew Lucas Guedes de Souza - 16/0023921
- Nivaldo Pereira Lopo Junior - 12/0039460
- Max Henrique Barbosa - 16/0047013
- Introdução
- Objetivo do projeto
- Requisitos do projeto
- Falhas do projeto
- Problemas conhecidos do projeto
- Melhorias do projeto
- Imagens do Sistema
Relatorios individuais
Um gerenciador de memória de sistemas operacionais, é utilizado para gerir a memória, manipulando espaços na memória, alguns com processos, outros livres. Os processos serão executados por um período de tempo gerado pseudo-randomicamente pelo sistema e a inserção de um novo processo na memória será feita utilizando o método First-Fit, que utiliza a primeira lacuna que encontrar com tamanho suficiente para alocar o processo, esse método é o que possui melhor performance em comparação com os outros métodos.
O projeto visa o desenvolvimento de um simulador de gerenciamento de memória em sistemas operacionais, utilizando a linguagem C.
-
Os processos devem ter como parâmetros o seu tamanho (em Kbytes) e o tempo de execução (em segundos).
-
Os processos devem ser alocados na memória de acordo com o seu tamanho e devem ter um identificador (label).
-
O processo deve ser colocado na primeira região de memória (a contar do início para o final da memória) onde esse processo couber.
-
O programa deve tentar encontrar uma forma de reorganizar os processos na memória de modo a acomodar o novo processo. Se depois dessa tentativa não houver espaço disponível, deve-se imprimir a seguinte mensagem: "Não foi possível alocar memória para o processo: [label do processo]".
-
O tempo de execução de um processo é aleatório (não previsível). Portanto, caberá ao aluno definir como ele vai simular esse tempo de execução e o término de um processo. Sugere-se ainda que o programa imprima o registro de entrada e saída de processos na memória.
-
O programa deve ser capaz de imprimir, a qualquer momento, quais posições de memória estão ocupadas (P) e quais estão livres (H). Imagine que a memória é um grande vetor onde cada posição armazena um Kbyte.
-
Além das opções para inclusão de processos na memória e impressão, o programa deve ter a opção de sair (deixar o programa).
-
O programa deve oferecer a opção de gravar os dados em arquivo. E quando o programa for iniciado, deve ser possível ler as informações desse arquivo para continuar a execução da simulação da memória.
-
A gerência de espaços de processo (P) e buracos (H) na memória deve ser feito por meio de uma lista circular duplamente encadeada, com cabeçalho. Nesse caso, o aluno deve desenhar o nó considerando pelo menos: tipo de nó (P ou H), posição de memória inicial, tamanho da área de memória livre ou ocupada.
O cabeçalho é composto por dois apontadores, um apontando para o primeiro elemento no primeiro endereço da memoria, seja um processo ou um buraco. E outro apontando para o útimo elemento da lista, E por fim um inteiro para registrar a soma de todos os espaçoes livres.
Na lista, cada elemento possui:
Nome | Nome na estrutura | Tipo |
---|---|---|
tipo | type | P - processo ou H - buraco |
id | id | int |
rótulo | label | char |
tamanho | size | int |
Endereço | startAt | int |
Tempo de início | initialTime | int |
Duração | duration | int |
Apontador próximo | next | struct MemoryList |
Apontador anterior | prev | struct MemoryList |
Biblioteca | Descrição | Utilidade |
---|---|---|
stdio | Possui definições de subrotinas de entrada/saída de dados. | Utilizada para ler e mostrar informções. |
stdlib | biblioteca de propósito geral padrão | Alocação de memória, gerar um tempo aleatório para cada processo e limpar a tela |
time | Bibiloteaca dedicada manipulação de datas e horários | Controle de tempo dos processos |
locale | Define configurações específicas da localização | Mostrar caracteres especiais. |
unistd | Permite acesso a ficheiros e diretórios | Função sleep; |
pthread | Biblioteca para manipulação de threads | Utilização de thread para mostrar display e atualização |
string | Manipulação de string | Manipular tempo em formato de string |
Obs: o arquivo é aberto na função shut, para verificar sua existência.
void initializeProcess(Memory * memory, int id, char label, int size, int duration, int initTime, int mode)
Verifica se há processos encerrados na memória, aloca espaço para o novo processo, define as suas informações. Verifica se há espaço na memória maior ou igual a do processo, se sim verifica se é continuo ou não, se não, chama o procedimento compactMemory, caso não seja necessário compactar a memória, a lista é pecorrida e até encontrar o espaço o qual possa alocar o processo. Ao final da alocação, registra em log o processo criado.
Se não há espaço para o processo, uma mensagem é exibida informando o usuário.
Mostra a porcentagem de uso da memória, e como os processos estam alocados nela. além de dados como memória livre, ocupada e total. A tela é atualizada a cada segundo, enquanto o usuario não apertar Enter para voltar ao menu.
A compactação é feita copiando todos processos em execução para um arquivo temporário e depois repassando os processos para a lista seguido da exclusão do arquivo.
- A barra de exebição dos processos na memória, eventualmente fica desalinhada da tabela;
- Exibir o a tabela de processos em execução na mesma tela do menu;
- Desenvolver uma melhor interface gráfica.
- Método mais eficiente para compactação.
Tela de exibição de processos (não há processos)
Tela de exibição de processos (processo A criado)
Tela de exibição de processos (processo A após 27s de execução)
Tela de exibição de processos (processo B criado)
Tela de exibição de processos (processo A encerrado)
- Implementação Geral
Planejamento de funções e implementação, além de implementar a exibição das telas do sistema. - Escrever relatório
Descrever funções, objetivos e requisitos do sistema; - Organizar estrutura do programa
Planejar quais funções necessárias para gerenciamento da memória e qual estrutura utilizar. - Gerenciar o projeto
Distribuir atividades entre os membros do grupo, e guiar o desenvolvimento do sistema.
- Uso de thread para realizar a verificação e encerramento dos processos, que concluiram o tempo de execução.
- Como utilizar a biblioteca pthread, para criação e gerenciamento de threads em C.
- Utilização da bilioteca time.h e como ela funciona, para implementar a verificação do tempo de execução de um processo.
- Como o gerenciamento de memória é realizado, visando planejar quais funções e procedimentos necessários para realização do sistema simulador de gerenciamento de memória.
- Não conseguir implementar um método eficiente de compactação da memória feita com arquivo temporário.
- Consegui identificar onde poderia ser utilizada uma estrutura de pilha, mas não consegui implementar a sua utilização.
- initializeProcess(inicializar e alocar um processo): Tive dificuldades em implemntar uma função que abrangesse todos os casos de inserção de um novo processo na lista, mas após alguns estudos de como é feita a alocação de um novo processo na memória, consegui entender a lógica, e tornou a implementação mais fácil.
- compactMemory (compactar memória): Tentei realizar esse metódo utilizando a estrutura de pilhas, sem sucesso. Mas segui a mesma lógica de pilhas, implementando em arquivo, mesmo sabendo que não é um processo eficiente;
- showMemory (mostrar informações):
No inicio foi fácil, porém depois que decidimos implementar novas funções, essa função se tornou mais complexa, e foi necessário investir mais tempo no estudo de sua implementação e na implementação de fato.
Com a chegada do prazo de entrega, o projeto percebi que não teria tempo suficiente para termina-lo, então decidimos, atrasar, porém entregar um projeto bem feito para compensar o atraso, implementando novas pequenas funcionalidades e deixando o visual mais bonito.
Por fim, gostei bastante da proposta do projeto, consegui aprender bastante informação nova, e úteis para aplicar em projetos futuros.
Definimos formas de criar, encerrar e mostrar os processos em execução. Das dificuldades houve uma certa complicação com o tempo e com as possíveis ferramentas que poderíamos utilizar para resolver coisas de alguns requisitos como, a exibição do tempo de cada processo. Além de procurar outras soluções que viessem de encontro com coisas que eram de nosso conhecimento. Houve ao longo do desenvolvimento pesquisas dos membros e solicitação de auxílio com outros alunos que estavam um pouco mais a frente do curso que entendiam melhor do assunto.
Tirando isso conseguimos alcançar grande parte dos requisitos solicitados, desde tempo e parâmetros a uma possibilidade de poder gravar dados em arquivo.
- Implementação
- Escrita do relatório
- Estudo de maneiras de realizar a compactação de processos.
- Utilização da biblioteca time.h, para implementar a geração da semente para geração de numero pseudorrandômico.
- Estudo da função rand(); para geração pseudorrandômica da duração de um novo processo.
- Estudos relacionado a causas de falhas por segmentação.
- Diversas tentativas de realizar a compactação da memoria, primeiramente ao tentar utilizar pilhas o programa estava encerrando devido a falha por segmentação, após repetidamente tentar resolver este problema (utilizando outras variáveis, vetores e outras maneiras de lidar com a memoria) não foi encontrada solução com pilha para a compactação. Foi então tentado realizar a compactação ao tentar religar os processos ainda ativos retirando a conexão dos mesmos com buracos, ainda assim não foi possível. Portanto a compactação foi realizada utilizando um arquivo temporário.
- A realização desse projeto foi interessante para mim por ser o primeiro projeto de software que realizei em grupo na universidade, uma vez estou realizando essa matéria como optativa na minha grade curricular (curso engenharia aeroespacial). Por estar ocupado com outras matérias e com meu trabalho de conclusão de curso, adiei o inicio deste trabalho e acabei tendo algumas dificuldades, com ajuda de colegas que já cursaram a disciplina e do membro do grupo Andrew consegui entender bem o problema a ser trabalhado e como realizar a implementação das funções que trabalhei no grupo. Em geral, a experiência de realizar esse trabalho e de cursar essa disciplina como um todo tem me ajudado a me profissionalizar e me capacitar mais em desenvolvimento de software, conhecimento que tenho também aplicado em meu TCC, além de um conhecimento mais avançado da linguagem C.