Báo cáo Xây dựng chương trình debugger cho hệ thông tính toán song song phân cụm

Trong đó command-name là tên của lệnh được định nghĩa. Command-body xác định lệnh được định nghĩa là lệnh đơn giản hay là lệnh hình thành bằng cách ghép các lệnh lại với nhau. Câu lệnh alias sẽ gắn lệnh mà người dùng vừa định nghĩa với tập lệnh của chương trình debugger vì vậy sau đó nó được sử dụng nh một lệnh của chương trình debugger. Chú ý rằng nếu câu lệnh alias mà không có tham số kềm theo thì kết quả nhận được sẽ là toàn bộ các lệnh do người dùng định nghĩa. Câu lệnh alias khi thực hiện nếu người dùng cố gắng định nghĩa lại một lệnh của chương trình debugger thì sẽ sinh ra lỗi và xuất hiện thông báo lỗi tương ứng. Còn nếu khi muốn xem một lệnh không tồn tại hoặc đã bị xoá bởi lệnh unalias thì một cảnh báo sẽ được sinh ra để báo rằng lệnh như trên không tồn tại

doc54 trang | Chia sẻ: oanh_nt | Lượt xem: 1200 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Báo cáo Xây dựng chương trình debugger cho hệ thông tính toán song song phân cụm, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
với n tiến trình thì định danh của các tiến trình được gán từ 0 đến n-1. Nhóm các hàm gửi nhận dữ liệu giữa hai tiến trình Có hai chế độ truyền thông giao tiếp với nhau là Blocking và NonBlocking. Các hàm gửi, nhận dữ liệu theo Blocking sẽ kết thúc khi điều kiện kết thúc của nó xảy ra.Các hàm gửi, nhận dữ liệu theo NonBlocking sẽ kết thúc ngay mà không cần bất cứ kiện điện nào, nó không quan tâm đến việc dữ liệu đã thực sự được truyền đi hoặc nhận về hay chưa. Việc dữ liệu đã thực sự được truyền đi hay nhận về được kiểm tra bằng lời gọi các hàm khác trong thư viện truyền thông. Các hàm trong chế độ Blocking int MPI_Send(void *buf, int count, MPI_Datatype dtype, int dest, int tag, MPI_Comm comm) Trong đó buf là con trỏ trỏ đến đầu mảng dữ liệu cần truyền đi. count là số lượng phần tử dữ liệu của mảng cần truyền đi. dtype là kiểu dữ liệu của mỗi phần tử trong mảng dữ liệu. dest là định danh của tiến trình đích. tag là thẻ được gán cho mảng dữ liệu. comm là giá trị xác định kiểu giao tiếp với 3 giá trị được định nghĩa trước Hàm trả về 0 nếu thao tác thành công và mã lỗi trong trường hợp ngược lại int MPI_Recv(void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_Status *status) Trong đó buf là con trỏ trỏ đến đầu vùng nhớ mà dữ liệu sẽ được nhận vào. count là số phần tử source là định danh của tiến trình gửi. Giá trị MPI_ANY_SOURCE xác định việc nhận dữ liệu từ bất cứ tiến trình nào. tag là thẻ của khổi dữ liệu cần nhận về. Giá trị MPI_ANY_TAG xác định việc nhận dữ liệu với giá trị thẻ bất kỳ. Lỗi sẽ xảy ra nếu kích thước dữ liệu nhận về lớn hơn kích thước vùng đệm chứa nó. Thông thường kích thước cùng đệm chứa dữ liệu nhận về cần phải lớn hơn hoặc bằng kích thước của khối dữ liệu sẽ nhận về. Khi kích thước của khối dữ liệu nhận về nhở hơn kích thước của vùng đệm chứa nó thì hàm sau cho phép xác định số phần tử nhận được int MPI_Get_count(MPI_Status *status, MPI_Datatype dtype, int *count) Hàm sau dùng để đồng bộ dữ liệu int MPI_Probe (in source, int tag, MPI_Comm comm, MPI_Status *status) Hàm này không trả về cho đến khi dữ liệu được đồng bộ. Hàm sau dùng để chờ đợi cho các thao tác Send hoặc Receive hoàn thành int MPI_Wait( MPI_Request *request, MPI_Status *status ) Các hàm NonBlocking int MPI_Isend(void *buf, int count, MPI_Datatype dtype,int dest, int tag, MPI_Comm comm, MPI_Request *request) int MPI_Irecv(void *buf, int count, MPI_Datatype dtype, int source, int tag, MPI_Comm comm, MPI_Request *request) Nhóm hàm giao tiếp giữa nhiều tiến trình Thao tác Broadcast : là quảng bá một khối dữ liệu từ tiến trình này sang tất cả các tiến trình khác int MPI_Bcast(void *buf, int count,MPI_Datatype dtype,int root, MPI_Comm comm) Thao tác Gather và Scatter : đây là hai thao tác tập hợp dữ liệu từ nhiều tiến trình về một tiến trình và phân tán dữ liệu từ một tiến trình đến nhiều tiến trình. Thao tác Reduction : Thao tác này thực hiện 1 phép tính trên các biến của các tiến trình trong nhóm và kết quả sẽ được truyền về 1 biến trên vùng nhớ cục bộ của 1 tiến trình. Thao tác này được thực hiện qua hàm sau: int MPI_Reduce(void *sbuf, void *rbuf, int count, MPI_Datatype dtype,MPI_Op op, int root, MPI_Comm comm) trong đó sbuf : địa chỉ đầu của mảng các phần tử trên vùng nhớ cục bộ của các tiến trình trong nhóm, phép tính op sẽ tác động lên nhóm từng phần tử tương ứng của các tiến trình và kết quả được truyền về tiến trình root rbuf : địa chỉ đầu của mảng kết quả trên vùng nhớ nhận dữ liệu của tiến trình root count : số lượng phần tử của mỗi mảng trên vùng nhớ cục bộ của các tiến trình dtype : kiểu dữ liệu của từng phần tử trong mảng. op : phép toán thực, hiện có thể nhận 1 trong các giá trị sau MPI_MAX maximum MPI_MIN minimum MPI_SUM sum MPI_PROD product MPI_LAND logical and MPI_BAND bitwise and MPI_LOR logical or MPI_BOR bitwise or MPI_LXOR logical exclusive or MPI_BXOR bitwise exclusive or root : định danh của tiến trình nhận kết quả comm : xác định nhóm các tiến trình thực hiện. Phần 2 Hệ quản lý tài nguyên và phân tải Mục đích và nhiệm vụ của hệ quản lý tài nguyên và phân tải Ngày nay yêu cầu về việc tính toán song ngày cang trở nên phổ biến và được áp dụng rộng dãi trong các bài toán có yêu cầu số lượng phép tính lớn, như vậy dẫn đến tình trạng số nút tính toán sẽ rất lớn, số tài nguyên lớn và môi trường không đồng nhất do đó việc quản lý tài nguyên và phân tải tạo ra một môi trường tính toán ổn định không chỉ do hệ điều hành đảm nhân nữa mà cần tạo ra một môi trường tính toán ổn định và hiệu quả. Để đáp ứng yêu cầu này hệ quản lý tài nguyên và phân tải ra đời (Portable Batch System-PBS ) Hệ thống quản lý tài nguyên và phân tải có hai nhiệm vụ chính là : Quản lý tài nguyên : đưa ra một “bức tranh” về toàn bộ hệ thống Tài nguyên tính toán : CPU, RAM … Phân tải : phân bổ công việc trong các điều kiện về tài nguyên của hệ thống sao cho hiệu quả đạt được là tối ưu Như đã nói ở trên chúng ta thấy rằng ngày nay hệ thống tính toán bó đã trở nên khá phổ biến, các thư viện và các ngôn ngữ lập trình song song tạo cho người lập trình môi trường lập trình trên hệ thống tính toán bó, các phần mềm quản lý và phân tải lại tạo ra một môi trường tính toán ổn định và hiệu quả. Các phần mềm này có ý nghĩa càng lớn khi số lượng các nút càng lớn và số lượng các chương trình thực hiện càng nhiều. Để hệ thống hoạt động tối ưu thì các phần mầm phân tải phải sử dụng các phần mềm quản lý tài nguyên và lập lịch. Phần mềm quản lý tài nguyên còn được người dùng sử dụng để quản lý hệ thống và đánh giá hiệu năng của hệ thống. PBS là hệ thống quản lý tài nguyên và phân tải rất mạnh do NASA phát triển. Hệ thống này được sử dụng rất nhiều trong các hệ thống tính toán hiệu năng cao. Chức năng chính của hệ thống là tiếp nhận bảo vệ công việc đó cho đến khi nó được thực hiện, thực hịên công việc và trả lại kết quả cho người sử dụng.PBS có thể được cấu hình để chạy trên một hệ thống đơn hoặc một hệ thống đa máy tính, chính sự linh hoạt này đã giúp cho PBS có thể thích hợp với nhiều hệ thống tính toán khác nhau. PBS ngày nay đã trở thành một hệ phân tải hang đầu trong các hệ siêu máy tính và trở thành chuẩn cho các hệ thống bó trên Linux, PBS cung cấp rất nhiều lợi ích cho các hệ thống tính toán hiệu năng cao. Sau đây là một số chức năng quan trọng của PBS : Chia sẻ tài nguyên cung cấp một cơ chế lập lịch cho các công việc một cách trong suốt trên bất kỳ một hệ thống PBS nào. Công việc được yêu cầu từ một máy client bất kỳ, cục bộ hay từ xa. Giao diện dử dụng đồ hoạ giúp người sử dụng chuyển các yêu cầu tính toán ở chế độ lô( Batch ) hay chế độ tương tác(interative), truy vấn các công việc, hàng đợi công việc và tình trạng hệ thống và theo doi dự tiến triển của công việc. Ngoài ra PBS cũng hỗ trợ giao diện dòng lệnh cho những người sử dụng chuyên nghiệp. Cơ chế bảo mật cho phép người quản trị có thể thiết lập hoặc huỷ bỏ việc truy cập đến PBS của một người nào đó, một nhóm người, một máy hay một mạng nào đó. Nhật ký cho phép ghi lại tất cả các hoạt động trên của hệ thống theo từng người, từng nhóm người hoặc từng máy. Tự động chuyển tập là cơ chế sao chép các tệp cần thiết cho việc thực hiện một công việc trên các máy trạm tính toán. Các tệp cần chuyển có thể là các tệp dữ liệu hoặc các tệp thực thi. Hỗ trợ các công việc song song cho phép hoạt động cùng với các thư viện lập trình song song như MPI,PVM va HPF. Các chương trình có thể dựoc lập lịch để chạy trên các thống đa bộ xử lý hoặc đa máy tính. Hỗ trợ tính toán lưới cung cấp hệ thống siêu tính toán và tính toán lưới, bao gồm việc hỗ trợ cho GGT( Globuls Grid Toolkit ) Giao diện lập trình được PBS cung cấp cho phép người lâp trình có thể tự viết lệnh mới cho PBS, tích hợp PBS vào các ứng dụng của họ hoặc cài đặt các cơ chế lập trình riêng. Tự động phân tải là cơ chế phân tỉ công việc trên tài nguyên của hệ thống bó. PBS gồm ba phân hệ chính là: PBS_SERVER : phân hệ quả lý công việc. PBS_Scheduler : phân hệ lập lịch PBS_Mom : phân hệ quản lý tài nguyên và thực thi Vị trí các phân hệ : Hệ thống quản lý tài nguyên và phân tải PBS Một số khái niệm cơ bản Công việc : là một tập hợp các thao tác (xử lý) nào đó được hệ thống xử lý. Nút : đối với hệ thống PBS thì một nút là một đơn vị tính toán, một công việc có thể được chạy trên 1 nút hoặc trên nhiều nút. Chuyển tệp vào (Stage in) : Đây là quá trinh chuyển 1 hoặc nhiều tệp vào các nút thực thi để bắt đầu công việc Chuyển tệp ra (Stage out) : Đây là quá trình chuyển 1 hoặc nhiều tệp ra khỏi các nút sau khi công việc đã hoàn thành Hàng đợi công việc : là nơi chứa các chứa các công việc đang chờ được thực hiện ở bên trong server. Có hai loại hàng đợi là routing và excution. Routing queue là hàng đợi dùng để dịch các công việc đến một hàng đợi khác. Excution queue chứa các công việc sẽ được thực hiện. Một số đặc trưng cơ bản PBS có khá nhiều đặc trưng cần quan tâm đến khi tim hiểu, một số đặc trưng nổi bật được đề cập đến sau đây: Các lệnh người dùng: đây là các lệnh cung cấp cho người dùng khả năng thao tác làm việc với hệ thống PBS, đặc biệt là các thao tác đối với công việc như: đệ trình, thay thế, xóa bỏ, yêu cầu thông tin công việc v.v.. Các lệnh thao tác: đây là các lệnh phục vụ cho việc thiết lập, khởi động và dừng hệ thống PBS Các lệnh quản trị hệ thống: đây là các lệnh phục vụ cho việc quản trị hệ thống PBS Thư viên API: cung cấp giao diện lập trình phục vụ cho việc xây dựng các ứng dúng client giao tiếp với hệ thống PBS. Công việc tương tác (Interactive Job) : đây là một công việc được thực hiên một cách đặc biệt. Công việc thông thường được đệ trình cho PBS thông qua một tệp kịch bản nào đó. Nhưng với công việc tương tác thì việc đệ trình và thực hiện công việc có thể tương tác được. Người sử dụng có thể truy nhập đầu vào và đầu ra của công việc. Kịch bản công việc trước và sau khi thực hiện : PBS cho phép người sử dụng tạo các kịch bản để thực hiện chúng trước khi chạy công việc và sau khi công việc hoàn thành. Các kịch bản này chủ yếu để khởi tạo trước khi tiến hành thực thi công việc và dọn dep sau khi công việc kết thúc. Chuyển tệp vào và chuyển tệp ra : Hệ thống PBS cung cấp khả năng chuyển tệp vào và chuyển tệp ra trước và sau khi công việc được thực hiện. Điều này làm tăng khả năng đáp ứng của hệ thống trước các yêu cầu của người dùng. Các phân hệ trong hệ thống PBS Hệ thống PBS gồm có ba phân hệ là PBS_Server, PBS _Sheduler và PBS_Mom. Phân hệ quản lý công việc PBS_Server Phân hệ quản lý công việc là thành phần trung tâm của PBS. Tất cả các thành phần khác của PBS giao tiếp với phân hệ quản lý công việc qua một địa chỉ IP duy nhất. Chức năng của phân hệ quản lý công việc là cung cấp các dịch vụ lô, như là nhận/tạo ra các công việc lô (batch công việc), thay đổi các công việc, bảo vệ công việc khi có sự cố hệ thống, và thực hiện công việc (chuyển công việc cho phân hệ thực thi công việc). Phân hệ này quản lý một hoặc nhiều hàng đợi công việc (queue), một công việc phải thuộc vào một hàng đợi. Các hàng đợi được server quản lý bởi một tập thuộc tính như kiểu, tài nguyên, tên,... Phân hệ Quản lý công việc tiếp nhận các công việc được người sử dụng đệ trình từ phía client. Sau khi tiếp nhận công việc và đưa vào hàng đợi, Phân hệ yêu cầu Phân hệ Lập lịch thực hiện lập lịch. Quá trình lập lịch được tiến hành. Tùy theo tình trạng cụ thể của hệ thống mà công việc được đưa vào thực hiện ngay hay phải lưu trong hàng đợi. Nếu công việc được thực hiện, Phân hệ Quản lý công việc sẽ gửi công việc cùng với yêu cầu thực thi xuống cho Phân hệ Quản lý tài nguyên và Thực thi công việc. Trong qua trình công việc thực thi, Phân hệ Quản lý công việc luôn lưu trữ thông tin của công việc. Điều đó giúp cho Phân hệ có thể điều quản được công việc một cách dễ dàng hơn. Phân hệ lập lịch PBS_Scheduler Nếu như Phân hệ Quản lý công việc là trái tim thì Phân hệ Quản lý lập lịch thực hiện công việc được coi là bộ não của toàn bộ hệ thống PBS. Trong môt phân cụm tính toán, Phân hệ này có thể được cài đặt trên một hoặc nhiều nút (nút quản trị) cũng dưới dạng một tiến trình chạy ngầm và được thực thi bởi quyền root. Nhiệm vụ của Phân hệ Quản lý lập lịch thực hiện công việc chỉ là tiến hành lập lịch để đảm bảo một công việc khi được đệ trình từ phía người sử dụng, sẽ được phân bố vào các nút tính toán hoặc sẽ bị loại bỏ do không đáp ứng được các ràng buộc đã xác định trước.BatchServer đưa ra quyết định lập lịch khi có các yêu cầu sau xảy ra: Có nhiệm vụ mới cần chạy. Có nhiệm vụ kết thúc tiến trình của mình. Sau một khoảng thời gian nhất định do hệ thống định trước. Thuộc tính Scheduling của PBS_Server được gán bằng true. Có nhiều nhiệm vụ cần chạy. Khi BatchServer vừa bắt đầu khởi động và gửi lệnh thiết lập cấu hình cho bộ lập lịch. Sau khi nhận được yêu cầu lập lịch từ PBS_Server thì phân hệ lập lịch sẽ tiến hành lấy các thông tin về máy chủ(Server), hàng đợi (queue), các nhiệm vụ (job) để tìm ra nhiệm vụ tốt nhất cần chạy, sau đó nó sẽ gửi yêu cầu các thông tin về tài nguyên cho phân hệ PBS_Mom tại mỗi nút, sau đó tìm ra nút tốt nhất để chạy nhiệm vụ đó và thông báo lại kết quả cho PBS_Server để PBS__Server chạy nhiệm vụ đó tại các nút đã chọn. Các thông tin cần thiết để lập lịch: Các thông tin về máy chủ, hàng đợi,công việc Các thông tin về tài nguyên cho phân hệ PBS_Mom tại mỗi nút Hiện nay, cơ chế lập lịch được Phân hệ Lập lich của hệ thống PBS sử dụng là cơ chế Vào trước Thực hiện trước. Quá trình Lập lịch được phân loại thành lập lịch thực hiện công việc trên một nút tính toán và lập lịch thực hiện công việc trên nhiều nút tính toán Lập lịch thực hiện trên một nút tính toán Hình 3.2.1: Lập lịch thực hiện công việc trên 1 nút Sự kiện báo cho Server khởi tạo quá trình lập lịch Server gửi lệnh lập lịch đến Scheduler Scheduler yêu cầu thông tin tài nguyên từ MOM MOM trả lại thông tin được yêu cầu Scheduler yêu cầu thông tin công việc Server gửi thông tin công việc đến cho Scheduler để Scheduler lập lịch Scheduler gửi yêu cầu chạy đến Server Server gửi công việc đến MOM để chạy Lập lịch trên nhiều nút tính toán Hình 3.2.2:Lập lịch thực hiện công việc trên nhiều nút tính toán Phân hệ quản lý tài nguyên và thực thi công việc PBS_Mom Vai trò của Phân hệ này trong hệ thống PBS là hết sức quan trọng. Đây chính là các thành phần để thực thì công việc trên các nút tính toán cũng như thu thập các thông tin tài nguyên của các nút tính toán. Phân hệ được cài đặt trên từng nút tính toán của phân cụm, cũng dưới dạng một tiến trình ngầm và chạy với quyền root. Nút tính toán PBS_MOM Nút tính toán PBS_MOM Nút tính toán PBS_MOM PBS_MOM Nút tính toán PBS_MOM Nút tính toán PBS_MOM Nút tính toán PBS_MOM Nút tính toán PBS_MOM PBS_MOM Nút tính toán PBS_MOM MẠNG LIÊN KẾT Hình 3.3 : Phân bố Phân hệ Quản lý Tài nguyên và Thực thi công việc trên các nút Đây là thành phần đảm nhiệm hai chức năng chính là quản lý tài nguyên và thực hiện chạy các Job. Do đó nó được chia thành hai thành phần sau 3.3.1 Thành phần quản lí tài nguyên(Resource Monitor-RM) Thành phần quản lí tài nguyên hệ thống là thành phần bổ trợ cho thành phần lập lịch. Thành phần quản lí tài nguyên hệ thống cung cấp cho thành phần lập lịch nhưng thông tin và tài nguyên của hệ thống cục bộ. Thành phần quản lí tài nguyên hệ thống là một phần của phân hệ pbs_mom. Nó lắng nghe đầu vào tại một socket nhất định (được định nghĩa là PBS_MOM_SERVICE_PORT = 15002) và đáp ứng danh sách các tên tài nguyên và giá trị tương ứng. Thành phần quản lí tài nguyên hệ thống có thể đáp ứng yêu cầu của rất nhiều tiến trình nhưng socket được sử dụng chỉ có tiến trình chủ mới có thể kết nối. Chú ý rằng pbs_mom không còn giải quyết định vị của các nút thực thi các Job. Các chức năng này được chuyển cho thành phần Pbs_Server như là một phần của toàn bộ đặc tính song song. Các thông tin được RM quản lý: Arch Hệ điều hành của host.n Cput Thời gian cpu theo giây. Idletime Thời gian nghỉ của hệ thống theo giây Loadave Số các tiến trình đang chạy Mem Số bộ nhớ đã dùng tính theo byte Ncpus Số bộ vi xử lý trong máy trạm. Nsessions Số phiên làm việc đang thực hiện trong máy trạm Nuers Số người dùng có tiến trình đang chạy trên máy trạm Pids Danh sách cac tiến trình của cùng một phiên làm việc. Physmem Kích thước bộ nhớ vật lý. Sessions Số phiên làm việc trong máy trạm Size Kích thước file hệ thống tính theo kb Uname Thông tin từ lệnh Uname trả về Validuser Người dùng có hợp pháp không. Walltime Thời gian tính theo đơn vị giây mà một chương trình hay phiên làm việc tồn tại trong hệ thống. 3.3.2 Thành phần thực hiện(Job Excutor-JE) Mục đích của JE là chạy các nhiệm vụ (Job), theo dõi và điều khiển các Job đó và báo cáo lại cho PBS_Server. Mỗi một nút có một JE Như vậy PBS_Server chịu trách nhiệm chung về Job được chạy, còn JE chịu trách nhiệm cụ thể về Job đó, khởi tạo, giám sát, thu dọn sau khi Job hoàn thành. Một Job có thể có nhiều tiến trình. JE giám sát tất cả các tiến trình trong nút tính toán. JE gắn liền với thành phần quản lí tài nguyên nhưng khác biệt hẳn về chức năng. JE hoạt động như một Task Manager đối với các Job mà nó quản lý. Một PBS_Server sẽ làm việc với rất nhiều JE. Hoạt động của hệ thống Người sử dụng sẽ giao tiếp với Phân hệ quản lý công việc với tư cách là môt client đối với hệ thống PBS. Sau khi tiếp nhận được công việc, Phân hệ Lập lịch thực hiện công việc sẽ được kích hoạt để thực hiện việc lập lịch và phân phối công việc vào các nút tính toán theo các giải thuật và cơ chế lập lịch có sẵn. Đồng thời, công việc cũng được lưu trong các hàng đợi (queue) của Phân hệ quản lý công việc. Phân hệ Lập lịch để có thể lập lịch và phân bổ công việc vào đúng các nút cần thiết sẽ yêu cầu Phân hệ thu thập và quản lý tài nguyên cung cấp các thông tin về tài nguyên trên từng nút tính toán. Dựa vào nhưng thông tin đó, cùng với những thông tin có sẵn của công việc, Phân hệ Lập lịch có thể xác định được sự phân bổ công việc trên các nút. Thông tin đó sẽ đựợc chuyển xuống cho Phân hệ Thu thập tài nguyên và thực thi công việc để tiến hành thực hiện công việc đồng thời trong qua trình thực hiện công việc, các thông tin có liên quan sẽ được cập nhật và lưu trữ trong Phân hệ quản lý công việc. Khi công việc kết thúc, kết quả sẽ được trả về cho người dùng ở phía client. Quá trình này sẽ được lặp đi lặp lại để đáp ứng cho các công việc tiếp theo được đệ trình từ phía người sử dụng. Quá trình này được diễn ra trong toàn bộ hệ thống, và các phân hệ đều trực tiếp tham gia vào. Phân hệ quản lý công việc Phân hệ lập lich Phân hệ quản lý tài nguyên và thực thi công việc Người sử dụng Công viêc và Yêu cầu Kết quả & Thông tin Yêu cầu lập lịch &Thông tin công việc Yêu cầu thông tin công việc &kết quả lập lịch Yêu cầu thông tin tài nguyên Thông tin tài nguyên Công việc và Yêu cầu Hình 2.4:Hoạt động của hệ thống PBS Giữa các phân hệ trong hệ thống PBS luôn có sự giao tiếp, liên lạc với nhau. Sự giao tiếp là cần thiết và quan trọng đặc biệt đối với nhiệm vụ quản trị hệ thống phân cụm. Vì nếu không có các giao tiếp, liên lạc giữa các phân hệ thì toàn bộ hệ thống sẽ trở nên rời rạc và không còn là một thể thống nhất nữa. Giao tiếp giữa PBS_Server và PBS_Sheduler Từ Phân hệ quản lý công việc đến Phân hệ lập lịch thực hiện là các yêu cầu lập lịch và thông tin về công việc cần được lập lịch Từ Phân hệ lập lịch đến Phân hệ quản lý công việc là các yêu cầu thông tin về công việc và các kết quả đã đáp ứng sau khi lập lịch Phân hệ Quản lý công việc Phân hệ Lập lịch công việc Yêu cầu lập lịch và thông tin công việc Yêu cầu thông tin công việc và kết quả sau lập lịch Hình 2.4.1: Giao tiếp giữa Phân hệ Quản lý công việc và Phân hệ lập lịch Giao tiếp giữa PBS_Sheduler và PBS_Mom Từ Phân hệ Lập lịch đến Phân hệ quản lý tài nguyên và thực thi công việc: yêu cầu thông tin tài nguyên do Phân hệ quản lý tài nguyên thu thập được. Từ Phân hệ Quản lý tài nguyên và thực thi công việc đến Phân hệ Lập lịch: thông tin tài nguyên đã thu thập được. Phân hệ Lập lịch công việc Phân hệ quản lý tài nguyên và thực thi công việc Yêu cầu thông tin tài nguyên Thông tin tài nguyên cần thiết Hình 4.2: Giao tiếp giữa Phân hệ Lập lịch và Phân hệ Quản lý tài nguyên và thực thi công việc Giao tiếp giữa PBS_Server và PBS_Mom Từ Phân hệ Quản lý công việc tới Phân hệ Quản lý tài nguyên và thực thi công việc: công việc và yêu cầu thực thực công việc đó. Phân hệ Quản lý công việc Phân hệ Quản lý tài nguyên và thực thi công việc Công việc và yêu cầu thực thì Hình 4.3: Giao tiếp giữa Phân hệ Quản lý công việc và Phân hệ Quản lý tài nguyên và thực thi công việc Sự đóng gói dữ liệu và truyền thông Hệ thống PBS thích hợp với mô hình client-server, trong client đưa ra các yêu cầu vàn server đáp ứng. Ngoài ra trong môi trường giao tiếp này cũng cầm có sự giao tiếp giữa các tiến trình bên trong và sự định dạng dữ liệu khi truyền trên mạng. Mặt khác hệ thống này cũng cần thiết phải có một hệ thống gioa tiếp để khi các công việc được giao cho các server tránh xảy ra hiện tượng bị mất hay lặp lại công việc. Thêm nữa hầu hết các yêu cầu từ client đến server đều là các yêu cầu đơn và việc xử lý với các yêu cầu này là khá đơn giản. Tuy nhiên cũng có một vài yêu cầu phức tạp và gồm nhiều yêu cầu hợp lại hay là có nhiều yêu cầu phụ đi kèm, mà trong bất kỳ trường hệ thống cũng có thể bỏ qua các yêu cầu phụ này. Vậy vấn đề đặt ra ở đây là hệ thống kết nối phải được kết nối sao cho hệ thống có thẻ bỏ qua một số yêu cầu không quan trọng mà vẫn đảm bảo không bị bỏ xót hay lặp lại công việc Hệ thống sử dụng kiến trúc mạng TCP/IP và socket để kết nối và trao đổi dữ liệu, cổng dịch vụ là cổng 15002. Một vài kiến trúc mạng đơn giản khác cũng có thể được sử dụng để thay thế như SNI, DNI. PBS sử dụng kiểu má hoá dữ liệu theo dạng xâu theo chuẩn ISO ASN.1 để truyền dữ liệu giữa các phần ngoại trừ việc giao tiếp giữa PBS_Sheduler và RM, dữ lieu được mã hoá theo dạng DIS(Data Is String), ưu điểm là Dễ dàng mã hoá Mã hoá cả tên trường nên rất linh hoạtmdễ sửa đổi và dễ lập trình Bây giờ chúng ta sẽ cùng tìm hiểu về chuẩn ASN.1 và DIS Các đặc tả của chuẩn ASN.1 về định dạng dữ liệu được truyền đi Giao thức chuẩn ASN.1 được chia thành hai phân hệs phân biệt. Phân hệ thứ nhất, Batch, chứa các yêu cầu và đáp ứng giữa clent và server, phân hệ thứ hai, SSBatch, chứa các message giữa các server với nhau. BATCH DEFINITIONS ::= BEGIN -- -- The Client to Server Requests and Replies Network Protocol PBS ERS -- BatchRequest ::= SEQUENCE { request INTEGER { connect (0), queuejob (1), jobcredential (2), jobscript (3), rdytocommit (4), commit (5), deletejob (6), holdjob (7), locatejob (8), manager (9), messagejob (10), modifyjob (11), movejob (12), releasejob (13), rerunjob (14), runjob (15), selectjobs (16), servershutdown (17), signaljob (18), statusjob (19), statusqueue (20), statusserver (21), trackjob (22), authenuser (49), orderjob (50), selstat (51), registerdependent (52), copyfiles (54), delfiles (55), jobobit (56), mvjobfile (57) }, user ISO646String, credential [0] Credential OPTIONAL, -- no longer used body ANY, requestextend [1] OCTET STRING OPTIONAL } -- -- The server to client reply, one per request -- BatchReply ::= SEQUENCE { code INTEGER, auxcode INTEGER, bodyCHOICE { none [0] NULL, queue [1] JobIdentifier, rdytocommit [2] JobIdentifier, commit [3] JobIdentifier, select [4] SelectReply, stat [5] SET OF ObjStatus, text [6] OCTET STRING, -- error msg locate [7] IMPLICIT ISO646String -- server name }, vendorextend OCTET STRING OPTIONAL } -- -- request body elements, one and only one per request -- Connect ::= OBJECT IDENTIFIER QueueJob ::= SEQUENCE { destin [1] DestinationID, jobid [2] JobIdentifier OPTIONAL, -- server-server only attr [3] AttributeList } JobCredential ::= SEQUENCE { type INTEGER, data OCTET STRING } -- JobFile - chunks of the job script (and other) file passed as a string, -- each chunk can be up to 8k octets in length JobFile ::= SEQUENCE { sequence [1] INTEGER, -- chunk sequence number type [2] INTEGER, -- file type jobid JobIdentifier OPTIONAL, data OCTET STRING -- chunk of file } RdyToCommit ::= JobIdentifier Commit ::= JobIdentifier DeleteJob ::= Manage HoldJob ::= Manage LocateJob ::= JobIdentifier Manage ::= SEQUENCE { command INTEGER { create(0), delete(1), set(2), unset(3) }, objtype ObjType, objname ISO646String, attrib AttributeList } MessageJob ::= SEQUENCE { Network Protocol PBS ERS jobid JobIdentifier, fileopt INTEGER { default(0), oflg(1), eflg(2) }, message ISO646String } ModifyJob ::= Manage MoveJob ::= SEQUENCE { jobid JobIdentifier, destin DestinationID } ReleaseJob ::= Manage RerunJob ::= JobIdentifier RunJob ::= SEQUENCE { jobid JobIdentifier, location ISO646String OPTIONAL } SelectJobs ::= AttributeList ServerShutdown ::= INTEGER { immediate(0), delay(1) } SignalJob ::= SEQUENCE { jobid JobIdentifier, signal ISO646String } Status ::= SEQUENCE { id ISO646String OPTIONAL, -- either job or destination id attr AttributeList OPTIONAL } TrackJob ::= SEQUENCE { hopcount INTEGER, jobid JobIdentifier, location DestinationID, jobstate ISO646String } GetCredent ::= OCTET STRING -- -- reply-body elements, zero or one per reply -- SelectReply ::= SEQUENCE OF JobIdentifier ObjStatus ::= SEQUENCE { -- for Queue and Server Status Reply objtype ObjType, objectname ISO646String, attrib AttributeList, text ISO646String OPTIONAL } -- -- Lower Level types -- Credential ::= SEQUENCE { credentialtype INTEGER { credential-none (0), -- NULL credential-text (1) }, credential ANY DEFINED BY credenttype } DestinationID ::= ISO646String JobIdentifier ::= ISO646String ObjType ::= INTEGER {server(0), queue(1), job(2) } -- JobIdentifier is in the form: "seq_number.server_name" AttributeList ::= SET OF Attribute -- Job attributes defined by the P1003.15 standard are: -- account-name -- checkpoint -- error-path -- execution-time -- hold-type -- job-name -- job-state -- join-paths -- keep-files -- mail-points -- mail-users -- output-path -- priority -- rerunable -- resource-list -- shellpath-list -- security -- user-list -- variable-list -- Additional PBS job attributes are: -- ctime -- cput-remain -- current-loc -- dependency -- group -- mtime -- owner -- submithost Attribute ::= SEQUENCE { name [1] ISO646String, resource [2] ISO646String OPTIONAL, -- resource name value [3] ISO646String, -- attribute or resource name oper [4] INTEGER { set(0), unset(1), incr(2), decr(3), eq(4), ne(5), ge(6), gt(7), le(8), lt(9), dflt(16) } } END SSBATCH DEFINITIONS ::= BEGIN -- -- Server to Server Requests -- IMPORTS JobIdentifier , DestinationID , Attribute , AttributeList FROM BATCH ; PullJob ::= SEQUENCE { destin DestinationID, attrib AttributeList } RegisterDependent ::= SEQUENCE { owner OCTET STRING, parentid JobIdentifier, childid JobIdentifier, dependtype INTEGER, op INTEGER, cost INTEGER } CopyFiles ::= SEQUENCE { files SET OF FilePairs, jobid JobIdentifier, -- Job Id owner OCTET STRING, -- Job owner user OCTET STRING, -- user name for job execution group OCTET STRING, -- group name for job execution direction INTEGER } JobObit ::= SEQUENCE { jobid JobIdentifier, status INTEGER, resources AttributeList } FilePairs ::= SEQUENCE { flag INTEGER, local OCTET STRING, rmt OCTET STRING } END Phương pháp mã hoá DIS Mục đích của DIS là cung cấp một phương pháp mã hoá dữ liệu nhanh chóng, đơn giản, gọn nhẹ và độc lập với định dạng của máy cho việc mã hoá dữ liệu về dạng xâu ký tự và ngược lại. Bởi vì dữ liệu có thể được giải mã trực tiếp ở chính cấu trúc nội tại của nó nên các thao tác sao chép dữ liệu sẽ được giảm đi. Mặt khác một lợi ích nữa là chúng ta cũng có thể đọc được các dữ liệu này. Theo cách này dữ liệu được biểu diễn theo đúng những gì chúng ta nhìn thấy về chúng nhưng đi kèm với độ dài của mỗi phần tử được mã hoá. Một nhược điểm của phương pháp này là với một số nguyên dương nhỏ chúng ta không thể nói là đấy là số dạng signed hay unsigned chars, short, ints or long sau khi chúng ta đã biết dạng mã hoá của nó. Tương tự như vậy cho một số âm nhỏ, chúng ta chỉ có thể xác định duy nhất một điều là dữ liệu ban đầu không phải là số không dấu. Và ở đây cũng không xác định trước được độ dài của từ một từ mã và phương pháp mã hoá, có thể dùng mã bù hai, mã bù một, số lớn thậm chí là mã nhị phân. Với phương pháp này mọi dữ liệu cơ sở của C đều có thể được quản lý. Cụ thể singned và unsigned chars, short, ints, longs tạo nên tập số nguyên. Ký tự NULL cùng với xâu ký tự tạo nên xâu ký tự với ký tự NULL dùng để báo kết thúc xâu. Floats, doubles và long doubles tạo nên tập số thực Các loại dữ liệu phức tạp khác phải được xây dựng từ những dữ liệu cơ sở. Mẫu mã hoá một số nguyên : integer =: | count =: sign =: ’+’ | ’-’ decimal string =: | digit =: ’0’ | ’1’ | ’2’ | ’3’ |’4’ | ’5’ | ’6’ | ’7’ | ’8’ | ’9’ Trên đây là công thức chung, với số chỉ có một chữ số thì thành phần count là không có mà chỉ có hai thành phần dấu và giá trị. Các trường hớp còn thì count là độ dài của số đó, thành phần decima string giá trị thực của số đó Ví dụ : Chúng ta sẽ giải thích thêm ở số cuối cùng : Số 2 là số chữ số của số tiếp theo sau nó, tiếp sau số 2 là số 10 có hai chữ số, và bởi vậy số 10 biểu diễn giá trị 10 trong hệ thập phân. Số 10 là độ dài của số cần mã hoá. Cuối cùng là giá trị của số đó Mã hoá xâu : counted string =: characters =: | Số ký tự có trong xâu được cho bởi số nguyên đứng ở đầu xâu. Ví dụ : Value Encoded String “abc” “This is a long string” +3abc 2+22this is a long string Số thực được mã hoá dạng : real number =: Trong đó số nguyên đầu tiên được gọi là hệ số, biểu diễn số thực ban đầu dưới dạng số nguyên. Số nguyên tiếp theo biểu diễn số mũ trong hệ cở số 10 để số trước nhân với 10 với số mũ này ra số ban đầu. Ví dụ số 8.9 được chuyển thành số 89 và –1 sau đó được chuyển thành xâu. PBS cung cấp sẵn một tập hợp các hàm để tiến hành mã hoá và giải mã với các dạng dữ liệu cơ sở, tập hợp các hàm này nằm trong thư viện đi kèm. Đóng gói dữ liệu có cấu trúc Ví dụ với một cấu trúc dữ liệu dạng danh sách móc nối như sau: struct simple{ int n; char str[30]; struct simple* next; } Với cấu trúc như trên, khi muốn mã hóa một danh sách móc nối có kiểu như trên và có phần tử đầu tiên là firstnode thì ta làm như sau: Đếm xem có bao nhiêu phần tử trong danh sách, mã hóa nó. Duyệt từ firstnode, với mỗi phần tử thì tiến hành mã hóa các trường dữ liệu của nó chỉ trừ trường next: Mã hóa số nguyên n Mã hóa xâu str Với một mảng các đối tượng như sau: Object* arrayobject; Việc mã hóa cũng được tiến hành tương tự như trên tức là đầu tiên tính số phần tử của mảng, mã hóa số đó ra gói tin, sau đó mã hóa từng phần tử của mảng với cách mà hóa tương tự như trên. Đây cũng chính là cách mà PBS sử dụng để mã hóa những cấu trúc phức tạp mã ta sẽ thấy sau này. Một số kết quả đã đạt được và định hướng phát triển Một số kết quả trung tâm đã đạt được K43-BKParaComp: Xây dựng môi trường phát triển ứng dụng song song với LAM MPI và PBS K44-BKSupComp: Tích hợp khả năng chống lỗi cho MPICH và cải tiến cơ chế lập lịch của PBS Định hướng phát triển Tích hợp BKParaComp và BKSupComp Phát triển công cụ quản trị hệ thống Phát triển bộ Debuger Phần 3 Tìm hiểu về chương trình Debugger Debugger Interface Khái niệm parallel Debugger Debugger là cung cấp cho người sử dụng khả năng kiểm soát từ bên trong của một chương trình đang được thực hiện. Parallea debugger là công cụ debugger dành cho các chương trình song song Xét một cách tổng quoát một chưong trình gồm có 3 phần là: Souce file: là file mã nguồn do người lập trình viết trên một ngông ngữ bậc cao nào đấy như C, Pascal… File chay: file sau khi đã được dịch từ souce ra mã máy, ở đây có sự liên kết giữa souce file và file chạy Các thư viện dùng chung: là các file đã được dịch của nhiều chương trình khác nhau và được chương trính chính của ta sử dụng . Chương trình debugger mà chúng ta sẽ xây dựng có liên quan đến cả ba phần trên. Khi một chương trình được thực thi thì bao gồm nhiều tiến trình cùng chạy đồng thời, mỗi tiến trình lại có thể bao gồm nhiều luồng, mỗi luồng có tập các thanh ghi và vùng nhớ stack riêng. Một chương trình hoàn thiên bao gồm các tiến trình và các luồng có thể có thêm phần giao tiếp, giao tiếp với người sử dụng để lấy các thông tin đầu vào hoặc giao tiếp giứa các tiến trình với nhau, để kích hoạt cho chương trình hoạt động. Nói chung số lượng các tiến trình/luồng phụ thuộc vào nhiều yếu tố, như chất lượng của chương trình ban đầu, của chương trình sau khi dịch, cách chạy chương trính và số lượng các công việc cần giải quyết tuần tự. Vì vậy số lượng các tiến trình và luồng là không cố định đối với mỗi chương trình. Debugger có thể sẽ rang buộc số lượng các tiến trình hay số luồng trong chương trình đích. Một threads-onlyDebugger là chưong trình gỡ rối chỉ có khả năng debugger một tiến trình đơn tuy nhiên không hạn chế số luồng trong tiến trình này. Tưong tự như vậy, một processes_onlyDebugger không thể nhận ra các luồng bên trong một tiến trình. Thao tác này có thể áp dụng vào các chương trình gồm nhiều tiến trình nhưng mỗi tiến trình chỉ có một luồng. Chúng ta gọi một chương trình debugger có khả năng kiểm soát chương trình gồm nhiều tiến trình, mỗi tiến trình lại có nhiều luồng là bộ debugger đa mức, chúng ta sẽ bàn chủ yếu về những bộ debugger này. Chúng ta chú ý rằng mọi chương trình parallel Debugger đều có thể sử dụng để debugger một chương trình tuần tự. Cách thức hoạt động của chương trình Debugger Debugger có ảnh hưởng đến chương trình nhưng không phải là một phần của chương trình. Chúng ta có thể hiểu debugger là việc chạy từng tiến trình một cách riêng rẽ. Debugger giao tiếp với chương trình thông qua execution-time interface theo một nghĩa noà đó ta có thể coi debugger là một hệ điều hành đặc biệt. Hình 2.1: Quan hệ giữa debugger và chương trình đích Chúng ta đều biết rằng một chương trình bao gồm một tập hợp các trạng thái được thực hiện theo một thứ tự nhất định và khi debugger chương trình thì thứ tự của các trạng thái này không thay đổi. Tuy nhiên trong các chương trình song song, do có thể gồm nhiều tiến trình và nhiều luồng, sự can thiệp của debugger có thể thay đổi thời gian tương tác của các tiến trình này và sau đó quay trở lại tác động vào chương trình. Debugger lấy file chạy làm đầu vào.Bởi vì debugger được hỗ trợ ở mức này nên mỗi một file chạy đều gắn với các thông tin debugger( debugging information). Trong tất cả các hệ thống đích yêu cầu các file chạy được chuẩn bị với một lựa chọn của compiler, như là “-g”.Các thông tin debugger có hai chức năng chính là: Cung cấp một cách để bộ debugger gửi các thông tin gỡ rối lên mức cao hơn cho người sử dụng. Đưa ra cách thức tiếp cân vào các thành phần bên trong của chương trình cho bộ debugger. Các tiêu chuẩn trên không đưa ra các đặc điểm truy nhập khi file mã nguồn chưa được dịch và cung cấp đầy đủ các thông tin debugger. Có ba cách để tiến hành debugger một chương trình. Cách thứ nhất là chương trình được chạy trong môi trường debugger, nghĩa là sau khi đã có bộ debugger. Cách hai là bộ debugger kết hợp với một chương trình đã được thực hiện trong môi trường run-time. Trong trường hợp này nếu chương trình gồm nhiều tiến trình thì debugger có thể cần tương tác với môi trường run-time hoặc các thư viện đáp ứng được việc quản lý các tiến trình này. Cách thứ ba là debugger được kết hợp với một chương trình song song mà kết thúc một cách không bình thường, một chương trình mà file chạy chương trình được tìm thấy và lưu trong một core file. Bởi vậy khi debugger không có bất cứ một tiến trình nào là thức sự gắn với chương trình đích cả và chỉ có thao tác debugger là có tác động đến core file debugging. Đặc biệt trong khi thực hiện bộ debugger có thể xác định vị trí của chương trình cũng như các giá trị các biến nhưng không thể thay đổi bất cứ điều gì ở trong core file. Giao diện Debugger có giao diên với người sử dụng , đây là nơi để chúng ta dùng để nhập các thông tin cần được kiểm soát trong quá trình debugger hoặc để đưa ra những thông tin về chương trình trong lúc chạy chương trình. Debugger Output Debugger các thông báo để trả lời về các thông tin mà chúng ta muốn biết khi tiến hành debugger chương trình. Một trong các thông tin này là thông báo xem các thao tác có đợc thực hiên một cách thành công hay không , nếu có lỗi thì là lỗi gì và ở đâu. Ngoài ra cũng có thể đưa thêm các thông tin độ sâu chi tiết của chương trình đang debugger hay chính là chương trình đang chạy đến đâu( chúng ta thấy tượng tự khi chúng ta debugger một chương trình tuần tự cho chạy từng dòng lệnh. Nói chung các thông báo lại cho người sử dụng là khác nhau với các dòng lệnh khác nhau.Chương tình HPD(High Performance Debugger) do nhóm HPDF(High Performance Debugger Forum) đưa ra phiên 1 có ba loại tham số điều khiển là ERR: tập cácc tham số này cho biết chương trình đã mắc lỗi WARN: tập các lời cành báo khi gặp các câu lệnh khó hiểu hay có khả năng mắc lỗi cao. ALL Các tham số này được lưu trong biến trạng thái là VERBOSE. Một loại biến điều khiển khác là ERROR_CHECKS cho phép người dùng điều khiển quá trình debugger bằng chách thay đổi giá trị các biến trong chương trình. Hiệu ứng của sự song song trong quá trình debugger Tên của các tiến trình và các luồng Như chúng ta đã biết một chương trình song song luông bao gồm nhiều tiến trình chạy đồng thời và trong mỗi tiến trình lại có nhiều luồng vậy làm thế nào để quản lý được các luồng này trong quá trình debugger? Và người ta đã đưa ra giải pháp là gán một định danh cho mỗi tiến trình và mỗi luồng. Các định danh này có thể được tạo ra bởi chính bộ debugger hoặc có thể sử dụng một hệ thống nào đó để gán định danh cho các tiến trình. Nhưng chúng ta phải chú ý rằng mỗi định danh của một tiến trình là duy nhất trong quá trình debugger và định danh của mỗi luồng là duy nhất trong thời gian tồn tại của tiến trình. Để minh hoạ chúng ta cùng xem xét một chương trình gồm có hai tiến trình, mỗi tiến trình có hai luồng, chúng ta sẽ có 4 luồng: thread 0 of process 0 thread 1 of process 0 thread 0 of process 1 thread 1 of process 1 Chúng ta có mẫu định danh cho các luông như sau: [process-identifier.thread-identifier] Và ta có định danh của các luồng như sau: [0.0] - thread 0 of process 0 [0.1] - thread 1 of process 0 [1.0] - thread 0 of process 1 [1.1] - thread 1 of process 1 Chúng ta cũng có những quy ước: *- xác định tất cả các định danh trong trong một vị trí xác định : - tât cả các định danh trong phạm vi giơi hạn nào đó. Cụ thể giả sử chúng ta có: 0.*- các định danh của các luồng trong tiến trình 0. 0.*:4.*-các luồng trong các tiến trình từ không đến 4 1.2:1.5- các luồng trong phạm vi từ luồng 2 đến luồng 5 của tiến trình 1 Tập các tiến trình và luồng Đây là khái niệm được mở rộng từ định nghĩa các tiến trình của lập trình tuần tự sao cho có thể phù hợp với môi trường lập trình song song. Việc coi tiến trình và luồng như nhau sẽ tạo điều kiện đểc ứng dụng các lênh debugger này vào cả chương trình gồm nhiều tiến trình cũng như các chương trình gồm nhiều luồng Chúng ta định nghĩa tập các tiến trình và luồng là tập hợp gồm tất cả các luông trong tất cả các tiến trình của chương trình ban đầu. Một tập p/t( processes/threads) được giới hạn bên trong một dấu ngoặc vuông. Ví dụ : [0.0,0.1,0.2] - the first 3 luồng trong tiến 0 [0.*] - tất cả các luồng trong tiến trình 0 [1.1, 2.1] - luồng 1 trong tiến trình 1 và 2 [1:2.1] - luồng 1 trong tiến trình 1 và 2. Trong tập p/t nếu tồn tại hai giá trị bằng nhau sẽ sinh ra lời cảnh báo nhưng không ảnh hưởng gì đến quá trình debugger chương trình. Không giống như khi debugger một chương trình tuần tự, khi mà mỗi lệnh chỉ sử dụng cho một luồng duy nhất, khi debugger một chương trình song song thì có thể có nhiều luồng điều khiển riêng biệt và đồng thời cũng có nhiều vị trí khác nhau trao đổi thông tin với chương trình. Để hạn chế bớt sự phức tạp của một lệnh debugger thì khái niêm tập đích đã ra đời, điều này giới hạn một lệnh được áp dụng cho một, nhiều hay tất cả các luồng điều khiển. Tập đích có thể ảnh hưởng đến tất cả các lệnh debugger vì vậy bộ debugger cần phải có những quy tăc nghiêm ngặt để xác định tập đích. Tập tên Debugger tạo ra và lưu giữ các tập chứa mọi luồng, các tập này được tham chiếu bởi tên của tập. Mỗi tập chứa một loại luồng khác nhau. Trong HDP phiên bản 1 có 5 loại tập như vậy là: all: tập này chứa mọi luồng của chương trình running: chứa các luông đang ở trạng thái chạy. stopped: chứa mọi luồng ở trạng thái dừng runnable: chứa các luồng ở trạng thái dừng hoặc ở trạng thái runnable held: các luồng ở trạng thái dừng hoặc held exec: các luồng được đặt tên dạng executable Các tập này có thể thay đổi trong quá trình debugger chương trình. Trên đây là những lý thuyết ban đầu về xây dựng chương trình debugger cho một chương trình song song, tiếp theo chúng ta sẽ cùng tìm hiểu về một chương trình cụ thể đó là phiên bản HPD Version 1 do nhóm HPDF làm ra. High Performance Debugger Version 1 Giới thiệu về nhóm HPDF HPDF-High Performance Debugger Forum, là phòng thí nghiệm vừa tiến hành nghiên cứu đồng thời cũng phát triển các chương trình debugger trong môi trường lập trình song song. Nhóm được thành lập năm 1997 với mục đích là đưa ra một công cụ debugger chuẩn cho hệ thống tính toán song song(High Performance Computing-HPC) Mục tiêu của nhóm là xây dựng công cụ debugger chuẩn cho cả hệ thống chia sẻ bộ nhớ và hệ thống bộ nhớ phân tán Phưong pháp tiếp cận vấn đề của nhóm HPDF là chia chia nhỏ vấn đề thành các lớp bài toán nhỏ hơn và dễ giải quyết hơn sau đó tiến hánh hoàn thiện dần và sẽ cho ra đời các version với version sau là sự kế thừa cảu version trước. Trong bài này chúng ta sẽ cùng tìm hiểu về phiên bản đầu tiên và các lệnh chuẩn cũng như giao diện cơ sở của một chơng trình debugger song song. High Performance Debugger Version 1-HPD Giao diện Trong phiên bản đầu tiên này mới chỉ đưa ra giao diện dòng lệnh. Vì vậy khi một chương trình cũng có giao diện dòng lệnh mà lại được điều khiển bằng chương trình debugger này thì quan hệ giữa hai dao diện này là không được rõ rang lắm. Có thể xảy ra trường hợp cả chương trình debugger và ứng dụng của người dùng đều đang ghi lên thiết bị đầu cuối tại cùng một thời điểm. Vì vậy cần thiết phải có một kỹ thuật qua đó cho phép người dùng có thể phân biệt được dữ liệu nào là của chương trình , dữ liệu nào là của debugger. Điều này đã được thực hiện bằng cách chốt dữ liệu giữa debugger và chương trình. Nếu khởi tạo chế độ debugger input thì mọi dữ liệu đầu vào sẽ là của giao diên debugger và để chuyển sang chế độ program input thì lệnh proginput phải được đưa ra và khi này thiết bị input chính là giao diện của chương trình, khi này mọi lệnh gõ ra đều không ảnh hưởng đến chương trình debugger. Để quoay trở lại chế độ giao diện của chương trình debugger cần phải ngắt lệnh proginput bằng các phím user interrupt key, việc làm này sẽ làm tự động quay trở lại chế độ debugger input và dấu nhắc sủa debugger sẽ xuất hiện trên màn hình. Đoạn mã dưới đây sẽ giải thích rõ hơn về điều này: [all]> run [all]> Debugger prompts for next command Enter degrees of freedom: Program prompts for first value proginput User switches to program input mode 4 User interacts with program, File for results: temp.dat ... ^C then exits back to debugger input mode [all] Debugger prompts for next command Khởi tạo Để khởi tao chúng ta tạo ra file debugger initation file, file này cung cấp một kỹ thuật cho việc khởi tạo các phiên debugger bằng cách thiết lập các lựa chọn về môi trường debugger. File này phải được đặt tên dạng .hpdinit và được lưu dữ trong thư mục user home directory. Bình thường file khởi tạo ở trên dùng để lưu trữ các đặc tả các lệnh của người dùng hoặc các lệnh để chạy một cách tự động mỗi khi quá trình debugger được thực hiện. Ngoài ra chương trình debugger cũng lưu giữ các lệnh đã sử dụng gần đây và điều này cho phép chúng ta thấy được các lệnh đã được thực hiên trước đây hoặc thực hiện lại các lệnh này. Và người sử dụng có thể điều khiển độ dài của danh sách này thông qua biến trạng thái của debugger là MAX_HISTORY Để chạy chương trình trong môi trường debugger thì cần sử dụng hai lệnh sau: load command và tiếp theo là run command. Việc phân làm hai lệnh riêng biệt này cho phép người sử dụng khởi tạo điểm actionpoint bên trong chương trình trước khi bắt đầu thực hiện chương trình, và qua đó chúng ta có thể chạy debugger hơn một lần với những trạng thái debugger đã chọn sẵn. Một số lệnh đặc biệt: attach command: lệnh này dùng để gắn một chương trình đang được thực hiện với chương trình debugger. detach command: lệnh này ngược với lệnh attach command, lệnh này dùng để đưa một chương trình đang được điều khiển bởi chương trình debugger về trạng thái chạy bình thường. Core command: lệnh này được thực hiện khi debugger được gắn với core file image Actionpoints Actionpoints là các điểm tại đó chương trình có thể phải dừng lại dưới một điều kiện đặc biệt nào đó. Có ba loại actionpoints được hỗ trợ trong HPD version1. Mỗi loại cho phép người sử dụng xác định chương trình hực thi sẽ dừng khi một vài sự kiện đặc biệt của chương trình xuất hiện. Breakpoint: điểm dừng này sẽ xác định chương trình sẽ dừng khi chạy đến dòng lệnh được đánh dấu sẵn ơ trong source. Watchpoint: cung cấp một cơ chế điều khiển tương tự như khi dữ liệu được lưu trữ trong bộ nhớ và nó sẽ dừng chương trình mỗi khi giá trị các biến được thay đổi. Barrier: điểm này dùng để đồng bộ hoá các tiến trình với nhau, nó ngăn không cho một tiến trình không chạy tiếp cho đến khi các tiến trình đèu đã chạy đến đây và đã được đồng bộ hoá. Đặc tả lệnh #: Xác định bỏ qua phần còn lại của dòng. Thường dùng đặt trước các lời giải thích cho chương trình được rõ nghiữa hơn. Alias-tạo ra hoặc xem kại một lệnh do người dùng định nghĩa. Tạo ra một lệnh mới do người dùng định nghĩa. Cấu trúc: alias command-name command-body Xem lại một lệnh đã tồn tại trước rồi. Cấu trúc: alias [command-name] Trong đó command-name là tên của lệnh được định nghĩa. Command-body xác định lệnh được định nghĩa là lệnh đơn giản hay là lệnh hình thành bằng cách ghép các lệnh lại với nhau. Câu lệnh alias sẽ gắn lệnh mà người dùng vừa định nghĩa với tập lệnh của chương trình debugger vì vậy sau đó nó được sử dụng nh một lệnh của chương trình debugger. Chú ý rằng nếu câu lệnh alias mà không có tham số kềm theo thì kết quả nhận được sẽ là toàn bộ các lệnh do người dùng định nghĩa. Câu lệnh alias khi thực hiện nếu người dùng cố gắng định nghĩa lại một lệnh của chương trình debugger thì sẽ sinh ra lỗi và xuất hiện thông báo lỗi tương ứng. Còn nếu khi muốn xem một lệnh không tồn tại hoặc đã bị xoá bởi lệnh unalias thì một cảnh báo sẽ được sinh ra để báo rằng lệnh như trên không tồn tại.Ví dụ: alias nt next Định nghĩa một lệnh nt để thực hiện lệnh tiếp theo. alias nt Hiển thị định nghĩa về lệnh nt alias step2 “step;step” Định nghĩa lệnh step2 để thực hiện hai lệnh step trên cùng một dòng. [0.*] alias step0 “step” Định nghĩa lệnh step 0 hỗ trợ mọi luồng trong tiến trình 0 alias steptoo “step0;[1.*] step” Định nghĩa lệnh steptoo thực hiện đòng thời hai lệnh, lệnh đầu ảnh hưởng đến mọi luồng trong tiến trình 0, lệnh thứ hai tác động tương tự lê tiến trình 1 Unalias: lệnh này ngược với lệnh alias ở trên. Cấu trúc : unalias {command-name | -all} Cũng như alias như lệnh alias lệnh unalias sẽ gặp lỗi nếu người sử dụng cố gắng xoá đi một lệnh của chương trình debugger. Ví dụ: unalias step2 loại bỏ lệnh step2 ra khỏi chương trình, chú ý rằng nếu lệnh step2 được sử dụng trong việc định nghĩa một lệnh khác thì lệnh này không bị ảnh hương gì bởi lệnh loại bỏ step2 unalias –all lệnh này loại bỏ mọi alias history: tham chiếu đến các lệnh đã được sử dụng Hiển thị lệnh được sử dụng gần nhất. Cú pháp: history [num_commands] Thực hiện lại lệnh được thực hiện gần nhất. Cú pháp: !! Thực hiện lại một lệnh đã được thực hiện trước đây. Cú pháp: ! {command_id | rel_command_id | command_string} Lệnh history thực hiện một vài thao tác có liên quan đến lệnh cần được thực hiện lại được lưu trong command history list, theo mặc định sẽ có 20 lệnh được lưu lại trong danh sách này, kích thước cảu danh sách này được lưu trong biến trạng thái MAX_HISTORY và có thể thay đổi được. Ví dụ: history hiển thị danh sách của 20 lênh được thực hiên gần nhất history 10 hiển thị 10 lệnh được thực hiên gần đây nhất !! thực hiện lại lệnh ngay trước !15 thực hiện lệnh thứ 15 trong danh sách !print thực hiện lệnh print cuối cùng !pr thực lệnh cuối cùng mà bắt đầu bằng chữ pr set: thay đổi hoặc xem giá trị của các biến trạng thái Thay đổi giá trị của biến trạng thái set debugger-var = value Xem giá trị hiện thời của một biến trạng thái set [debugger-var] Nếu lệnh này không có tham số kèm theo thì tên và giá trị hiện thời của toàn bộ các biến trạng thái sẽ đượ hiển thị. Các biến trạng thái có thể áp dụng lệnh set được HPD hỗ trợ là: Ví dụ: set PROMPT = "Fixme% " đặt promt là Fixme% và dấu cách theo sau unset: phục hồi lại các giá trị mặc địh cho các biến trạng thái. unset {debugger-var | -all} debugger-var: tên của biến trạng thái được phục hồi -all: phục hồi giá trị mặc định cho mọi biến trạng thái Tương tự như lệnh set lệnh unset chỉ có tác dụng với một số biến nhất định. Input: đọc và thực hiện lệnhđược lưu giữ trong file input file Lệnh input đọc và thực hiện tuần tự từng lệnh debugger được lưu trữ trong file. Chương trình debugger không thực hiện lại các lệnh này nhưng việc hiển thị kết quả diễn ra hoàn toàn bình thường. Info: cho biết thông tin về môi trườn debugger. Lệnh này dùng để hiển thị những thông tin chung về môi trường tiến hành debugger Help: đưa ra hướng dẫn làm việc

Các file đính kèm theo tài liệu này:

  • docDAN074.doc