C ông cụ sinh mã kiểm chứng PVG
3.5 Má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