Sau đây ta sẽ nghiên cứu các hệ thống bộ nhớ chia sẻ phân tán xây dựng trên các hệ thống multicomputer, trong đó các bộ xử lí liên kết với nhau qua mạng truyền thông điệp đặc trưng, các workstation kết nối quan LAN và các cấu trúc tương ứng. Ý tưởng chủ yếu là không bộ xử lí nào có thể truy suất trực tiếp đến bộ nhớ của các bộ xử lí khác. Hệ thống như vậy thường được gọi là NORMA (NO Remote Memory Access) để phân biệt với các hệ thống NUMA.
Khác biệt cơ bản của NUMA và NORMA là, với hệ thống NUMA, mọi bộ xử lí có thể tham chiếu trực tiếp đến mọi từ trong không gian địa chỉ toàn cục bằng các thao tác đọc và ghi. Các page được phân bố một cách phân tán ngẫu nhiên giữa các bộ nhớ mà không làm ảnh hưởng đến kết quả chương trình. Khi bộ xử lí tham chiếu đến page ở xa, hệ thống có 2 lựa chọn là, fetch page hoặc sử dụng page từ xa. Các lựa chọn này ảnh hưởng đến performance của hệ thống, nhưng không ảnh hưởng đến độ chính xác. Các máy NUMA là các hệ thống multiprocessor, phần cứng cho phép mọi bộ xử lí tham chiếu đến mọi từ trong không gian địa chỉ mà không cần có sự can thiệp của phần mềm. Các workstation trong mạng LAN là sự khác biệt căn bản với hệ thống
multiprocessor. Các bộ xử lí chỉ có thể tham chiếu đến các bộ nhớ nội bộ riêng của nó, mục tiêu của DSM là thêm phần mềm để hệ thống multicomputer có thể sử dụng các phần mềm của hệ thống multiprocessor. Do đó, khi bộ xử lí tham chiếu đến page ở xa, page này phải được fetch.
1.6.4.1 Thiết kế cơ bản:
Ý tưởng cơ bản của DSM rất đơn giản: chia sẻ bộ nhớ bằng cache dùng MMU và hệ điều hành. Trong hệ thống DSM, không gian địa chỉ được chia thành các chunk, các chunk này được chia sẻ cho tất cả các bộ xử lí trong hệ thống.
DSM sẽ fetch chunk chứa địa chỉ này và khởi động lại câu lệnh bị lỗi, như trong hình 1.31(a), ở đây không gian địa chỉ được chia thành 16 chunk và 4 bộ xử lí.
Hình 1.31: (a) Các chunk của không gian địa chỉ phân tán trên 4 máy, (b) Trường hợp sau khi CPU 1 tham chiếu chunk 10, (c) trường hợp chunk 10 chỉ được đọc và đã thực hiện tạo bản sao.
Trong ví dụ này, nếu bộ xử lí 1 tham chiếu đến các câu lệnh hay dữ liệu trong chunk 0, 2, 5 hoặc 9 thì tham chiếu này sẽ được thực hiện ngay. Tham chiếu đến các chunk khác đòi hỏi phải thực hiện bẫy chunk. Ví dụ, tham chiếu tới
địa chỉ trong chunk 10 sẽ gửi một bẫy chunk tới phần mềm DSM, DSM sẽ chuyển chunk 10 từ máy 2 đến máy 1, như trong hình 1.31(b).
1.6.4.2 Replication:
Một cải tiến cho hệ thống cơ bản như trên là thực hiện replication các chunk chỉ đọc, ví dụ các chương trình văn bản, các biến chỉ đọc hoặc các cấu trúc dữ liệu chỉ đọc khác. Chẳng hạn, nếu chunk 10 trong hình 1.31 là một phần của chương trình văn bản, được sử dụng chung bởi bộ xử lí 1 và bộ xử lí 2 mà không cần thực hiện bẫy chunk.
Một khả năng khác là không chỉ tạo bản sao chỉ đọc mà tất cả các chunk, miễn là khi các thao tác đọc đang được thực hiện không có sự khác biệt giữa các bản sao.
1.6.4.3 Granularity:
Vấn đề quan trọng của mô hình này là kích thước phù hợp nhất của chunk, có thể là một khối gồm vài từ, page hoặc segment (nhiều page).
Trong hệ thống multiprocessor, fetch một từ hoặc vài chục byte là có thể vì MMU biết chính xác vị trí của địa chỉ được tham chiếu và thời gian thiết lập
một thao tác chuyển giao bus là cỡ nanogiây. Hệ thống Memnet sử dụng chunk có kích thước 32byte. Với DSM, các phương pháp thực hiện như vậy không thích hợp hoặc khó thực hiện.
Khi một tiến trình tham chiếu một từ không có trong bộ nhớ nội bộ, nó sẽ gây ra lỗi page. Giải pháp đầu tiên là tích hợp DSM vào bộ nhớ ảo để page của DSM và bộ nhớ có kích thước giống nhau, sau đó chỉ cần fetch page có chứa từ đó vào bộ nhớ nội bộ rồi chạy lại tiến trình.
Một giải pháp khác là fetch một khối nhớ lớn hơn, có thể bằng 2, 4, hoặc 8 pages gồm cả page cần có. Ưu điểm của phương pháp này là giảm được số lần trao đổi trên bus, đặc biệt với các chương trình sử dụng các biến nằm trên cùng page. Nhược điểm là nếu page đó có chứa một biến được dùng bởi một
chương trình trên máy khác thì sẽ xẩy ra trường hợp page này sẽ được di chuyển nhiều lần giữa 2 máy, còn gọi là false sharing, như mô tả trong hình 1.32.
Hình 1.32: False sharing của page chứa 2 biến không có quan hệ với nhau. 1.6.4.4 Tính toàn vẹn:
Khi page ghi đọc được tạo bản sao, trong nhiều hệ thống DSM, khi tiến trình định đọc một page từ xa, một bản sao nội bộ được tạo vì hệ thống này không biết page ở đâu và liệu nó có thể ghi được hay không. Page nội bộ này và page gốc được thiết lập trên các MMU tương ứng như là page chỉ đọc, nếu các tham chiếu đến page chỉ để lấy thông tin trên page này thì không có vấn đề gì xẩy ra.
Tuy nhiên, nếu bất kì tiến trình nào định ghi lên các page đã được tạo bản sao thì xẩy ra trường hợp không toàn vẹn dữ liệu. Trong các hệ thống multiprocessor, người ta dùng 2 biện pháp là cập nhật và invalidation. Nhưng trong hệ thống DSM, phần mềm không biết từ nào đã được cập nhật và giá trị mới là gì. Để xác định, nó sẽ tạo một bản sao bí mật của page về sự thay đổi (chẳng hạn số hiệu page), chuyển thuộc tính của page thành có thể ghi, thông báo cho phần cứng bẫy bit sau mỗi câu lệnh, và khởi động lại tiến trình bị lỗi. Một câu lệnh được thực hiện sau đó sẽ so sánh page hiện tại với bản sao bí mật của nó để xác định từ nào đã bị thay đổi. Sau đó nó sẽ quảng bá một gói tin ngắn và địa chỉ và giá trị mới này trên mạng. Các bộ xử lí nhận được gói
tin này sẽ kiểm tra và cập nhật vào page của mình. Khối lượng công việc rõ ràng là rất lớn và dễ phát sinh sự không toàn vẹn dữ liệu.
Hình 1.33: (a) Tiến trình P muốn đọc một page. (b) Tiến trình P muốn ghi một page.
Do đó, các hệ thống DSM thường chỉ sử dụng giao thức invalidation thay vì phải sử dụng giao thức cập nhật. Có rất nhiều giao thức như vậy, nhưng ta chỉ xét một giao thức cơ bản, trong đó tất cả các page đều có thể được ghi (nghĩa là phần mềm DSM không biết nội dung cũng như vị trí của page).
Trong giao thức này, mỗi page chỉ tồn tại ở một trong hai trạng thái R (có thể đọc) hoặc W (có thể ghi), và trạng thái này có thể thay đổi khi thực hiện tiến trình. Mỗi page có một tiến trình sở hữu nó, đây là tiến trình vừa mới thực hiện thao tác ghi lên page này. Khi page ở trạng thái W, thì chỉ có thể tồn tại một phiên bản của nó, được gắn vào không gian địa chỉ của tiến trình sở hữu nó ở trạng thái đọc ghi. Khi page ở trạng thái R, các tiến trình khác cũng có bản sao của page này.
Có 6 trường hợp xẩy ra như mô tả trong hình 1.33.
Trong tất cả các ví dụ này, tiến trình P trên bộ xử lí 1 muốn đọc hoặc ghi một page, chúng chỉ khác nhau về việc liệu P có phải là tiến trình sở hữu, có một bản sao hay không, liệu các tiến trình khác có bản sao hay không, và trạng thái của page là gì. Sau đây ta sẽ xét từng trường hợp.
Trong 4 trường hợp đầu tiên, P chỉ thực hiện thao tác đọc, page cần đọc sẽ được map vào không gian địa chỉ của tiến trình P và thao tác đọc sẽ được thực hiện bằng phần cứng. Trong trường hợp thứ 5 và thứ 6, page cần đọc không được map mà sẽ gây ra tình trạng lỗi page rồi chuyển quyền điều khiển cho phần mềm DSM. Nó gửi thông điệp tới tiến trình sở hữu page và đưa ra yêu cầu đọc. Khi page được gửi đến P, nó sẽ được map vào không gian địa chỉ của P và khởi động lại câu lệnh lỗi trước đó. Nếu trạng thái của page là W ở tiến trình sở hữu thì trạng thái của page sẽ được chuyển về R.
Thao tác ghi được thực hiện như trong hình 1.33(b). Trong trường hợp thứ nhất, thao tác ghi được thực hiện mà không cần phải bẫy vì page cần ghi đã ở
chuyển sang trạng thái W và được ghi. Trường hợp thứ 3 có nhiều bản sao, vì thế các bản sao này cần được invalidate để thực hiện thao tác ghi. Trong 3 trường hợp tiếp theo, có một số tiến trình khác đang sở hữu page khi P thực
hiện thao tác ghi, do đó P phải yêu cầu tiến trình đang sở hữu page phải invalidate các bản sao của nó và chuyển quyền sở hữu page cho P rồi gửi một bản sao của page cho P nếu P chưa có bản sao nào của page này. Chỉ sau khi thực hiện xong các thao tác này thì mới thực hiện thao tác ghi. Trong cả 3
trường hợp trên thì P sẽ kết thúc công việc với một bản sao duy nhất của page, và page đang ở trạng thái W.
Trong cả 6 trường hợp, trước khi thực hiện thao tác ghi, giao thức này phải luôn đảm bảo chỉ có một bản sao của page tồn tại, được đặt trong không gian địa chỉ của tiến trình định thực hiện thao tác ghi lên page. Nhờ đó đảm bảo được cơ chế toàn vẹn.
1.6.4.5 Tiến trình sở hữu page:
Hình 1.34: Vị trí của tiến trình sở hữu page được xác định nhờ page manager (a)Giao thức 4 thông điệp, (b)Giao thức 3 thông điệp.
Để xác định tiến trình sở hữu page, người ta không thể thực hiện theo các giao thức thông thường như là phát quảng bá một bản tin để chờ phản hồi từ tiến trình đang sở hữu page vì nó làm lãng phí tài nguyên mạng và bộ xử lí. Li và Hudak (1989) đã đưa ra một số biện pháp khả thi. Biện pháp đầu tiên là sử
dụng một tiến trình làm page manager để xử lí các yêu cầu đọc ghi liên quan đến page, như trong hình 1.34.
Giao thức này có thể khó thực hiện khi page manager bị quá tải khi thực hiện tất cả các yêu cầu gửi đến. Vấn đề này có thể được giải quyết bằng cách sử dụng nhiều page manager thay vì chỉ sử dụng một page manager. Song việc sử dụng nhiều page manager lại làm nảy sinh vấn đề về việc lựa chọn page
manager phù hợp để xác định tiến trình sở hữu page. Người ta có thể giải quyết vấn đề này bằng cách sử dụng các bit thấp của số hiệu page để làm chỉ số cho các page manager, ví dụ với 8 page manager, các page có chỉ số tận
cùng bằng 000 sẽ được quản lí bởi page manager 0, tận cùng bằng 001 sẽ được quản lí bởi page manager 1….
Một giải pháp khác là để cho mỗi tiến trình lưu thông tin về tiến trình sở hữu page, yêu cầu thông tin về tiến trình sở hữu page sẽ được gửi đến tiến trình sở hữu tương ứng và sẽ được chuyển tiếp đến tiến trình tiếp theo nếu tiến trình sở hữu page đã bị thay đổi.
1.6.4.6 Tìm các bản sao:
Có 2 phương pháp xác định vị trí các bản sao của page để thực hiện invalidate khi cần. Phương pháp thứ nhất là gửi một thông điệp quảng bá, phương pháp này chỉ thực hiện được khi các thông điệp không bị mất trong quá trình quảng bá, cũng như độ tin cậy của các thông tin trong thông điệp quảng bá là cao. Phương pháp thứ 2 là tạo một danh sách các bản sao để sác định bộ xử lí nào đang sở hữu page, như mô tả trong hình 1.35.
Hình 1.35: Danh sách các bản sao của mỗi page, các bộ xử lí sẽ sở hữu các page được bao bởi ô vuông kép.
Ở đây, page 4 được sở hữu bởi tiến trình trên CPU 1, danh sách bản sao của page 4 bao gồm các tiến trình trên máy 2 và 4 vì các bản sao của 4 tồn tại trên các máy này.
Khi invalidate page, tiến trình sở hữu mới, tiến trình sở hữu cũ hoặc page manager sẽ gửi một thông điệp đến tiến trình đang sở hữu page và chờ phản hồi để xác nhận.
1.6.4.7 Thay thế page:
Khi không gian địa chỉ trong bộ nhớ để lưu page mới, cần phải giải phóng bớt một số page trong bộ nhớ để dành chỗ cho page mới.
Ta có thể xử dụng giải thuật least recently used (LRU) truyền thống, tuy
nhiên trong hệ thống DSM các page này có thể bị invalidate đồng thời (do hoạt động của các tiến trình khác nhau). Để sử dụng được giao thức này, ta cần duy trì một danh sách các cấp LRU đã được valid. Page đã được sao do một tiến trình khác sở hữu luôn là đối tượng đầu tiên được xét để loại bỏ khỏi bộ nhớ vì có nó đã có bản sao khác.
1.6.4.8 Đồng bộ:
Trong hệ thống DSM, cũng như với hệ thống multiprocessor, các tiến trình
cần phải hoạt động đồng bộ. Thường một biến sẽ được dùng làm khoá để tránh xung đột giữa các tiến trình khi hoạt động. Bình thường, biến này sẽ
được thiết lập giá trị 0 khi không có tiến trình nào ở trong vùng tới hạn, và có giá trị 1 khi đang có một tiến trình nào đó ở vùng tới hạn.
Trong DSM, nếu một tiến trình A đang trong vùng tới hạn và có một tiến trình khác, B (trên máy khác), muốn vào vùng tới hạn thì B sẽ thiết lập một vòng lặp để liên tục kiểm tra biến này đến khi nó có giá trị 0. Page chứa biến này vẫn được giữ trên máy B, khi A ra khỏi vùng tới hạn và định thiết lập giá trị 0 cho biến dùng làm khóa thì nó sẽ nhận được lỗi page, lỗi page sẽ được gửi tới B và B sẽ xoá page để A thực hiện lệnh ghi lên biến khoá.
Vấn đề xẩy ra khi một số tiến trình khác cũng muốn vào vùng tới hạn này, băng thông của mạng có thể bị ảnh hưởng khi các tiến trình đều thực hiện lệnh ghi giá trị 1 lên biến đồng bộ. Người ta đưa ra một số biện pháp để giải quyết vấn đề này. Có thể dùng một trình quản lí đồng bộ để nhận các thông điệp, khoá và mở khoá các biến… gửi phản hồi khi công việc hoàn thành. 1.6.5 Bộ nhớ chia sẻ phân tán chia sẻ biến:
Mô hình page-based DSM sử dụng không gian địa chỉ tuyến tính và cho phép các page được sao chép một cách linh động trên mạng theo yêu cầu. Có một kiến trúc khác có cấu trúc hơn để chia sẻ các biến và cấu trúc dữ liệu giữa các tiến trình, nó thực hiện duy trì một số cơ sở dữ liệu đã sao, phân tán bao gồm các biến chia sẻ.
1.6.6 Object based distributed shared memory:-
Các hệ thống page based DSM sử dụng phần cứng MMU để bẫy các truy suất - đến các page bị mất. Phương pháp này có một số nhược điểm đặc biệt trong
nhiều ngôn ngữ lập trình, dữ liệu được tổ chức thành các đối tượng, gói, module hoặc các cấu trúc dữ liệu khác, chúng tồn tại độc lập nhau. Nếu một tiến trình tham chiếu đến một phần của đối tượng thì trong nhiều trường hợp
sẽ phải sử dụng toàn bộ đối tượng đó, vì thế dữ liệu trao đổi trên mạng là một đối tượng hoàn chỉnh chứ không phải là page.
Trong cả 2 phương pháp nêu trên ta thấy người lập trình phải cung cấp thông tin về các biến chia sẻ các biến không chia sẻ cũng như các thông tin giao