24/05/2018, 15:37

Mô hình đối tượng các phục vụ tài nguyên và ngôn ngữ lập trình đồng thời

Nhu cầu đồng bộ xuất hiện từ việc chia xẻ tài nguyên. Để làm tăng hiệu quả việc sử dụng tài nguyên cần giao trách nhiệm cho phục vụ quản lý tài nguyên. Sử dụng khái niệm hướng đối tượng đối với tài nguyên sẽ cung cấp sự trong suốt tài nguyên ...

Nhu cầu đồng bộ xuất hiện từ việc chia xẻ tài nguyên. Để làm tăng hiệu quả việc sử dụng tài nguyên cần giao trách nhiệm cho phục vụ quản lý tài nguyên. Sử dụng khái niệm hướng đối tượng đối với tài nguyên sẽ cung cấp sự trong suốt tài nguyên tới các khách. Một tài nguyên được coi là một đối tượng ảo và được trình bày dưới dạng một tập các thao tác chính xác được khách gọi. Đồng bộ và điều khiển đồng thời giữa các đối tượng phục vụ là hoàn toàn trong suốt với các khách. Hơn nữa truyền thông giữa các khách và phục vụ đối tượng có thể trong suốt bằng cách dùng các lời gọi thủ tục từ xa. Sự đồng thời trong phục vụ có thể được thực hiện tốt bằng cách dùng đa luồng cho phép đáp ứng đồng thời các yêu cầu của nhiều khách. Do các luồng chia xẻ vùng địa chỉ chung, phương pháp đồng bộ biến chia xẻ được sử dụng để phối hợp các luồng.

Trong RPC và cuộc hẹn đã thảo luận nhiều về việc đồng bộ CTĐ. Trong một vài ứng dụng, các khách có thể ưa thích gửi các yêu cầu dị bộ cho phục vụ. Một yêu cầu không cần sự đáp lại nên là dị bộ. Điều này cũng có thể xảy ra khi cần lời dáp cho một câu hỏi song để hiệu quả hơn, QT khách thực hiện một công việc khác thay vì bị kết khối. Có hai phương pháp thi hành việc CTĐ không đồng bộ với phục vụ: một là định nghĩa RPC dị bộ mới, hai là ứng với mỗi RPC tạo một luồng của QT khách. Cả hai phương pháp đều cần tới cơ chế ngôn ngữ, với cơ chế đó QT có thể biết được việc hoàn thành và lấy được kết quả của các RPC.

Ngôn ngữ lập trình đồng thời là một hệ chương trình hỗ trợ việc đặc tả tính đồng thời, sự đồng bộ, việc truyền thông trong tương tác giữa các QT đồng thời. Sự thi hành của ngôn ngữ lập trình đồng thời được dành cho HĐH phân tán hơn là chương trình dịch như kiểu các ngôn ngữ tuần tự. Điều đó do tính đồng thời, đồng bộ và truyền thông QT là một vần đề thời gian chạy. Ngôn ngữ lập trình đồng thời có thể được xem như là sự mở rộng từ ngôn ngữ tuần tự đã tồn tại. Chúng ta xem xét cơ chế đồng bộ theo minh họa trong hình 3.22.

Cơ chế đồng bộ được phân thành hai loại: Biến chia xẻ hoặc CTĐ. Monitor là một ví dụ thông dụng nhất cho khái niệm đồng bộ biến chia xẻ cho những ngôn ngữ đồng thời. Sự thể hiện trừu tượng nhờ khái niệm monitor làm cho nó trở thành mô hình thích hợp đối với đối tượng dữ liệu và phục vụ tài nguyên. Những ngôn ngữ cổ điển sử dụng monitor là Concurent Pascal, Modula và Turing Plus. Concurent Pascal là ngôn ngữ đầu tiên hỗ trợ monitor. Modula là một ngôn ngữ được phát triển với mục đích nhấn mạnh tầm quan trọng của modun chương trình. Nhờ bổ sung môdun giao tiếp hỗ trợ monitor, Modula sử dụng môđun thiết bị nhằm thi hành các I/O trừu tượng cho phép mềm dẻo hơn khi giao tiếp với nhân. Turing là một ngôn ngữ tuần tự được thiết kế phục vụ chỉ dẫn tới các công thức toán học mạnh. Turing Plus là một mở rộng của Turing nhằm hỗ trợ monitor cho lập trình đồng thời. Tồn tại nhiều ngôn ngữ đồng thời dựa trên monitor và việc định nghĩa monitor cũng rất đa dạng. Điều khác nhau chính của chúng là ngữ nghĩa là toán tử signal cùng lời gọi monitor lồng nhau và quy định phạm vi của các biến.

