Download - Lab8 Synchronization Fix Errata
-
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