Semaphore so với màn hình - sự khác biệt là gì?


233

Sự khác biệt chính giữa Màn hìnhSemaphore là gì?


8
Bạn có thể nghĩ về màn hình như một semaphore nhị phân.
Maxim Egorushkin


1
Vui lòng đi qua albahari.com/threading/part2.aspx . Tôi đã đọc bài viết này, cuốn sách hay nhất tôi từng đọc trên Threading
Chaianu Gupta

5
Tôi không nghĩ bạn đúng, Maxim. Một semaphore là cấu trúc "cấp thấp hơn", nếu tôi không nhầm, trong khi Màn hình là một đối tượng toàn diện. Tôi nhớ rằng chúng tôi đã xem qua màn hình một cách nhanh chóng trong lớp Hệ điều hành của tôi ở trường đại học, nhưng tôi không nhớ Màn hình khác với Mutex như thế nào, ngoài việc nó hướng đối tượng. Tôi nhớ một vấn đề có thể được thực hiện bằng cách sử dụng màn hình, nhưng chúng tôi không thể sử dụng cùng phương thức này trong lớp, do các hạn chế của ngôn ngữ C.
user919860

1
Semaphore và Monitor rất khác nhau, nhưng tương đương về sức mạnh, theo nghĩa là bạn có thể thực hiện cái này từ cái khác. Bạn có thể đọc bài báo gốc của Hoare chứng minh sự tương đương của họ từ đây
Thanh DK

Câu trả lời:


529

Một Monitor là một đối tượng được thiết kế để được truy cập từ nhiều luồng. Các chức năng hoặc phương thức thành viên của một đối tượng giám sát sẽ thực thi loại trừ lẫn nhau, do đó chỉ một luồng có thể thực hiện bất kỳ hành động nào trên đối tượng tại một thời điểm nhất định. Nếu một luồng hiện đang thực thi chức năng thành viên của đối tượng thì bất kỳ luồng nào khác cố gọi hàm thành viên của đối tượng đó sẽ phải đợi cho đến khi luồng đầu tiên kết thúc.

Một Semaphore là một đối tượng cấp dưới. Bạn cũng có thể sử dụng một semaphore để thực hiện một màn hình. Một semaphore về cơ bản chỉ là một truy cập. Khi bộ đếm dương, nếu một luồng cố gắng thu được semaphore thì nó được phép và bộ đếm bị giảm. Khi một luồng được thực hiện thì nó sẽ giải phóng semaphore và tăng bộ đếm.

Nếu bộ đếm đã bằng 0 khi một luồng cố gắng thu được semaphore thì nó phải đợi cho đến khi một luồng khác giải phóng semaphore. Nếu nhiều luồng đang chờ khi một luồng phát hành một semaphore thì một trong số chúng sẽ nhận được nó. Các chủ đề phát hành một semaphore không cần phải là cùng một chủ đề có được nó.

Một màn hình giống như một nhà vệ sinh công cộng. Chỉ một người có thể nhập tại một thời điểm. Họ khóa cửa để ngăn chặn bất kỳ ai khác bước vào, làm công việc của họ và sau đó mở khóa khi họ rời đi.

Một semaphore giống như một nơi thuê xe đạp. Họ có một số lượng xe đạp nhất định. Nếu bạn thử và thuê một chiếc xe đạp và họ có một chiếc miễn phí thì bạn có thể lấy nó, nếu không bạn phải chờ. Khi ai đó trả lại xe đạp thì người khác có thể lấy nó. Nếu bạn có một chiếc xe đạp thì bạn có thể đưa nó cho người khác trả lại --- nơi thuê xe đạp không quan tâm ai trả lại, miễn là họ lấy lại được xe đạp.


162
+1 Tương tự lớn với phòng tắm công cộng và nơi cho thuê xe đạp. Tôi sẽ không bao giờ quên sự khác biệt giữa hai bây giờ.
Drupad Panchal

4
Câu trả lời của bạn dường như mâu thuẫn với stackoverflow.com/a/7336799/632951 .. vậy ai đúng?
Pacerier

6
@Pacerier: Tôi là :-) Mâu thuẫn duy nhất là thứ cấp cao / cấp thấp. Bạn có thể xây dựng một màn hình từ semaphores, nó không thực sự gọn gàng, chính xác bởi vì màn hình là một cấu trúc cấp cao hơn một semaphore. Một semaphore chỉ là một quầy với sự chờ đợi. Tôi đề nghị đọc "Cuốn sách nhỏ về ngữ nghĩa" greenteapress.com/semaphores
Anthony Williams

3
@AnthonyWilliams: Có lẽ tôi nghi ngờ khái niệm rằng bạn chỉ có thể xây dựng màn hình từ semaphores. Một cách khác cũng có thể và do đó chúng ta không thể nói rằng màn hình là một thực thể cấp cao hơn so với semaphores.
Kavish Dwivingi 23/03/13

5
Có, bạn có thể xây dựng một semaphore từ một màn hình. Bạn luôn có thể xây dựng các đối tượng cấp thấp từ những đối tượng cấp cao. Các công cụ cấp cao / thấp là về khả năng và phạm vi hoạt động, không phải là thứ có thể được sử dụng để xây dựng cái khác.
Anthony Williams

11

Giải thích sau đây thực sự giải thích sự chờ đợi () và tín hiệu () của màn hình khác với P và V của semaphore.

Các hoạt động Wait ()signal () trên các biến điều kiện trong một màn hình tương tự như các hoạt động PV khi đếm các semaphores .

Một câu lệnh chờ có thể chặn quá trình thực thi của một tiến trình, trong khi một câu lệnh tín hiệu có thể khiến một tiến trình khác bị bỏ chặn. Tuy nhiên, có một số khác biệtgiữa họ. Khi một quá trình thực hiện một hoạt động P, nó không nhất thiết phải chặn quá trình đó bởi vì semaphore đếm có thể lớn hơn 0. Ngược lại, khi một câu lệnh chờ được thực thi, nó luôn chặn quá trình. Khi một tác vụ thực thi thao tác V trên semaphore, nó sẽ bỏ chặn một tác vụ đang chờ trên semaphore đó hoặc tăng bộ đếm semaphore nếu không có nhiệm vụ để mở khóa. Mặt khác, nếu một quá trình thực thi một tuyên bố tín hiệu khi không có quá trình nào khác để bỏ chặn, thì không có ảnh hưởng đến biến điều kiện. Một điểm khác biệt giữa semaphores và màn hình là người dùng được đánh thức bởi thao tác V có thể tiếp tục thực hiện mà không bị trì hoãn. Ngược lại, người dùng được đánh thức bởi một hoạt động tín hiệu chỉ được khởi động lại khi màn hình được mở khóa. Ngoài ra,

Liên kết: ở đây để đọc thêm. Hy vọng nó giúp.


6

Trả lời một dòng:

Màn hình: chỉ điều khiển MỘT luồng tại một thời điểm có thể thực thi trong màn hình. (cần phải có khóa để thực hiện chuỗi đơn)

Semaphore: một khóa bảo vệ tài nguyên được chia sẻ. (cần phải có được khóa để truy cập tài nguyên)


5

Semaphore cho phép nhiều luồng (tối đa một số được đặt) truy cập vào một đối tượng được chia sẻ. Màn hình cho phép truy cập lẫn nhau vào một đối tượng chia sẻ.

Giám sát

Semaphore


10
Nhưng, màn hình sẽ khác với MutEx như thế nào? Một khóa loại trừ lẫn nhau thực hiện điều tương tự chính xác như một semaphore, nhưng chỉ cho phép một luồng truy cập vào Vùng quan trọng tại một thời điểm.
dùng919860

2
Vâng, sự khác biệt giữa một mnitor và mutex là gì?
Pacerier

2
Đáng lưu ý rằng Semaphores không kiểm soát quyền truy cập vào một đối tượng được chia sẻ, mà là một tài nguyên được chia sẻ (sẽ chứa nhiều đối tượng).
xbonez

@xbonez: Nếu chúng ta nhìn vào java.util.ArrayList: nó là một đối tượng hoặc nơi chứa nhiều đối tượng? Vâng, đó là cả hai cùng một lúc. Vì vậy, semaphore có thích hợp để kiểm soát truy cập vào nó? Tôi sẽ nói không.
dma_k

Trong câu trả lời được chấp nhận, có đề cập rằng Monitor đang thực hiện Loại trừ lẫn nhau. Vui lòng xem "Các chức năng hoặc phương thức thành viên của đối tượng giám sát sẽ thực thi loại trừ lẫn nhau, do đó chỉ một luồng có thể thực hiện bất kỳ hành động nào trên đối tượng tại một thời điểm nhất định"
achoora