Một ngôn ngữ đồng thời danh tiếng khác sử dụng biến chung đồng bộ đồng thời là Path Pascal, một biến thể của khoảng tới hạn điều kiện - CCR trong QT phân tán - DP (Distributed Processes) và Argus. Biểu thức Path là cách đặc tả ngữ nghĩa cho một tính toán đồng thời. Tuy nhiên, biểu thức Path đơn giản không hiệu quả trong các mô hình cộng tác QT trong đó đòi hỏi thông tin trạng thái về tài nguyên chia xẻ. Biểu thức Path mở rộng được đề xuất để thể hiện việc mở rộng mô hình kiểu đó nhưng khi mở rộng như vậy thì sự đẹp đẽ ban đầu lại bị mất đi. Khoảng tới hạn điều kiện CCR dễ dàng được thi hành. Đánh giá các điều kiện nhằm tách khối các QT là rất đáng giá. Điều này có thể được giải quyết bằng waitsignal hiển theo điều kiện tương tự như biến điều kiện trong tiếp cận monitor.

Hai phương pháp đồng bộ CTĐ đồng bộ và dị bộ được sử dụng trong nhiều ngôn ngữ đồng thời. Việc nhận hoặc gửi TĐ có thể được xác định bằng cách chỉ trực tiếp tên nguồn và tên đích của TĐ. Tuy nhiên, như đã được diễn giải ở trên, cách chỉ tên như vậy là không thực tế. Mềm dẻo hơn, QT TT là không trực tiếp mà được thực hiện bằng cách qua kênh định danh. Cổng (Port) và hộp thư (Mailbox) là hai kênh chuyển định danh. Cổng cho phép truyền thông nhiều-một. Hộp thư cho phép truyền thông nhiều-nhiều. Sử dụng cổng hoặc hộp thư không giới hạn việc cung cấp gửi TĐ dị bộ. GYPSY là ngôn ngữ bậc cao đầu tiên sử dụng hộp thư để gửi các TĐ dị bộ. PLITS là ngôn ngữ sử dụng việc CTĐ dị bộ nhưng định danh trực tiếp các môđun QT. Vấn đề định tên trực tiếp trong PLITS được làm nhẹ bớt bằng việc bổ sung khóa TĐ và những phép toán cho phép loại bỏ những thông tin được bổ sung từ bên gửi. Một QT nhận có thể nhận mọi TĐ từ bất cứ nơi gửi nào hay bất cứ TĐ nào với cùng một khoá thẻ (tagged key) thực sự. Hợp lý hơn nếu QT nhận trở thành một phục vụ dành cho khách phức mà không cần biết tên của các khách. Nói thêm là kênh TT phức giữa khách và phục vụ được thiết lập khi dùng các khóa khác nhau đối với TĐ.

Chính vì vậy, bên nhận có thể được coi như là một phục vụ dành cho nhiều khách mà không cần biết tên của các khách. Sử dụng khoá thẻ khác nhau có thể tạo nên những kênh truyền khác nhau giữa phục vụ và khách.

Thiên hướng trên được sử dụng trong ngôn ngữ C đồng thời để chuyển đồng bộ những TĐ dị bộ. Có thể đặt tên cho kênh bằng cách sử dụng những cấu trúc ngôn ngữ bậc cao qua các lời gọi thủ tục và được gọi là RPC dị bộ.

