Você está na página 1de 7

Intercomunicao entre processos

Memria compartilhada
Prof. MSc. Pedro Batista de Carvalho Filho

Exerccio
Introduo:
Este exerccio visa explorar na prtica contedo abordado em sala de aula referente a tcnica de
memria compartilhada como forma de intercomunicao entre processos.

Pr-requisitos:

Habilidade com comandos bsicos de Linux;

Instalao de qualquer distribuio Linux com ambiente grfico

Conhecimento de teoria de Sistemas Operaconais;

Programas utilizados para o exerccio:

ipcs (inter-process communication service): Programa do Linux para explorar as reas de


memria compartilhadas invocadas pelo processos;

firefox: Navegador web, utilizado para este experimento pois faz uso da tcnica de memria
compartilhada;

Descrio bsica da tcnica de memria compartilhada:


Esta tcnica consiste em permitir que duas ou mais tarefas em processos distintos se comunicam
sem interveno do sistema operacional aps criado a rea de memria compartilhada, desta forma,
possvel aumentar o desempenho pois haveria uma comunicao direta entre as tarefas de
processos distinto sem exigir a troca de contexto da tarefa para o estado de bloqueado.
A criao da rea de memria compartilhada inicia-se quando uma tarefa do processo realizar uma
solicitao (SystemCall) ao sistema operacional para criao de uma nova rea de memria que ser
utilizada para trocar informaes com tarefas de outros processos.
Aps criado a rea de memria compartilhada, qualquer processo que desejar acess-la, basta
vincular esta rea compartilhada ao seu segmento de memria para obter acesso.

Parte 1 rea de memria compartilhada no Linux (ipcs):


Para anlise e identificao das reas de memria compartilhadas atualmente criadas no sistema
operacional Linux, usaremos o programa ipcs (Inter-Process Communication Service).
O programa ipcs tambm prov informaes de IPC de filas de mensagens e arrays de semforos utilizados
na interconexo entre processos

Nas prximas sesses ser apresentado:

Como visualizar todas as reas de memria compartilhada;

Identificar qual processo iniciou a criao de uma rea me memria compartilhada;

Identificar quanto de memria est sendo utilizado para todas essas reas;

Identificar o limite mximo que cada rea dessa pode consumir de memria.

1.1 Viso geral


Para obter uma viso geral todos os segmentos de memria compartilhada existentes: (opo -m)
[root@vm ~]# ipcs -m
- Segmentos da memria compartilhada key
shmid
owner
perms bytes
nattch status
0x00000000 131072 pedro
600
503216 2
dest
0x00000000 163841 pedro
600
333216 2
dest
0x00000000 196610 pedro
600
1003216 2
dest
...
Compreenso do resultado acima:

chave (key): usado como argumento para as funes msgget( ), semget( ), ou shmget( )
para criar uma nova entrada de segmento;

shmid: Identificador do segmento de memria compartilhada;

proprietrio (owner): Nome do usurio dono do processo na qual soliciou ao sistema


operacional a criao do segmento de memria compartilhada;

perms: Permisses atribudas as segmento de memria compartilhada;

bytes: Tamanho da rea de memria compartilhada;

noattch: total de processos compartilhando o segmento de memria;

status: Informa o status do segmento de memria.

Quando tambm utilizado a opo -p, possvel identificar qual o processo que solicitou ao sistema
operacional a criao de cada rea de memria compartilhada existente, como tambm, identificar o
ultimo processo que acessou, vinculou ou alterou alguma informao dentro da rea de memria
compartilhada.

[root@vm ~]# ipcs -mp


-PIDs Criador/ltima op da memria compartilhadashmid
owner cpid
lpid
131072 pedro
4000
8438
163841 pedro
4322
3438
196610 pedro
4322
8438
...
Compreenso do resultado acima:

shmid: ID do segmento de memria

owner: Usurio do processo que solicitou a criao da rea de memria;

cpid (Created PID): PID do processo que solicitou a criao da rea de memria
compartilhada;

lpid (Last PID): ltimo processo que acessou, vinculou ou modificou alguma informao
dentro da rea de memria compartilhada.

