3. Bố cục của luận văn
2.4. Kiểm tra tính khả tuần tự của lịch
Kết quả thực hiện hiện tương đương với một trật tự ma trận riêng rẽ với từng tiến trình.
Mô hình 1: Chỉ xét các thao tác LOCK và UNLOCK. - Gọi S là lịch gồm các giao tác T1, T2, T3, ..., Tn
- Xét các thao tác có dạng LOCK và UNLOCK
- Nếu dòng i có 1 thao tác dạng UNLOCK, dòng j có thao thác tiếp theo sau đó có dạng LOCK thì ta vẽ một cung có hướng i → j
- Lịch thao tác khả tuần tự khi và chỉ khi đồ thì không có chu trình. Thí dụ: Cho lịch gồm 2 giao tác trên 4 đơn vị dữ liệu như sau:
a = T1 c b = T2 Xét từng đơn vị dữ liệu từ 1 đến 4 1: T1 2: T1 T2 3: T1 4: T2 1 L 2 2 L 4 2 L 4 1 U 2 1 L 2 2 L 2 1 L 1 1 U 2 2 U 4 1 L 3 2 L 2 2 L 1 1 U 3 2 U 4 2 U 2 1 U 1 1 L 1 2 U 1 1 L 3 1 U 3 1 U 1 2 L 1 2 U 2 2 U 1
Thuật toán được mô tả như sau: Lập đồ thị có hướng G Đỉnh là các giao tác
Với mọi đơn vị dữ liệu e (T K e) Nếu trong lịch xuất hiện 2 dòng i < j
- Dòng i: T UNLOCK e - Dòng j: T' LOCK e T T' thì nối cung T T'
Kiểm tra G ?
- G có chu trình: thông báo không khả tuần tự - G không có chu trình : Xuất trật tự topo.
- Xuất trật tự TOPO là sắp xếp theo công việc, việc nào nên làm trước, việc nào nên làm sau.
- Các công việc được đại diện bởi các đỉnh đồ thị. Đồ thị có cung từ x đến y nếu công việc x phải hoàn thành trước khi công việc y bắt đầu (chẳng hạn như khi giặt quần áo, việc giặt phải hoàn thành trước khi bắt đầu phơi khô). Khi đó, một thứ tự Tô Pô tương ứng với một thứ tự thực hiện các công việc.
=> Thuật toán :
Algorithm LichKhaTuanTu Input: Lich T
Output: true if T là kha tuan tu; false - ngoài ra.
begin
cc[i][j];// ma tran ke x, y; // cung x -> y bac[P]; // , bac cua dinh
for i = 1 to n do
if ( bac [i] == 0 ) then bac [i] == -1 return true
else return false endì// khong co dinh troc if (x== 0 && y ==0 ) then
c[x][y] = 1 ; ++ bac[y] ; // tang bac y if x= dinhtroc
if x = 0 return false endif; for y =1 to n do if cc[x][y] == 1 then { cc[x][y] == 0; --bac[y]; endif endLichKhaTuanTu
Mô hình 2: Chỉ xét các thao tác RLOCK/ WLOCK và UNLOCK. - Gọi S là lịch gồm các giao tác T1, T2, T3, ..., Tn
- Xét các thao tác có dạng RLOCK/ WLOCK và UNLOCK
- Nếu dòng i có 1 thao tác dạng UNLOCK, dòng j có thao thác tiếp theo sau đó có dạng RLOCK/ WLOCK thì ta vẽ một cung có hướng i → j
- Lịch thao tác khả tuần tự khi và chỉ khi đồ thì không có chu trình. Thí dụ: Cho lịch gồm 2 giao tác trên 4 đơn vị dữ liệu như sau:
a = T1 c= T3 b = T2 Xét từng đơn vị dữ liệu từ 1 đến 4 1: T1 T2 T1 T4 2 : T2 3: T3 T1 4: T4 T3 1 WLOCK 1 2 WLOCK 3 3 WLOCK 2
1 WLOCK 2 2 UNLOCK 3 3 WLOCK 4 1 UNLOCK 1 2 WLOCK 4 3 UNLOCK 4 1 UNLOCK 2 2 WLOCK 1 3 UNLOCK 2 2 UNLOCK 4 3 WLOCK 3 2 UNLOCK 1 3 UNLOCK 3 2 WLOCK 3
Lập đồ thị có hướng G Đỉnh là các giao tác
Với mọi đơn vị dữ liệu e (T K e) Nếu trong lịch xuất hiện 2 dòng i < j
- Dòng i: T UNLOCK e
- Dòng j: T' RLOCK/ WLOCK e T T' thì nối cung T T'
Kiểm tra G ?
- G có chu trình: thông báo không khả tuần tự - G không có chu trình : Xuất trật tự topo.
Algorithm LichKhaTuanTu Input: Lich T
Output: true if T là kha tuan tu; false - ngoài ra.
begin
cc[i][j];// ma tran ke x, y; // cung x -> y bac[P]; // , bac cua dinh
for i = 1 to n do
if ( bac [i] == 0 ) then bac [i] == -1 return true
else return false endì// khong co dinh troc if (x== 0 && y ==0 ) then
c[x][y] = 1 ; ++ bac[y] ; // tang bac y if x= dinhtroc
if x = 0 return false endif; for y =1 to n do
if cc[x][y] == 1 then { cc[x][y] == 0; --bac[y];
endif
endLichKhaTuanTu