CTĐ đồng bộ có thể đối xứng hoặc không đối xứng, phụ thuộc vào kịch bản truyền thông. CTĐ đồng bộ không đối xứng giả thiết hai chủ thể truyền thông có quan hệ chủ/tớ - master/slave (chính-phụ - primary/secondary). Đối tượng chính phát yêu cầu và đối tượng phụ đáp ứng câu trả lời cho yêu cầu đó. Khi thi hành trong mô hình phục vụ/client thì phục vụ đóng vai trò như là đối tượng nhận yêu cầu phục vụ. CTĐ đồng bộ đối xứng là khái niệm cuộc hẹn khi các QT truyền thông đang cố gắng tích cực đồng bộ với một QT khác. Tương tự, cả đồng bộ hỏi/đáp và cuộc hẹn đều yêu cầu thiết lập kênh truyền thông bằng tên QT hoặc lời gọi thủ tục. Cổng và hộp thư không thể áp dụng ở đây vì chúng được dùng cho gửi dị bộ. RPC quy ước dùng CTĐ đồng bộ không đối xứng và các lời gọi thủ tục được hợp thể hoá trong một số ngôn ngữ đồng thời như DP, Argus và Mesa. Các ngôn ngữ này cũng bổ sung đồng bộ CCR hoặc monitor biến chia xẻ. Do RPC là phương pháp truyền thông quan trọng trong hệ phân tán nên nó được tích hợp như một gói phần mêm trong hầu hết HĐH hiện nay.

CTĐ đồng bộ đối xứng dùng cuộc hẹn. CSP dùng cách đánh tên QT cho cuộc hẹn. DP mở rộng thêm tên thủ tục trong QT, nơi cuộc hẹn có thể xẩy ra tại các điểm khác nhau. Hiệu quả sử dụng cuộc hẹn theo kiểu RPC tìm thấy trong Ada. Thi hành Ada cho cuộc hẹn RPC là đúng hoàn toàn. Lệnh seclect hỗ trợ lời gọi cuộc hẹn không định trước (truyền thông chọn lọc). Bổ sung thêm những chức năng về quá hạn (time-out) và điểm vào thủ tục cho vector ngắt trong những lệnh accept. Ada trở thành thích hợp cho lập trình hệ thống và lập trình thời gian thực. Hình 3.20 trình bày sự phân loại các mô tả trên đây về đồng bộ và truyền thông ngôn ngữ đồng thời. Nhiều ngôn ngữ đồng thời dùng cách tổ hợp các cơ chế. ví dụ, ngôn ngữ SR (Synchronizing Resources) có hâu hết các cấu trúc cần thiết cho lập trình đồng thời. SR dùng sự trừu tượng tài nguyên, PRC dị bộ và RPC cuộc hẹn, truyền thông chọn lọc, mô đun hóa phần cứng và mô đun hóa ngắt.

Đi tới các tiệm cận ngôn ngữ đồng thời khác ngoài hướng mở rộng đơn giản các ngôn ngữ tuần tự cũng rất có giá trị. Bàn luận trên đây chỉ ra rằng quản lý QT đồng thời, đồng bộ cũng như truyền thông thực ra là những vấn đề trực giao với khía cạnh tính toán của ngôn ngữ tuần tự. Thực ra cần tìm một ngôn ngữ phối hợp theo phương thức đơn giản và hiệu quả để xây dựng chương trình đồng thời bằng cách kết nối một vài thực thể truyền thông cơ sở lại và cung cấp ý nghĩa truyền thông và đồng bộ nhau cho chúng. Các thực thể truyền thông là QT, tài nguyên, hoặc cả hai hoặc là đối tượng trừu tượng. Với giá thiết CTĐ cho truyền thông và đồng bộ QT, thì các vấn đề mấu chốt chỉ là thực thể được mô hình hóa như thế nào, các chương trình đồng thời được giải quyết ra sao và các kênh truyền thông giữa các thực thể sẽ được đặt tên lôgic và quản lý như thế nào ? Một ngôn ngữ đồng thời mới (chi tiết hơn, hệ lập trình đồng thời) có thể được xây dựng dựa trên những mô hình tính toán và truyền thông. Đoạn dưới đây giới thiệu và so sánh ba hệ thống, được thiết kế theo dòng tiếp cận này: Occam, SR và Linda.

