Lập trình song song

35 758 6
Lập trình song song

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Các phương pháp truyền thông ClientServer Khái niệm Các phương pháp truyền thông (Khái quát): Chương trình mô phỏng chat đơn giản thông qua socket Chương trình mô phỏng hàng đợi đa mức có phản hồi Bài toán người đọc và biên tập viên Bài toán người thợ cắt tóc ngủ gật Bathroom problem Producer Consumer Dining philosophers Bài toán tạo phân tử H2O Đọc Master Boot Record, đưa ra các phân vùng chính của ổ cứng, nếu phân vùng ổ C sử dụng hệ thống file FAT32 thì đưa ra thông tin về ổ.

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI Viện Công nghệ Thông tin và Truyền thông BÀI TẬP LỚN HỆ ĐIỀU HÀNH Sinh viên thực hiện: 1. Chu Đức Lộc SHSV: 20091678 2. Phạm Quang Toản SHSV: 20092793 Mã lớp: 21538 Giáo viên hướng dẫn: TS. Phạm Đăng Hải HÀ NỘI – 2011 1 Mục lục Mục lục 2 1 Khái niệm 2 2 Các phương pháp truyền thông (Khái quát): 3 A Các phương pháp truyền thông Client-Server 1 Khái niệm Mô hình client-server là một mô hình nổi tiếng trong mạng máy tính, được áp dụng rất rộng rãi và là mô hình của mọi trang web hiện có. Ý tưởng của mô hình này là máy con (đóng vài trò là máy khách) gửi một yêu cầu (request) để máy chủ (đóng vai trò người cung ứng dịch vụ), máy chủ sẽ xử lý và trả kết quả về cho máy khách. 2 Thuật ngữ server được dùng cho những chương trình thi hành như một dịch vụ trên toàn mạng. Các chương trình server này chấp nhận tất cả các yêu cầu hợp lệ đến từ mọi nơi trên mạng, sau đó nó thi hành dịch vụ và trả kết quả về máy yêu cầu. Một chương trình được coi là client khi nó gửi các yêu cầu tới máy có chương trình server và chờ đợi câu trả lời từ server. Chương trình server và client nói chuyện với nhau bằng các thông điệp (messages) thông qua một cổng truyền thông liên tác IPC (Interprocess Communication). Để một chương trình server và một chương trình client có thể giao tiếp được với nhau thì giữa chúng phải có một chuẩn để nói chuyện, chuẩn này được gọi là giao thức. Nếu một chương trình client nào đó muốn yêu cầu lấy thông tin từ server thì nó phải tuân theo giao thức mà server đó đưa ra. 2 Các phương pháp truyền thông (Khái quát): 2.1 Socket Một socket là một thiết bị truyền thông 2 chiều tương tự như một tập tin. Chúng ta có thể đọc hay ghi lên nó. Tuy nhiên mỗi socket là một thành phần trong một mối nối nào đó giữa các máy trên mạng máy tính và các thao tác đọc/ghi chính là sự trao đổi dữ liệu giữa các ứng dụng trên nhiều máy khác nhau. Ở đây ta hiểu Socket trong Winsock như là một “phương tiện” để ứng dụng mạng có thể trao đổi dữ liệu. Nghĩa là 1 Server thì sẽ cần một Socket để lắng nghe, chờ đợi các kết nối từ client và Client thì phải cần có một Socket để kết nối tới Sever. 2.2 RMI RMI (Remote Method Invocation) là một cơ chế cho phép một đối tượng đang chạy trên một máy ảo Java này ( Java Virtual Machine) gọi các phương thức của một đối tượng đang tồn tại trên một máy ảo Java khác (JVM). Thực chất RMI là một cơ chế gọi phương thức từ xa đã được thực hiện và tích hợp trong ngôn ngữ Java. Vì Java là một ngôn ngữ lập trình hướng đối tượng, nên phương pháp lập trình trong RMI là phương pháp hướng đối tượng do đó các thao tác hay các lời gọi phương thức đều liên quan đến đối tượng. Ngoài ra, RMI còn cho phép một Client có thể gửi tới một đối tượng đến cho Server xử lý, và đối tượng này cũng có thể được xem là tham số cho 3 lời gọi hàm từ xa, đối tượng này cũng có những dữ liệu bên trong và các hành vi như một đối tượng thực sự. 2.3 RPC RPC (Remote Procedure Calls) – Thủ tục gọi hàm từ xa là một kỹ thuật tiến bộ cho quá trình kết nối từ Client đến Server để sử dụng các ứng dụng và dịch vụ. RPC cho phép client có thể kết nối tới 1 dịch vụ sử dụng dynamic port nằm ở một máy tính khác. Trong hệ thống mạng máy tính hiện nay có rất nhiều dịch vụ và ứng dụng sử dụng cơ chế kết nối RPC. RPC được thiết kế để cung cấp cho việc truyền tải thông tin giữa client và server dễ dànghơn, bảo mật hơn, và thuận tiện hơn cho việc đồng bộ hóa các luồn dữ liệu. Các thông điệp gửi cho một dịch vụ RPC được biểu diễn bởi ngôn ngữ XDR (External Data Representation): dạng thức biểu diễn dữ liệu ngoài. Chỉ có các kiểu dữ liệu có thể được định nghĩa bởi XDR mới có thể truyền đi. B Chương trình mô phỏng chat đơn giản thông qua socket +Server: import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Server {public static void main(String[] args) { // Xử lí các trường hợp ngoại lệ có thể xảy ra của các lệnh đặt trong khối try catch try { // Khởi tạo sever tại cổng 6132 ServerSocket server = new ServerSocket(1234); // Tạo vòng lặp vô hạn while (true) { System.out.println("Listening "); // Chờ cho đến khi có Client kết nối tới thì sẽ trả Client về Socket sock Socket sock = server.accept(); // Lấy thông tin về Client vừa conect tới InetAddress addr = sock.getInetAddress(); System.out.println("Connection made to " + addr.getHostName()+ " (" + addr.getHostAddress() + ") \n"); 4 ObjectInputStream ois = new ObjectInputStream(sock.getInputStream()); ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); Object infor = ois.readObject(); System.out.println(infor.toString()); oos.writeObject("Hi, I'm Server \n"); // Đóng kết nối sock.close(); } } catch (ClassNotFoundException x) {System.out.println(x);} catch (IOException x) {System.out.println("Exception detected: " + x);} } } + Client import java.io.*; import java.net.Socket; public class Client{public static void main(String[] args) { Socket sock; int port = 1234; String hostname = "127.0.0.1"; // Địa chỉ để chat trên cùng một máy // Xử lí các trường hợp ngoại lệ có thể xảy ra của các lệnh đặt trong khối try catch try { sock = new Socket(hostname, port); System.out.println("Connect successfully \n"); ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); ObjectInputStream ois = new ObjectInputStream(sock.getInputStream()); oos.writeObject("Hello, I'm Client \n"); Object infor = ois.readObject(); System.out.println(infor.toString()); } catch (ClassNotFoundException x) {System.out.println(x);} catch (IOException x) {System.out.println(x);} catch (Exception x) {System.out.println(x);} }}}} C Chương trình mô phỏng hàng đợi đa mức có phản hồi 5 + Bài toán: Sử dụng 3 hàng đợi với 3 mức độ ưu tiên lần lượt là 1, 2, 3. Các tiến trình trên cùng 1 hàng đợi có cùng mức độ ưu tiên. * Queue 1 sử dụng chiến lược điều phối RR với lượng tử thời gian là 8. * Queue 2 sử dụng chiến lược điều phối RR với lượng tử thời gian là 16. * Queue 3 sử dụng chiến lược điều phối FCFS. + Thuật toán: * Khi 1 tiến trình P1 yêu cầu CPU mà không được đáp ứng ngay thì xếp nó vào Queue 1. * Nếu hết lượng tử thời gian dùng CPU ở Queue 1 mà P1 vẫn chưa thực hiện xong thì đẩy nó xuống Queue 2. * Nếu hết lượng tử thời gian dùng CPU ở Queue 2 mà P1 vẫn chưa thực hiện xong thì đẩy nó xuống Queue 3. * Thực hiện các tiến trình theo mức độ ưu tiên và thứ tự trong hàng đợi. + Sử dụng chương trình: * Nhập số lượng tiến trình tham gia điều phối. * Với mỗi tiến trình thì nhập thời điểm bắt đầu vào hệ thống và thời gian chạy cần thiết để tiến trình hoàn tất. * Chương trình sẽ in ra thời điểm chạy của các tiến trình. + Chương trình: #include<iostream.h> #include<stdlib.h> #define max 100 6 float t[max], b[max]; int q1[max], q2[max], q3[max], vt[max], kt[max], n, f1, r1, f2, r2, f3, r3; void sort() { int i,j,t3; float t1,t2; for (i=1; i<n; ++i) { t3=vt[i]; j=i; while ((j>0)&&(b[vt[j-1]]>b[t3])) { vt[j]=vt[j-1]; j; } vt[j]=t3; } } void push(int q[], int i, int &f, int &r) { if ((max-f+r)%max==max-1) {cout<<"hang doi day"; return;} q[r]=i; r=(r+1)%max; } int isempty(int q[], int f, int r) { return (f==r); } int pop(int q[], int &f, int &r) { int gt=q[f]; 7 f=(f+1)%max; return gt; } int ketthuc() { int i; for (i=0; i<n; ++i) if (!kt[i]) return 0; return 1; } int main() { float td; int tt,i,ok; system("cls"); cout<<"So luong tien trinh tham gia: "; cin>>n; for (i=0; i<n; ++i) { cout<<"Thoi diem tien trinh "<<i<<" xuat hien: "; cin>>b[i]; cout<<"Thoi gian de tien trinh hoan thanh: "; cin>>t[i]; } for (i=0; i<n; ++i) {vt[i]=i; kt[i]=0;} sort(); i=1; td=b[vt[0]]; f1=f2=f3=r1=r2=r3=0; push(q1,vt[0],f1,r1); while (!ketthuc()) { 8 if (!isempty(q1,f1,r1)) { tt=pop(q1,f1,r1); if (t[tt]>8) { cout<<td<<" -> "<<td+8<<" Tien trinh "<<tt<<" dang chay"<<endl; td+=8; t[tt]-=8; push(q2,tt,f2,r2); } else { cout<<td<<" -> "<<td+t[tt]<<" Tien trinh "<<tt<<" chay va ket thuc"<<endl; td+=t[tt]; kt[tt]=1; } } else if(!isempty(q2,f2,r2)) { tt=pop(q2,f2,r2); if (t[tt]>16) { cout<<td<<" -> "<<td+16<<" Tien trinh "<<tt<<" dang chay"<<endl; td+=16; t[tt]-=16; push(q3,tt,f3,r3); } else { cout<<td<<" -> "<<td+t[tt]<<" Tien trinh "<<tt<<" chay va ket thuc"<<endl; td+=t[tt]; kt[tt]=1; } } else if (!isempty(q3,f3,r3)) { 9 tt=pop(q3,f3,r3); cout<<td<<" -> "<<td+t[tt]<<" Tien trinh "<<tt<<" chay va ket thuc"<<endl; td+=t[tt]; kt[tt]=1; } ok=0; while ((i<n)&&(b[vt[i]]<=td)) { ok=1; push(q1,vt[i],f1,r1); ++i; } if ((i<n)&&(!ok)) {td=b[vt[i]]; push(q1,vt[i],f1,r1); ++i;} } system("pause"); } + Ví dụ: Tiến trình Thời điểm vào hệ thống Thời gian thực thi 0 2 9 1 1 4 2 0 40 Kết quả: 0 ->8 Tiến trình 2 đang chạy 10 [...]...8 ->12 Tiến trình 1 chạy và kết thúc 12 ->20 Tiến trình 0 đang chạy 20 ->36 Tiến trình 2 đang chạy 36 ->37 Tiến trình 0 chạy và kết thúc 37 ->53 Tiến trình 2 chạy và kết thúc D Bài toán người đọc và biên tập viên + Yêu cầu: • Nhiều tiến trình (Readers) cùng truy cập cơ sở dữ liệu (CSDL) • Một số tiến trình (Writers) cập nhật CSDL • Cho phép một số lượng tùy ý các tiến trình (Readers) cùng... phân tử H2O + Yêu cầu: • Có 2 kiểu tiến trình (luồng): oxygen và hydrogen • Để kết hợp các tiến trình thành phân tử nước, cần 1 ba-ri-e để các tiến trình phải đợi cho tới khi một phân tử nước sẵn sàng được tạo ra • Khi mỗi tiến trình vượt qua ba-ri-e, nó phải kích hoạt liên kết • Tất cả các tiến trình trong cùng một phân tử nước phải tạo liên kết, trước khi một tiến trình của phân tử nước khác gọi tới... độ tránh tình trạng đói CPU của các tiến trình Writers; • int rc=0; // Số tiến trình Readers truy cập CSDL • Readers() { While (1) { Wait(turnstile); Signal(turnstile); // Dành quyền đọc CSDL 11 Wait(mutex); //Thêm 1 tiến trình reader rc=rc+1; // Giành quyền truy xuất CSDL nếu là tiến trình đọc đầu tiên if (rc==1) wait(db); // Giải phóng quyền đọc cho các tiến trình readers khác signal(mutex); // Đọc... số lượng tùy ý các tiến trình (Readers) cùng truy cập CSDl Đang tồn tại một tiến trình Reader truy cập CSDL, mọi tiến trình Readers khác mới xuất hiện đều được truy cập CSDL (Tiến trình Writers phải xếp hàng chờ đợi • Chỉ cho phép một tiến trình Writers cập nhật CSDL tại một thời điểm • Vấn đề không trưng dụng Các tiến trình ở trong đoạn găng mà không bị ngắt + Cài đặt • Khởi tạo semaphore Mutex=1;... với điều kiện người ra ( vào) phòng tắm là nữ turnstile=1; // Giảm đi 1 khi có tiến trình xin vào phòng tắm Dùng để điều độ tránh tình trạng đói CPU của tiến trình male hoặc female mutex1=1; // Điều độ biến đếm m; 19 mutex2=1; // Điều độ biến đếm fm; mutex=1; // Điều độ quyền truy cập file văn bản in kết quả + Chương trình #include #include int m=0, fm=0; HANDLE room, maleMultiplex,... Tao oxy Oxy cho Tao oxy Oxy cho * Kết quả cho thấy các tiến trình đã được điều độ đúng đắn ( ngay khi có đủ 1 nguyên tử oxy và 2 nguyên tử hydro thì lập tức tạo liên kết sinh ra phân tử H2O) 32 J Đọc Master Boot Record, đưa ra các phân vùng chính của ổ cứng, nếu phân vùng ổ C sử dụng hệ thống file FAT32 thì đưa ra thông tin về ổ + Chương trình #include #include int main(int argc,... Điều hòa count để chi có duy nhất 1 tiến trình truy cập nó tại 1 thời điểm • Đồng bộ hóa trong mỗi Producer và consumer 23 + Khởi tạo : • Đèn empty xem buffer rỗng hay không Khởi tạo là max = kích thước buffer, và giá trị cực đại cũng là max • Đèn full kiểm tra bufer đầy hay không Khởi tạo là 0 và cực đại là max kích thước buffer • Đèn mutex điều phối các tiến trình trong 1 producer , consumer Khi có... các tiến trình trong 1 producer , consumer Khi có nhiều producer và consumer Khởi tạo là 1 và cực đại là 1 • Đèn s điều phối count, sao cho tại một thời điểm chỉ có 1 tiến trình được dùng count Khởi tạo là 1 và cực đại là 1 +Chương trình #include #include #include #include #define max 10 #define maxProducer 100 #define maxConsumer 100 HANDLE s,empty,full,mutex;... Mỗi triết gia cần 2 cái dĩa để ăn • Chỉ lấy một dĩa tại một thời điểm • Cái bên trái trước rồi cái bên phải  Ăn xong để dĩa vào vị trí cũ Viết chương trình đồng bộ bữa tối 5 triết gia + Khởi tạo semaphore Các fork bằng 1 và giá trị tối đa là 1 + Chương trình : #include #include #include #include HANDLE fork[5],mutex; 27 void Dining(int i) { int j,p,q; while(1)... người trong phòng tắm mới có thể vào • Số lượng người sử dụng phòng tắm trong một đơn vị thời gian là có giới hạn ( trong trường hợp này ta giả sử là 5 người) + Yêu cầu: • Có 2 kiểu tiến trình male() và female() • Mỗi tiến trình ở trong bathroom một khoảng thời gian ngẫu nhiên + Cài đặt int m=0; // Số nam trong phòng tắm fm=0; // Số nữ trong phòng tắm Khởi tạo semaphore room=1; // Nếu phòng tắm trống thì . được thực hiện và tích hợp trong ngôn ngữ Java. Vì Java là một ngôn ngữ lập trình hướng đối tượng, nên phương pháp lập trình trong RMI là phương pháp hướng đối tượng do đó các thao tác hay các. 3. * Thực hiện các tiến trình theo mức độ ưu tiên và thứ tự trong hàng đợi. + Sử dụng chương trình: * Nhập số lượng tiến trình tham gia điều phối. * Với mỗi tiến trình thì nhập thời điểm bắt. đầu vào hệ thống và thời gian chạy cần thiết để tiến trình hoàn tất. * Chương trình sẽ in ra thời điểm chạy của các tiến trình. + Chương trình: #include<iostream.h> #include<stdlib.h> #define

Ngày đăng: 16/05/2015, 01:48

Mục lục

  • Mục lục

    • 1 Khái niệm

    • 2 Các phương pháp truyền thông (Khái quát):

Tài liệu cùng người dùng

Tài liệu liên quan