2

Khi một semaphore được sử dụng để bảo vệ một khu vực quan trọng, không có mối quan hệ trực tiếp giữa semaphore và dữ liệu được bảo vệ. Đây là một phần lý do tại sao semaphores có thể bị phân tán xung quanh mã và tại sao dễ quên gọi chờ hoặc thông báo , trong trường hợp đó, kết quả sẽ là vi phạm loại trừ lẫn nhau hoặc khóa tài nguyên vĩnh viễn.

Ngược lại, không có những điều xấu này có thể xảy ra với một màn hình. Một màn hình mệt mỏi trực tiếp với dữ liệu (nó đóng gói dữ liệu) và, vì các hoạt động của màn hình là các hành động nguyên tử, không thể viết mã có thể truy cập dữ liệu mà không cần gọi giao thức nhập. Giao thức thoát được gọi tự động khi hoàn thành thao tác màn hình.

Một màn hình có một cơ chế tích hợp để đồng bộ hóa điều kiện dưới dạng biến điều kiện trước khi tiến hành. Nếu điều kiện không được thỏa mãn, quy trình phải đợi cho đến khi được thông báo về sự thay đổi trong điều kiện. Khi một quy trình đang chờ đồng bộ hóa điều kiện, việc triển khai màn hình sẽ xử lý vấn đề loại trừ lẫn nhau và cho phép một quy trình khác có quyền truy cập vào màn hình.

Lấy từ tài liệu khóa học "Quá trình tương tác" của Đại học Mở M362.


Ngoại trừ điều đó, mặc dù semaphores khá phổ biến có sẵn trong một ngôn ngữ và được trình bày trong sách giáo khoa như một loại biến với các toán tử nguyên tử hạn chế, semaphore là một trường hợp đặc biệt của màn hình - bởi vì nó là một loại biến với các toán tử nguyên tử giới hạn, bởi vì đó là những gì một màn hình. Các đối số ở trên mà semaphores là "cấp thấp hơn" là đặc biệt.
philipxy

2

Semaphore:

Sử dụng bộ đếm hoặc cờ để kiểm soát truy cập một số tài nguyên được chia sẻ trong một hệ thống đồng thời, ngụ ý sử dụng Semaphore .

Thí dụ:

  1. Một quầy chỉ cho phép 50 Hành khách có được 50 chỗ ngồi (Tài nguyên được chia sẻ) của bất kỳ Nhà hát / Xe buýt / Xe lửa / Chuyến đi vui vẻ / Lớp học. Và chỉ cho phép một Hành khách mới nếu có người rời ghế.
  2. Một cờ nhị phân cho biết trạng thái miễn phí / chiếm đóng của bất kỳ Phòng tắm.
  3. Đèn giao thông là ví dụ tốt về cờ. Họ kiểm soát dòng chảy bằng cách điều tiết phương tiện đi lại trên Đường (Tài nguyên dùng chung)

Cờ chỉ tiết lộ trạng thái Tài nguyên hiện tại, không có số lượng hoặc bất kỳ thông tin nào khác về các đối tượng đang chờ hoặc đang chạy trên tài nguyên.

Giám sát:

Một Monitor đồng bộ truy cập vào một đối tượng bằng cách giao tiếp với chủ đề quan tâm đối tượng, yêu cầu họ truy cập được hoặc chờ đợi đối với một số điều kiện để trở thành hiện thực.

Thí dụ:

  1. Một người cha có thể đóng vai trò là người theo dõi con gái mình, cho phép cô chỉ hẹn hò với một chàng trai tại một thời điểm.
  2. Một giáo viên trường sử dụng dùi cui để chỉ cho phép một đứa trẻ nói trong lớp.
  3. Cuối cùng là một kỹ thuật, các giao dịch (thông qua các luồng) trên một đối tượng Tài khoản được đồng bộ hóa để duy trì tính toàn vẹn.

Tôi nghĩ rằng đèn giao thông trên đường giao nhau cũng là cờ nhị phân: ô tô trên một đường hoặc trên đường trực giao có thể lái (loại trừ lẫn nhau) do đó ví dụ (3) giống như (2). Ngoài ra tôi nghĩ rằng những ví dụ đó là trường hợp góc cho semaphores (trường hợp tầm thường), có thể được thực hiện bằng cách sử dụng màn hình. Có nhiều ví dụ điển hình hơn trong wikipedia .
dma_k
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.