1.2 Sumarizao de consumo atual da memria principal para tcnica


de memria compartilhada
Para visualizar quanto de memria principal est sendo utilizada para uso da tcnica de memria
compartilhada: (opo -mu)
[root@vm ~]# ipcs -mu
------ Shared Memory Status -------segments allocated 34
pages allocated 3200
pages resident 671
pages swapped 0
Swap performance: 0 attempts
0 successes
Principais resultados do resultado acima:

segments allocated: Representa o nmero de segmentos exibidos na sada do comando


(ipcs -m).

pages allocated: Representa o total de pginas alocados na memria principal para


comportar todos os 34 segmentos criados.
Sabendo que uma pgina de memria contm 4Kbytes de memria, e existe 3200 pginas
alocadas, temos atualmente no sistema operacional 12800 Kbytes de memria principal
sendo utilizados por todos os segmentos de memria compartilhada.

1.3 Limite do sistema operacional para tcnica de memria


compartilhada
Para Identificar o limite mximo de memria principal que pode ser utilizado para uso da tcnica de
memria compartilhada, execute: (opo -ml)

[root@vm ~]# ipcs -ml


max number of segments = 5120
max seg size (kbytes) = 358400
max total shared memory (kbytes) = 21474836480
min seg size (bytes) = 1
Compreenso do resultado acima:

Nmero mximo de segmentos (max number of segments): Limita quantos de segmentos


de memria compartilhadas podem ser criadas;

Tamanho mximo de segmentos (max seg size): Este nmero limita o tamanho total de
cada segmento de memria compartilhada, ou seja, o sistema operacional no permitira a
criao de um segmento de memria maior que 358400 Kbyte = 257 Mbyte;

Total mximo de memria compartilhada (max total shared memory): Limita quanto da
memria principal pode ser utilizado pela tcnica de memria compartilhada, o nmero
expressado acima representa um valor muito mair do que atualmente os computadores
podem suportar de memria principal.
21474836480 KByte = 20971520 MByte = 20480 Gbyte = 20 TByte

Parte 2 Ajustando os limites no kernel


Sabendo que os valores apresentados na sesso 1.3 esto relacionados aos limites internos no
Kernel do sistema operacional, logo, possvel alter-los quando houver necessidade.
No sistema operacional Linux, possvel interagir com o Kernel atravs do diretrio /proc, que
no existe fisicamente no disco, apenas um mapeamento na memria para buscar informaes
atuais do kernel e modificar seu comportamento diante dos processos.
Dentro do diretrio /proc/sys/kernel existe alguns arquivos que quando alterados, reflete
diretamente nos limites impostos pelo kernel diante da tcnica de inter-conexo entre processos
utilizando a tcnica de memria compartilhada, so eles:
[root@vm ~]# cat /proc/sys/kernel/shmmax
367001600
[root@vm ~]# cat /proc/sys/kernel/shmmni
5120
[root@vm ~]# cat /proc/sys/kernel/shmall
5368709120
A compreenso do resultado apresentado acima, representa os valores expressos quando executado
o comando ipcs -ml (sesso 1.3):

shmmax: Valor expresso em bytes, representa o limite apresentado em max seg size
(kbyte);

shmmni: Total de segmentos suportados pelo kernel, representado por max number of
segments;

shmall: Valor expresso em pginas (1 pgina = 4Kbyte), representa o limite apresentado em


max total shared memory (kbytes).

Para alterar os valores acima, utilize o programa sysctl, exemplo:


[root@vm ~]# sysctl -w kernel.shmmni=5000
kernel.shmmni = 5000
O programa sysctl utilizado para alterar qualquer valor do kernel que esteja a partir do diretrio /proc/sys.
Logo, se desejarmos, por exemplo, habilitar o roteamento do kernel, o valor no arquivo
/proc/sys/net/ipv4/ip_forward deve ser alterado para 1, assim, utilizaremos o programa sysctl da seguinte
forma: sysctl net.ipv4.ip_forward=1

