Semaphore là gì?

Semaphore là 1 trong cơ chế giúp quản lý các nguồn chia sẻ và đảm bảo an toàn access không bị tắc nghẽn.

Bạn đang xem: Semaphore là gì

Có hai nhiều loại semaphore: binary semaphore với counting semaphore.


*
*

Ví dụ bọn họ gọi những phương thức tuần từ bỏ như sau:

// tạo thành một Semaphore có 5 ticket
Semaphore semaphore = new Semaphore(5);// Yêu ước lấy 1 ticket để sử dụngsemaphore.acquire(); // 5-1// Đếm về con số ticket bao gồm sẵnint number
Of
Available
Tickets = semaphore.available
Permits(); // 4// Trả 1 ticket về Semaphoresemaphore.release(); // 4+1// Đếm về con số ticket bao gồm sẵnsemaphore.available
Permits(); // 5

Ví dụ áp dụng Semaphore

Giả sử một ngân hàng có 4 cây ATM, từng cây chỉ hoàn toàn có thể phục vụ được một người tiêu dùng tại một thời điểm. Chương trình bên dưới cho thấy Semaphore có thể đảm bảo chỉ buổi tối đa 4 người rất có thể truy cập tại một thời điểm.

Worker
Thread.java

package com.gpcoder.semaphore;import java.util.concurrent.Semaphore;public class Worker
Thread extends Thread private final Semaphore semaphore;private String name;public Worker
Thread(Semaphore semaphore, String name) this.semaphore = semaphore;this.name = name;public void run() try System.out.println(name + ": acquiring lock...");System.out.println(name + ": available Semaphore permits now: " + semaphore.available
Permits());semaphore.acquire();System.out.println(name + ": got the permit!");try System.out.println(name + ": is performing operation, available Semaphore permits : "+ semaphore.available
Permits());Thread.sleep(100); // simulate time to work finally // calling release() after a successful acquire()System.out.println(name + ": releasing lock...");semaphore.release();System.out.println(name + ": available Semaphore permits now: " + semaphore.available
Permits()); catch (Interrupted
Exception e) e.print
Stack
Trace();Semaphore
Example.java

