lab8 synchronization fix errata

Upload: nhuhoamac

Post on 07-Jul-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 Lab8 Synchronization Fix Errata

    1/13

    Đ i h c Bách Khoa TP. HCM, Khoa KH & KTMT

    Bài th c hành 8Môn: H đi u hành

    Phương-Duy Nguy nEmail: [email protected]

    Ngày 16 tháng 3 năm 2016

    1 Gi i thi uNôi dung sinh viên chu n b bài trư c khi lên l p Sinh viên c n ôn t p ph nlý thuy t các n i dung v đ ng bô:

    • Khái ni m v vùng tranh ch p (critical section);

    • C u trúc t ng quát c a quá trình trong bài toán lo i tr tương h ;

    • Semaphore và các bài toán đ ng bô.

    Sinh viên c n chu n b nhà ph n mã ngu n c a thí nghi m s d ng trong bài th chành s 6 v Multithread. Ph n thí nghi m bài này phát tri n ti p thí nghi m bàitrư c.

    N i dung Bài th c hành gi i thi u các cơ ch hi n th c đ ng b đ gi i các bài toán

    lo i tr tương h và các bài toán đ ng b . Trong n i dung bài h c, sinh viên s v nd ng đư c các ki n th c lý thuy t vào thí nghi m th c t c a bài toán lo i tr tương h .Bài toán đ ng b đư c gi i quy t trong thí nghi m này là bài toán producer-consumerhay còn g i là bounded buffer. Sau khi hoàn thành bài th c hành, sinh viên c n t m r ng các ki n th c đư c trang b áp d ng cho các bài toán "Dining Philsopher" và"Readers-Writers" đ làm ti n đ cho các bài h c ti p theo.

    1

  • 8/18/2019 Lab8 Synchronization Fix Errata

    2/13

    Yêu c u Sinh viên làm ph n bài t p mô t m c 4

    Output Sinh viên c n hoàn thành các công vi c sau:

    • Mã ngu n thí nghi m bài lab6 có áp d ng phương th c đ ng b mutex lock

    • Mã ngu n chương trình Producer-Consumer (hay Bounded buffer)

    2 Thread Synchronization2.1 Gi i thi u Thread

    Thread là cơ ch cho phép ng d ng th c hi n nhi u tính toán cùng m t lúc. M t processđơn có th ch a bên trong nhi u thread. T t c các thread trong m t process th c hi ncác chương trình đ c l p v i nhau, và chúng chia s chung m t vùng nh toàn c c baog m các d li u và ph n heap.

    Đ i tư ng d li u đ ng b Chúng ta thư ng s d ng các đ i tư ng d li uđ ng b là các bi n trong b nh mà các lu ng thread c a các quá trình process khácnhau có th giao ti p, thao tác đ ng th i. Các thread/process khác nhau có th khôngbi t v s t n t i c a nhau. Các đ i tư ng d li u này có th đư c ch a trong các t ptin v n có th i gian s ng lâu hơn s t n t i c a các process. Trong ng c nh s d ngđó, chúng ta có th th y m t s l i ích cũng như tính c p thi t khi s d ng đ ng b hóatrong các trư ng h p sau:

    • Đ m b o s nh t quán gi a các d li u đư c chia s .

    • Hai ho c nhi u lu ng/quá trình thao tác m t d li u cùng nhau.

    • Khi s đ ng b là c n thi t đ b o v các bi n tương h .

    • Khi m t process có nhi u thread th c hi n m t tác v I/O (truy xu t file,...) c nkhóa tránh các thread khác truy xu t I/O cho đ n khi khóa đư c gi i phóng.

    • Trong trư ng h p th i gian truy xu t m t bi n d li u đòi h i nhi u hơn m t chukỳ b nh (ví d đ r ng c a ki u d li u l n hơn hơn đ r ng bus d li u).

    Các thư vi n cung c p cá cơ ch đ ng b :

    mutex Mutual Exclusion Lock: khóa truy xu t đ n bi n b i các thread khác. Cơ ch này

    ch cho phép m t thread truy xu t t i nhóm bi n đư c khóa; joins th c hi n ch đ i cho đ n khi thread th c thi xong xuôi;

    conditional variables đ ng b d a trên ki u d li u pthread_cond_t

    2

  • 8/18/2019 Lab8 Synchronization Fix Errata

    3/13

    2.2 Thread Synchronization - Mutual Exclusion LockTh c hi n tu n t Mutual Exclusion Lock-mutex là cách thông d ng đ tu n t hóa vi c th c thi các thread. mutex đ ng b các thread b ng cách đ m b o ch có duynh t thread t i m t th i đi m đo n critical source code đư c th c thi.

    Kh i t o thu c tính Mutex Hàm pthread_mutexattr_init() đư c dùng đ kh it o đ i tư ng d li u v i các giá tr m c đ nh.

    int pt hread_m utexat tr_ini t ( pthread_mutexattr_t ∗ mattr ) ;

    C n lưu ý là khi mu n tái kh i t o (reinitialize) đ i tư ng d li u thì c n ph i h y đ itư ng d li u đó b ng l i g i hàm pthread_mutexattr_destroy() . N u đ i tư ng d li u không đư c h y s t o ra l i memory leak.

    T m v c c a Mutex t m v c c a mutex có th là trong ph m vi m t process (in-

    traprocess ) ho c m c toàn h th ng (interprocess ). Hàm pthread_mutexattr_setpshared()

    đư c dùng đ cài đ t t m v c; hàm pthread_mutexattr_getpshared() dùng đ l ythông tin v t m v c c a bi n mutex.

    Kh i t o/H y b Mutex Hàm pthread_mutex_init() dùng đ kh i t o mutex.Hàm này s kh i t o mutex đư c tr đ n b i mp v i các giá tr m c đ nh n u matrr làNULL. M t mutex không đư c tái kh i t o hay h y b khi các thread đang s d ngnó. L i chương trình s x y ra n u thao tác này không đư c th c hi n đúng.Khi m t mutex đư c kh i t o, nó tr ng thái unlock

    int pthread_mutex_init(pthread_mutex_t ∗mp, pthread_mutexattr_t ∗ mattr ) ;

    Hàm đư c s d ng đ h y mutex đư c tr đ n b i mpint pthread_mutex_destroy(pthread_mutex_t ∗mp);

    Locking Mutex Hàm pthread_mutex_lock đư c s d ng đ lock mutex đư c trđ n b i mp. Khi mutex đã đư c lock , vi c g i thread b block và mutex ph i ch trênhàng đ i th t . Khi hàm pthread_mutex_lock hoàn t t, mutex b lock và thread đangg i là owner.

    int pthread_mutex_lock ( pthread_mutex_t ∗mp);

    Đ unlock mutex hàm pthread_mutex_unlock đư c s d ng. Khi mutex đư c s n sàng,thread đ u hàng đ i đư c unblock.

    int pthread_mutex_unlock(pthread_mutex_t ∗mp);

    3

  • 8/18/2019 Lab8 Synchronization Fix Errata

    4/13

    Trư ng h p nonblocking mutex Hàm pthread_mutex_trylock là b n nonblock-ing c a pthread_mutex_lock . Khi hàm đư c g i n u mutex đã b lock, l i g i đư c trv mà không b block. Ngư c l i thì mutex b block và thread g i s tr thành owner.

    int pthread_mutex_trylock(pthread_mutex_t ∗mp);

    Xem xét các ví d s d ng mutex lock .

    1 #include 2 #include 34 #define MAX_THREAD 35 #define MAX_LOOP 100000067 s t at i c i nt coun t = 0 ;8 pthread_mutex_t count_mutex ;9

    10 void ∗ inc_count( void ∗ thread id )11 {12 int t ;1314 int t id = ( int ) thr ead id ;1516 for ( t =0; t

  • 8/18/2019 Lab8 Synchronization Fix Errata

    5/13

    38 for ( i =0; i

  • 8/18/2019 Lab8 Synchronization Fix Errata

    6/13

    17 for ( i =0; i

  • 8/18/2019 Lab8 Synchronization Fix Errata

    7/13

    void wai t ( semaphore S) {S . value−− ;i f ( S . v al u e < 0 ) {

    add t h i s p r oc e ss t o S . L ;b lock ( ) ;}

    }

    void s i gna l ( semaphore S) {S . valu e++;i f (S . va lue

  • 8/18/2019 Lab8 Synchronization Fix Errata

    8/13

    truy n vào. Tham s pshared xác đ nh semaphore đư c s d ng ph m vi c c b trongprocess hi n t i hay có th chia s gi a các process:

    • pshared = 0 semaphore chia s gi a các threads trong m t proces, nó c n đư cđ t t i đ a ch mà các thread có th th y (bi n c c b , bi n c p phát đ ng t iheap)

    • pshared != 0 semaphore có th chia s gi a các process và nên đư c đ t t i vùngnh chia s (shared memory)

    int sem_init (sem_t ∗ sem , int pshared , unsigned int value ) ;

    Hàm sem_destroy() dùng đ h y b semaphoreint sem_destroy(sem_t ∗ sem ) ;

    3.3 Ho t đ ng c a semaphoreHàm sem_wait() t m d ng vi c g i thread cho đ n khi semaphore đư c tr đ n b ibi n sem có giá tr khác 0. Sau khi ch đ n lư t th c thi, nó s t đ ng gi m giá tr bi nđ m count trong semaphore.

    int sem_wait ( sem_t ∗ sem)

    Hàm sem_post() th c hi n vi c tăng bi n đ m count trong semaphore m t cách đơnđ nh. Hàm này không bao gi b block.

    int sem_post (sem_t ∗ sem)

    3.4 ng d ng semaphore3.4.1 S d ng semaphore như là mutex lock

    Binary Semaphore Đ xây d ng vùng lock cho critical section chúng ta có th đ tm gi a m t c p sem_wait() / sem_post() . Semaphore đư c kh i t o giá tr là 1. Xemxét thread đ u tiên g i sem_wait() , hàm đư c g i đ ch giá tr c a semaphore l nhơn 0, v n đã th a mãn do giá tr semaphore đang là 1. Do v y, nó s không ph i ch

    đ i và gi m giá tr semaphore xu ng 0 trư c khi hoàn t t l i g i th c thi. Thread đós đư c vào vùng critical section. Sau khi th c thi trong vùng critical section, nó g isem_post() tăng bi n đêm tr l i 1. Trong lúc thread đang lock trong critical section,xem xét trư ng h p có m t thread khác g i sem_wait() đ c g ng vào vùng criticalsection. Khi đó, thread m i s th y giá tr semaphore đang là 0, và nó s ph i ch đ i.Khi thread đ u tiên hoàn t t th c thi, giá tr semaphore v 1 thì thread m i m i có thl y quy n lock và vào vùng critical section.

    8

  • 8/18/2019 Lab8 Synchronization Fix Errata

    9/13

    sem_t sem ;/ ∗∗ I n i t i a l i z e semaphore w it h v a lu e e q ua l 1∗ This usage somet ime knows as a "b inary semaphore" ∗ /

    sem_init(&sem , 0 , 1) ;

    sem_wait(&sem ) ;// c r i t i c a l s ec t i o n go es h ere sem_post(&sem ) ;

    3.4.2 S d ng semaphore cho producer/consumer problem

    Bài toán producer/consumer là v n đ m đ u cho vi c phát minh ra semaphore1 . Xem

    xét trư ng h p có nhi u producer thread và nhi u consumer thread. Producer threadtao các d li u đưa và buffer và các consumer threads l y d li u ra kh i buffer và x lý chúng. B i vì vùng buffer là tài nguyên chia s , chúng ta ph i h tr cơ ch đ ng bkhi truy xu t đ tránh x y ra hi n tư ng race condition. Xem xét ví d v buffer

    int b u f f e r [MAX_BUF] ; / ∗ RING BUFFER s i z e MAX_BUF ∗ / int f i l l = 0;int use = 0 ;

    int inser t_ to_buffer ( int value ){

    bu ff er [ f i l l ] = value ;f i l l = ( f i l l + 1) % MAX_BUF;

    return 0 ;}

    int get_buffer_item ( int ∗ ret_valu e ){

    ∗ ret_value = bu ff er [ use ] ;us e = ( us e + 1) % MAX_BUF;

    return 0 ;}

    1 "My recollections of operating system design", E.W. Dijkstra. April, 2001. Circulated privately. Avail-able: http://www.cs.utexas.edu/users/EWD/ewd13xx/EWD1303.PDF A fascinating read for thoseof you interested in how the pioneers of our field came up with some very basic and fundamentalconcepts, including ideas like "interrupts" and "a stack"!

    9

  • 8/18/2019 Lab8 Synchronization Fix Errata

    10/13

    Cơ ch h tr đ ng b khi truy xu t vùng buffer s d ng semaphore.

    Lưu ý: Đ tuân theo API đ nh nghĩa trong POSIX, mã ngu n minh h a s d ng các API sem_wait/sem_post thay th cho các API wait/signal trong lý thuy t

    #define MAX_DAT 1000 / ∗ Maximum number of pro ces sin g i tems ∗ / sem_t empty ;sem_t f u l l ;sem_t mutex ;

    void ∗ prod ucer (void ∗ arg ){int i ;for ( i = 0 ; i < MAX_DAT; i ++){

    / /TODO: Add synchr oniza t ion to pro tec t bu ff er inser t_to_b uffe r ( i ) ;/ /TODO: Add synchr oniza t ion to pro tec t bu ff er

    }

    }

    void ∗ consumer(void ∗ arg ){int i , i tem ;for ( i = 0 ; i < MAX_DAT; i++) {

    / /TODO: Add synchr oniza t ion to pro tec t bu ff er get_buffer_item(&item ) ;/ /TODO: Add synchr oniza t ion to pro tec t bu ff er consume_item( item ) ;

    }}

    int main( int argc , char ∗ argv [ ] ) {pthread_t pro , con ;

    //TODO: In i t i a l i z e synchron iza t ion ob j ec t

    pthread_c reate(&pro , NULL, producer , (void ∗ ) 0 ) ;pth read _crea te(&con , NULL, consumer , (void ∗ ) 1 ) ;

    pth read_ join ( con , NULL) ;pth read_ join ( pro , NULL) ;

    sem_destroy(&empty );sem_destroy(& f u l l ) ;sem_destroy(&mutex );

    10

  • 8/18/2019 Lab8 Synchronization Fix Errata

    11/13

    return 0 ;}

    11

  • 8/18/2019 Lab8 Synchronization Fix Errata

    12/13

    4 Bài t pSinh viên hoàn thi n các ví d đư c mô t và ti n hành biên d ch, ch y chương trình.

    12

  • 8/18/2019 Lab8 Synchronization Fix Errata

    13/13