Occam tiến hóa từ nhiều ý tưởng trong CSP. Nó được dùng rộng rãi để lập trình đồng thời trong các hệ thống Transputer và xử lý tín hiệu số DSP (Digital Signal Processing). Transputer và DSP là các máy tính đơn chíp với bộ nhớ trong cục bộ và tuyến truyền thông nhanh. Nó có thể cấu hình để ánh xạ các QT đồng thời tới xử lý song song hiệu quả với việc truyền thông dữ liệu thường xuyên giữa các bộ xử lý nhờ tuyến tốc độ cao. Do các bộ xử lý đơn chíp này có bộ nhớ cục bộ hạn chế nên OCCAM giả thiết hạt QT nhỏ. Mỗi lệnh sai khiến (gán, vào và ra) được coi như những QT nguyên thủy. Lệnh được nhóm với nhau nhờ lệnh contructors thành lệnh hợp thành theo một trong ba kiểu thực hiện: thực hiện tuần tự các lệnh (cấu trúc SEQ), thực hiện song song các lệnh (cấu trúc PAR), thực hiện dị bộ và không định trước cấu trúc ALT tương tự như lệnh alternative trong CSP. Hai cấu trúc bổ sung, IF và WHILE cần đến để điều chỉnh dòng tuần tự thực hiện cấu trúc. Cấu trúc có thể cộng tác với các biến cục bộ và có thể gộp trong cấu trúc khác. Mặc dù lệnh là QT nguyên thủy thực hiện được, cấu trúc là đơn vị QT lập lịch chuẩn. Không có sự chia sẽ biến toàn cục giữa các cấu trúc khác nhau. Đồng bộ được thực hiện bằng cách sử dụng khái niệm cuộc hẹn của lệnh input/output trong CSP, ngoại trừ tên các kênh truyền thông dùng các tên kênh toàn cục khai báo tường minh. Sử dụng cấu trúc để dàn xếp các chương trình đồng thời và kênh toàn cục để truyền thông giữa các cấu trúc làm cho trình biên dịch dễ tạo ra mã xếp lịch các QT tới bộ xử lý.

Trong SR, chương trình đồng thời là một tập các tài nguyên, khác với cách nhìn QT của Occam. Tài nguyên được trừu tượng như một môđun gồm khai báo và thân. Khai báo đặc tả những thực thể nhập đối với các tài nguyên khác và thực thể xuất đối với các phép toán trên chính tài nguyên này. Thân chứa một phần khởi tạo, một hoặc nhiều QT và một mã kết thúc. Các QT trong một tài nguyên có thể đồng thời hoặc tương tác nhau nhờ biến chia sẻ trong nguốn đó. Các tài nguyên khác nhau tương tác nhờ các operations tương tự như thực thể thủ tục trong Ada. Thực thể operations hoặc là QT hoặc là thủ tục.

Minh họa cho một tài nguyên được dẫn ra qua việc thực hiện lệnh CREATE tên_tài_nguyên trả lại năng lực để truyền thông sau này với các phép toán tài nguyên. Phép toán tài nguyên được dẫn ra lênh CALL đồng bộ hoặc lệnh SEND không đồng bộ tới tài nguyên khi dùng năng lực tài nguyên. Trong Occam, năng lực là mềm dẻo hơn so với kênh toàn cục. Chúng được tạo ra một cách động và có thể được truyền như một biến. Thêm vào nữa, năng lực có thể trình bày đa thể hiện của một tài nguyên và đạt được cả khái niệm đặt tên kênh và điều khiển truy nhập. Cuộc hẹn được đặc tả bằng lệnh nhập (in) với điểm vào phép toán có lựa chọn (ana) để hỗ trợ truyền thông chọn lọc và lựa chọn (by) để lập lịch các yêu cầu sắp giải quyết. SR dùng trừu tượng dữ liệu và hỗ trợ hầu hết mọi kiểu đồng bộ CTĐ và chia sẻ biến.

