Linux鎖相關
一、為什麼需要鎖
臨界區資源保護
二、Linux下鎖的類型:
1、 spin_lock(自旋鎖)
一般用在多核間
單核間使用可作為搶占式開關
內核隊列(kfifo)使用自旋鎖
2、 mutex(互斥鎖)
多用於線程安全的保護
也可用於進程間保護
pthread_mutex_t *p_map;
int cpid;
p_map=(pthread_mutex_t*)mmap(NULL,sizeof(pthread_mutex_t)*10,PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS,-1,0);
sum_mutex = p_map;
pthread_mutexattr_t mutex_shared_attr;
/* Set pthread_mutex_attr to process shared */
pthread_mutexattr_init(&mutex_shared_attr);
pthread_mutexattr_setpshared(&mutex_shared_attr, PTHREAD_PROCESS_SHARED);
pthread_mutex_init(sum_mutex, &mutex_shared_attr);
3、 write_lock
4、 read_lock
三、死鎖
原因:等待永遠不可能發生的條件
(1) 因為系統資源不足。
(2) 進程運行推進的順序不合適。
(3) 資源分配不當等。
條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
死鎖的解除與預防:
理解了死鎖的原因,尤其是產生死鎖的四個必要條件,就可以最大可能地避免、預防和
解除死鎖。所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確
定資源的合理分配算法,避免進程永久占據系統資源。此外,也要防止進程在處於等待狀態
的情況下占用資源。因此,對資源的分配要合理。