Pilha de uma dll

26/11/2005

2

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

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar