Isletim Sistemleri Uygulama 7 - Ölümcül kilitlenme
Transkript
Isletim Sistemleri Uygulama 7 - Ölümcül kilitlenme
İşletim Sistemleri Uygulama 7 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Bilgisayar Mühendisliği İstanbul Teknik Üniversitesi 34469 Maslak, İstanbul 10 Nisan 2013 BM BLG 312 İşletim Sistemleri Uygulama 7 Bugün İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Catch-22 Joseph Heller’in Catch-22 adlı romanı bir çelişki üzerine kuruludur. Romanda, olayın gerçekleşmesi bir şarta bağlıdır ancak o şartın gerçekleşmesi de aynı olaya bağlıdır. I Deneyimsiz biri iş bulamaz. İş bulamazsa deneyim kazanamaz. I Oy oranı düşük bir partiye oy verilmez. Oy verilmeyen partinin oy oranı artmaz. I İyi bir takım olmak için iyi futbolcular gerekir. İyi futbolcular iyi takımlara transfer olurlar. Benzer çelişkiler süreçleri ilgilendiriyorsa, işletim sistemi ölümcül kilitlenmeyle karşılaşabilir. BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Catch-22 Joseph Heller’in Catch-22 adlı romanı bir çelişki üzerine kuruludur. Romanda, olayın gerçekleşmesi bir şarta bağlıdır ancak o şartın gerçekleşmesi de aynı olaya bağlıdır. I Deneyimsiz biri iş bulamaz. İş bulamazsa deneyim kazanamaz. I Oy oranı düşük bir partiye oy verilmez. Oy verilmeyen partinin oy oranı artmaz. I İyi bir takım olmak için iyi futbolcular gerekir. İyi futbolcular iyi takımlara transfer olurlar. Benzer çelişkiler süreçleri ilgilendiriyorsa, işletim sistemi ölümcül kilitlenmeyle karşılaşabilir. BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Catch-22 Joseph Heller’in Catch-22 adlı romanı bir çelişki üzerine kuruludur. Romanda, olayın gerçekleşmesi bir şarta bağlıdır ancak o şartın gerçekleşmesi de aynı olaya bağlıdır. I Deneyimsiz biri iş bulamaz. İş bulamazsa deneyim kazanamaz. I Oy oranı düşük bir partiye oy verilmez. Oy verilmeyen partinin oy oranı artmaz. I İyi bir takım olmak için iyi futbolcular gerekir. İyi futbolcular iyi takımlara transfer olurlar. Benzer çelişkiler süreçleri ilgilendiriyorsa, işletim sistemi ölümcül kilitlenmeyle karşılaşabilir. BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Basit bir ölümcül kilitlenme örneği 1 v o i d ∗ f a u l t y f u n c t i o n A ( v o i d ∗ a r g ){ p t h r e a d m u t e x l o c k (& l o c k 1 ) ; p r i n t f ( ”\nA k r i t i k b o l g e 1 ’ de \n” ) ; f f l u s h ( stdout ) ; 6 sleep (2); p t h r e a d m u t e x l o c k (& l o c k 2 ) ; p r i n t f ( ”\nA k r i t i k b o l g e 2 ’ de \n” ) ; f f l u s h ( stdout ); 11 p t h r e a d m u t e x u n l o c k (& l o c k 2 ) ; p t h r e a d m u t e x u n l o c k (& l o c k 1 ) ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Basit bir ölümcül kilitlenme örneği 5 v o i d ∗ f a u l t y f u n c t i o n B ( v o i d ∗ a r g ){ sleep (1); p t h r e a d m u t e x l o c k (& l o c k 2 ) ; p r i n t f ( ”\nB k r i t i k b o l g e 2 ’ de \n” ) ; f f l u s h ( stdout ); sleep (2); p t h r e a d m u t e x l o c k (& l o c k 1 ) ; p r i n t f ( ”\nB k r i t i k b o l g e 1 ’ de \n” ) ; f f l u s h ( stdout ) ; 10 p t h r e a d m u t e x u n l o c k (& l o c k 1 ) ; p t h r e a d m u t e x u n l o c k (& l o c k 2 ) ; 15 } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Basit bir ölümcül kilitlenme örneği i n t main (){ p t h r e a d t threadA , threadB ; 4 p t h r e a d m u t e x i n i t (& l o c k 1 , NULL ) ; p t h r e a d m u t e x i n i t (& l o c k 2 , NULL ) ; 9 i f ( p t h r e a d c r e a t e (& t h r e a d A , NULL , f a u l t y f u n c t i o n A , NULL)){ p r i n t f ( ” i p l i k y a r a t i l i r k e n hata ” ) ; exit (1); } 14 i f ( p t h r e a d c r e a t e (& t h r e a d B , NULL , f a u l t y f u n c t i o n B , NULL)){ p r i n t f ( ” i p l i k y a r a t i l i r k e n hata ” ) ; exit (1); } 19 i f ( p t h r e a d j o i n ( t h r e a d A , NULL)){ p r i n t f ( ” i p l i k b i r l e s i r k e n hata ” ) ; exit (1); } i f ( p t h r e a d j o i n ( t h r e a d B , NULL)){ p r i n t f ( ” i p l i k b i r l e s i r k e n hata ” ) ; exit (1); } 24 p t h r e a d m u t e x d e s t r o y (& l o c k 1 ) ; p t h r e a d m u t e x d e s t r o y (& l o c k 2 ) ; 29 return 0; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Basit bir ölümcül kilitlenme örneği v o i d ∗ f u n c t i o n A ( v o i d ∗ a r g ){ 3 p t h r e a d m u t e x l o c k (& l o c k 1 ) ; p r i n t f ( ”\nA k r i t i k b o l g e 1 ’ de \n” ) ; f f l u s h ( stdout ) ; sleep (5); w h i l e ( p t h r e a d m u t e x t r y l o c k (& l o c k 2 ) ) { p t h r e a d m u t e x u n l o c k (& l o c k 1 ) ; sleep (1); p r i n t f ( ”\nA b e k l i y o r \n” ) ; f f l u s h ( stdout ); p t h r e a d m u t e x l o c k (& l o c k 1 ) ; } 8 13 p r i n t f ( ”\nA k r i t i k b o l g e 2 ’ de \n” ) ; f f l u s h ( stdout ) ; 18 p t h r e a d m u t e x u n l o c k (& l o c k 2 ) ; p t h r e a d m u t e x u n l o c k (& l o c k 1 ) ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Basit bir ölümcül kilitlenme örneği 4 v o i d ∗ f u n c t i o n B ( v o i d ∗ a r g ){ sleep (1); p t h r e a d m u t e x l o c k (& l o c k 2 ) ; p r i n t f ( ”\nB k r i t i k b o l g e 2 ’ de \n” ) ; f f l u s h ( stdout ) ; sleep (4); w h i l e ( p t h r e a d m u t e x t r y l o c k (& l o c k 1 ) ) { p t h r e a d m u t e x u n l o c k (& l o c k 2 ) ; sleep (1); p r i n t f ( ”\nB b e k l i y o r \n” ) ; f f l u s h ( stdout ); p t h r e a d m u t e x l o c k (& l o c k 2 ) ; } 9 14 p r i n t f ( ”\nB k r i t i k b o l g e 1 ’ de \n” ) ; f f l u s h ( stdout ) ; 19 p t h r e a d m u t e x u n l o c k (& l o c k 1 ) ; p t h r e a d m u t e x u n l o c k (& l o c k 2 ) ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek #i n c l u d e <s t r i n g . h> 3 u s i n g namespace s t d ; c l a s s P a i r{ private : 8 int a ; int b; pthread mutex t plock ; 13 public : b o o l o p e r a t o r <(P a i r &) ; b o o l o p e r a t o r >(P a i r &) ; b o o l o p e r a t o r ==( P a i r &) ; void setA ( i n t ) ; void setB ( i n t ) ; v o i d setAB ( i n t , i n t ) ; Pair ( int , int ) ; Pair ( void ) ; ˜ Pair ( ) ; void p r i n t ( s t r i n g ) ; void lock ( ) ; void unlock ( ) ; 18 23 }; BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek b o o l P a i r : : o p e r a t o r <( P a i r &o t h e r ){ i f ( t h i s−>a<o t h e r . a ) return true ; 4 i f ( t h i s−>a==o t h e r . a && t h i s−>b<o t h e r . b ) return true ; 9 return false ; } b o o l P a i r : : o p e r a t o r >( P a i r &o t h e r ){ 14 i f ( t h i s−>a>o t h e r . a ) return true ; i f ( t h i s−>a==o t h e r . a && t h i s−>b>o t h e r . b ) return true ; 19 return false ; } b o o l P a i r : : o p e r a t o r ==( P a i r &o t h e r ){ 24 i f ( t h i s−>a==o t h e r . a && t h i s−>b==o t h e r . b ) return true ; return false ; 29 } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek 1 P a i r : : P a i r ( i n t a , i n t b){ t h i s−>a=a ; t h i s−>b=b ; } 6 P a i r : : P a i r (){ t h i s−>a=( r a n d ( ) % 1 0 ) ; t h i s−>b=( r a n d ( ) % 1 0 ) ; } 11 v o i d P a i r : : p r i n t ( s t r i n g name){ c o u t << e n d l << name << ” : ( ” << t h i s−>a <<” , ”<<t h i s−>b<<” ) ”<<e n d l ; } 16 v o i d P a i r : : s e t A ( i n t a ){ t h i s−>a=a ; } v o i d P a i r : : s e t B ( i n t b){ t h i s−>b=b ; 21 } 26 v o i d P a i r : : setAB ( i n t a , i n t b){ t h i s−>a=a ; t h i s−>b=b ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek i n t main (){ p t h r e a d t mythreadA , mythreadB ; 4 P a i r∗ x=new P a i r ( 1 , 2 ) ; P a i r∗ y=new P a i r ( 2 , 3 ) ; P a i r∗ p L i s t []={ x , y }; 9 i f ( p t h r e a d c r e a t e (&mythreadA , NULL , t h r e a d f u n c t i o n , ( v o i d ∗) p L i s t )){ p r i n t f (” error creating thread ” ) ; abort ( ) ; } 14 sleep (1); x−>s e t A ( 5 ) ; p L i s t [0]−> p r i n t ( ” x ” ) ; 19 i f ( p t h r e a d j o i n ( mythreadA , NULL)){ p r i n t f (” error j o i n i n g thread ” ) ; abort ( ) ; } 24 return 0; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek v o i d∗ t h r e a d f u n c t i o n ( v o i d ∗a r g ){ P a i r∗∗ p L i s t =( P a i r ∗∗) a r g ; 4 p L i s t [0]−> p r i n t ( ” x ” ) ; p L i s t [1]−> p r i n t ( ” y ” ) ; sleep (2); 9 i f ((∗ p L i s t [0]) >(∗ p L i s t [ 1 ] ) ) c o u t<<e n d l<<” x>y ”<<e n d l ; i f ((∗ p L i s t [0]) <(∗ p L i s t [ 1 ] ) ) c o u t<<e n d l<<” x<y ”<<e n d l ; 14 i f ((∗ p L i s t [0])==(∗ p L i s t [ 1 ] ) ) c o u t<<e n d l<<” x=y ”<<e n d l ; 19 r e t u r n NULL ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek b o o l P a i r : : o p e r a t o r <( P a i r &o t h e r ){ t h i s −>l o c k ( ) ; other . lock ( ) ; 4 i f ( t h i s −>a<o t h e r . a ){ t h i s −>u n l o c k ( ) ; other . unlock ( ) ; return true ; } 9 i f ( t h i s −>a==o t h e r . a && t h i s −>b<o t h e r . b ){ t h i s −>u n l o c k ( ) ; other . unlock ( ) ; return true ; } 14 t h i s −>u n l o c k ( ) ; other . unlock ( ) ; 19 return false ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek 1 P a i r : : P a i r ( i n t a , i n t b ){ t h i s −>a=a ; t h i s −>b=b ; p t h r e a d m u t e x i n i t (& p l o c k , NULL ) ; } 6 Pair : : ˜ Pair (){ p t h r e a d m u t e x d e s t r o y (& p l o c k ) ; } 11 v o i d P a i r : : s e t A ( i n t a ){ t h i s −>l o c k ( ) ; t h i s −>a=a ; t h i s −>u n l o c k ( ) ; } 16 void Pair : : lock (){ p t h r e a d m u t e x l o c k (& p l o c k ) ; } 21 void Pair : : unlock (){ p t h r e a d m u t e x u n l o c k (& p l o c k ) ; } BM BLG 312 İşletim Sistemleri Uygulama 7 Ölümcül kilitlenme Örnekler Daha gerçekçi bir örnek i n t main (){ 2 p t h r e a d t mythreadA , mythreadB ; P a i r∗ x=new P a i r ( 1 , 2 ) ; P a i r∗ y=new P a i r ( 2 , 3 ) ; 7 P a i r∗ p L i s t []={ x , y }; P a i r∗ q L i s t []={ y , x }; i f ( p t h r e a d c r e a t e (&mythreadA , NULL , t h r e a d f u n c t i o n , ( v o i d ∗) p L i s t )){ p r i n t f (” error creating thread ” ) ; abort ( ) ; } 12 i f ( p t h r e a d c r e a t e (&mythreadB , NULL , t h r e a d f u n c t i o n , ( v o i d ∗) q L i s t )){ p r i n t f (” error creating thread ” ) ; abort ( ) ; } 17 sleep (1); 22 i f ( p t h r e a d j o i n ( mythreadA , NULL)){ p r i n t f (” error j o i n i n g thread ” ) ; abort ( ) ; } 27 i f ( p t h r e a d j o i n ( mythreadB , NULL)){ p r i n t f (” error j o i n i n g thread ” ) ; abort ( ) ; } 32 return 0; } BM BLG 312
Benzer belgeler
Isletim Sistemleri Uygulama 6 - Ninova
İşletim Sistemleri Uygulama 6
Uygulamada adım adım semafor kullanımı
Örnek Senkronizasyon Problemleri - H2 O
Örnek Senkronizasyon Problemleri - Sushi Bar
Örnek Senkronizasyon Problemleri - Par...