You are on page 1of 11
7O__Sistemas operacionais madeimos ria se um thread mudasse os tratadores do sinal sem dizer nada a0s outros threads? E se um thread quisesse capturar uum sinal especifico (por exemplo, quando o usuétio digi tasse CTRL-C) ¢ outro thread requisitasse esse sinal para terminar 0 processo? Uma situagao como essa pode surgir quando um ow mais threads executam rotinas da biblio- teca-padrio enquanto outtos utilizam rotinas escritas pelo usuario. Esses desejos so claramente incompativeis. Em geral, sinais sio suficientemente diffceis de gerenciar em uum ambiente monothread, Converter para um ambiente ‘multithread nao torna mais {cil a tarefa de traté-los. Um iiltimo problema introduzido por threads é 0 ge~ renciamento da pitha. Em muitos sistemas, quando ocorre uum transbordo da pilla do processo, o niicleo apenas garan- te que o processa ters automaticamente mais pilha. Quan- do possut miihiplos threads, um processo também deve ter ialtipls pilhas. Se nao estiver ciente de todas essas pilhas, © miicleo nao poderé fazé-las crescer automaticamente pot ocasiéo da ocorténcia de uma “falta de pilla” (stack fault). Na verdade, cle pode nem perceber que um erro na memétia esté relacionado com o crescimento da pilha. Esses problemas certamente nao sfo insuperdvels, mas mostram que a mera introducio de threads em um sistema existente no vai funcionar sem um bom reprojeto. No himo, as semanticas das chamadas de sistema poster py cisar ser redefinidas e as bibliotecas, reescritas. E tudo isso tem de ser feito a fim de manter compatibilidade com pro- ‘gramas jd existentes para 0 caso limitante de um processo com apenas um thread. Para informagées adicionais sobre treads, veja Hauser et al, (1993) e Marsh et al. (1991), EE] Comunicacao entre processos Frequentemente processos precisam se comuicar com ‘outros. Por exemplo, em um pipeline do interpretador de co- mandos, o safda do primeiro processo deve ser pasaada para ‘segundo processo,e isso prossegue até fim da linha de co: mando. Assim, hi uma necessidade de comunicagao entre processos que deve acorrer, ce preferénicia, de uma maneira ‘bem estruturada ¢ sem interrupgdes. Nas priximas sectes estudaremos alguns dos assuntos relacionados & comuni- cagao entre processos (inierprovesscomnuurication —IPC).. Muito resumidamente, ha trés t6picos em relagio a isso que devem ser abordados. © primeiro & o comentado an- teriormente: como um processo passa informacio para um outro. © segundo discute como garantir que dois ou mais, processos nao entrem em conflito, por exemplo, dois pro- Figura 2.17. Exchsto mitue usende exes enteas mente como um resultado da intertupgi do religio ou de Varidvels do tipo trava (Jock) ‘outra interrupgio. Com as interrupgbes desligadas, a CPU. nao seré mais chaveada para outro processo. Assim, uma ver que tenha desabilitado as interrupgbes, um processo pode verificar e atualizara meméria compartthada sem te- mer a intervengio de um outro process. De modo geral, essa abordagem nio é interessante, porque nao é prudente dar aos processos dos usudtios 0 poder de desligar interrupcdes. Suponha que um deles te- nha feito isso e nunca mais as tenha ligado. Esse poderia ser o fim do sistema, Alm disso, se o sistema for um multi processador (com duas ou mais CPUs), desabilitar as inter rrupgGes afetaré somente a CPU que executow a instrugio dsable (desablitar). As outras continuardo executando © tendo acesso meméria compantilhada. Pot outro lado, frequentemente convém ao préprio nnicleo desabilitar interrupgoes. para algumas poucas ins- irugdes, enquanto estiver alterando variveis ou listas. Se ‘ocorrer uma intetrupgdo — por exemplo, enquanto a lista de processos prontos estiver em um. estado inconsisten- te —, poderd haver condigies de corrida. A conclusio é: desabilitar interrupgbes muitas vezes & uma técnica bastan- te titl dentro do préprio sistema operacional, mas inade- quada como um mecanismo geral de exclusio mata para processos de usutio, A possibilidade de realizar exclusio miitua desabilitan- do interrupges — mesmo dentro do niicleo — esta se tor. nando menor a cada dia em virtude do ntimero crescente de chips multiniicleo até em PCs populares. Dois micleos ja Go comuns, quatro estdo presentes em méquinas sofstcadas, € oto ou 16 virao em breve. Em um sistema multicore (mmul- tiprocessador), desabilitar as interrupgies de uma CPU ni impede que outras CPUs interfiram nas operagoes que a primeira CPU esté executando. Consequentemente, esque- ‘mas mals sofsticados sio necessétios. Como uma segunda tentativa, busquemos uma solugo dle software. Considere que haja uma tinica vatidvel com= partlhada (trava), inicialmente contenda 0 valor 0. Para entrar em sua regido critica, um processo testa antes se ha trava, verificando o valor da varidvel trava. Se trava for 0,0 processo altcra essa varivel para I c entra na regiio critica Se trav jé estiver com o valor 1, 0 processo simplesimente aguardara até que ela se torne 0. Assim, vim O significa que nnenhum processo esid em sua regio erica e um 1 indica que algum processo esté em sta regido critica Infelizmente, essa ideia apresemta exatamente a mes ma falha que vimos no diretério de spool. Suponha que tum proceso leia a varidvel trae veja que ela € 0. Antes «que possa alterar a variavel trava para 1, outro processo & escalonado, executa e altera a varidvel trava para 1. Ao exe: cutae novamente, o primeito processo também colocard 1 nna varidvel trav, assim, os dos processos estarao em suas, regides criticas ao mesmo tempo. Agora voc’ pode pensar que seria possivel contornar esse problema endo primero a varidvel frava e, entao, ver ficé-Ia novamente, um pouco antes de armazend-la, Mas de que isvo adianteria? A disputa entdo ocorreria se 0 xegundo proceso modificasse a variével trava um pouco depois de Co primeiro processo ter terminado sua segunda veriicagio. Chaveamento obrigatério Um teeceiro modo de lidar com 0 problema da exclu- sio mttua ¢ ilustrado na Figura 2.18. Esse fragmento de programa — como quase todos os outros deste livro — fol escrito em C. € foi escolhida aqui porque os sistemas ope- racionais reais Si0 quase todos escritos em C (ou, ocasio- nalmente, em C+), mas muito dificimente emt linguagens como Java, Modula 3 ou Pascal. C & uma linguagem po- derosa, eficiente e previsive, caracteristicas fundamentais para escrever sistemas operacionais. Java, por exemplo, while (TRUE) { while (turn critical tun = 4; oneritcal_region( Js » ago "Fs region(); (a) while (TRUE) ( vis (wart critical region( ); tun = rroncsitical_region(}; kag “Ts © Figura 2.18 Solucao proposta para 6 problema da regiao ‘tia. (a) Proosssc 0. (o} Processo 1. Em ambos 0s ¢2508, no deixe da obsomvar 0s ponto-e-vigulas concluindo os ‘comands whl, indo € previsivel porque a meméria pode se esgotar em um momento critico, sendo preciso invocar 0 coletor de lixo {garbage collector) em uma hora inoportuna. Iss0 no acon teceria com €, em que ndo hé coleta de lixo, Uma com poragio quantitativa entre C, C++, Java e outras quatro linguagens pode ser verificada em Prechelt (2000), Na Figura 2.18, a varidvel inteira tur, inicialmente 0, serve pata controlar a ver de quiem entra na regido critica € verifica ou atualiza a mennéia compartilhada, Inicialmen- te, © processo 0 inspeciona a varidvel turn, enconira la 0 valor 0 e entra em sta regido critica. © processo 1 também encontra Id 0 valor 0 ¢, cntdo, fica em um lago fechado testando continuamente para ver quando a variével turn se torna 1, Testar continuamente uma varidvel até que algum valor apareca & chamado de espera ociosa (iusy waiting). A espera ociosa deveria em geral ser evitada, j4 que gasta tempo de CPU. Somente quando hd uma expec- Tativa razodvel de que a espera seja breve & que ela é usada, Uma varidvel de trava que usa a espera ociosa 6 chamada de trava giratéria (spin lock}, Quando deixa a regido critica, © processo 0 pe a variavel tur em 1, para petmitir que 0 processo 1 entre em sua regido critica. Suponha que 0 pracesso 1 tenha terminado rapidamente sua regido critica e, assim, ambos, 1s processos ndo estejam em suas regides crticas, com a varidvel turn em 0. Agora, 0 proceso 0 executa todo o seu lago rapidamente, saindo de aua regio critica ¢ colo cando a varidvel tur em 1. Nesse ponto, a varlével tera € 1 e oy dois processos estdo executando em suas regides ngo-ctiticas. De repente, 0 processo 0 termina sua regido nao critica € volta a0 infcio de seu lago. Infelizmente, a ele néo ser ppermitido entrar em sua regiao critica agora, pois a varidvel {urn est& em 1 e 0 processo 1 est ocupado com sua regia BLES) aia Capitulo 2 _Processos e threads 73 no critica. © processo 0 fica suspenso em seit Iago wile até que 0 processo 1 coloque a varidvel turn em 0. Em outras palavras, chavear a vez nao é uma boa ideia quando um dos processos for muito mais lento que o outto. Essa situagio viola a condigéo 3 estabelecida anterior- mente: 0 processo 0 esta sendo bloqueado por um process que nao esté em sua regido critica. Voltando ao diretdrio de spool discutido ha pouco, se associdssemos agora a regio

You might also like