4.7 Modelos de gerenciamento de mem´ oria
4.7.5 Segmenta¸c˜ao
Enquanto que a organiza¸c˜ao da mem´oria atrav´es da pagina¸c˜ao ´e um modelo puramente unidimensional, isto ´e, o espa¸co de endere¸camento virtual ofe- recido a cada um dos diversos processos ´e ´unico e linear, a segmenta¸c˜ao prop˜oe um modelo bidimensional, onde cada processo pode utilizar-se de diversos espa¸cos de endere¸camento virtuais independentes. Este conceito foi introduzido nos sistemas Burroughs e Multics [GUI86, p. 137].
Num esquema de mem´oria segmentada, o espa¸co de endere¸camento vir- tual ´e dividido em blocos de tamanho vari´avel, onde cada bloco pode as- sumir tamb´em um posicionamento vari´avel, isto ´e, para um dado processo, enquanto cada segmento deve ocupar um espa¸co de endere¸camento cont´ınuo na mem´oria f´ısica, n˜ao existe necessidade dos diversos segmentos deste pro- cesso estarem alocados de forma cont´ıgua ou sequer ordenada. Estes blocos s˜ao denominados segmentos de mem´oria ou simplesmente segmentos, como ilustrado na Figura 4.25.
´
E comum que os segmentos possuam um tamanho m´aximo, limitado ao tamanho da mem´oria f´ısica do sistema e um n´umero m´aximo de segmentos distintos. Cada segmento representa um espa¸co de endere¸camento linear independente dos demais segmentos, isto permite que cada segmento possa crescer ou diminuir conforme suas necessidades e livremente de outros seg- mentos. Uma situa¸c˜ao poss´ıvel e comum ´e a de um processo que possui um segmento de c´odigo (o programa em si), um ou mais segmentos de dados e um segmento para sua pilha (stack ), todos com diferentes tamanhos.
Dado que um segmento ´e uma unidade l´ogica, o programador deve ex- plicitamente determinar sua utiliza¸c˜ao. Embora seja poss´ıvel ter-se c´odigo,
4.7. MODELOS DE GERENCIAMENTO DE MEM ´ORIA 129
Figura 4.25: Armazenamento prim´ario na segmenta¸c˜ao
dados e pilha num ´unico segmento, isto representa uma m´a utiliza¸c˜ao desta estrutura de organiza¸c˜ao da mem´oria, invalidando seus benef´ıcios.
A organiza¸c˜ao da mem´oria em segmentos favorece e simplifica a orga- niza¸c˜ao de estruturas de dados, principalmente as de tamanho vari´avel em tempo de execu¸c˜ao. Al´em disto oferece importantes facilidades do ponto de vista de compartilhamento e prote¸c˜ao. Por exemplo, uma biblioteca de fun¸c˜oes pode ser colocada num segmento e compartilhada pelas diver- sas aplica¸c˜oes que as necessitem. A cada segmento podem ser associados tipos de acesso que especifiquem as opera¸c˜oes que podem ser executadas no segmento, tais como leitura (read ), escrita (write), execu¸c˜ao (execute) e anexa¸c˜ao (append ). Tais opera¸c˜oes podem ainda ser associadas a modos de acesso espec´ıficos, criando um amplo conjunto de possibilidades ´uteis para implanta¸c˜ao de esquemas de seguran¸ca [DEI92, p. 233].
Num sistema de segmenta¸c˜ao pura, os endere¸cos virtuais, cuja estrutura se indica na Figura 4.26, s˜ao denominados v e tomam a forma de pares ordenados (s, d), onde s representa o n´umero do segmento e d a posi¸c˜ao desejada, ou seja, o deslocamento (displacement ou offset) a partir da origem deste segmento. Notamos que a forma¸c˜ao dos endere¸cos na segmenta¸c˜ao ´e semelhante a existente na pagina¸c˜ao.
Um processo somente pode ser executado se ao menos um de seus seg- mentos contendo c´odigo estiver presente na mem´oria f´ısica. Para isto seg- mentos devem ser transferidos da mem´oria secund´aria para a mem´oria pri- m´aria da mesma forma que as p´aginas no esquema de pagina¸c˜ao, ou seja, cada segmento deve ser transferido inteiramente e posicionado numa regi˜ao cont´ınua de mem´oria.
Isto indica que os segment faults s˜ao opera¸c˜oes mais lentas, dado que os segmentos s˜ao usualmente maiores do que as p´aginas, e tamb´em me- nos freq¨uentes, pois o n´umero de segmentos de um processo ´e tipicamente menor que o n´umero de p´aginas equivalente. Outro ponto ´e que deve ser determinada qual regi˜ao de mem´oria permite a coloca¸c˜ao do novo segmento, opera¸c˜ao que pode ser realizada atrav´es de algoritmos que apliquem as es- trat´egias de posicionamento (placement strategies). O segmento que deve ser substitu´ıdo, em caso de um segment fault, deve ser obtido atrav´es de al- goritmos que implementem as estrat´egias de substitui¸c˜ao (replacement stra- tegies).
O mapeamento dos endere¸cos virtuais em endere¸cos reais pertencentes aos segmentos corretos se faz de maneira idˆentica `a pagina¸c˜ao, ou seja, utiliza um esquema de mapeamento e tabelas de mapeamento de segmentos (segment map tables):
1. MMU recebe o endere¸co virtual contido nas instru¸c˜oes do programa. 2. O n´umero de segmento virtual ´e usado como ´ındice na tabela de seg-
mentos.
3. Obtˆem-se o endere¸co f´ısico de in´ıcio do segmento ou ocorre um segment fault.
4. MMU comp˜oe o endere¸co final usando o endere¸co de in´ıcio do segmento e uma parte do endere¸co virtual (displacement).
O mecanismo de convers˜ao de endere¸cos depende da organiza¸c˜ao das tabelas de segmentos e da forma do mapeamento (mapeamento direto ou mapeamento associativo).
Exemplos de sistemas computacionais que utilizaram a segmenta¸c˜ao pura s˜ao:
• Burroughs B6700, computador do in´ıcio da d´ecada de 60, com arqui- tetura tipo pilha [GUI86, p.157].
• HP 3000, minicomputador tipo pilha cujo espa¸co l´ogico consistia de at´e 255 segmentos de c´odigo execut´avel de 16 KBytes cada e um ´unico segmento de dados de 64 KBytes manipulado por hardware [GUI86, p.172].
4.7. MODELOS DE GERENCIAMENTO DE MEM ´ORIA 131 • Intel 8086/8088, microprocessador de 8 bits, oferecia um espa¸co de endere¸camento l´ogico de 1 MByte, podendo efetuar o endere¸camento f´ısico de no m´aximo 64 KBytes, tamanho m´aximo dos segmentos que administrava [BOR92, p. 342].
• IBM OS/2 1.x (Operating System/2), voltado para o microprocessa- dor Intel 80286, utilizava segmenta¸c˜ao pura, onde o tamanho m´aximo dos segmentos era 64 Kbytes, espa¸co de endere¸camento virtual de 512 MBytes por aplica¸c˜ao e mem´oria f´ısica m´axima de 16 MBytes [IBM92b, p. 11][LET89, p. 142].
• Microsoft Windows 3.x, tamb´em dirigido para o microprocessador In- tel 80286, usava segmenta¸c˜ao pura, segmentos de no m´aximo 64 KBy- tes, 48MBytes de espa¸co de endere¸camento virtual e mem´oria f´ısica m´axima de 16 MBytes [IBM92b, p. 14].
Apesar de ser um esquema de organiza¸c˜ao de mem´oria que oferece uma s´erie de vantagens, a segmenta¸c˜ao apresenta uma grande desvantagem: con- forme os segmentos se tornam grandes, as opera¸c˜oes de posicionamento e substitui¸c˜ao tendem a se tornar lentas conduzindo o sistema a uma situa¸c˜ao de ineficiˆencia. Existe ainda o problema maior de um segmento individual se tornar maior que a mem´oria f´ısica dispon´ıvel no sistema. A solu¸c˜ao desta desvantagem se d´a na utiliza¸c˜ao conjunta dos esquemas de segmenta¸c˜ao e pagina¸c˜ao, como veremos mais a frente.