Linda khác biệt với Occam hoặc SR. Nó không là một ngôn ngữ lập trình nhưng một mô hình dữ liệu chia xẻ duy nhất có thể được tích hợp với bất kỳ ngôn ngữ lập trình nào để hỗ trợ cộng tác QT trong lập trình song song. QT và dữ liệu chia xẻ trong mô hình Linda được trình bày đồng nhất như một tập không sắp xếp của các bộ (tuple) mà mỗi bộ có dạng t = (“tag”, value), trong đó tag là tên kí hiệu của bộ dữ liệu còn value là danh sách giá trị có kiểu phù hợp với bộ đó. QT là bộ hoạt động (active tuple) còn bộ dữ liệu là bộ thụ động (pass tuple). Các bộ thuộc lớp không gian bộ (TS), một vùng bộ nhớ lôgic địa chỉ hóa được nội dung chia xẻ, có thể phân tán một cách vật lý để trình bày cấu trúc dữ liệu phân tán trong không gian bài toán. Linda cung cấp ba nguyên thủy cơ sở để truy nhập bộ. Hai nguyên thủy in(s) và out(s) là nhận kết khối từ TS và gửi không kết khối tới TS, ở đây, s là một mẫu hoặc một anti-tuple có dạng s = (“tag”, Actual, formats). in(s) làm phù hợp với mẫu s dựa vào bộ t với thẻ tag và thực tế Actual. Nếu phù hợp, nghi thức trong s được gán bằng các giá trị tương ứng trong t và QT gọi được tiếp tục. Sau đó, bộ này bị xoá khỏi TS. Trong trường hợp phù hợp bội (có nhiều hơn một bộ phù hợp) thì chỉ có duy nhất một bộ được chọn một cách tuỳ biến. Phép toán in bị kết khối theo nghĩa QT gọi bị ngừng lại cho đến khi có được sự phù hợp. Phép toán out đơn giản tính giá trị của biểu thức trong s và đưa vào trong TS. Cập nhật bộ được thực hiện này sau khi có sự phù hợp in ngay sau một nguyên thủy out. Nguyên thủy thứ ba là rd được dùng để đánh giá bộ. Nguyên thủy này tương tự như in, ngoại trừ còn phải làm phù hợp với các bộ còn lại trong TS. Các phiên bản inrd không kết khối cũng được Linda hỗ trợ.

Linda có một nguyên thủy bổ sung eval(s) tạo ra QT. Phép toán eval khởi tạo (fork) một QT mới nhằm đánh giá tất cả các biểu thức trong s. Các biểu thức này thường chứa các thủ tục. eval tương tự như out, ngoại trừ việc s được đưa vào TS trước khi đánh giá nó. Khi QT được hoàn thành (tức mọi biểu thức đã được tính), s cùng các giá trị kết quả thành một bộ dữ liệu thụ động. Linda là cách trừu tượng nhất để mô hình hóa cộng tác quá trình. Do chỉ có một số rất ít các phép toán nguyên thủy, Linda có thể được gắn vào ngôn ngữ cơ sở, chẳng hạn C. C-Lind là thi hành của mô hình Linda trong C.

Hình 3.23 mô tả những nét khác nhau cơ sở giữa Occam, SR và Linda theo các phương diện là khái niệm hệ thống cơ sở, mô hình dữ liệu căn bản, cách thức đặt tên cho kênh truyền thông.

Hệ thống Mô hình đối tượng Đặt tên kênh
Occam Ngôn ngữ lập trình đồng thời Quá trình Kênh toàn cục tĩnh
SR Ngôn ngữ lập trình đồng thời Tài nguyên Năng lực động
Linda Ngôn ngữ lập trình đồng thời Cấu trúc dữ liệu phân tán Thẻ kết hợp

Hình 3.23 So sánh Occam, SR và Linda

0