package com.gpcoder.semaphore;import java.util.concurrent.Semaphore;public class Semaphore
Example {private static Semaphore semaphore = new Semaphore(4);public static void main(String<> args) {System.out.println("Total available Semaphore permits: " + semaphore.available
Permits());for (int i = 1; i Chạy chương trình trên, ta có tác dụng sau:

Total available Semaphore permits: 4AMT 1: acquiring lock...AMT 1: available Semaphore permits now: 4AMT 1: got the permit!AMT 1: is performing operation, available Semaphore permits : 3AMT 2: acquiring lock...AMT 2: available Semaphore permits now: 3AMT 2: got the permit!AMT 2: is performing operation, available Semaphore permits : 2AMT 3: acquiring lock...AMT 3: available Semaphore permits now: 2AMT 3: got the permit!AMT 3: is performing operation, available Semaphore permits : 1AMT 6: acquiring lock...AMT 4: acquiring lock...AMT 4: available Semaphore permits now: 1AMT 4: got the permit!AMT 4: is performing operation, available Semaphore permits : 0AMT 5: acquiring lock...AMT 5: available Semaphore permits now: 0AMT 6: available Semaphore permits now: 1AMT 3: releasing lock...AMT 4: releasing lock...AMT 1: releasing lock...AMT 4: available Semaphore permits now: 2AMT 2: releasing lock...AMT 2: available Semaphore permits now: 2AMT 6: got the permit!AMT 6: is performing operation, available Semaphore permits : 2AMT 5: got the permit!AMT 5: is performing operation, available Semaphore permits : 2AMT 1: available Semaphore permits now: 3AMT 3: available Semaphore permits now: 2AMT 6: releasing lock...AMT 6: available Semaphore permits now: 3AMT 5: releasing lock...AMT 5: available Semaphore permits now: 4

Ví dụ sử dụng Mutex

Mutex là một Semaphore với cỗ đếm là 1. Tình huống có thể sử dụng là lock tài khoản khi rút tiền. Tại 1 thời điểm chỉ 1 thao tác rút chi phí được chấp nhận.

Chúng ta sẽ áp dụng lại worker sống trên. đưa sử bao gồm 6 user thuộc login vào một trong những tài khoản ở những cây ATM khác biệt để triển khai rút tiền, nếu bọn họ không áp dụng cơ chế synchronized thì cả 6 bạn đều rất có thể rút tiền đồng thời và có thể rút nhiều hơn số tiền hiện bao gồm trong tài khoản.

Đoạn code dưới sử dụng Mutex giúp bọn họ kiểm thẩm tra được vấn đề này một giải pháp dễ dàng.

package com.gpcoder.semaphore;import java.util.concurrent.Semaphore;public class Mutex
Example {private static Semaphore semaphore = new Semaphore(1);public static void main(String<> args) {System.out.println("Total available Semaphore permits: " + semaphore.available
Permits());for (int i = 1; i Chạy công tác trên, bọn họ có kết quả sau:

Total available Semaphore permits: 1AMT 1: acquiring lock...AMT 2: acquiring lock...AMT 1: available Semaphore permits now: 1AMT 2: available Semaphore permits now: 1AMT 1: got the permit!AMT 1: is performing operation, available Semaphore permits : 0AMT 3: acquiring lock...AMT 3: available Semaphore permits now: 0AMT 4: acquiring lock...AMT 4: available Semaphore permits now: 0AMT 5: acquiring lock...AMT 6: acquiring lock...AMT 6: available Semaphore permits now: 0AMT 5: available Semaphore permits now: 0AMT 1: releasing lock...AMT 1: available Semaphore permits now: 1AMT 2: got the permit!AMT 2: is performing operation, available Semaphore permits : 0AMT 2: releasing lock...AMT 2: available Semaphore permits now: 0AMT 3: got the permit!AMT 3: is performing operation, available Semaphore permits : 0AMT 3: releasing lock...AMT 3: available Semaphore permits now: 1AMT 4: got the permit!AMT 4: is performing operation, available Semaphore permits : 0AMT 4: releasing lock...AMT 6: got the permit!AMT 6: is performing operation, available Semaphore permits : 0AMT 4: available Semaphore permits now: 0AMT 6: releasing lock...AMT 5: got the permit!AMT 5: is performing operation, available Semaphore permits : 0AMT 6: available Semaphore permits now: 0AMT 5: releasing lock...AMT 5: available Semaphore permits now: 1Bài viết đến đấy là hết. Mong muốn sau nội dung bài viết này các bạn hiểu rõ rộng về Semaphore, tương tự như biết cách áp dụng nó trong một vài tình huống ưng ý hợp.

Semaphore là gì?

đèn hiệu chỉ dễ dàng và đơn giản là một trở thành không âm và được chia sẻ giữa những luồng. Semaphore là một trong những cơ chế thông tin và một thread đang chờ trên một semaphore có thể được một thread không giống báo hiệu. Nó áp dụng hai atomic opera1) Đợi với 2) dấu hiệu cho quá trình syncsự hro hóa.

Một semaphore cho phép hoặc không chất nhận được truy cập vào tài nguyên, điều này nhờ vào vào bí quyết nó được thiết lập.


Đặc điểm của Semaphore

Đây là điểm sáng của một semaphore:

Đó là 1 trong những cơ chế có thể được sử dụng để hỗ trợ syncđồng hồ nước hóa các nhiệm vụ.Đó là cường độ thấp synccơ chế đồng hồ đeo tay hóa.Semaphore sẽ luôn giữ một quý giá nguyên ko âm.Semaphore có thể được thực hiện bằng cách sử dụng thể nghiệm operacác chuyển động và ngắt, cần được thực thi bằng cách sử dụng bộ trình bày tệp.

Các nhiều loại Semaphores

Hai một số loại ngữ nghĩa phổ biến là

Đếm các ngữ nghĩa
Các ngữ nghĩa nhị phân.

Đếm những ngữ nghĩa

Loại Semaphore này thực hiện số đếm giúp trách nhiệm được tiến hành hoặc giải phóng các lần. Nếu số đếm ban sơ = 0, semaphore đếm sẽ được tạo làm việc trạng thái ko khả dụng.

*

Semaphores nhị phân

Ví dụ về Semaphore

Chương trình dưới đây là quá trình tiến hành từng bước, bao hàm việc áp dụng và khai báo semaphore.

Shared var mutex: semaphore = 1;Process i begin . . P(mutex); execute CS; V(mutex); . . End;

Chờ ngóng và ra hiệu Operacác ngữ nghĩa vào Semaphores

Cả nhị operađược áp dụng để thực hiện quá trình syncsự hóa thân. Phương châm của semaphore này operađiều đó là để có được sự loại bỏ lẫn nhau.


Chờ Operasản xuất

Loại đèn hiệu này operation góp bạn kiểm soát điều hành việc đưa một trọng trách vào phần quan trọng. Mặc dù nhiên, nếu quý hiếm wait là dương thì quý giá của đối số wait X sẽ sút đi. Trong trường hợp quý hiếm âm hoặc bởi 0, ko operahoạt hễ được thực thi. Nó còn được gọi là P(S) operasự.

Sau khi cực hiếm semaphore giảm xuống và biến âm, lệnh sẽ được giữ nguyên cho tới khi những điều khiếu nại yêu cầu được thỏa mãn.

Copy Code
P(S){ while (S

Tín hiệu operasản xuất

Loại Semaphore này operation được sử dụng để kiểm soát điều hành việc ra khỏi một trọng trách từ một phần quan trọng. Nó giúp đội giá trị của đối số lên 1, được ký kết hiệu là V(S).

Copy Code
P(S) while (S>=0); S++;

Đếm Semaphore với Semaphore nhị phân

Dưới đó là một số biệt lập chính giữa semaphore đếm với nhị phân:

Đếm Semaphore
Semaphore nhị phân
Không vứt bỏ lẫn nhauLoại trừ lẫn nhau
Bất kỳ cực hiếm số nguyên nàoChỉ có mức giá trị 0 với 1
Nhiều rộng một khe cắmChỉ một nơi trống
Cung cấp cho một cỗ quy trìnhNó có một cơ chế loại trừ lẫn nhau.

Sự khác biệt giữa Semaphore với Mutex

Thông sốđèn hiệuđột biến
Cơ chếNó là 1 trong những loại hình thức báo hiệu.

Xem thêm: Cách tìm từ khóa chuẩn seo chính xác cho người mới bắt đầu!, từ khóa seo là gì

Đó là 1 cơ chế khóa.
Loại dữ liệuSemaphore là một trong biến số nguyên.Mutex chỉ là một đối tượng.
Sửa đổiSự mong chờ và biểu đạt operations rất có thể sửa đổi một semaphore.Nó chỉ được sửa đổi vày quá trình hoàn toàn có thể yêu cầu hoặc giải tỏa tài nguyên.
Quản lý tài nguyênNếu không tài giỏi nguyên trống thì quá trình yêu ước tài nguyên phải tiến hành chờ operasự. Nó đã đợi cho đến khi số lượng semaphore lớn hơn 0.Nếu nó bị khóa, quy trình này đề nghị chờ. Quá trình này bắt buộc được duy trì trong một mặt hàng đợi. Điều này chỉ việc được truy cập khi mutex được mở khóa.
Sợi chỉBạn gồm thể có không ít chủ đề chương trình.Bạn có thể có khá nhiều luồng công tác trong mutex nhưng không hẳn simultaneothông thường.
Quyền sở hữuGiá trị rất có thể được thay đổi bởi bất kỳ quá trình giải hòa hoặc mang tài nguyên nào.Khóa đối tượng chỉ được giải phóng bởi quy trình đã mang được khóa trên đó.
Các loạiCác nhiều loại Semaphore gồm có semaphore đếm, semaphore nhị phân vàMutex không tồn tại kiểu con.
Operasản xuấtGiá trị semaphore được sửa đổi bằng phương pháp sử dụng wait() với signal() operasự.Đối tượng Mutex bị khóa hoặc mở khóa.
Tài nguyên chỉ chiếm chỗNó bị sở hữu nếu tất cả tài nguyên đang rất được sử dụng và quy trình yêu cầu tài nguyên tiến hành chờ () operation và tự chặn cho tới khi con số semaphore lớn hơn 1.Trong trường vừa lòng đối tượng đã bị khóa, quy trình yêu mong tài nguyên sẽ ngóng và được khối hệ thống xếp sản phẩm đợi trước lúc khóa được giải phóng.

Ưu điểm của Semaphores

Dưới đấy là những ưu/lợi ích của việc áp dụng Semaphore:

Nó cho phép nhiều rộng một luồng truy vấn vào phần quan tiền trọng
Semaphores hòa bình với máy.Semaphores được tiến hành trong mã chủ quyền với lắp thêm của vi hạt nhân.Họ không được cho phép nhiều quá trình đi vào phần quan trọng.Vì có tương đối nhiều sự chờ đợi trong semaphore bắt buộc không lúc nào có sự tiêu tốn lãng phí về thời gian và khoáng sản của quy trình.Chúng chủ quyền với máy, đề xuất được chạy bằng mã tự do với đồ vật của vi nhân.Chúng mang lại phép thống trị tài nguyên linh hoạt.

Nhược điểm của semaphores

Đây là nhược điểm/nhược điểm của semaphore

Một một trong những hạn chế lớn nhất của semaphore là hòn đảo ngược mức độ ưu tiên.Sản phẩm operahệ thống ting đề xuất theo dõi tất cả các cuộc điện thoại tư vấn để chờ và báo hiệu tín hiệu semaphore.Việc áp dụng chúng không khi nào được triển khai mà chỉ theo quy ước.Để tránh deadlocks vào semaphore, chờ và bộc lộ operacác thao tác cần được thực hiện theo đúng thứ tự.Lập trình Semaphore rất phức tạp nên có nhiều khả năng không giành được sự đào thải lẫn nhau.Nó cũng không phải là một phương pháp thực tế để thực hiện ở quy mô lớn vì việc thực hiện chúng đã dẫn mang lại mất tính tế bào đun.Semaphore dễ dẫn đến lỗi lập trình viên hơn.

Tổng kết

Semaphore được định nghĩa là một biến ko âm cùng được share giữa những luồng.Đó là 1 cơ chế có thể được sử dụng để hỗ trợ syncđồng hồ nước hóa các nhiệm vụ.Việc đếm semaphore thực hiện số đếm góp tác vụ được triển khai hoặc giải phóng những lần.Các đèn hiệu nhị phân khá tương tự với các đèn hiệu đếm, tuy thế giá trị của bọn chúng bị giới hạn ở 0 và 1.Đợi operation giúp bạn kiểm soát và điều hành việc nhập một nhiệm vụ vào phần quan liêu trọng
Tín hiệu biểu đạt operation được thực hiện để kiểm soát việc ra khỏi một trọng trách từ 1 phần quan trọng
Đếm Semaphore ko có loại trừ lẫn nhau trong khi Semaphore nhị phân có sa thải lẫn nhau
Semaphore tức là cơ chế báo hiệu trong lúc Mutex là phép tắc khóa
Semaphore chất nhận được nhiều thread truy cập vào phần quan liêu trọng
Một trong số những hạn chế lớn số 1 của semaphore là đảo ngược cường độ ưu tiên.
Bạn có thể thích: