Pilha de uma dll

26/11/2005

1

Senhores, quando dois ou mais aplicativos executam a mesma função de uma dll ao mesmo tempo; o que ocorre ?
Os endereços de pilha são distintos utilizando a memória do aplicativo ou é um único endereço utilizando a memória do Windows ?
Usando ShareMem ou não usando, faria diferença ?

Fiz um teste colocando na função um Sleep de 10 segs; chamei tres vezes o programa que executa essa função no onShow e após 10 segs os tres programas exibiram a tela; ou seja; o segundo programa não esperou 20 segs e nem o terceiro esperou 30 segs. Daí acho que os aplicativos importam a função dentro de sua respectiva memória.

Alguém poderia explicar como funciona ?

Obrigado !


Responder

Posts

26/11/2005

Edilcimar

a teoria básica do windows é de que os programas funcionam de maneira concomitante, cada um pegando um ´pedaço´ da memória e o compartilhamento é feito através da divisão de tempo do processador, ou seja:
prg1->1mb, prg2->2mb, prg3->5mb, teoriamente você teria a partir de um determinado ponto da memória o seguinte: posição 50mb começa o prg1, posição 51mb começa o prg2, posição 56mb começa o prg3, é claro que aqui eu não separei as coisas que cada programa carrega consigo, depois disto o windows ´divide´ o tempo por três e dá uma fração de tempo para o prg1, depois outra para o pr2 e depois outra para o prg3, sendo que dá mais tempo para aquele que tem foco, ou seja um programa (mesmo que seja o mesmo) não deveria ter absolutamente nada com o outro (mas esta divisão é mal feita pela MS e é por isto que dá aquelas ´pequenas´ travadas).


Responder

28/11/2005

Siam

Sim, mas a minha dúvida não é bem esta. Minha dúvida é: Quando dois ou mais programas executam a mesma função de uma dll, esta função é importada na área de stack de cada programa ou o Windows aloca uma área stack para a função ser executada ?


Responder

28/11/2005

Nildo

Sim, mas a minha dúvida não é bem esta. Minha dúvida é: Quando dois ou mais programas executam a mesma função de uma dll, esta função é importada na área de stack de cada programa ou o Windows aloca uma área stack para a função ser executada ?


Seguinte, cada programa carrega uma [b:4502b050a6]cópia[/b:4502b050a6] da sua DLL no espaço alocado para cada um dos programas. Então fica assim:

uma cópia da DLL no espaço do aplicativo 1;
outra cópia da DLL no espaço do aplicativo 2;
outra cópia da DLL no espaço do aplicativo 3;

Essa regra vale para os Windows com kernel baseado em NT. Já nos 9x, as DLLs do windows como user32.dll, gdi32.dll e kernel32.dll, são carregadas em um espaço compartilhado de memória, onde todos os aplicativos acessam essa paginação ( > $80000000 ). Eu falo sobre isso num artigo do meu site: www.ProjetoBms.net. O que era um grave erro no win9x, eles queriam economizar memória sendo que não havia necessidade. Então no NT ficou tudo organizadinho, e cada programa tem sua cópia da DLL rodando no próprio bloco de memória virtual.

Qualquer coisa estamos aí!


Responder

28/11/2005

Siam

Era disso que suspeitava, inclusive para as variáveis globais. Se o Applicativo1 alterar uma variável global na dll, essa alteração não será vista no Aplicativo2.
Obrigado pela resposta !!!


Responder