Máy trừu tượng cho vấn đề cung cấp-tiêu thụ

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 48)

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

3.5Máy trừu tượng cho vấn đề cung cấp-tiêu thụ

không để biểu diễn số phần tử của bộ đệm. Biến Count sẽ tăng lên một khi một phần tử dữ liệu mới được bổ sung vào bộ đệm và giảm khi một phần tử dữ liệu được loại bỏ từ bộ đệm. Biến Buffer Size biểu diễn kích thước (số phần tử tối đa) của bộ đệm, bộ đệm sẽ đầy khi biến semaphoreCount bằng kích thước của nó và ngược lại rỗng khi Count bằng không. Khi bộ đệm đã đầy sự kiện Producers sẽ kích hoạt sự kiện close thông qua biến semaphore isClose để chuyển sang trạng thái trừu tượng CLOSED. Mô hình làm mịn được đặc tả như trong Hình 3.6. Mục

A.2của Phụ lụcAtrình bày đặc tả cho vấn đề cung cấp-tiêu thụ với hai tiến trình và bộ đệm dữ liệu được biểu diễn bằng một hàng đợi có kích thước hữu hạn, cố định.

Mô hình làm mịn trong Hình3.6 chỉ thực hiện tốt khi chúng ta có một tiến trình cung cấp và một tiến trình tiêu thụ. Trong trường hợp có nhiều tiến trình cung cấp đồng thời đẩy các phần tử dữ liệu, hoặc nhiều tiến trình cùng tiêu thụ dữ liệu thì sẽ gây ra trường hợp cạnh tranh dữ liệu (data race) do các tiến trình cùng nhau đọc/ghi dữ liệu tại một ô nhớ của bộ đệm ở cùng một thời điểm. Để giải quyết vấn đề này chúng ta cần một cơ chế loại trừ sao cho tại cùng một thời điểm chỉ cho phép một tiến trình producer và một tiến trình consumer được thực hiện song song nhau. Hình 3.7 đặc tả mô hình làm mịn thứ hai với n tiến trình producer và m tiến trình consumer được thực hiện song song. Trong mô hình làm mịn này, chúng tôi bổ sung hai tập hợp Producers gồm n phần tử và Consumers gồm m

phần tử để biểu diễn số tiến trình producer và consumer của mô hình. Hai biến semaphore là TurnP và TurnC được khởi tạo là một số ngẫu nhiên thuộc tập

machine ProducerConsumerR1

refinesProducerConsumer

invariant

inv1 : Buffer size ∈NAT

inv2 : Count ∈0..Buffer size

...

init

act1 : Count := 0

...

producer consumer

refinesproducer refines consumer

when when

grd1 :G1 grd1 : G2

grd2 :Count <Buffer Size grd2 : Count >0

then then

act1 : create d act1 : consume d

act2 :Count :=Count+1 act2 : Count :=Count−1

act3 :if Count =Buffer Size then end

isClose =True end close when grd1 :isClose =True then act1 : G1 := False act2 : G2 := False end

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 48)