Apesar do programa sysctl alterar em tempo real parmetros do kernel forando alguma funo
interna mudar seu comportamento, tais mudanas esto gravadas apenas na memria, ou seja,
quando reiniciar o computador, os valores padres deve voltar.
Para que tais valores sejam gravados e aplicados ao iniciar o sistema operacional, necessrio
alterar o arquivo /etc/sysctl.conf, que corresponde ao arquivo de configurao do programa sysctl.
As configuraes inseridas neste arquivo sero aplicadas pelo programa sysctl quando iniciar o
sistema operacional.
Exemplo: Se desejarmos definir que o sistema operacional deve suportar no mximo 1000
segmentos de memria compartilhada, faa:
[root@vm ~]# vi /etc/sysctl.conf
kernel.shmmni = 1000
Observe se no arquivo /etc/sysctl j existe alguma configurao que voc deseja aplicar, por
exemplo o shmmin, pois se houver mais de uma configurao, ser aplicado apenas o ltimo
expressado no arquivo /etc/sysctl.conf.

Parte 3 Aplicando o conhecimento


Este exerccio tem o objetivo de aplicar o conhecimento abordado acima analisando as reas de
memria compartilhada criadas pelo sistema operacional para atender algum programa que
necessite desta tcnica de inter-conexo entre processos. Portanto, siga as instrues abaixo
respondendo as perguntas quando necessrio.
1 Com o programa ipcs, identifique as seguintes informaes:
a. Quantos segmentos de memria existem atualmente criados no sistema operacional?
b. Quantas pginas de memria esto sendo utilizadas?
c. Quanto de memria est sendo utilizada somando todas as reas memria compartilhadas
criadas?
d. Qual o limite de segmentos de memria compartilhada o sistema operacional suporta?
e. Qual o tamanho mximo de um segmento de memria o sistema operacional permite que seja
criado?

2 Analisando o programa firefox:


Abra o navegador firefox e responda as seguintes questes abaixo:
a. Qual o PID do processo relacionado ao programa Firefox?
b. Qual o ID do segmento de memria compartilhada utilizado pelo programa Firefox?
c. Qual o tamanho do segmento de memria compartilhada utilizado pelo programa Firefox?
d. Quantos processos esto compartilhando este mesmo segmento de memria?
e. Qual o nome e o PID do ultimo programa que acessou a rea de memria compartilhada criado
pelo programa Firefox?
3 Fazendo merda no sistema operacional
Obs. Antes de aplicar as configuraes abaixo, copie os valores atuais do kernel para voltar
posteriormente aos valores padres.
a. Sabendo o valor do tamanho do segmento de memria compartilhada utilizada pelo programa
Firefox, altere o tamanho limite permitido de um segmento de memria compartilhada no kernel do
sistema operacional para um valor menor do que o tamanho do segmento de memria criado pelo
programa Firefox. Faa as devidas configuraes sem reiniciar o computador (utilize o programa
sysctl -w ...);
b. Feche o programa Firefox, verifique quantos segmentos de memria existem. Agora, abra
novamente o programa Firefox, observe se foi criado um novo segmento de memria?
c. Altere o valor determinado na questo (a) voltando para o padro.
d. Altere a quantidade limite de segmentos suportados pelo sistema operacional para apenas 2, faa
isso alterando o arquivo (/etc/sysctl.conf). Aps alterao, reinicie o Linux com o comando (init 6),
aps iniciar o sistema, verifique quantos segmentos de memria existem.
e. Volte o valor alterado em (d) para o padro.
4 Explique porque usar a tcnica de memria compartilhada
5 Utilizando a teoria de sistemas operacionais vistas at o momento, explique com o
mximo de detalhes como possvel obter desempenho ao utilizar da tcnica de memria
compartilha?

Referncias:
http://www.linuxcommand.org/man_pages/ipcs8.html
http://www.thegeekstuff.com/2010/08/ipcs-command-examples/
http://gerardnico.com/wiki/linux/shared_memory
http://www-archive.mozilla.org/projects/nspr/reference/html/prshm.html

Anexo 1
Pgina de memria...