Rate this post

Để loại bỏ vấn đề lãng phí các wake-up signals, Dijkstra đã đề xuất một phương pháp liên quan đến việc lưu trữ tất cả các wake-up calls. Dijkstra nói rằng, thay vì đưa ra các wake-up calls trực tiếp cho consumer, producer  có thể lưu trữ các wake-up calls trong một biến. Bất kỳ consumer nào cũng có thể đọc nó bất cứ khi nào họ cần.

Semaphore là các biến lưu trữ toàn bộ các wake-up signals đang được chuyển từ producer sang consumer. Nó là một biến mà việc đọc, sửa đổi và cập nhật diễn ra tự động trong kernel mode.

Các bài viết liên quan:

Semaphore không thể được thực hiện trong chế độ người dùng vì race condition có thể luôn phát sinh khi hai hoặc nhiều quy trình cố gắng truy cập biến đồng thời. Nó luôn cần sự hỗ trợ từ hệ điều hành để được thực hiện.

Theo nhu cầu của tình hình, Semaphore có thể được chia thành hai loại.

  • Counting Semaphore
  • Binary Semaphore hoặc Mutex

Chúng tôi sẽ thảo luận chi tiết từng cái một.

Counting Semaphore

Có những tình huống trong đó nhiều hơn một Process cần thực hiện đồng thời trong critical section. Tuy nhiên, counting semaphore có thể được sử dụng khi chúng ta cần có nhiều hơn một Process trong critical section cùng một lúc.

Mã lập trình của việc triển khai semaphore được hiển thị bên dưới, bao gồm cấu trúc của semaphore và logic sử dụng mục nhập và lối ra có thể được thực hiện trong critical section.

struct Semaphore  
{  
    int value; // processes that can enter in the critical section simultaneously.   
    queue type L; // L contains set of processes which get blocked   
}  
Down (Semaphore S)  
{  
    SS.value = S.value - 1; //semaphore's value will get decreased when a new   
    //process enter in the critical section   
    if (S.value< 0)  
    {  
        put_process(PCB) in L; //if the value is negative then   
        //the process will get into the blocked state.  
        Sleep();   
    }  
    else  
        return;  
}  
up (Semaphore s)  
{  
    SS.value = S.value+1; //semaphore value will get increased when   
    //it makes an exit from the critical section.   
    if(S.value<=0)  
    {  
        select a process from L; //if the value of semaphore is positive   
        //then wake one of the processes in the blocked queue.   
        wake-up();  
    }  
    }  
}  

Trong cơ chế này, việc nhập và xuất trong phần tới hạn được thực hiện trên cơ sở giá trị couting semaphore. Giá trị couting semaphore tại bất kỳ thời điểm nào cho biết số lượng process tối đa có thể nhập vào critical section cùng một lúc.

Một process muốn nhập vào critical section trước tiên hãy giảm giá trị semaphore đi 1 và sau đó kiểm tra xem nó có bị âm hay không. Nếu nó bị âm thì process sẽ bị đẩy vào danh sách các blocked processes, nếu không thì nó sẽ được nhập vào critical section.

Khi một Process thoát khỏi critical section, nó sẽ tăng couting semaphore đang lên 1 và sau đó kiểm tra xem nó là số âm hay số không. Nếu nó là âm thì điều đó có nghĩa là ít nhất một process đang đợi ở blocked state, do đó, để đảm bảo việc chờ có giới hạn, process đầu tiên trong danh sách các blocked processes sẽ wake up và được nhập vào critical section.

Các Process trong blocked processes sẽ được wake up theo thứ tự mà chúng đã ngủ. Nếu giá trị đếm semaphore là số âm thì nó cho biết số lượng Process ở blocked processes trong khi nếu nó là dương thì nó cho biết số lượng process có sẵn trong critical section.

Vấn đề về Couting Semaphore

Các câu hỏi đang được hỏi về couting semaphore trong GATE. Nói chung các câu hỏi rất đơn giản chỉ bao gồm phép trừ và phép cộng.

  1. Wait → Decre → Down → P   
  2. Signal → Inc → Up → V  

Các câu hỏi loại sau có thể được hỏi trong GATE.

Một Semaphore đếm được khởi tạo thành 12. sau đó các hoạt động 10P (chờ) và 4V (Tín hiệu) được tính trên semaphore này. Kết quả là gì?

S = 12 (initial)   
10 p (wait) :  
SS = S -10 = 12 - 10 = 2   
then 4 V :   
SS = S + 4 =2 + 4 = 6  

Do đó, giá trị cuối cùng của đếm semaphore là 6.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now