From 4b6bad5600c3b0d5e9cfe5bdf7e29d638f5d9f92 Mon Sep 17 00:00:00 2001 From: "silveira.kaue" Date: Sun, 4 Apr 2010 12:37:25 -0300 Subject: [PATCH] tudo pronto --- makefile | 1 - makefile~ | 2 +- relatorio/relatorio.aux | 1 + relatorio/relatorio.log | 47 ++++++++++++++++++++++++++++++++++++++++------- relatorio/relatorio.pdf | Bin 114694 -> 115026 bytes relatorio/relatorio.tex | 21 +++++++++++---------- relatorio/relatorio.tex~ | 21 +++++++++++---------- 7 files changed, 64 insertions(+), 29 deletions(-) diff --git a/makefile b/makefile index 00e9951..9f53c9d 100644 --- a/makefile +++ b/makefile @@ -4,7 +4,6 @@ all: $(PROG) %: %.8 8l -o $@ $< - #./$@ %.8: %.go 8g $< diff --git a/makefile~ b/makefile~ index 605f628..00e9951 100644 --- a/makefile~ +++ b/makefile~ @@ -4,7 +4,7 @@ all: $(PROG) %: %.8 8l -o $@ $< - ./$@ + #./$@ %.8: %.go 8g $< diff --git a/relatorio/relatorio.aux b/relatorio/relatorio.aux index 4b96c3a..8edf980 100644 --- a/relatorio/relatorio.aux +++ b/relatorio/relatorio.aux @@ -37,6 +37,7 @@ \@writefile{lol}{\contentsline {lstlisting}{../pc\textunderscore sem.go}{12}} \@writefile{toc}{\contentsline {section}{\numberline {4.8}Monitor}{13}} \@writefile{lol}{\contentsline {lstlisting}{../pc\textunderscore monitor.go}{13}} +\newlabel{Monitor}{{4.8}{15}} \@writefile{toc}{\contentsline {section}{\numberline {4.9}Vari\IeC {\'a}vel de Condi\IeC {\c c}\IeC {\~a}o}{15}} \@writefile{lol}{\contentsline {lstlisting}{../pc\textunderscore monitor\textunderscore cond.go}{15}} \@writefile{toc}{\contentsline {section}{\numberline {4.10}The Go Way}{17}} diff --git a/relatorio/relatorio.log b/relatorio/relatorio.log index f51eff5..087e131 100644 --- a/relatorio/relatorio.log +++ b/relatorio/relatorio.log @@ -1,4 +1,4 @@ -This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2010.4.3) 4 APR 2010 12:07 +This is pdfTeXk, Version 3.141592-1.40.3 (Web2C 7.5.6) (format=pdflatex 2010.4.3) 4 APR 2010 12:30 entering extended mode %&-line parsing enabled. **relatorio.tex @@ -591,11 +591,38 @@ File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc Cap\'{\i }tulo 3. (/usr/share/texmf-texlive/tex/latex/base/utf8.def File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc ) [5 ] (/usr/share/texmf-texlive/tex/latex/base/utf8.def File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc ) [6] (/usr/share/texmf-texlive/tex/latex/base/utf8.def File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc @@ -606,6 +633,12 @@ File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc ) (/usr/share/texmf-texlive/tex/latex/base/utf8.def File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc +) +(/usr/share/texmf-texlive/tex/latex/base/utf8.def +File: utf8.def 2006/03/30 v1.1i UTF-8 support for inputenc ) (../hello.go LaTeX Font Info: Font shape `OMS/ptm/m/it' in size <9> not available (Font) Font shape `OMS/cmsy/m/n' tried instead on input line 1. @@ -702,20 +735,20 @@ Cap\'{\i }tulo 5. ] (./relatorio.aux) ) Here is how much of TeX's memory you used: - 4400 strings out of 95077 - 58979 string characters out of 1183064 - 123255 words of memory out of 1500000 - 7368 multiletter control sequences out of 10000+50000 + 4428 strings out of 95077 + 60103 string characters out of 1183064 + 123266 words of memory out of 1500000 + 7374 multiletter control sequences out of 10000+50000 68570 words of font info for 86 fonts, out of 1200000 for 2000 30 hyphenation exceptions out of 8191 - 32i,7n,42p,977b,2145s stack positions out of 5000i,500n,6000p,200000b,5000s + 32i,7n,42p,955b,2145s stack positions out of 5000i,500n,6000p,200000b,5000s {/usr/share/texmf-texlive/fonts/enc/dvips/base/8r.enc} -Output written on relatorio.pdf (21 pages, 114694 bytes). +Output written on relatorio.pdf (21 pages, 115026 bytes). PDF statistics: 95 PDF objects out of 1000 (max. 8388607) 0 named destinations out of 1000 (max. 131072) diff --git a/relatorio/relatorio.pdf b/relatorio/relatorio.pdf index 8eb581d4d424271bc075314551b3a250b0a520b8..cce9989fe54b538818893f0aec14216b175f6927 100644 GIT binary patch delta 12055 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 Uzo7m*o(IB>N>48#FNym90aJxvm;e9( delta 11732 zcwUA0Wl$VZw*?I28rmw?J@x z^E|h{ukHWw>FredB zbz9b^@^lN>kwyogTsU~RW0<1Kyq%?V9`0+D#|mx#rDZfl?E*m-h)(;C9=mB<*nGX9H6$1C2}PdT zQZJ72hjuYIq82bUD3T*)$?hN4meUGZ{*r#QmwgyE43%H60-xR4+_p`XwN2etIl+P>(Ib#$CSxn z{$~9^aT>NMs@W2*MUjAUlGlgVQS85Z-zeo2&PlqZ6v-tD>>TBxrF~TB_D7O(Rnbb6 zVkCPI#3vcEO63TIn%~COTX@hTSUs;{Ct;k8;3AAGH<(Ig#-ZCUsi4O7!ONul>Y|W` zL~MsSJCO_U*^tq5_xmG&eS?Si@M%l-ca^)pW3clujdd@~DRvr$c_VbZQF}q;d=(?_ zNy3+^udFlLJffh|mz3J>3ECvR{t;TWG)F1vlqH1z;cz-rJZq-kV>|gWVEeFk~<$l+V{iA~GmQM<(y z;oxih7?dl~0rNttBlJJgLa`Wqzbrq#9{G6>LR{KxI!bi4N;@g8Ozxx3zVDhHa})Y1 zIHNtxR!*T0gp1G_6%}wqyY%~16kzI1T;c)E`<*>JlVfSWMN@+Lk^5JpxEMa}V7@nj zH7e<%hu4|!?JYI$DRL!Vk?%QJ-{JshJ!y zUDlzm91fr*v%E?#INh$(mq{DLnG|unGaJh-Yl4l^kLN8+eNhIS!uJ;^$7?%o&1HaI z)9csx$a@95S0xvnM7eP5;R2OT9vk0;z5N$i3B@tuy61NRHUViet_gZxI-Y%Mff|LV z!aq~!iY3reaO3yJ$V^duteBW#V7s5EBhjsa2p&yvrIhKY`QG0L9k>)gjDQ{+ncH$F?uWrSc!T~d?y~7IJF+(MUBDMUTN4N7y zA|L%)1hrojfKI3n*pjM*)gn^It|x&1+_=G^Xm!Edq~MsIM@)QgDRV+499+!VX* zLRoVV@jsD%FRB`?3O=~`%p=hi`j%Jj^*gfZdA0PnQl^cA1W@Vx4YioQ?0PF0&W+f>RHBK&>lkbd)yP zX9^((-i>B`ODev`^-*@itFPoc7nBh6qJ*7Seu=H_AxsrfaVL3}!Kbm4y>|5st1^yg zulh~iP5Y2q3)ioXO9#>>6P_`$etgYc4r$-bFHT+XjwaCj!4HN50N8_7=!zu4d(ai3 z{Z>5t_CSL)g=h1}i?Xtg9-rU1OQ)Kq zUC%ig`Dzw_QK;1CHEo+NIl7$H!r7mdwQED%F~=R8d=bd~ZxX;e9GO7(?ja~rbwnBe!DS6A1=*lnL+e#g8z0u9U-+g24?W4wo8Yyr`Cgeygbb8Fq| z6a(wBSkyZb?;9QwPo{L9GvvTCi!(`Qbm|Dwwy?~VrQf9xc5EQ|t$s$xMpY+LtR7_l zY`oVuT+a?#SnX(IKH=*RXNY4a3_oS|{N4W9N=_s1-E6rBfOF`d)hFKh#e?RMd}%z_ zM12=19T8~d!fJ};ZxPG z;+6HyV|aqi0v>vw>j*o_O~7 z{a57=0f%Krq3Y`mdCMKy#plNYj~?Ta6#W)AVs>J&LIOjPz}D*@#dOFWH@7KeB-dO{ zkzxu0m|9o42C3M-Dv?^WiLznWbhgIals11(r)*_tCD6ExODNdBaZ*_37(UQ{y%9JT zc!0rlIuKw^H#+g%)V=Y%`YiFyG^9u%X#B~C=YYYI;{u!zI5t@=41P9QcJ;hwww-I# z$nr@KSyj`Y+uOpzi+I0Gd9szgW{Q2LolIDx=Q|$lV{6h9j)QV zkpP3HiaBFefZAbcD9i8YB%Tjr2}0L=3?!e@l&#VTB;t|j8g;;X-276{aTAS)dREOZ5Z{erlm6p6;LOx9orK;mTDO%ZUyi6uD2ogDMiz_+d;<&Md0T7j`rsP557~ zCnv+-+;$-CE?z22H9X86U60D)a51o|mjlVF)lq&zcN|~4(d}j)+v%GNg)DQZ9Wk>;$2!}9Sy#>ByQS&wahtl7AVSc04DP5G62$G$Pzj{{oz ziwXUsS0P8=QQRbxF_WLkM}4ng{z<+n4um?zw?^Gmz7?lMhlGPC-2g=S9=z%hS8FV_9$(M2sB?*E!>Q$fIa+P7VWeiQ*wz|jiH7A z$x04Zqz#WiK$r9=+L2K4LP2&3X9i@=X;we@t}*CN$T&J%Zd0YH$E3`!qfgD_ACWlMi;M+9;{N_Akp9yy?>FxRtMMcSvFMeXF0jcJ;|C8NVQoh#|)c&K({R zdxQC*NEdGq@flHf?xTuz=*fowch1o7uA$XC03vNn)tlaMZI=&pTdH>-m<)iQrDX!o z{dsq8F~lyo(a`M^)pZv}(CO_k=!4!N5KId3I*~T1!DK5aCzt9DFLD(a@v^ZR8)ZoX z;f(lN7K58|+|{FuI!u^{9A$&CZ}rXk)}ZJsR$tKx!OrvyBBNcdC;hQFQTm?Q1Kh+! z_p_TPUkMM%&Pm2B>BBz8Cq zEE3bL^En0hwyLbnq6JJwC542scfUx-*~jxrFHn!*f(2WYHziNe^1h*EA03&V7MP{` zk;f$Cnue)Ii_Z{}Z(@+mP)Bk?0$XR(xUS?z&xZ-R(D`|`ZXm2H(M-V1wn^?jY_7R1 zOwXiW{8#2+x`AJKu2FQ{i=kx^eCuF>c27M&YCi-66u#v;V`sJa<_2S$gAmqg;(HqE zVkaL~iHXBT>Lx{Iep0J`lK%HwByleE`ND}>ZxqOVC~`{6xTu^>cSxI5K2wbC zE$L3MVJb~arOB0W`ODOIdJvNS94+mP@fs2){ZRtj5^G(LR%HZQUV98X zv(ejN9Jx=XD;(htbWV8Xtv+ghVtoSk!B!bZbm1DWmc{A=mBh+`F?D~A_$^+NaCoVF zY48r_RvZ5})6bhPUKM3^soBTZ%XBP}+LS1JU8V!zL= z9QJSWpd-waQDZ{aGK|GlWUd!-3UnVaqdK461*$(2e~(l&i;DXtnD+ZbSD>VRM)FJe zrJDv)+1kJ$lXy!e;OR&pm`#MG0H@-CYzfG)m`tq}jJM3tF=1@(xu+z1Q+%aNo-#GN zW|b^7l1GfpBoI8|&hXPes1=KP<&EDQLPO!o?&iFeb|5PDDi+4P9M4aOHsmO3fn_t? z{=;wk%vHN${N_Fd7EK}4e9NZBekK=A_R1zo=CV5s>chSW)K@K6^ofl59|{}c*)B)Z zAWR3`T`EW3H0}b;DQjuWcEkhVhqfV2wFizi_hj>Xsl`0h5dwA_?2Wg?^j?{rOM3*yH-9)2svIqvlF0RgXC3eO)$*3xgLh%vnHhOCuc*r1L z{DN;d)HtYs0}{)OS@rg$I|%AO=WJomsXNZG@f(6iTf>-YJ0JZ8|XAYO%_bEVZB%e-9#a72Rr^-I7-$Kc-9RE9u}Dd2{AwockQ( zB)+B04wI%SW?7mN2@XzKK-lG4vKerqhJK5L#~TQgx)CHx7tzqzONN^a`8bvtQjaD? zs(r+6JiVl#(JOqnhqTbbk={ji_xgB$u*R<(3kMC$e!PTD`Pr?mn-RKE*R3bFn~Fh` zmcSqH59-J{OP1`f!0FB$Ie;63;CXp~T@UiatSw1FfnTsY5vj4fj*i1ssRXt~n(8D4 z7sDT*tnB_f9G1Ph4s<6S)D3?b4TEOnsHd0LEXMdQ)aBTXcQNpNd0HR0QepKj702X9Ys0G0{5PN~-3U7b9j+VJ+h!fgw& z_v83Jp>6Ty&=H>%?{u!vk5kNJl-Cg{z-`c5Hd15pyp$?#3n1 z!`)ar8EIr#PfNMfaS-z6K4}nQ5=to9|NN!B0y$Ys>;A)s$M#Vv&xKOO4k|6$`xy2J z8zy56JJs;K8y}F5b%d$JLxFC~>n|j!Mzo`L-I;upRbE#$=Yt3gmn}dya%7)_r(k*5 zL&((q?mL46S01GWuhjbR*!n4G!=EiczL+X$v9FqX&CCEcg{JCfR6VFceQvO6N!vIX zNIpEcIa&Cu9V0cDoObGQ;LA0R)T1zH?1vGtXTB(jTV?(reev+zo$EU-_e=wO1m~AS z6?x@m)5KF_ecr}fuzHd(AIX;5y7wI!4rjP#x*68)@g9!X$uu_hF#DFT7uF>}uhjlH zo1I!?#gFET(2hlmDNO}yRmq5*ncqmvuIc^FZvtr>OIt%uTJYL&L=zV-M3Q*dUFSoT zdcUUBatTf`=ZiUJaV!~UMe*nu93!RUqllcP#gQcQ6ME7gwK zB}4kKVa8w5E+4AN>BA^qcYcC{UyHI5Z@Sm?cNCVC%BveHj>*+r(rb&AmX_?#t&It; zjp0>3_}=bqeboN+It3)y>=*GWpWtLE%?6ub4bzU78< zSG~>Q5+i2trZYijp?TAxXZN8Mb!8^!&KL#9j{t@@zcD_6(2>JmacM=5G#SBXTTWZ* z!qIiPq$q)JcxFByyP?l`BHM8WF_$xhYJo2@6xyytZK^#N!;!?YH)PvoV{0n#knK?9GSy$;5|VJHa1i zzx~#yP(m-YQ@q%Q%)1d<_)eCQgFF^IyKC;LLI#9Q7uax<9DZ1}m7j8#`EY;n&B7oi zhek9GzIl@l^BYsfUvq#LD-|5z%+zz~T$gwO%KApz5^aGweLjg1Uz(X%M*a0MXtxJz zB)J%ArRi;zh4_pPS?z98+p?em zIksm(UWbx>biOU{qy=VER`9tqIJf1y9!+qKV)1%vcd4dr>kp1qmO^HI-izr;>|g<$ z>G+H&IvXeHwjl3RdDY&>ysj!U>9&h34EA>FjFhk#=A8nlQlZBO2JrV-x-kiKjhjBC zk8P#e9jRepP&kQcR0LlvX7){m0md0%&oVzNd-rvDq(SxNM{V&Gsw4jocwvo}jM581 zh^%Ru^K=xN;KCPE=4qcXvEds$ov z{P8C4xu%*;!^6V0Bd`)RSN>dlS7s0wbM`rx*%|2xEJF+4JDE~?#Q}x^6`k&H^`))=d$#0dM&aEH zUF}Dd7tYeb_=e)}Oudk%9O>D&OL}NJRvjaW9~&T~f_#;sGl(o}zlHHRa*r#0VQObK zrI$Us+)lg>Wqv`H4ww*&tU=fAG{{i9aDSk(Vo{=6f>ZnX3q+wT?#E3FYksm61q#pF zJf_ONqiQZ2NHjEmqQ zUKbxxG^KNv)DbGR==E@3&HZ3w$cY&kFi>NWb%zJUA?(4JT}93_q9=1-eG+Y_*H%a| zqU6l~;Y*O6$is-BNkqSX0Y01maCMH#J|a3RK=k;G3!`KoRqGl+;6N(H?y<7;QY2hcRo`bGKcm%{$rCf%w@MaA6-mHwLV& z*Lk&^29jIw3pr302{kaI^Jlz-=n%~SIsKxt@R@bF@>?Jw%UWC_CLBQlNjCPS|GQE3 zwK*9k1uXX8M(Otor5c})T=bZg)Dw_KiFh#?$&JF!ArlDy%Fj$LxR7=7iERXmfyl-ea$CYI-_>=1CJ-8 zI>oWo>*9Q>_GbpCK&`WF)EA?+j5nWpLsRwQ`gPesE&9X8(!wc^w|hK4XYBz&&eY#GCTUS8eNW|D}$f%I7m?PTg|Fmp6peL-{$ zKj&9D7DZSM=npD|%e$lhE_w!7Q&Txw8yyO%e!^q;T)ipsegFC!b5%C_kH}Pbbq!Pf zIk+0(88I`|ro5;wcREhL!pD_Zav)w&qDZ$)gM?m_CgfsQyvR*50Uu_ZtM_29;6 zp`4+Tv}5&=%x6I>{Qy!Hnv@Jgec~(!$Cqe*>@*>w~KB6I$7A-X!l8?Isn^|tb4 z*;B&$9>P#r`5M*Oj6rXxjO7b3lDb*(rXoLX3h~{Bg_vHT-T1FuU);|8q0-b9E?Yyy zKhkqsip$;OHi`U@GY4+BgeifjKc24mg@fJwKh&Gbek9VVd_et@0X!z50l(filsLSa znAU5O0=e^qRhy#+1(Wz^TkT^}9>1}u(%k=CA!@PWu0@uzEQs*^HBKj&IKirLcDdDI z9i$|yoZ_dWL}EllYwKryoG*~URAs&!h$tJtfkAU6u447>yQQu zIoRmc+};s3pw&g)Hf<`~o3BeLELHkiK1ywtciMMbG~d|agb?j>8*kWs!-UD6VGrC)=QF)XGrJJ zZbCeNY!nWZaJ(!t5eRQ-a3~In`o!pmnf+vSwpLm~sj<<&!!L0TGtlAGrEPE;*Bv=} z-@eY}D-+Ji$aLb4k2|=^h}>o|nxpe#`nb{n&6qhUlm~bxJJQ9Zt(;|S5$JLp;UxLX z?Y{J`u2iJFHy6F3Aj!X*BE7sbM2ID0x&mr#hH_<$7mIF(PA7i zsPe!$Ep_=^U7Zx%j*ayZO?W+lDsJxUAEqNCegGpl7;9pIlfQYl-`FK~m<;L;;$z&A zq{NMZIctR{)eY({=QWSq5mv+_2hbvzbAMC5Ln{L8-Zr2pW6on9W|597n(KT^5riP_ zT#$z~=}nX?JD^TQF6_{`j;!XKTB))R;m|18&CxW6N;fQJqj?wOD~X-QVcnw5**kge zoSM33(xJbt9cs)KxGXsW3a5mKdm&%U#^v2+v+{d9;WLGrvY zRg^bpID5TuFuowr^8WqvN1v*wJXGLaLi5B;)DTU~;e*40b7F#h{2kX!{6RSbU0)xd zzom-HO%6|e|2{P>3@fLPXDgDJ`L+k;tE7_pmbNT#`l$$@EcNaOtd0AE-cIa>4eZbLyW z*VC$x@nKO+pidDIQ_U0ND;-)nfJO{Zw6k{WSX?o%M4HI^zV+K0FBatlpD?e~oDQHA z#3|FrlNwHhu!L)-dzPWR5OC8Q2zFQb&T)t{4q$d7AY&1JP)$>^lVR!ByzZwm$cfje zKAa{`&s`CPB05C`&M+Y<#Zpt&i6EP{iM?s#4=6kzON%8Y#)M!o>}cfX#l!(fOr-3T zdy8s=G{g&-G?sU-maV>_;jYRZQv|u(Rk$X9_3xKe5WNy5cKfvmbH=qsZ9%{b96`hl zHDUa+4`t4CBD+=e?RjsO7`=lH|*T;na9j?jJJ+> z?P6h{TjKX9qEll9&OkRYE0bZKGx$y!vZ!khV|KmA^e4dg4^@PgJn;D_dL7Ka$AXvY zgVFk^B-dS>`+o$yHfHH29XV($*=ScQeqtreoJ3_@@*n{RDq04(Z?mvp2?y0S+eaJ z^A%UVnre7@bLeF&ys~E|u3@U-kC>|cDH56S?|KSZ(Ja-aOFzCe6={+4VaU)1M3aC2 z1}OHew;Brrc5g<^larl7Lwu#Ip)ewhy%hd?@eC8L#*vrT<2cV$U%#^plG0BZWZ-sT zy6y;LeizHiOq8AIH1|;|(yc45Uwky%d^0BEJbyCJM1%Nb37rjLH+)nkCdtEwtkkmV z=$C$J=7omVp9@XyZy1~MWl_tCM5X7?Ujs7Lb6R_|K{+E@wbf=KTKBd~tO#l|G5NC| zFQ7&8YnR2uk(ymdgfcfh4tcRW_Jd@o($2N)MT)V$i8|dzy9;qSWX~;oLQmO5H(U&r zzm(8!HQfa(IZ{S*Z&9L(AE|in3F%W3X!fA*a0wH7mDS~Qv`ArR^EjoBQvIquJqHjb zr#lnN%@gG@lJSUs3QtRbYjw9@r6Vo;^4#Q)7DJ&ShNzeyEyRKFoiUZuCh=kkshvzC z$DiLhXhra__xtcUU@6Wt7#!oFdb~8y_eQNNBszUL0eVG>heka@&A_2YZY zUFx^*FZ(jGPm@;0(W~dm49oCF-Le1+qEFTr&dJVclHVVr64q#@<|VchFI_aYDn4aJ z!;ri!rU~c^BFV*TY5txWJwE+<&3#}V#+6$o+9&-3Nh9gyHj=nfe;2phHykhlZuXz^ z09!Kdz+f&iw!N6z1ikt(tbhTO>Hb(AitRB@Jb{p(H*#E>x57hJFMiSdlI=7EjOxEq zR;k6I?pAQFYa&5w3*4~Jtkuc6pKEBEmbiQU2_KCiuT!WsU+9~42!{o_uQp^QiJ4j! zI~6g94(%&X$oPlRb~H2=nPU)5=2Pxit)!AJeI^uLufLYshF~1ONo+C^mTxUciy<4F z+Un8{KUqW*|CI zqVU4Nu%vg5h;;w+l-7uNEd~Pf()0f3qIaOj`p+E%0)gT1Cm00!ln3VpCrvgXh9g74 z@Fde_L?v-vIE4RS8m|DH@Bd=Ff8_-rPq4rFk`9^?S%AOK|GpG}3p`E2C-5)tZ&AGe z^8Ql*{0a7#`J^8K-v9D||4roMgA4o{%m;@3Tm4_to)it@hdmYMhr*r|$j1+Y{x1yp zF9-)g!2c5e8vay7fcM{Gz`T4<+yeg%eNqe@%>OS22Ezc*za4|Y(Ek?^$P@d)5Ewt` z2?phZKFJ4vYCo74^gsE4|3!rHLY`Cz72tc)9R$wL|1Ty0<$F?~06+L&SHUn4^#3&X zAOHD40#6e1f#49{CkbJYe>>*;+ws35d=P%nzs2zV{bZiR!k`e~Daa50*FruB4E*ns z@CoojpI~qS$iK_U2ZQndQ_NrcLH|Du;QvpA{KwdTf+7Fe6HkOe(5E~B-hUf`@WSB# zHUjzU!~c!t`fu=)FBk&i{nx_3yFF>F9g!H|eXspo zPe1_rWWN8G_+<6LAjnhf-y!`MYt+4(ILP1b078Yq$8La;Y D@I|Ca diff --git a/relatorio/relatorio.tex b/relatorio/relatorio.tex index 95b906b..13e8add 100644 --- a/relatorio/relatorio.tex +++ b/relatorio/relatorio.tex @@ -131,20 +131,20 @@ $ ./prog \chapter{Mecanismos de Programação Concorrente} \section{Gorotinas} Go tem seu próprio modelo de processo / thread / corotina, -chamado gorotina (\emph{goroutines}). Gorotinas são divididas de acordo com o necessário em threads (de usuário) e processos do sistema. Quando uma goroutine executa uma chamada de sistema bloqueane, nenhuma outra gorotina é bloqueada. Para configurar o número máximo de processos criados podemos modificar a variável de ambiente \lstinline|\$GOMAXPROCS| ou utilizar a função runtime.GOMAXPROCS (n int) durante a execução. Seu valor default é 1, ou seja, todas as gorotinas são threads de usuário pertencentes ao mesmo processo. +chamado gorotina (\emph{goroutines}). Gorotinas são divididas de acordo com o necessário em threads (de usuário) e processos do sistema. Quando uma goroutine executa uma chamada de sistema bloqueane, nenhuma outra gorotina é bloqueada. Para configurar o número máximo de processos criados podemos modificar a variável de ambiente \lstinline[language=Go]|\$GOMAXPROCS| ou utilizar a função \lstinline[language=Go]|runtime.GOMAXPROCS (n int)| durante a execução. Seu valor default é 1, ou seja, todas as gorotinas são threads de usuário pertencentes ao mesmo processo. \section{Channel} Representa um canal de comunicação / sincronização que pode conectar duas computações concorrentes. Na realidade são referências para um objeto que coordena a comunicação. - <- é o operador binário de comunicação (envio) <- também é o operador, desta vez unário, de recebimento. Ambos são atômicos. + <- é o operador binário de comunicação (envio). <- também é o operador, desta vez unário, de recebimento. Ambos são atômicos. - Operações de leitura (respesctivamente, escrita) em canais que não têm buffer ou que estão com o buffer vazio (respectivamente, cheio) bloqueiam, e o bloqueio se mantém até que haja aconteça uma operação de escrita (respectivamente, leitura). A linguagem também permite leitura (respectivamente, escrita) não bloqueante, a qual retorna imediatamente uma flag dizendo se a operação foi realizada com sucesso ou não. + Operações de leitura (respesctivamente, escrita) em canais que não têm buffer ou que estão com o buffer vazio (respectivamente, cheio) bloqueiam, e o bloqueio se mantém até que aconteça uma operação de escrita (respectivamente, leitura). A linguagem também permite leitura (respectivamente, escrita) não bloqueante, a qual retorna imediatamente uma flag dizendo se a operação foi realizada com sucesso ou não. - Na criação são sempre bidirecionais, mas quando são recebidos como parâmetro por uma função, além da declaração normal (chan T) podem ser declarados para apenas receber (<-chan T) e apenas enviar (chan<- T), com o objetivo garantir que serão utilizados corretamente no corpo da função. + Na criação são sempre bidirecionais, mas quando são recebidos como parâmetro por uma função, além da declaração normal (\lstinline[language=Go]|chan T|) podem ser declarados para apenas receber (\lstinline[language=Go]|<-chan T|) e apenas enviar (\lstinline[language=Go]|chan<- T|), com o objetivo de garantir que serão utilizados corretamente no corpo da função. - As funções len e cap, quando aplicadas a canal, retornam, repspectivamente, a quantidade de mensagens esperando e o tamanho do buffer do canal (caso este seja assíncrono), ou zero caso contrário. São úteis para determinar se o buffer de um canal assíncrono está cheio, o que permite evitar torná-lo síncrono. + As funções \lstinline[language=Go]|len| e \lstinline[language=Go]|cap|, quando aplicadas a canal, retornam, repspectivamente, a quantidade de mensagens esperando e o tamanho do buffer do canal (caso este seja assíncrono), ou zero caso contrário. São úteis para determinar se o buffer de um canal assíncrono está cheio, o que permite evitar torná-lo síncrono. Exemplos: @@ -176,7 +176,7 @@ coordena a comunicação. \end{lstlisting} \section{go} - É o operador que inicia a execução concorrente de uma gorotina, sempre no mesmo espaço de endereçamento. Prefixe uma chamada de função ou de método com a palavra-chave go para executar a chamada numa nova gorotina. Quando a chamada termina, a gorotina também termina (silenciosamente). O efeito é similar a notação \& do shell Unix para rodar um comando em background. + É o operador que inicia a execução concorrente de uma gorotina, sempre no mesmo espaço de endereçamento. Prefixe uma chamada de função ou de método com a palavra-chave \lstinline[language=Go]|go| para executar a chamada numa nova gorotina. Quando a chamada termina, a gorotina também termina (silenciosamente). O efeito é similar a notação \lstinline[language=Shell]|&| do shell Unix para rodar um comando em background. Exemplo: @@ -194,7 +194,7 @@ func main () { \end{lstlisting} \section{select} - É um estrutura de controle análoga a um switch, mas que age sempre sobre comunicações. Escolhe qual das comunicações listadas em seus casos pode prosseguir. Se todas estão bloqueadas, ele espera até que alguma desbloqueie. Se várias podem prosseguir, ele escolhe uma aleatoriamente. + É um estrutura de controle análoga a um switch, mas que age sempre sobre comunicações. Escolhe qual das comunicações listadas em seus casos deve prosseguir. Se todas estão bloqueadas, ele espera até que alguma desbloqueie. Se várias podem prosseguir, ele escolhe uma aleatoriamente. Exemplo: @@ -212,7 +212,7 @@ func gerador_aleatorio_de_bits (canal chan<- int) \chapter{Prática} \section{Compilando e executando os exemplos} - Todos os exemplos, exceto o hello.go, implementam a solução do problema produtor-consumidor com buffer limitado e taxa de produção e consumo aleatórias, sendo que o pc\_channel\_multi.go implementa a versão com vários produtores e vários consumidores. Os outros implementam a versão singular apenas para manter a simplicidade, mas também são facilmente generalizáveis. + Todos os exemplos, exceto o \lstinline[language=Shell]|hello.go|, implementam a solução do problema produtor-consumidor com buffer limitado e taxa de produção e consumo aleatórias, sendo que o \lstinline[language=Shell]|pc_channel_multi.go| implementa a versão com vários produtores e vários consumidores. Os outros implementam a versão singular apenas para manter a simplicidade, mas também são facilmente generalizáveis. \begin{lstlisting}[language=Shell, texcl=true, numbers=none, escapechar={\%}] $ cd src @@ -317,6 +317,7 @@ monitor.metodo() \item[Implementação (parte principal)]: \lstinputlisting[firstline=37, lastline=110, language=Go, texcl=true, escapechar={\#}]{../pc_monitor.go} \item[Discussão]: semáforos são utilizados para simular as variáveis de condição. As diferenças entre ambos são: +\label{Monitor} \begin{description} \item[Memória:] semáforos têm memória, no sentido de que sinalização nunca são perdidas, pois permanecem armazenadas no semáforo. Variáveis de condição não tem memória, caso não haja ninguém esperando quando ocorre um sinal, o sinal se perde. \item[Atomicidade:] variáveis de condição destravam o mutex e entram em estado de espera de forma atômica. Isso é necessário pois, se houvesse uma troca de contexto entre estas duas ações, um outra thread poderia entrar no monitor e gerar um sinal que seria perdido, podendo causar um deadlock. Os semáforos, ao contrário, não realizam estas duas operações de forma atômica, mas isso não é um problema, já que os sinais não se perdem. @@ -338,7 +339,7 @@ trysignal(cond) \item[Arquivo:] pc\_monitor\_cond.go \item[Implementação (parte principal)]: \lstinputlisting[firstline=57, lastline=130, language=Go, texcl=true, escapechar={\#}]{../pc_monitor_cond.go} - \item[Discussão]: a semântica das variáveis de condição diz que o destrancamento do mutex tem que acontecer de forma atômica com o início da espera pela variável (ver discussão na seção sobre Monitor). A melhor tentativa de simular esta atomicidade foi criar uma outra gorotina (waiter) e deixá-la esperando pelo variável de condição antes de destrancar o mutex, e então esperar pela resposta desta gorotina. Porém, mesmo esta implementação está incorreta, pois não há como garantir que a gorotina criada já esteja esperando pela variável de condição antes de destrancarmos o mutex. Portanto, não há como implementar variáveis de condição corretamente na linguagem, podemos apenas simular seu comportamente com semáforos, mas são coisas diferentes. Para se ter uma idéia da chance de ocorrência do deadlock, no meu computador pessoal o programa acima entrou em deadlock em média após 40000 iterações. + \item[Discussão]: a semântica das variáveis de condição diz que o destrancamento do mutex tem que acontecer de forma atômica com o início da espera pela variável (ver \ref{Monitor}). A melhor tentativa de simular esta atomicidade foi criar uma outra gorotina (waiter) e deixá-la esperando pelo variável de condição antes de destrancar o mutex, e então esperar pela resposta desta gorotina. Porém, mesmo esta implementação está incorreta, pois não há como garantir que a gorotina criada já esteja esperando pela variável de condição antes de destrancarmos o mutex. Portanto, não há como implementar variáveis de condição corretamente na linguagem, podemos apenas simular seu comportamente com semáforos, mas são coisas diferentes. Para se ter uma idéia da chance de ocorrência do deadlock, no meu computador pessoal o programa acima entrou em deadlock em média após 40000 iterações. \end{description} \section{The Go Way} @@ -363,7 +364,7 @@ $ ./pc_channel_multi.go -s BUFFER_SIZE -t MAX_SLEEP_TIME -m MAX_PRODUCTIONS -p N \chapter{Conclusão} Go é uma linguagem que tenta aliar um certo nível de abstração (coletor de lixo, canais inspirados num modelo formal amplamente aceito) com eficiência de compilação e execução. A linguagem não apresenta nativamente algumas funcionalidades comuns de concorrência, mas sua implementação é relativamente fácil, pois a linguagem possui o tipo canal que é tão poderoso quanto as funcionalidades a que estamos acostumados. - Com a disseminação de computadores multiprocessados, e as dificuldades que temos atualmente para programar corretamente sistemas concorrentes, certamente linguagens como essa terão grande crescimento e importância, podendo começar a substituir gradualmente linguagens mais antigas (como C), pois a ineficiência de execução de suas abstrações individualmente vai ser compensada pela eficiência de sua execução como um todo, por aproveitarem melhor os recursos de hardware disponíveis. + A disseminação de computadores multiprocessados e de sistemas distribuídos, aliada às dificuldades que temos atualmente para programar corretamente sistemas concorrentes, certamente fará com que linguagens como essa apresentem grande crescimento e importância, podendo começar a substituir gradualmente linguagens mais antigas (como C), pois a ineficiência de execução de suas abstrações individualmente vai ser compensada pela eficiência de sua execução como um todo, por aproveitarem melhor os recursos de hardware disponíveis. \begin{thebibliography}{10} \bibitem{GO} \emph{The Go Programming Language}, http://golang.org/. Acessado em: 04/04/2010. diff --git a/relatorio/relatorio.tex~ b/relatorio/relatorio.tex~ index 95b906b..08bd61f 100644 --- a/relatorio/relatorio.tex~ +++ b/relatorio/relatorio.tex~ @@ -131,20 +131,20 @@ $ ./prog \chapter{Mecanismos de Programação Concorrente} \section{Gorotinas} Go tem seu próprio modelo de processo / thread / corotina, -chamado gorotina (\emph{goroutines}). Gorotinas são divididas de acordo com o necessário em threads (de usuário) e processos do sistema. Quando uma goroutine executa uma chamada de sistema bloqueane, nenhuma outra gorotina é bloqueada. Para configurar o número máximo de processos criados podemos modificar a variável de ambiente \lstinline|\$GOMAXPROCS| ou utilizar a função runtime.GOMAXPROCS (n int) durante a execução. Seu valor default é 1, ou seja, todas as gorotinas são threads de usuário pertencentes ao mesmo processo. +chamado gorotina (\emph{goroutines}). Gorotinas são divididas de acordo com o necessário em threads (de usuário) e processos do sistema. Quando uma goroutine executa uma chamada de sistema bloqueane, nenhuma outra gorotina é bloqueada. Para configurar o número máximo de processos criados podemos modificar a variável de ambiente \lstinline[language=Go]|\$GOMAXPROCS| ou utilizar a função \lstinline[language=Go]|runtime.GOMAXPROCS (n int)| durante a execução. Seu valor default é 1, ou seja, todas as gorotinas são threads de usuário pertencentes ao mesmo processo. \section{Channel} Representa um canal de comunicação / sincronização que pode conectar duas computações concorrentes. Na realidade são referências para um objeto que coordena a comunicação. - <- é o operador binário de comunicação (envio) <- também é o operador, desta vez unário, de recebimento. Ambos são atômicos. + <- é o operador binário de comunicação (envio). <- também é o operador, desta vez unário, de recebimento. Ambos são atômicos. - Operações de leitura (respesctivamente, escrita) em canais que não têm buffer ou que estão com o buffer vazio (respectivamente, cheio) bloqueiam, e o bloqueio se mantém até que haja aconteça uma operação de escrita (respectivamente, leitura). A linguagem também permite leitura (respectivamente, escrita) não bloqueante, a qual retorna imediatamente uma flag dizendo se a operação foi realizada com sucesso ou não. + Operações de leitura (respesctivamente, escrita) em canais que não têm buffer ou que estão com o buffer vazio (respectivamente, cheio) bloqueiam, e o bloqueio se mantém até que aconteça uma operação de escrita (respectivamente, leitura). A linguagem também permite leitura (respectivamente, escrita) não bloqueante, a qual retorna imediatamente uma flag dizendo se a operação foi realizada com sucesso ou não. - Na criação são sempre bidirecionais, mas quando são recebidos como parâmetro por uma função, além da declaração normal (chan T) podem ser declarados para apenas receber (<-chan T) e apenas enviar (chan<- T), com o objetivo garantir que serão utilizados corretamente no corpo da função. + Na criação são sempre bidirecionais, mas quando são recebidos como parâmetro por uma função, além da declaração normal (\lstinline[language=Go]|chan T|) podem ser declarados para apenas receber (\lstinline[language=Go]|<-chan T|) e apenas enviar (\lstinline[language=Go]|chan<- T|), com o objetivo de garantir que serão utilizados corretamente no corpo da função. - As funções len e cap, quando aplicadas a canal, retornam, repspectivamente, a quantidade de mensagens esperando e o tamanho do buffer do canal (caso este seja assíncrono), ou zero caso contrário. São úteis para determinar se o buffer de um canal assíncrono está cheio, o que permite evitar torná-lo síncrono. + As funções \lstinline[language=Go]|len| e \lstinline[language=Go]|cap|, quando aplicadas a canal, retornam, repspectivamente, a quantidade de mensagens esperando e o tamanho do buffer do canal (caso este seja assíncrono), ou zero caso contrário. São úteis para determinar se o buffer de um canal assíncrono está cheio, o que permite evitar torná-lo síncrono. Exemplos: @@ -176,7 +176,7 @@ coordena a comunicação. \end{lstlisting} \section{go} - É o operador que inicia a execução concorrente de uma gorotina, sempre no mesmo espaço de endereçamento. Prefixe uma chamada de função ou de método com a palavra-chave go para executar a chamada numa nova gorotina. Quando a chamada termina, a gorotina também termina (silenciosamente). O efeito é similar a notação \& do shell Unix para rodar um comando em background. + É o operador que inicia a execução concorrente de uma gorotina, sempre no mesmo espaço de endereçamento. Prefixe uma chamada de função ou de método com a palavra-chave \lstinline[language=Go]|go| para executar a chamada numa nova gorotina. Quando a chamada termina, a gorotina também termina (silenciosamente). O efeito é similar a notação \lstinline[language=Shell]|&| do shell Unix para rodar um comando em background. Exemplo: @@ -194,7 +194,7 @@ func main () { \end{lstlisting} \section{select} - É um estrutura de controle análoga a um switch, mas que age sempre sobre comunicações. Escolhe qual das comunicações listadas em seus casos pode prosseguir. Se todas estão bloqueadas, ele espera até que alguma desbloqueie. Se várias podem prosseguir, ele escolhe uma aleatoriamente. + É um estrutura de controle análoga a um switch, mas que age sempre sobre comunicações. Escolhe qual das comunicações listadas em seus casos deve prosseguir. Se todas estão bloqueadas, ele espera até que alguma desbloqueie. Se várias podem prosseguir, ele escolhe uma aleatoriamente. Exemplo: @@ -212,7 +212,7 @@ func gerador_aleatorio_de_bits (canal chan<- int) \chapter{Prática} \section{Compilando e executando os exemplos} - Todos os exemplos, exceto o hello.go, implementam a solução do problema produtor-consumidor com buffer limitado e taxa de produção e consumo aleatórias, sendo que o pc\_channel\_multi.go implementa a versão com vários produtores e vários consumidores. Os outros implementam a versão singular apenas para manter a simplicidade, mas também são facilmente generalizáveis. + Todos os exemplos, exceto o \lstinline[language=Shell]|hello.go|, implementam a solução do problema produtor-consumidor com buffer limitado e taxa de produção e consumo aleatórias, sendo que o \lstinline[language=Shell]|pc_channel_multi.go| implementa a versão com vários produtores e vários consumidores. Os outros implementam a versão singular apenas para manter a simplicidade, mas também são facilmente generalizáveis. \begin{lstlisting}[language=Shell, texcl=true, numbers=none, escapechar={\%}] $ cd src @@ -317,6 +317,7 @@ monitor.metodo() \item[Implementação (parte principal)]: \lstinputlisting[firstline=37, lastline=110, language=Go, texcl=true, escapechar={\#}]{../pc_monitor.go} \item[Discussão]: semáforos são utilizados para simular as variáveis de condição. As diferenças entre ambos são: +\label{Monitor} \begin{description} \item[Memória:] semáforos têm memória, no sentido de que sinalização nunca são perdidas, pois permanecem armazenadas no semáforo. Variáveis de condição não tem memória, caso não haja ninguém esperando quando ocorre um sinal, o sinal se perde. \item[Atomicidade:] variáveis de condição destravam o mutex e entram em estado de espera de forma atômica. Isso é necessário pois, se houvesse uma troca de contexto entre estas duas ações, um outra thread poderia entrar no monitor e gerar um sinal que seria perdido, podendo causar um deadlock. Os semáforos, ao contrário, não realizam estas duas operações de forma atômica, mas isso não é um problema, já que os sinais não se perdem. @@ -338,7 +339,7 @@ trysignal(cond) \item[Arquivo:] pc\_monitor\_cond.go \item[Implementação (parte principal)]: \lstinputlisting[firstline=57, lastline=130, language=Go, texcl=true, escapechar={\#}]{../pc_monitor_cond.go} - \item[Discussão]: a semântica das variáveis de condição diz que o destrancamento do mutex tem que acontecer de forma atômica com o início da espera pela variável (ver discussão na seção sobre Monitor). A melhor tentativa de simular esta atomicidade foi criar uma outra gorotina (waiter) e deixá-la esperando pelo variável de condição antes de destrancar o mutex, e então esperar pela resposta desta gorotina. Porém, mesmo esta implementação está incorreta, pois não há como garantir que a gorotina criada já esteja esperando pela variável de condição antes de destrancarmos o mutex. Portanto, não há como implementar variáveis de condição corretamente na linguagem, podemos apenas simular seu comportamente com semáforos, mas são coisas diferentes. Para se ter uma idéia da chance de ocorrência do deadlock, no meu computador pessoal o programa acima entrou em deadlock em média após 40000 iterações. + \item[Discussão]: a semântica das variáveis de condição diz que o destrancamento do mutex tem que acontecer de forma atômica com o início da espera pela variável (ver \ref{Monitor}). A melhor tentativa de simular esta atomicidade foi criar uma outra gorotina (waiter) e deixá-la esperando pelo variável de condição antes de destrancar o mutex, e então esperar pela resposta desta gorotina. Porém, mesmo esta implementação está incorreta, pois não há como garantir que a gorotina criada já esteja esperando pela variável de condição antes de destrancarmos o mutex. Portanto, não há como implementar variáveis de condição corretamente na linguagem, podemos apenas simular seu comportamente com semáforos, mas são coisas diferentes. Para se ter uma idéia da chance de ocorrência do deadlock, no meu computador pessoal o programa acima entrou em deadlock em média após 40000 iterações. \end{description} \section{The Go Way} @@ -363,7 +364,7 @@ $ ./pc_channel_multi.go -s BUFFER_SIZE -t MAX_SLEEP_TIME -m MAX_PRODUCTIONS -p N \chapter{Conclusão} Go é uma linguagem que tenta aliar um certo nível de abstração (coletor de lixo, canais inspirados num modelo formal amplamente aceito) com eficiência de compilação e execução. A linguagem não apresenta nativamente algumas funcionalidades comuns de concorrência, mas sua implementação é relativamente fácil, pois a linguagem possui o tipo canal que é tão poderoso quanto as funcionalidades a que estamos acostumados. - Com a disseminação de computadores multiprocessados, e as dificuldades que temos atualmente para programar corretamente sistemas concorrentes, certamente linguagens como essa terão grande crescimento e importância, podendo começar a substituir gradualmente linguagens mais antigas (como C), pois a ineficiência de execução de suas abstrações individualmente vai ser compensada pela eficiência de sua execução como um todo, por aproveitarem melhor os recursos de hardware disponíveis. + A disseminação de computadores multiprocessados e de sistemas distribuídos, aliada às dificuldades que temos atualmente para programar corretamente sistemas concorrentes, certamente fará com que linguagens como essa terão grande crescimento e importância, podendo começar a substituir gradualmente linguagens mais antigas (como C), pois a ineficiência de execução de suas abstrações individualmente vai ser compensada pela eficiência de sua execução como um todo, por aproveitarem melhor os recursos de hardware disponíveis. \begin{thebibliography}{10} \bibitem{GO} \emph{The Go Programming Language}, http://golang.org/. Acessado em: 04/04/2010. -- 2.11.4.GIT