Semaphore vs Mutex
Semaphore là một cấu trúc dữ liệu được sử dụng để đảm bảo rằng nhiều quy trình không truy cập vào một tài nguyên chung hoặc một phần quan trọng cùng một lúc, trong các môi trường lập trình song song. Semaphores được sử dụng để tránh khóa chết và điều kiện cuộc đua. Mutex (Đối tượng loại trừ lẫn nhau) cũng được sử dụng để tránh truy cập vào một tài nguyên chung cùng một lúc bởi một số quy trình đồng thời.
Semaphore là gì?
Semaphore là một cấu trúc dữ liệu được sử dụng để cung cấp loại trừ lẫn nhau cho các phần quan trọng. Semaphores chủ yếu hỗ trợ hai hoạt động được gọi là chờ đợi (trong lịch sử được gọi là P) và tín hiệu (trong lịch sử được gọi là V). Hoạt động chờ chặn một quy trình cho đến khi semaphore được mở và hoạt động tín hiệu cho phép một quy trình (luồng) khác đi vào. Mỗi semaphore được liên kết với một hàng các quá trình chờ đợi. Khi hoạt động chờ được gọi bởi một luồng, nếu semaphore được mở, luồng có thể tiếp tục. Nếu semaphore bị đóng khi hoạt động chờ được gọi bởi một luồng, thì luồng bị chặn và nó phải chờ trong hàng đợi. Hoạt động tín hiệu mở một semaphore và nếu có một luồng đang chờ trong hàng đợi, quá trình đó được phép tiến hành và nếu không có luồng nào chờ trong hàng đợi, tín hiệu sẽ được ghi nhớ cho các luồng tiếp theo. Có hai loại semaphores được gọi là mutex semaphores và đếm semaphores. Mutap semaphores cho phép một quyền truy cập vào một tài nguyên và đếm semaphores cho phép nhiều luồng truy cập vào một tài nguyên (có sẵn một số đơn vị).
Mutex là gì?
Khi một ứng dụng máy tính được khởi động, nó sẽ tạo ra một mutex và gắn nó vào một tài nguyên. Khi tài nguyên được sử dụng bởi một luồng, nó bị khóa và các luồng khác không thể sử dụng nó. Nếu một luồng khác muốn sử dụng cùng một tài nguyên, nó sẽ phải đưa ra yêu cầu. Sau đó, luồng đó sẽ được đặt trong hàng đợi cho đến khi luồng đầu tiên kết thúc với tài nguyên. Khi luồng đầu tiên kết thúc với tài nguyên, khóa sẽ bị xóa và luồng đang chờ trong hàng đợi có thể có quyền truy cập vào tài nguyên. Nếu có nhiều luồng đang chờ trong hàng đợi, chúng sẽ được cấp quyền truy cập trong một cơ sở luân phiên. Thực tế, khi mutex thay thế quyền truy cập vào một tài nguyên giữa một số luồng, nó sẽ hiển thị vì nhiều luồng đang tiêu thụ một tài nguyên cùng một lúc. Nhưng bên trong chỉ có một luồng duy nhất đang truy cập tài nguyên tại một thời điểm nhất định.
Sự khác biệt giữa Semaphore và Mutex là gì?
Mặc dù, cả hai đối tượng semaphores và mutex đều được sử dụng để đạt được loại trừ lẫn nhau trong môi trường lập trình song song, chúng có một số khác biệt. Một đối tượng mutex chỉ cho phép một luồng duy nhất tiêu thụ một tài nguyên hoặc một phần quan trọng, trong khi các ngữ nghĩa cho phép một số lượng hạn chế truy cập đồng thời vào một tài nguyên (dưới một số lượng tối đa được phép). Với các đối tượng mutex, các luồng khác muốn truy cập tài nguyên phải chờ trong hàng đợi cho đến khi luồng hiện tại kết thúc bằng cách sử dụng tài nguyên.