Mutex vs Semaphore: Sự khác biệt là gì?

Mục lục:

Anonim

Semaphore là gì?

Semaphore chỉ đơn giản là một biến không âm và được chia sẻ giữa các luồng. Semaphore là một cơ chế báo hiệu, và một luồng đang đợi trên semaphore có thể được báo hiệu bởi một luồng khác. Nó sử dụng hai hoạt động nguyên tử, 1) chờ và 2) tín hiệu cho quá trình đồng bộ hóa.

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

Trong hướng dẫn này, bạn sẽ học:

  • Mutex là gì?
  • Sử dụng Semaphore
  • Sử dụng Mutex
  • Sự khác biệt giữa Semaphore và Mutex
  • Những quan niệm sai lầm phổ biến về Mutex và Semaphore
  • Ưu điểm của Semaphore
  • Ưu điểm của Mutex
  • Bất lợi của Semaphores
  • Nhược điểm của Mutex

Mutex là gì?

Dạng đầy đủ của Mutex là Đối tượng Loại trừ lẫn nhau. Nó là một loại semaphore nhị phân đặc biệt được sử dụng để kiểm soát quyền truy cập vào tài nguyên được chia sẻ. Nó bao gồm một cơ chế kế thừa ưu tiên để tránh các vấn đề đảo ngược ưu tiên mở rộng. Nó cho phép các tác vụ có mức độ ưu tiên cao hơn hiện tại được giữ ở trạng thái bị chặn trong thời gian ngắn nhất có thể. Tuy nhiên, kế thừa ưu tiên không sửa chữa đảo ngược ưu tiên mà chỉ giảm thiểu tác dụng của nó.

SỰ KHÁC BIỆT CHÍNH

  • Mutex là một cơ chế khóa trong khi Semaphore là một cơ chế báo hiệu
  • Mutex chỉ là một đối tượng trong khi Semaphore là một số nguyên
  • Mutex không có kiểu con trong khi Semaphore có hai kiểu, đó là đếm semaphore và semaphore nhị phân.
  • Semaphore hỗ trợ sửa đổi hoạt động chờ và báo hiệu, trong khi Mutex chỉ được sửa đổi bởi quy trình có thể yêu cầu hoặc giải phóng tài nguyên.
  • Giá trị Semaphore được sửa đổi bằng cách sử dụng các hoạt động wait () và signal (), mặt khác, các hoạt động Mutex bị khóa hoặc mở khóa.

Sử dụng Semaphore

Trong trường hợp có một bộ đệm, chúng ta có thể tách bộ đệm 4 KB thành bốn bộ đệm 1 KB. Semaphore có thể được liên kết với bốn bộ đệm này. Điều này cho phép người dùng và nhà sản xuất làm việc trên các bộ đệm khác nhau cùng một lúc.

Sử dụng Mutex

Một mutex cung cấp sự loại trừ lẫn nhau, có thể là nhà sản xuất hoặc người tiêu dùng có thể có khóa (mutex) và tiếp tục công việc của họ. Miễn là nhà sản xuất lấp đầy bộ đệm, người dùng cần đợi và ngược lại. Trong khóa Mutex, mọi lúc, chỉ một luồng duy nhất có thể hoạt động với toàn bộ bộ đệm.

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

Thông số Semaphore Mutex
Cơ chế Nó là một loại cơ chế báo hiệu. Nó là một cơ chế khóa.
Loại dữ liệu Semaphore là một biến số nguyên. Mutex chỉ là một đối tượng.
Sửa đổi Các hoạt động chờ và báo hiệu có thể sửa đổi một semaphore. Nó chỉ được sửa đổi bởi quy trình có thể yêu cầu hoặc giải phóng tài nguyên.
Quản lý tài nguyên Nếu không có tài nguyên nào là miễn phí, thì quá trình yêu cầu một tài nguyên sẽ thực hiện thao tác chờ. Nó sẽ đợi cho đến khi số lượng semaphore lớn hơn 0. Nếu nó bị khóa, quá trình này phải đợi. Quá trình này nên được giữ trong một hàng đợi. Điều này chỉ cần được truy cập khi mutex được mở khóa.
Chủ đề Bạn có thể có nhiều chủ đề chương trình. Bạn có thể có nhiều luồng chương trình trong mutex nhưng không đồng thời.
Quyền sở hữu Giá trị có thể được thay đổi bởi bất kỳ quá trình nào giải phóng hoặc lấy tài nguyên. Khóa đối tượng chỉ được phát hành bởi quá trình đã lấy được khóa trên đó.
Các loại Các loại Semaphore là đếm semaphore và semaphore nhị phân. Mutex không có kiểu phụ.
Hoạt động Giá trị Semaphore được sửa đổi bằng thao tác wait () và signal (). Đối tượng Mutex bị khóa hoặc mở khóa.
Chiếm tài nguyên Nó bị chiếm dụng nếu tất cả các tài nguyên đang được sử dụng và quá trình yêu cầu tài nguyên thực hiện hoạt động wait () và tự chặn cho đến khi số lượng semaphore trở thành> 1. Trong trường hợp nếu đối tượng đã bị khóa, quá trình yêu cầu tài nguyên sẽ đợi và được hệ thống xếp hàng trước khi khóa được phát hành.

