Chƣơng 2 Kiến thức cơ sở
3.2. Bài toán kiểm chứng ràng buộc thời gian giữa các thành phần tƣơng tranh
cạnh [1]. Trong đó, ràng buộc thời gian giữa các thành phần đƣợc đặc tả bằng biểu thức chính quy thời gian. Từ các đặc tả này mã aspect sẽ đƣợc tự động sinh ra đan với mã của các thành phần để từ đó kiểm chứng sự tuân thủ ràng buộc thời gian so với đặc tả. Phƣơng pháp này đã đƣợc thực nghiệm với nhiều chƣơng trình khác nhau. Kết quả thực nghiệm cho thấy phƣơng pháp đã phát hiện các vi phạm về ràng buộc thời gian giữa các thành phần so với đặc tả.
3.2. Bài toán kiểm chứng ràng buộc thời gian giữa các thành phần tƣơng tranh thành phần tƣơng tranh
Giả sử một đoạn mã nguồn thực thi chƣơng trình bao gồm cả thành phần tuần tự và thành phần tƣơng tranh đƣợc mô tả trong Hình 3.1.
public static void main(String[] args) throws Exception { String rs1 = firstSequence(10);
String rs2 = secondSequence(10);
BlockingQueue queue = new ArrayBlockingQueue(1024); Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue); Thread t1 = new Thread(producer);
Thread t2 = new Thread(consumer); t1.start();
t2.start(); }
Hình 3.1 – Mã nguồn một chƣơng trình bao gồm thành phần tuần tự và tƣơng tranh. Thứ tự thực hiện các phƣơng thức trong đoạn chƣơng trình trên nhƣ sau: phƣơng thức Thứ tự thực hiện các phƣơng thức trong đoạn chƣơng trình trên nhƣ sau: phƣơng thức firstSequence(…) đƣợc thực hiện đầu tiên. Tiếp đó phƣơng thức secondSequence(…). Cuối cùng hai Thread t1 và t2 đƣợc thực thi song song nhau.
i. Phƣơng thức firstSequence(…) đƣợc thực hiện với đoạn thời gian đáp ứng cho phép là [a1, b1]. Tiếp đó phƣơng thức secondSequence(…) đƣợc thực hiện với thời gian đáp ứng [a2, b2]. Cuối cùng hai Thread t1 và t2 (hai Thread trên sử dụng phƣơng thức run(…) trong mỗi Thread để thực thi) đƣợc thực thi với thời gian đáp ứng lần lƣợt là [a3, b3] và [a4, b4].
ii. Tổng thời gian thực thi của các phƣơng thức trên không đƣợc quá ngƣỡng 𝜃
cho phép.
iii. Phƣơng thức Producer.run() phải đƣợc thực thi song song với phƣơng thức Consumer.run().
Tổng quát mỗi phƣơng thức Eiđƣợc gán với đoạn thời gian thực thi [ti1, ti2] với ti1 ≤ ti2. Thứ tự thực hiện của các phƣơng thức trên đƣợc mô tả chi tiết trong Hình 3.2.
firstSequence(…)[a1,b1]
secondSequence(…)[a2,b2]
Producer.run(…)[a3,b3]
Consumer.run(…)[a4,b4]
0 10 20
Hình 3.2 – Mô tả quá trình chạy các phƣơng thức.
Định nghĩa 3.1 (Hai sự kiện tuần tự). Hai sự kiện E1 và E2 đƣợc thực hiện tuần tự nhau khi và chỉ khi t21 ≥ t12 hoặc t11 > t22 .
Định nghĩa 3.2 (Hai sự kiện đan xen). Hai sự kiện E1 và E2 đƣợc thực hiện đan xen nhau khi và chỉ khi t11∈ [t21, t22] hoặc t12∈ [t21, t22] hoặc ngƣợc lại t21∈ [t11, t12] hoặc
t22∈ [t11, t12].
Định nghĩa 3.3 (Hai sự kiện song song và phủ nhau). Hai sự kiện E1 và E2song song và phủ nhau khi và chỉ khi t11,t12∈ [t21, t22] hoặc t21, t22∈ [t11, t12].
Định nghĩa 3.4 (Hai sự kiện song song tại cùng một thời điểm). Hai sự kiện E1 và E2