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 tiến 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 môi trường lập trình song song. Semaphores được sử dụng để tránh các khóa chết và các điều kiện đua. Mutex (Đối tượng Loại trừ lẫn nhau) cũng được sử dụng để tránh truy cập vào 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 để 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ờ (lịch sử được gọi là P) và tín hiệu (trong lịch sử được gọi là V). Thao tác chờ sẽ chặn một tiến trình cho đến khi semaphore được mở và thao tác tín hiệu cho phép một tiến trình (luồng) khác đi vào. Mỗi semaphore được liên kết với một hàng đợi các tiến trình đang chờ. Khi hoạt động chờ được gọi bởi một luồng, nếu semaphore đang mở, luồng có thể tiếp tục. Nếu semaphore bị đóng khi thao tác chờ được gọi bởi một luồng, luồng đó sẽ bị chặn và nó phải đợi trong hàng đợi. Hoạt động tín hiệu sẽ mở ra một semaphore và nếu đã có một luồng đang đợi trong hàng đợi, quá trình đó được phép tiếp tục và nếu không có luồng nào đang chờ trong hàng đợi thì 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à semaphores mutex và semaphores đếm. Các semaphores Mutex cho phép một quyền truy cập duy nhất vào một tài nguyên và đếm các 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 một mutex và đính kèm 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ó sẽ 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 thực hiện một yêu cầu. Sau đó, luồng đó sẽ được đặt trong một 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ị loại bỏ và luồng đang đợi trong hàng đợi có thể truy cập vào tài nguyên. Nếu có nhiều luồng đang đợi trong hàng đợi, chúng được cấp quyền truy cập trên cơ sở luân phiên. Thực tế, khi mutex xen kẽ quyền truy cập vào 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ụ 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 để 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 sử dụng tài nguyên hoặc một phần quan trọng, trong khi các semaphores cho phép một số lượng hạn chế truy cập đồng thời vào tài nguyên (dưới số lượng tối đa cho phép). Với đối tượng mutex, các luồng khác muốn truy cập tài nguyên phải đợi trong hàng đợi, cho đến khi luồng hiện tại sử dụng tài nguyên xong.