Thông tin cơ bản về Mutex và Semaphore

Dưới đây là một số thông tin chung về Mutex và Semaphore:

  • Chỉ một nhiệm vụ có thể có được mutex. Vì vậy, có quyền sở hữu được liên kết với mutex và chỉ chủ sở hữu mới có thể phát hành mutex.
  • Lý do sử dụng mutex và semaphore khác nhau có thể vì sự giống nhau trong cách triển khai của chúng, mutex sẽ được gọi là semaphore nhị phân.
  • Một quan niệm sai lầm rất được biết đến là Mutexes và Semaphores gần như giống nhau, với sự khác biệt duy nhất là Mutex có khả năng đếm đến 1, trong khi Semaphores có thể đếm từ 0 đến N.
  • Luôn có sự không chắc chắn giữa semaphore nhị phân và mutex. Bạn có thể nghe nói rằng mutex là một semaphore nhị phân, điều này không đúng.

Ưu điểm của Semaphore

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

  • Nó cho phép nhiều luồng truy cập vào phần quan trọng
  • Semaphores không phụ thuộc vào máy móc.
  • Semaphores được triển khai trong mã độc lập với máy của kênh vi mô.
  • Họ không cho phép nhiều quy trình vào phần quan trọng.
  • Vì phải chờ đợi trong semaphore bận rộn, nên không bao giờ lãng phí thời gian xử lý và tài nguyên.
  • Chúng độc lập với máy, nên được chạy trong mã độc lập với máy của kênh vi mô.
  • Chúng cho phép quản lý linh hoạt các nguồn lực.

Ưu điểm của Mutex

Dưới đây là những ưu / lợi ích quan trọng của Mutex

  • Mutexes chỉ là những ổ khóa đơn giản có được trước khi vào phần quan trọng của nó và sau đó giải phóng nó.
  • Vì chỉ có một luồng nằm trong phần quan trọng của nó tại bất kỳ thời điểm nào nên không có điều kiện chạy đua và dữ liệu luôn duy trì nhất quán.

Bất lợi của Semaphores

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

  • Một trong những hạn chế lớn nhất của semaphore là đảo ngược ưu tiên.
  • Hệ điều hành phải theo dõi tất cả các cuộc gọi để chờ và báo hiệu cho semaphore.
  • Việc sử dụng chúng không bao giờ được thực thi mà chỉ theo quy ước.
  • Để tránh deadlock trong semaphore, các hoạt động Wait và Signal yêu cầu phải được thực hiện theo đúng thứ tự.
  • Lập trình Semaphore là một phương pháp phức tạp, vì vậy có khả năng không đạt được loại trừ lẫn nhau.
  • Nó cũng không phải là một phương pháp thực tế để sử dụng trên quy mô lớn vì việc sử dụng chúng dẫn đến mất tính mô-đun.
  • Semaphore dễ bị lỗi lập trình viên hơn.
  • Nó có thể gây ra bế tắc hoặc vi phạm loại trừ lẫn nhau do lỗi của người lập trình.

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

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

  • Nếu một luồng nhận được khóa và chuyển sang trạng thái ngủ hoặc nó bị bắt trước, thì luồng kia có thể không thể tiến lên. Điều này có thể dẫn đến chết đói.
  • Nó không thể bị khóa hoặc mở khóa từ một ngữ cảnh khác với bối cảnh có được nó.
  • Mỗi lần chỉ nên cho phép một chủ đề trong phần quan trọng.
  • Việc thực hiện bình thường có thể dẫn đến trạng thái chờ bận, làm lãng phí thời gian của CPU.