Giải thuật nhãn thời gian dùng nhãn thời gian của Lamport đảm bảo truy nhập chính xác tới phần tới hạn. Giao thức thực hiện bởi vì có một phương pháp ưu tiên của các yêu cầu có thể được sắp xếp toàn cục. Có một bộ xử lý cho phép từ các bộ xử lý khác đi vào phần tới hạn, và bộ xử lý này sẽ từ chối cho phép tới tất cả các bộ xử lý khác.
Nhãn thời gian Lamport phục vụ như 1 đồng hồ toàn cục. Vì nó là thứ tự tuyệt đối, có sự sắp xếp toàn cục giữa tất cả các bộ xử lý đã yêu cầu phần tới hạn.
Một cách chuyển giải thuật dễ thấy trong giao thức là để mỗi bộ xử lý báo yêu cầu của nó đi vào phần tới hạn. Tất cả các bộ xử lý khác phải trả lời, đưa ra các yêu cầu hiện thời. Các trả lời này mang nhãn thời gian tại bên trả lời yêu cầu phần tới hạn hay giá trị không nếu bên trả lời không đợi hay sử dụng phần tới hạn. Khi bộ xử lý đi ra phần tới hạn, nó báo cho tất cả các bộ xử lý khác. Bằng cách xem xét các thông tin này, mỗi bộ xử lý có thể đặt hàng đợi ưu tiên giống nhau của các bộ xử lý đợi đi vào phần tới hạn. Khi bộ xử lý tìm thấy hàng đợi ưu tiên, nó biết rằng không có bộ xử lý khác nghĩ rằng nó ở đầu của hàng đợi ưu tiên, như vậy nó an toàn đi vào phần tới hạn.
Các biến dùng trong giải thuật Ricarat và Agrawala
timestamp currentime Thời gian Lamport hiện thời timestamp my_timestamp Nhãn thời gian yêu cầu
integer reply_count Số hiệu cho phép cần tập hợp trước khi vào phần tới hạn CS(critical section). boolean is_requesting Đúng nếu đang yêu cầu hay dùng CS
boolean reply_deffered[M] reply_deffered[i] đúng nếu trì hoãn trả lời yêu cầu của bộ xử lý j
Giả sử bộ xử lý p gửi yêu cầu đến bộ xử lý q. Bộ xử lý p sẽ bị chặn ít nhất chođến khi có trả lời của q.Nếu q có yêu cầu ưu tiên cao hơn p, p sẽ bị chặn cho đến khi q
tách ra khỏi phần tới hạn. Bộ xử lý q biết quan hệ ưu tiên của các yêu cầu; do vậy không cần đến vòng liên kết.
Giải thuật 2 vòng thực hiện như sau : Khi bộ xử lý muốn đi vào phần tới hạn, nó ghi lại nhãn thời gian hiện thời và gửi yêu cầu tới tất cả bộ xử lý khác. Khi bộ xử lý nhận yêu cầu mà nó sẽ cấp, nó gửi trả lời tới bên yêu cầu. Khi bộ xử lý nhận một yêu cầu muộn hơn chủ của nó, nó sẽ từ chối yêu cầu. Khi đó bộ xử lý chỉ cần làm trễ việc gửi trả lời tới bên yêu cầu mà không cần gửi thông báo bắt đầu. Khi bộ xử lý nhận các trả lời của tất cả các yêu cầu của nó, nó biết yêu cầu của nó sớm hơn tất cả các người khác và nó đi vào phần tới hạn. Khi rời khỏi phần tới hạn, nó gửi các yêu cầu mà nó đã chậm lại.
Dưới đây là các giải thuật yêu cầu token, giám sát phần tới hạn Giải thuật yêu cầu phần tới hạn
Request_CS()
my_timestamp= current_timestamp is_requesting=TRUE
reply_pending=M-1
for every other processor j,
send(j,REMOTE_REQUEST;my_timestamp) wait until reply_pending is 0
Giải thuật cho nhánh giám sát phần tới hạn
CS_Monitor():
wait until a REMOTE_REQUEST or a REPLY message is received REMOTE_REQUEST (sender;request_time):
let j be the sender of the REMOTE_REQUEST message. if( not is_requesting or my_timestamp>request_timestamp) send(j,REPLY)
else reply_deffered[j]=TRUE REPLY(sender):
reply_pending=reply_pending-1
Để tách ra khỏi phần tới hạn,bộ xử lý xử lý tất cả các trả lời trì hoãn của nó. Sau đây là giải thuật
Giải thuật giải phóng phần tới hạn
Release_CS() is_requesting=FALSE for j=1 through M if reply_deffered[j]=TRUE send (j,REPLY) reply_deffered[j]=FALSE c. Cấu trúc vật lý cố định
Cách tiếp cận khác đầy đủ hơn để đồng bộ hoá là sự truyền token giữa các bộ xử lý. Token đưa ra sự cho phép đồng bộ. Nếu bộ xử lý có được token, nó được phép
đi vào phần tới hạn. Token có thể tới tất cả các bộ xử lý góp phần vào sự đồng bộ hoá trong thưòi gian hợp lý sau khi bộ xử lý yêu cầu token. Một cách để đảm bảo token có thể đi tới tất cả các bộ xử lý là đặt cấu trúc vật lý trong các bộ xử lý và yêu cầu token đi theo cấu trúc vật lý.
Cấu trúc vật lý là một ring có sự lan truyền token. Nếu bộ xử lý giữ token nó được phép đi vào phần tới hạn.
Nếu bộ xử lý muốn thường xuyên đi vào phần tới hạn khi token đi tới, token truyền trong ring là một giải thuật đồng bộ. Token có thể đi qua hơn M lần trước khi bộ xử lý đi vào phần tới hạn. Tiếp theo ta cần giải quyết 2 vấn đề để yêu cầu thông qua token như thế nào và để token thông qua bộ xử lý tiếp theo như thế nào để vào phần tới hạn.
Khi bộ xử lý yêu cầu cho phép đi vào phần tới hạn, nó gửi yêu cầu trong hướng current_dir. Khi bộ xử lý nhạn được yêu cầu đi vào phần tới hạn, nó gửi tiếp yêu cầu đi vào phần tới hạn theo hướng current_dir nếu chưa sẵn sàng. Các bộ xử lý trong đường dẫn từ bên yêu cầu tới token phải ghi đường dẫn quay lại cho token. Bộ xử lý nhận được yêu cầu, đặt yêu cầu vào trong hàng đợi FIFO. Chú ý đầu hàng đợi FIFO chỉ rõ đường dẫn quay lại.
Khi bộ xử lý giải phóng token, nó kiểm tra thấy nếu có bất cứ yêu cầu từ chối cho token. Các yêu cầu này sẽ được cất trong hàng đợi FIFO. Nếu có yêu cầu từ chối, token được gửi tới láng giềng tại đầu FIFO. Nếu có yêu cầu khác trong FIFO, bộ xử lý bắt đầu thoả mãn yêu cầu bị từ chối.
Các biến dùng bởi giải thuật cấu trúc vật lý cố định Token_hldr Đúng nếu bộ xử lý giữ lệnh bài.
Incs Đúng nếu bộ xử lý đang dùng phần tới hạn current_dir Bên cạnh là gốc của cây con giữ lệnh bài requestQ FIFO cất giứ tên của các bộ xử lý bên cạnh. Các phép toán trên requestQ
Nq(neighbor) Thêm bộ xử lý bên cạnh vào requestQ Dq() Di chuyển và quay lại đầu của requestQ ismt() Quay lại đúng nếu requestQ.
Giao thức bao gồm các thủ tục yêu cầu và giải phóng token. Mỗi bộ xử lý thực hiện 1 luồng để trả lời các thông báo REQUEST và TOKEN.
Giải thuật yêu cầu và giải phóng phần tới hạn
Request_CS()
if not Token_hldr if ismt()
send (current_dir,REQUEST)
Nq(self)
wait until Token_hldr Incs=True
Release_CS()
if not ismt() current_dir=Dq() send(current_dir, TOKEN) Token_hldr=False if not ismt() send (current_dir,REQUEST)
Giải thuật thực hiện bằng nhánh giám sát phần tới hạn
Monitor_CS()
while (True)
wait for a REQUEST or a TOKEN message. REQUEST : If Token_hldr if Incs Nq(sender) else if ismt() send(current_dir, TOKEN) Token_hldr =False else send (current_dir,REQUEST) Nq(sender) TOKEN: current_dir=Dq() current_dir = self Token_hldr =True else send(current_dir, TOKEN) if not ismt() send (current_dir,REQUEST).
PHẦN IV: BẢO VỆ VÀ AN TOÀN HỆ THỐNG
An toàn và bảo vệ hệ thống là chức năng không thể thiếu của các hệ điều hành hiện đại phân tán. Trong bài học này, chúng ta sẽ làm quen với các khái niệm về tổ chức an toàn hệ thống, cũng như các cơ chế bảo vệ hỗ trợ việc triển khai các chiến lược này.