<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Core Code &#187; Sistemas Operacionais</title>
	<atom:link href="http://corecode.wordpress.com/category/sistemas-operacionais/feed/" rel="self" type="application/rss+xml" />
	<link>http://corecode.wordpress.com</link>
	<description></description>
	<lastBuildDate>Thu, 03 Dec 2009 23:46:53 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='corecode.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/501714ae3b790583f2bb3786bef3c5cb?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Core Code &#187; Sistemas Operacionais</title>
		<link>http://corecode.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://corecode.wordpress.com/osd.xml" title="Core Code" />
		<item>
		<title>Algoritmos de exclusão mutua (Regiões criticas)  em Python</title>
		<link>http://corecode.wordpress.com/2008/12/02/algoritmos-de-exclusao-mutua-regioes-criticas-em-python-2/</link>
		<comments>http://corecode.wordpress.com/2008/12/02/algoritmos-de-exclusao-mutua-regioes-criticas-em-python-2/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 17:20:34 +0000</pubDate>
		<dc:creator>leonidaskirotawa</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Sistemas Operacionais]]></category>
		<category><![CDATA[PyThreads]]></category>

		<guid isPermaLink="false">http://corecode.wordpress.com/?p=62</guid>
		<description><![CDATA[Em sistemas operacionais há alguns algoritmos para solucionar os problemas de competição de processos por recursos ou regiões criticas. Os mais conhecidos são a solução de peterson e o de semáforos. Geralmente, ao menos na UFRN, onde eu estudo as soluções implementadas são em Java. Como eu odeio Java, apesar de programar nessa coisa, preferi [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=corecode.wordpress.com&blog=3748115&post=62&subd=corecode&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p style="text-align:justify;">Em sistemas operacionais há alguns algoritmos para solucionar os problemas de competição de processos por recursos ou regiões criticas. Os mais conhecidos são a solução de peterson e o de semáforos. Geralmente, ao menos na UFRN, onde eu estudo as soluções implementadas são em Java. Como eu odeio Java, apesar de programar nessa coisa, preferi fazer as implementações em python e ficaram bons os resultados.</p>
<p style="text-align:justify;">A principio irei falar sobre cada um dos algoritmo e apresentar  a solução em  python =].</p>
<p style="text-align:justify;">
<p style="text-align:justify;">
<p style="text-align:justify;"><span style="color:#000000;"><strong>Solução por Variáveis de travamento</strong></span></p>
<p style="text-align:justify;">Nesse algoritmo há apenas uma variável compartilhada (variável de travamento), cujo o valor inicial é 0. Quando algum processo deseja entrar em sua região critica, ele deve primeiro estar essa variável . Caso ela seja 0, o processo a muda para 1 e entra na região critica. Se o valor da variável de travamento já for 1, o processo vai esperar que o valor volte para 0, antes de entrar na região critica.</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><strong>CODE</strong></p>
<pre class="brush: python;">
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep

lock = 0 # Variável de travamento

class Processo(Thread):

	def __init__(self, p):
		Thread.__init__(self)
		self.p = p

	def run(self):
		global lock
		while True:
			if lock == 0:
				lock = 1
				print &quot;processo %d entrou na regiao critica&quot; %self.p
				lock = 0
				print &quot;processo saiu da regiao critica&quot;
			else:
				sleep(60) # delay de 60
			sleep(3) # delay de 3 só pra deixar tudo mais emocionante =P.

p1 = Processo(0)
p2 = Processo(1)

p1.start()
p2.start()
</pre>
<p style="text-align:justify;">
<p style="text-align:justify;"><strong>Problemas desta solução</strong></p>
<p style="text-align:justify;">Pode ocorrer de um processo ler a variável de travamento com valor 0, mas antes que ele mude o valor para 1 pode ocorrer uma interrupção, e outro processo pode ser colocado para executar. Este segundo processo irá ler lock verificar que o seu valor é 0, seta-lo para 1 e entrar na região critica. Quando o primeiro processo volta vê que no seu contexto lock vale 0, seta o seu valor para 1 e entra na região critica. Ou seja os dois processos estão executando suas regiões criticas ao mesmo tempo.</p>
<p style="text-align:justify;">(Desafio a programadores Java fazerem esse código mais limpo e bonito que em python =P).</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><strong>Solução por Estrita Alternância</strong></p>
<p style="text-align:justify;">Nesta solução há uma variável chamada de <em>turn </em>que inicialmente está com valor 0. É ela quem irá determinar de quem é a vez de entrar na região crítica. A princípio um processo verifica turn se o professo for 0 e o turn for igual a 0 ele entra na sua região crítica, caso contrário ele entra em um loop até que turn seja igual a 1.</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><strong>CODE</strong></p>
<pre class="brush: python;">
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep

turn = 0

class Processo(Thread):

    def __init__(self, myturn):
        Thread.__init__(self)
        self.turn = myturn

    def run(self):
        global turn
        while True:
            while turn != self.turn:
                sleep(3)
            print &quot;Processo&quot;,self.turn
            turn = not turn

p1 = Processo(0)
p2 = Processo(1)
p1.start()
p2.start()
</pre>
<p style="text-align:justify;"><strong>Problemas desta solução</strong></p>
<p style="text-align:justify;">Como deve pra ter notado caso um processo passe muito tempo na sua região crítica o outro irá esperar por um longo tempo até conseguir na sua. Esse teste contínuo do valor de turn, esperando que ela torne-se 1, é chamado de espera ocupada. Em resumo, a espera ocupada deve ser evitada, pois consome tempo do processador. Em casos onde se supõe que a espera será curta, então pode-se usar esta solução.</p>
<p style="text-align:justify;">
<p style="text-align:justify;"><strong>Solução de Peterson</strong></p>
<p style="text-align:justify;">Na solução de Peterson há duas funções uma é a Entrar na região (Enter_regiao), e a outro é Deixar região (Leave_regiao). Entrar na região possui um parâmetro que o numero do processo que está tentando entrar na região critica. Assim como Deixar região.</p>
<p style="text-align:justify;">O algoritmo funciona da seguinte maneira. Quando Enter_regiao é chamado passando o numero do processo que deseja entrar, temos uma variável chamada <em>outro</em>, que nada mais é do que o outro processo. A lista de interessados é atualizada para o processo que entrou na região, com o valor <em>true</em>, e <em>turn</em> receberá o processo corrente. Enquanto <em>turn</em> for igual ao processo corrente, mas o processo interessado for o outro, o processo que chamou Enter_regiao irá ficar em espera ocupada.</p>
<p style="text-align:justify;">No caso da função Leave_regiao é apenas passado o processo que irá sair da região e a lista de interessados para aquele processo é setada como False.</p>
<p><strong><br />
</strong></p>
<p style="text-align:justify;"><strong>CODE</strong></p>
<pre class="brush: python;">
#! /usr/bin/env python
# -*- coding: utf-8 -*-

from threading import Thread
from time import sleep

turn = 0
interessados = [False,False]

class Regiao_critica:
    def __init__(self,processo):
        self.processo = processo

    def enter_regiao(self):
        global turn, interessados

        outro = 1 - self.processo
        interessados[self.processo] = True
        turn = self.processo
        if(turn == self.processo and interessados[outro] == False):
            print &quot;processo %d entrou na regiao critica&quot; %self.processo
        while(turn == self.processo and interessados[outro] == True): pass

    def leave_regiao(self):
        interessados[self.processo] = False
        print &quot;processo %d deixou a regiao critica&quot; %self.processo

class Processo(Thread):

    def __init__(self,processo):
        Thread.__init__(self)
        self.processo = processo

    def run(self):
        r = Regiao_critica(self.processo)

        while True:
            r.enter_regiao()
            r.leave_regiao()
            sleep(3)

p0 = Processo(0)
p1 = Processo(1)

p0.start()
p1.start()
</pre>
<p style="text-align:justify;">Nos próximos post&#8217;s irei falar sobre semaforos, o problema dos filosos glutões, leitores e escritoes e do bardeiro dorminhoco.</p>
<p style="text-align:justify;"><strong>continua&#8230;</strong></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/corecode.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/corecode.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/corecode.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/corecode.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/corecode.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/corecode.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/corecode.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/corecode.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/corecode.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/corecode.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=corecode.wordpress.com&blog=3748115&post=62&subd=corecode&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://corecode.wordpress.com/2008/12/02/algoritmos-de-exclusao-mutua-regioes-criticas-em-python-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/968c524e1d4a4b2b4b22e35672b5be8a?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">kirotawa</media:title>
		</media:content>
	</item>
	</channel>
</rss>