Ora aqui está uma excelente curta, sugerida pelo meu colega cozinheiro.
Abraços,
Gama Franco
skip to main |
skip to sidebar
30.5.06
26.5.06
A memória e o Assembly
Na passada segunda-feira ouvi o programa do Prof. Júlio Machado Vaz, e disse uma coisa que me prendeu a atenção. O tema era sobre a memória e surgiu uma frase cujo conteúdo se resumia a:
As pessoas têm uma capacidade muito grande, e as mais despaçaradas simplesmente memorizam as coisas mais importantes.
Achei piada, pois considero-me um despaçarado e nem por isso acho que fixo as coisas mais importantes. Nem as menos, sou um autentico cabeça no ar. Se não fosse o calendário do computador a avisar-me das coisas estava perdido. Quer dizer... isto era a minha opinião, porque hoje tive uma prova em contrário.
Agora vai entrar a parte só para geeks...
Surgiu a dúvida acerca de um simples problema, em que o programa tinha que actualizar uma variável num sistema multi-thread. A solução era simples, já a tinha aprendido na faculdade há uns anos valentes, meter um mutex (ou semáforo) para garantir a exclusão mútua. Apesar disso tudo o detalhe não era óbvio, pois tratava-se apenas de actualizar um apontador, que nada mais é que um valor inteiro. Acontece que esta operação não é atómica, e podem-se perder umas longas oras em debug. De qualquer forma, lembrar-me de meter o mutex já não era mau... mas o mais impressionante é que quando sai do trabalho comecei a lembrar-me de todos os pormenores desta solução, mesmo depois de já terem passados alguns anos de a ter aprendido.... lembrar-me ao detalhe do assembly deixa-me pasmado.
Ora cá vai:
Imaginemos o seguinte programa:
i++
print i;
Isto em assembly vai dar algo como:
mov(ax, 0FFF)
inc(ax)
mov(0FFF, ax)
push(ax)
call(BBBB)
Ou seja, ler para o registo ax o valor que está na posição 0FFF, incrementar o registo, escrever o novo valor na posição de memória. As últimas duas instruções dizem respeito à chamada da função de print.
Isto só com um thread até lá vai... mas os sistemas operativos actuais são multi-threaded. Ou seja, podemos colocar este código a correr duas vezes no mesmo contexto. E o sistema operativo pode suspender uma execução e colocar a outra a correr. Vistas bem as coisas podemos ter asneira.
Para ilustrar vou supor que o valor inicial na posição 0FFF é 0. Se tivermos dois threads a correr o código acima e a partilhar a posição 0FFF no final terá o valor 2, certo? Bem, às vezes sim outras não. As cores servem para ajudar a destinguir os dois threads. Ora vejamos:
mov(ax, 0FFF) --- Thread 1
inc(ax) --- Thread 1
mov(ax, 0FFF) --- Thread 2
inc(ax) --- Thread 2
mov(0FFF, ax) --- Thread 2
mov(0FFF, ax) --- Thread 1
Qual o valor final em 0FFF? Um! Isto porque o primeiro thread foi suspenso antes de escrever o valor de ax em memória.
Como é que se resolve? Com um mutex, um caso particular de semáforos.
Como funcionam os semáforos? Bom, aqui não me lembra ao pormenor. Mas sei se tem que mascarar um interrupt. Este é disparado quando um programa tenta aceder à posição de memória que se pretende proteger (no pior dos casos a qualquer posição). A rotina do interrupt verifica então se a exclusividade está ou não garantida. Se estiver o thread continua a correr, senão este é posto numa fila até o mutex ser libertado.
É o mais longe que consigo ir, mas tendo em conta que dei esta matéria quando ainda andava em Electrotécnica (a cadeira era de Informática mas eu andava a preparar a transferência), não está nada mal. Já lá vão cinco anos, e parece que o Prof. Júlio Machado Vaz tinha razão.
Abraços,
Gama Franco
As pessoas têm uma capacidade muito grande, e as mais despaçaradas simplesmente memorizam as coisas mais importantes.
Achei piada, pois considero-me um despaçarado e nem por isso acho que fixo as coisas mais importantes. Nem as menos, sou um autentico cabeça no ar. Se não fosse o calendário do computador a avisar-me das coisas estava perdido. Quer dizer... isto era a minha opinião, porque hoje tive uma prova em contrário.
Agora vai entrar a parte só para geeks...
Surgiu a dúvida acerca de um simples problema, em que o programa tinha que actualizar uma variável num sistema multi-thread. A solução era simples, já a tinha aprendido na faculdade há uns anos valentes, meter um mutex (ou semáforo) para garantir a exclusão mútua. Apesar disso tudo o detalhe não era óbvio, pois tratava-se apenas de actualizar um apontador, que nada mais é que um valor inteiro. Acontece que esta operação não é atómica, e podem-se perder umas longas oras em debug. De qualquer forma, lembrar-me de meter o mutex já não era mau... mas o mais impressionante é que quando sai do trabalho comecei a lembrar-me de todos os pormenores desta solução, mesmo depois de já terem passados alguns anos de a ter aprendido.... lembrar-me ao detalhe do assembly deixa-me pasmado.
Ora cá vai:
Imaginemos o seguinte programa:
i++
print i;
Isto em assembly vai dar algo como:
mov(ax, 0FFF)
inc(ax)
mov(0FFF, ax)
push(ax)
call(BBBB)
Ou seja, ler para o registo ax o valor que está na posição 0FFF, incrementar o registo, escrever o novo valor na posição de memória. As últimas duas instruções dizem respeito à chamada da função de print.
Isto só com um thread até lá vai... mas os sistemas operativos actuais são multi-threaded. Ou seja, podemos colocar este código a correr duas vezes no mesmo contexto. E o sistema operativo pode suspender uma execução e colocar a outra a correr. Vistas bem as coisas podemos ter asneira.
Para ilustrar vou supor que o valor inicial na posição 0FFF é 0. Se tivermos dois threads a correr o código acima e a partilhar a posição 0FFF no final terá o valor 2, certo? Bem, às vezes sim outras não. As cores servem para ajudar a destinguir os dois threads. Ora vejamos:
mov(ax, 0FFF) --- Thread 1
inc(ax) --- Thread 1
mov(ax, 0FFF) --- Thread 2
inc(ax) --- Thread 2
mov(0FFF, ax) --- Thread 2
mov(0FFF, ax) --- Thread 1
Qual o valor final em 0FFF? Um! Isto porque o primeiro thread foi suspenso antes de escrever o valor de ax em memória.
Como é que se resolve? Com um mutex, um caso particular de semáforos.
Como funcionam os semáforos? Bom, aqui não me lembra ao pormenor. Mas sei se tem que mascarar um interrupt. Este é disparado quando um programa tenta aceder à posição de memória que se pretende proteger (no pior dos casos a qualquer posição). A rotina do interrupt verifica então se a exclusividade está ou não garantida. Se estiver o thread continua a correr, senão este é posto numa fila até o mutex ser libertado.
É o mais longe que consigo ir, mas tendo em conta que dei esta matéria quando ainda andava em Electrotécnica (a cadeira era de Informática mas eu andava a preparar a transferência), não está nada mal. Já lá vão cinco anos, e parece que o Prof. Júlio Machado Vaz tinha razão.
Abraços,
Gama Franco
17.5.06
Aposta
Parece que os tipos do Google fizeram uma aposta de 10 Biliões de Euros...
Abraços,
Gama Franco
Abraços,
Gama Franco
11.5.06
Inocência
Fui ontem assistir à ante-estreia de "Innocence".
É agradável a forma como o filme nos agarra através da capacidade do realizador para gerir o 'mistério'. Resume-se a isto, e tudo o que se acrescentar à sinopse é redundante.
A fotografia é bela e o filme tem traços vincados de cinema europeu. No entanto não admirava se, caso fosse Americano, chegasse a 'Block Buster' com conotação de intelectual. Como a maior parte dos bons filmes polémicos que se fazem na terra do tio Sam, seria candidato a vários Óscares e não ganharia nenhum.
Para saberem qual o tema da polémica que se poderia levantar terão que ver o filme porque eu não vou dizer :p
Abraços,
Gama Franco
É agradável a forma como o filme nos agarra através da capacidade do realizador para gerir o 'mistério'. Resume-se a isto, e tudo o que se acrescentar à sinopse é redundante.
A fotografia é bela e o filme tem traços vincados de cinema europeu. No entanto não admirava se, caso fosse Americano, chegasse a 'Block Buster' com conotação de intelectual. Como a maior parte dos bons filmes polémicos que se fazem na terra do tio Sam, seria candidato a vários Óscares e não ganharia nenhum.
Para saberem qual o tema da polémica que se poderia levantar terão que ver o filme porque eu não vou dizer :p
Abraços,
Gama Franco
Acerca de mim
- Tiago Franco
- CEO, cosmopolita e com gosto pelo mercado de capitais. Sonha um dia viver em hotéis de 5 estrelas, mas ainda não descobriu como lá chegar. Tem um blogue com um 'look' giro mas comum, onde publica artigos de utilidade duvidosa.