Máy được làm mịn để truy cập vào vùng xung đột

Một phần của tài liệu Kiểm chứng các thành phần Java tương tranh (Trang 46)

C ông cụ sinh mã kiểm chứng PVG

3.3Máy được làm mịn để truy cập vào vùng xung đột

chúng tôi sử dụng kỹ thuật đồng bộ hóa với biến semaphore turn để điều khiển sự thực thi của các sự kiện theo giao thứcΓ. Ban đầu sự kiệninit được kích hoạt, biến turn được khởi tạo bằng 0 để khích hoạt sự kiện event1 trong giao thức khi điều kiệnG1của nó đồng thời được thỏa mãn. Các sự kiện khác được ngăn chặn không cho phép thực hiện, sau khi thực hiện xong, biến semaphore turn sẽ thay đổi giá trị để giải phóng vùng xung đột và cho phép sự kiện tiếp theo trong giao thức được thực hiện. Mục A.1 của Phụ lục A trình bày đặc tả cho vấn đề vùng xung đột với ba tiến trình được biểu diễn bằng các sự kiệnevt1,evt2và evt3 làm thay đổi giá trị của các biếnx,y và z.

3.2.3 Cung cấp và tiêu thụ

Vấn đề cung cấp-tiêu thụ (producer-consumer problem) là một ví dụ điển hình về sự đồng bộ hóa giữa các tiến trình tương tranh. Chúng tôi mô tả vấn đề này bởi hai tiến trình thực hiện theo các nguyên tắc như sau (Hình 3.4).

1. Producer : tạo các phần tử dữ liệu và đẩy vào bộ đệm bằng phương thức

enqueue(), bộ đệm được biểu diễn bằng một hàng đợi với kích thước hữu hạn và cố định,

2. Consumer : lấy các phần tử dữ liệu từ hàng đợi qua phương thức dequeue(), 3. Các tiến trình được thực hiện đồng thời và lặp,

4. Thứ tự thực hiện của các tiến trình tuân theo giao thứcΓ= [initb ,producer || consumer,close] tiến trình khởi tạo init được thực hiện trước, sau đó các tiến trình producer và consumer được thực hiện đồng thời. Tại trạng thái trừu tượngOPENED, các tiến trình producer và consumer có thể thực hiện các phương thứcenqueue()hoặc dequeue()để bổ sung hoặc loại bỏ các phần tử của hàng đợi. Khi tiến trình producer gọi phương thức close() để chuyển sang trạng thái trừu tượng CLOSED thì các phần tử khác sẽ không được bổ sung hoặc loại bỏ từ hàng đợi,

5. Các tiến trình producer và consumer phải bảo đảm không đẩy phần tử dữ liệu vào hàng đợi nếu nó đã đầy và không lấy dữ liệu nếu nó rỗng.

Một phần của tài liệu Kiểm chứng các thành phần Java tương tranh (Trang 46)