next up previous contents index
Next: Detalhes da versão intermediária Up: Detalhes na utilização do Previous: Detalhes na utilização do

Detalhes da versão simples

A versão simples do gerenciador de memória esta baseada em um esquema de alocação contínua, em que o próximo bloco alocado estará localizado ao final do último bloco.

Para que o endereço tenha um crescimento positivo para o usuário, ou seja, para que uma posição no bloco possa ser expressa como $\mathit{endereco+offset}$, o sentido da alocação deve ser do maior endereço disponível para o menor. Sendo assim, o endereço de um nov o bloco pode ser encontrado pela função bnnk_malloc() por:

\begin{displaymath}
novo\_endereco=endereco\_ultimo\_bloco-tamanho\_requerido \end{displaymath}


 
Figura: Sentido de Crescimento da Memória e da Alocação 
\begin{figure}

\begin{center}

\includegraphics [height=0.33\textheight]{memoria.eps}
\end{center}\end{figure}

Cada bloco alocado é representado por uma estrutura contendo sua posição e tamanho, armazenada em um vetor de tamanho fixo (1024), o que limita a quantidade de blocos que podem ser alocados simultaneamente. Como nesta versão não há gerência de blocos liberados e de fragmentos de memória, um bloco alocado não pode ser retirado da meória, mas ele é removido deste vetor.

Na figura Sentido de Crescimento da Mem=F3ria e da Aloca=E7=E3o, tem-se representado o sentido de crescimento real da memória, e o sentido que a alocação percorre. Essa informação é muito relevante quando se está trabalhando com alocação contínua, utilizada na versão simples, pois o próximo endereço a ser alocado depende do último.

Na versão intermediária, esse fato não é de importância, pois, primeiramente, é criado um bloco, na lista de blocos disponíveis, contendo toda a memória e, posteriormente, este bloco pode ser fracionado do menor para o maior endereço.

Analisando o caso da versão simples, quando um usuário requisita um bloco de tamanho x, o sistema pega o endereço do último bloco alocado e subtrai esse tamanho, encontrando diretamente o valor do novo endereço:

\begin{displaymath}
novo\_endereco=ultimo\_endereco - x; \end{displaymath}

Se o sistema fizesse uma alocação iniciando no menor endereço, teria-se que somar ao endereço do último bloco alocado o tamanho deste bloco, uma informação que exige um passo demorado, para encontrar o tamanho do bloco (utilizando a função bnnk_getsize()):


next up previous contents index
Next: Detalhes da versão intermediária Up: Detalhes na utilização do Previous: Detalhes na utilização do
rafael@safecore.net