Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Thảo luận Bài 5

+48
PhamHuyHoang(I113A)
TranMinhNhat61 (102c)
lebichtram89 (113a)
trinhquangtrong91 (113a)
PhanDiecLoi34 (113A)
CaoTheAnh01(113A)
nguyenduchuy19 (113A)
LUUDINHTOAN(I11C)
LeKimHoang (113A)
TrangSiMinhHai (113A)
ngongocdiep06 (113A)
NguyenVanNghiem(HC11TH3A)
tranthanhphu49 (113A)
LamVuThai (113A)
LeDangBaoNgoc55 (113A)
NguyenVuLinh12053_I11C
VuMinhTan (113A)
NguyenThiKimNgan (113A)
TranThiHuyenTrang(113A)
NguyenVanNgoc65 (113A)
dothanhnhan44 (113A)
nguyendinhhieu13 (113A)
NguyenHuuNghiep72
HoThienLang27 (113A)
voanhvy (113A)
nguyenchithuc(113A)
LeThanhNhan45 (113A)
MaiTrieuHung16 (113A)
NguyenPhamTanPhat(113A)
DangThiKimKhanh (113A)
ledinhngankhanh (113a)
TranThichThem (113A)
NguyenVanQuyet57 (113A)
TranThiThuyHang79 (113A)
trantrungnam-HC11TH2A
lechaukhoa(113A)
NguyenHuuLinh31(113A)
NguyenTrungTruc (113A)
NguyenVanLam(I13A)
PhamQuocAnh02 (113A)
NguyenThiNgocPhuong(113A)
NguyenNgocTrungNam (113A)
buidainghia(113A)
LeLamThang (113A)
NguyenThiThuThuy (113A)
HaHoangCongTien80 (113A)
phamanhtuan95(113A)
Admin
52 posters

Trang 5 trong tổng số 9 trang Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next

Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:05

Tại sao tiến trình truyền thống là tiến trình nặng,luồng là tiến trình nhẹ ?


- Tiến trình truyền thống là tiến trình nặng vì: khi tạo tiến trình mới sẽ phức tạp, khó khăn hơn..
- Luồng là tiến trình nhẹ vì: khi tạo luồng sẽ dễ dàng và nhanh hơn..
ví dụ: trong một lớp học A có 50 sinh viên, có thêm 10 sinh viên đăng kí vào học. Thay vì mở thêm lớp học mới, ta nên đưa 10 bạn đó vào danh sách lớp học A sẽ tiết kiệm được khoảng chi phí mở lớp học mới.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:05

Giải thích code Sản Xuất Tiêu Thụ Đa Luồng

#include -->khai báo
#include
#include
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
void Producer(){
while (1){
// ... (nextProduced) quá trình tạo ra 1 sản phẩm
while(((in+1)%BUFFER_SIZE)==out); ---> vòng lặp quẩn tại đây cho đến khi có 1 chỗ trống trong bộ đệm hay ngăn chứa sản phẩm… khi vòng lặp while kết thúc --> có 1 chỗ trống để chèn sản phẩm vô
buffer[in]=nextProduced++; --> chèn sản phẩm vô ngăn chứa
in=(in+1)%BUFFER_SIZE; --> tìm vị trí khác để Producer chèn thêm sản phầm vào
SuspendThread(GetCurrentThread());lấy luồng hiện hành, SuspendThread hàm API dùng để tạo ngưng 1 luồng.
}
}
void Consumer(){
int nextConsumed;
while (1){
while(in==out); --> vòng lặp quẩn tại đây khi các ngăn chứa sản phầm đều trống
------vòng lặp while thoát khi có 1 ngăn chứa sản phầm---------
nextConsumed=buffer[out]; --> lấy sản phẩm ra khỏi ngăn
out=(out+1)%BUFFER_SIZE; --> tìm vị trí khác để Consumer lấy sản phẩm nếu out đang nằm ở cuối mảng thì out sẽ trở về đầu mảng
// ... (nextConsumed) ----quá trình tiêu thụ sàn phẩm-----
Sleep(GetTickCount()%5000); --> hàm API đưa luồng vào trạng thái ngủ trong khi chờ Producer sản xuất thêm sản phầm,thời gian tính bằng ms trôi qua kể từ khi hệ thống khởi động tới thời điểm hiện tại, chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này tạm dừng trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nộii dung Buffer
const char * LeftMargin="\n\t";
int i;
printf(LeftMargin);
for(i=0; i<(in*5);i++) putchar(' '); printf("!in");
printf(LeftMargin);
for (i=0; iprintf("S%2d, ",buffer[i]);
printf("S%2d",buffer[BUFFER_SIZE-1]);
printf(LeftMargin);
for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
printf("\n");
}
int main(){
HANDLE ProducerHandle1, ProducerHandle2; --> biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1, ConsumerHandle2; --> biến Handle chứa mục quản NTT

DWORD ProducerID1, ProducerID2; --> chứa ID NSX
DWORD ConsumerID1, ConsumerID2; --> chứa ID NTT

// tạo 2 luồng sản xuất trong trạng thái ngủ
ProducerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID1); //khởi tạo NSX với các thông tin: Producer, ID, số 4 biểu thị trạng thái của Producer lúc khởi tạo là trạng thái luôn luôn ngủ

ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2); // tuong tu
// tao 2 luồng tiêu thụ trong trang thái ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //khởi tạo NTT với các thông tin: Consumer, ID, số 0 biểu thị trạng thái của Producer lúc khởi tạo: trạng thái luôn luôn thức.

ConsumerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID2); //tuong tu
while(1){
printf("\n- Nhấn P/p để sản xuất,0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1); //đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); ///đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case '0': /// giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1); --> ngủ trong khoảng 1mns
ShowBuffer(); -->kết quả sau khi sản xuất tiêu thụ, khi đang show thì không sx, không tiêu thụ
}
}

- SuspendThread : luồng sản xuất hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
vd; một người công nhân đến làm việc ở bến cảng khi chưa được phân công thì anh ta tạm rơi vào trạng thái ngủ, chờ khi tàu đến thì anh ta dậy và vác đồ vào kho, làm xong anh ta lại tiếp tục rơi vào trạng thái ngủ.
- GetCurrentThread: trả về mục quản cuả luồng hiện hành.
- Sleep: ngủ 1 khoảng thời gian cho trước.
- Sleep(0): làm cho luồng chính trễ đi 1mili giây trước khi thực hiện đưa nội dung bộ đệm ra màn hình.
- GetTickCount: Nhận số mili giây trôi qua kể từ khi HĐH khởi động cho đến thời điểm gọi hàm này.
- ShowBuffer(): Đưa kết quả ra màn hình.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:06

Giải thích 1 số hàm trong bài toán sản xuất tiêu thụ


Hàm GetCurrentThread: dùng để lấy về mục quản của luồng sản xuất hiện hành(mục quản: là con số do hệ điều hành cấp ho luồng hiện hành)
Hàm SuspendThread: dùng để tạm ngưng công việc của hàm với mục quản cho trước
Hàm Sleep: dùng để ngủ 1 số miligiay cho trước,hết khoảng thời gian đó nhà tiêu thụ lại làm việc tiếp
Hàm GetTickCount(): dùng để lấy số miligiay trôi qua kể từ khi hệ điều hành khởi động cho đến thời điểm gọi hàm này
HÀm ResumeThread: dùng để tiếp tục công việc của luồng với mục quản cho trước
Hàm CloseHandle: dùng để hủy đối tượng cho trước với mục quản cho trước. vd: CLoseHandle (45) :luồng 45 không làm việc nữa,bị đóng lại

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:06

Mô hình đa luồng


Ví dụ : Thực hành 1 môn học
* Mỗi nhóm 2 sinh viên là 1 tiến trình:
* Mỗi sinh viên là 1 luồng:
------> Cùng làm bài => Hoạt động đồng hành
------> Có bài thực hành chung => Tài nguyên chung
------> Trao đổi với nhau

Phân biệt giữa luồng và tiến trình
Luồng : 1 dòng xử lý
Tiến trình : 1 không gian địa chỉ hoặc nhiều luồng.
=> Các tiến trình là độc lập, trong mỗi tiến trình có thể có nhiều luồng

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:06

Mô hình đa luồng


Ví dụ : Thực hành 1 môn học
* Mỗi nhóm 2 sinh viên là 1 tiến trình:
* Mỗi sinh viên là 1 luồng:
------> Cùng làm bài => Hoạt động đồng hành
------> Có bài thực hành chung => Tài nguyên chung
------> Trao đổi với nhau

Phân biệt giữa luồng và tiến trình
Luồng : 1 dòng xử lý
Tiến trình : 1 không gian địa chỉ hoặc nhiều luồng.
=> Các tiến trình là độc lập, trong mỗi tiến trình có thể có nhiều luồng

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:07

Lập trình đa luồng bằng Visual C++


Tạm ngừng thi hành (SuspendThread) các luồng sản xuất(Producer), biết rằng mục quản (Handle) của chúng lưu trong mảng được khai báo bằng lệnh HANDLE ProducerHandle[50].

Code:
for(int i=0; i<50; i++)//khai báo biến i,i có giá trị ban đầu bằng 0,i chạy từ 0->49
SuspendThread(ProducerHandle[i]);
//gọi hàm SuspendThread để tạm ngưng thi hành sản xuất,mục quản của mỗi nhà sản xuất ứng với phần tử thứ i trong mảng ProducerHandle
}


*Đánh thức (ResumeThread) các luồng sản xuất (Producer), biết rằng mục quản (Handle) của chúng lưu trong mảng được khai báo bằng lệnh HANDLE ProducerHandle[50].

Code:
for(int i=0; i<50; i++)
{
ResumeThread(ProducerHandle[i]);
//gọi hàm ResumeThread để đánh thức thi hành sản xuất
}

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:08

Ví dụ về tính ưu việt của công nghệ "đa luồng".


* Chia sẻ tài nguyên: các luồng có thể dùng chung tài nguyên và bô nhớ của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dàng dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
VD: các bạn sinh viên thuê cùng phòng thì dễ dàng chia sẻ bóng đèn, quạt máy và tivi với nhau. Còn trường hợp hai, ba phòng trọ xài chung 1 quạt máy, 1 tivi thì chúng ta thấy việc chia sẻ, dùng chung quả là khó khăn hơn, phiền toái hơn.

*Tiết kiệm: cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng dùng chung tài nguyên với cha và các luồng khác nên việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn.
VD: trong 1 gia đình có người con trai lớn lập gia đình.Vấn đề cần thiết bây giờ là 1 chỗ ở riêng cho cặp vợ chồng này. Và rõ ràng chúng ta thấy nếu mua nhà ra ở riêng thì rất tốn kém so với ngăn ra 1 phòng trong nhà để ở. Vì khi mua nhà thì chi fí mua nhà cao hơn và tất cả vật dụng trong nhà sẽ phải sắm sửa lại từ đầu chứ không xài chung trong gia đình như trước nữa.
.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:08

Công Nghệ CGI

Hôm bửa thầy có nhắc tới công nghệ CGI nên mình có bài viết nói về công nghệ này.
Định nghĩa: Common Gateway Interface (CGI) là chuẩn để kết nối chương trình ứng dụng với Web server. Dữ liệu từ bảng biểu do người dùng điền vào trên trang Web được chuyển cho ứng dụng CGI, ứng dụng này sau đó sẽ gửi trả nội dung Web được tạo ra theo yêu cầu ngược về cho trình duyệt của người dùng.

Khi được phát triển lần đầu tiên cách đây một thập kỷ, World Wide Web được thiết kế để hiển thị tài liệu. Tuy nhiên, ngay từ lúc khởi đầu, các nhà phát triển Web site đã muốn có một cách thức để gửi dữ liệu từ trình duyệt của người dùng lên Web server, chẳng hạn tên, mật mã người dùng hay yêu cầu tìm kiếm.

CGI mang lại một phương thức chuẩn hoá để thực hiện những khả năng này. Khi người dùng gõ dữ liệu vào bảng biểu trên trang Web, nội dung này sẽ được gửi về cho Web server và thông qua giao tiếp CGI để đưa đến những chương trình riêng biệt xử lý.

Chương trình CGI sau đó có thể gửi ngược về cho trình duyệt của người dùng trang Web hiện có, trang Web mới được sinh ra trong quá trình xử lý, hình ảnh hay bất kỳ loại thông tin nào khác có thể hiển thị được trên trình duyệt.

Vì CGI hết sức linh động nên hầu như bất kỳ chương trình nào có thể chạy trên máy chủ Web và chấp nhận dữ liệu theo kiểu dòng lệnh như những chương trình được viết bằng C, C++, Perl, Visual Basic và thậm chí một số ngôn ngữ kiểu dòng lệnh của Unix - đều có thể dùng được với CGI.

Một trong những tồn tại lớn nhất của CGI là nó nạp một chương trình mới mỗi khi người dùng nhấn vào bảng biểu, vì thế những máy chủ Web dùng cho site có dòng lưu chuyển dữ liệu lớn có thể chạy hàng ngàn chương trình cùng lúc - một gánh nặng cho tốc độ của Web site.

Những chương trình chuyên biệt

Người dùng thường phàn nàn những chương trình được viết cho CGI không thể dùng lại được khi Web site thay đổi vì chúng thường rất chuyên dụng. Kết quả là trong một số năm qua, nhiều Web site lớn đã từ bỏ CGI để đi theo các máy chủ ứng dụng. Tương tự các chương trình CGI, máy chủ ứng dụng chấp nhận nhập liệu từ phía người dùng và gửi ngược lại các trang Web hay thông tin khác. Điều khác biệt là máy chủ ứng dụng xử lý nhập liệu của nhiều người dùng chỉ bằng một chương trình, do đó cải thiện tốc độ rất nhiều.

Hết sức thích hợp

Điều này không có nghĩa máy chủ ứng dụng sẽ thích hợp cho tất cả mọi người. CGI rất phù hợp với các mạng nội bộ, nơi thường có lưu lượng thông tin ít hơn những site bên ngoài. Hơn nữa, kinh phí của các phòng ban thường không chấp nhận mức giá 15.000 - 100.000 USD của máy chủ ứng dụng, trong khi CGI thì được thiết kế sẵn trong các máy chủ Web.

Chương trình CGI có thể được viết bằng bất kỳ ngôn ngữ nào và giao tiếp CGI cũng hết sức đơn giản, vì thế các nhà phát triển Web có thể nhanh chóng kết hợp những tiện ích CGI đơn giản với nhau. Tất cả những điều này làm cho CGI trở thành công cụ thực dụng cho những tiện ích và sửa đổi mang tính tức thời nhưng không thể dùng được trên những Web site thương mại đòi hỏi cao. CGI vẫn có vai trò hết sức quan trọng nhưng ngày càng có nhiều phương thức khác uyển chuyển hơn, hoàn thiện hơn để tích hợp với những hệ thống khác.


trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:09

Sự đồng bộ của luồng

Trong khi đang làm việc với nhiều luồng, nhiều hơn một luồng có thể muốn thâm nhập cùng một biến tại cùng thời điểm. Ví dụ, một luồng có thể cố gắng đọc dữ liệu, trong khi luồng khác cố gắng thay đổi dữ liệu. Trong trường hợp này, dữ liệu có thể bị sai.

Trong những trường hợp này, bạn cần cho phép một luồng hoàn thành trọn vẹn tác vụ của nó, và rồi thì mới cho phép các luồng kế tiếp thực thi. Khi hai hoặc nhiều hơn một luồng cần thâm nhập đến một tài nguyên được chia sẻ, bạn cần chắc chắn rằng tài nguyên đó sẽ được sử dụng chỉ bởi một luồng tại một thời điểm. Tiến trình này được gọi là "sự đồng bộ", (synchronization) được sử dụng để giải quyết vấn đề này, Java là ngôn ngữ duy nhất hổ trợ sự đồng bộ ở mức ngôn ngữ. Phương thức "đồng bộ" (synchronized) báo cho hệ thống đặt khóa trên tài nguyên.

Mấu chốt của sự đồng bộ hóa là khái niệm "monitor" (giám sát), hay còn gọi "semaphore" (cờ hiệu). Một "monitor" là một đối tượng mà được khóa độc quyền. Chỉ một luồng có thể có monitor tại mỗi thời điểm. Tất cả các luồng khác cố gắng thâm nhập vào monitor sẽ bị trì hoãn, cho đến khi luồng đầu tiên thoát khỏi monitor. Các luồng khác được báo chờ đợi monitor. Một luồng có thể monitor một đối tượng nhiều lần.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:10

thảo luận câu 2 bài 5


• Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
• Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
• Khi tiến trình cha (ví dụ Web Server) nhận thêm một yêu cầu, một luồng được đánh thức
và đưa vào vận hành.
• Phục vụ xong, luồng được đưa trả về tập luồng.
• Nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải
phóng.
ví dụ : anh lính trong quân đội mài kiếm, nhưng trước đó anh lính đó phải biết mặt áo giáp và đấu kiếm để khi có giặc có thế đánh giặc ngay
ví dụ từ thực tế của thầy: năm 1999 thầy đến thăm trang mạng phương nam đây là trang thông tin việc làm của vitanex. nhưng trang mạng này có một vấn đề là khi năm người cùng truy cập thì trang mạng thông tin việc làm này sẽ bị treo và thầy tuấn đã tìm ra nguyên nhân là vì tại thời điếm đó có 5 tiến trình hight weight cùng làm việc và thầy đã giải quyết được vấn đề bằng cách viết lại chương trình này bằng asp

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:10

Java – Đa luồng (Multithreading)

Một chương trình Java bị ngắt chỉ sau khi tất cả các luồng thực thi xong. Trong Java có hai loại luồng:

♦ Luồng người sử dụng.

♦ Luồng chạy ngầm (deamon).

Máy ảo Java có ít nhất một luồng deamon là luồng "garbage collection" (thu lượm tài nguyên - dọn rác). Luồng dọn rác thực thi chỉ khi hệ thồng không có tác vụ nào. Nó là một luồng có quyền ưu tiên thấp. Lớp luồng có hai phương thức để làm việc với luồng deamon:

♦ public void setDaemon(boolean on).

♦ public boolean isDaemon().

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:11

SỰ LIÊN LẠC GIỮA CÁC TIẾN TRÌNH(INTERPROCESS COMUNICATION)


1. Nhu cầu liên lạc giữa các tiến trình

Trong môi trường đa chương, một tiến trình không đơn độc trong hệ thống , mà có thể ảnh hưởng đến các tiến trình khác , hoặc bị các tiến trình khác tác động. Nói cách khác, các tiến trình là những thực thể độc lập , nhưng chúng vẫn có nhu cầu liên lạc với nhau để :
- Chia sẻ thông tin: nhiều tiến trình có thể cùng quan tâm đến những dữ liệu nào đó, do vậy hệ điều hành cần cung cấp một môi trường cho phép sự truy cập đồng thời đến các dữ liệu chung.
- Hợp tác hoàn thành tác vụ: đôi khi để đạt được một sự xử lý nhanh chóng, người ta phân chia một tác vụ thành các công việc nhỏ có thể tiến hành song song. Thường thì các công việc nhỏ này cần hợp tác với nhau để cùng hoàn thành tác vụ ban đầu, ví dụ dữ liệu kết xuất của tiến trình này lại là dữ liệu nhập cho tiến trình khác .Trong các trường hợp đó, hệ điều hành cần cung cấp cơ chế để các tiến trình có thể trao đổi thông tin với nhau.

2. Các vấn đề nảy sinh trong việc liên lạc giữa các tiến trình

Do mỗi tiến trình sỡ hữu một không gian địa chỉ riêng biệt, nên các tiến trình không thể liên lạc trực tiếp dễ dàng mà phải nhờ vào các cơ chế do hệ điều hành cung cấp. Khi cung cấp cơ chế liên lạc cho các tiến trình, hệ điều hành thường phải tìm giải pháp cho các vấn đề chính yếu sau :
Liên kết tường minh hay tiềm ẩn (explicit naming/implicit naming) : tiến trình có cần phải biết tiến trình nào đang trao đổi hay chia sẻ thông tin với nó ? Mối liên kết được gọi là tường minh khi được thiết lập rõ ràng , trực tiếp giữa các tiến trình, và là tiềm ẩn khi các tiến trình liên lạc với nhau thông qua một qui ước ngầm nào đó.
Liên lạc theo chế độ đồng bộ hay không đồng bộ (blocking / non-blocking): khi một tiến trình trao đổi thông tin với một tiến trình khác, các tiến trình có cần phải đợi cho thao tác liên lạc hoàn tất rồi mới tiếp tục các xử lý khác ? Các tiến trình liên lạc theo cơ chế đồng bộ sẽ chờ nhau hoàn tất việc liên lạc, còn các tiến trình liên lạc theo cơ chế nonblocking thì không.
Liên lạc giữa các tiến trình trong hệ thống tập trung và hệ thống phân tán: cơ chế liên lạc giữa các tiến trình trong cùng một máy tính có sự khác biệt với việc liên lạc giữa các tiến trình giữa những máy tính khác nhau?




trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:12

Re: Thảo luận Bài 5

Sự đồng bộ của luồng
nguyendinhhieu13 (113A) on 17/8/2012, 18:55

Trong khi đang làm việc với nhiều luồng, nhiều hơn một luồng có thể muốn thâm nhập cùng một biến tại cùng thời điểm. Ví dụ, một luồng có thể cố gắng đọc dữ liệu, trong khi luồng khác cố gắng thay đổi dữ liệu. Trong trường hợp này, dữ liệu có thể bị sai.

Trong những trường hợp này, bạn cần cho phép một luồng hoàn thành trọn vẹn tác vụ của nó, và rồi thì mới cho phép các luồng kế tiếp thực thi. Khi hai hoặc nhiều hơn một luồng cần thâm nhập đến một tài nguyên được chia sẻ, bạn cần chắc chắn rằng tài nguyên đó sẽ được sử dụng chỉ bởi một luồng tại một thời điểm. Tiến trình này được gọi là "sự đồng bộ", (synchronization) được sử dụng để giải quyết vấn đề này, Java là ngôn ngữ duy nhất hổ trợ sự đồng bộ ở mức ngôn ngữ. Phương thức "đồng bộ" (synchronized) báo cho hệ thống đặt khóa trên tài nguyên.

Mấu chốt của sự đồng bộ hóa là khái niệm "monitor" (giám sát), hay còn gọi "semaphore" (cờ hiệu). Một "monitor" là một đối tượng mà được khóa độc quyền. Chỉ một luồng có thể có monitor tại mỗi thời điểm. Tất cả các luồng khác cố gắng thâm nhập vào monitor sẽ bị trì hoãn, cho đến khi luồng đầu tiên thoát khỏi monitor. Các luồng khác được báo chờ đợi monitor. Một luồng có thể monitor một đối tượng nhiều lần.


VD: Trong 1 gia đình có nhiều người, chẳng hạn 1 thời điểm chủ nhà đang tiếp khách (L1), song song đó có 1 bức thư được gửi đến cho L1, nhưng vì đang tiếp khách nên L1 ko thể nhận thư, khi đó cô giúp việc (L2) sẽ nhận thư giúp L1, sau đó mang vào phòng khách cho L1, lúc này L1 vừa tiếp khách, vừa nhận biết mình nhận được thư từ người khác gửi đến.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:12

khã năng của đa luồng

Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
- Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
- Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:13

cơ bản về lập trình đa luồng


- Windows là hệ điều hành đồ họa trực quan, do dó các tài nguyên của hệ thống cung cấp rất đa dạng và phong phú. Lập trình trên Windows phải hết sức thân thiện với người dùng thông qua giao diện đồ họa sẵn có của Windows.
- Windows sử dụng các hàm trong thư viện Win32 API: Hệ điều hành Windows cung cấp hàng trăm hàm để cho những ứng dụng có thể sử dụng truy cập các tài nguyên trong hệ thống. Những hàm đó được gọi là giao diện lập trình ứng dụng API(Application Programming Interface).
- Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng: Ứng dụng Win32 xử lý theo các sự kiện(event - driven), các ứng dụng khi được viết sẽ liên tục chờ cho hệ điều hành truyền các dữ liệu nhập vào. Hệ thống sẽ đảm nhiệm truyền tất cả các dữ liệu nhập của ứng dụng vào các cửa sổ khác nhau.Mỗi cửa sổ sẽ có riêng một hàm gọi là hàm xử lý. Hệ thống sẽ gọi khi có bất cứ dữ liệu nhập vào được truyền đến cửa sổ, hàm này xử lý các dữ liệu nhập đó và trả quyền điều khiển về cho hệ thống.Hệ thống truyền các dữ liệu nhập vào thủ tục xử lý của cửa sổ thông qua một hình thức, gọi là thông điệp(message).Hệ thống sẽ phát sinh một thông điệp khi có một sự kiện nhập vào, Ví dụ như Khi người dùng nhấn một phím, di chuyển thiết bị chuột, hay kích vào các điều khiển (control) như thanh cuộn,...

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:15

Ý nghĩa của hàm Wait áp dụng cho đèn hiệu S , Ý nghĩa của hàm signal


Ý nghĩa của hàm Wait áp dụng cho đèn hiệu S :
Chờ cho đến khi giá trị của đèn hiệu S > = 1 sau đó qua được lệnh chờ này và giá trị của đèn tự động giảm đi 1.
Ý nghĩa của hàm signal : Đèn S tăng lên 1

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:15

Trình bày vấn đề và cấu trúc mã của đoạn tương tranh (Critical-Section Problem)

- Đoạn tương tranh :Xét một hệ có n tiến trình P0,P1, ...,Pn, mỗi tiến trình có một đoạn mã lệnh, nếu như trong đoạn mã này các tiến trình thao tác trên các biến chung,đọc ghi file... (tổng quát: thao tác trên dữ liệu chung) thì đoạn mã lệnh đó là đoạn tương tranh.
- Tính Loại trừ lẫn nhau hay Loại trừ tương hỗ (Mutual Exclusion) về phương diện thời gian: Khi có 1 tiến trình đang ở trong ĐTT của nó thì không có tiến trình nào khác trong nhóm cũng tại đoạn như vậy, nghĩa là: Mỗi thời điểm chỉ có 1 tiến trình được phép truy cập và/hoặc thay đổi tài nguyên chung.
- Các tiến trình tương tranh có cấu trúc mã bao gồm Entry Section (Đoạn Đăng nhập), Critical Section (Đoạn Tương tranh), Exit Section (Đoạn Đăng xuất) và các Remainder Section
đồng bộ hóa công việc của P1, P2, P3. sao cho:

a) P1 trước P2 và P3?
b) P1 và P2 trước P3?

ai hiểu rõ vấn đề này nói rõ dùm mình đc ko oa oa.........

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:16


Thực thi bài toán sản xuất và tiêu thụ được đồng bộ bằng ba đèn hiệu

HANDLE semEmpty, semFull; //hai đèn hiệu
CRITICAL_SECTION critSec;//Biến kiểu Mutex
void Producer(void * p)
{
while (1)
{
// ... Sản xuất (nextProduced)
// Chờ đến khi có chỗ trống
WaitForSingleObject(semEmpty, INFINITE);
EnterCriticalSection(&critSec);
//…Sắp sản phẩm vào Buffer
// Tăng (semFull) lên 1
ReleaseSemaphore(semFull, 1, NULL);
LeaveCriticalSection(&critSec);
SuspendThread(GetCurrentThread());
}
}
void Consumer()
{
int nextConsumed;
while (1)
{
// Chờ đến khi có sản phẩm
WaitForSingleObject(semFull, INFINITE);
EnterCriticalSection(&critSec);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// Tăng (semEmpty) lên 1
ReleaseSemaphore (semEmpty, 1, NULL);
LeaveCriticalSection(&critSec);
// ... Tiêu thụ (nextConsumed)
SuspendThread(GetCurrentThread());
}
}

- Biến semEmpty dùng để chứa mục quản của đèn hiệu quản lý số vùng trống trong bộ đệm.
- Biến semFull dùng để chứa mục quản của đèn hiệu quản lý số sản phẩm trong bộ đệm.
- CritSec là đối tượng đèn hiệu kiểu mutex dùng để bảo vệ đoạn tương tranh để đảm bảo tính loại trừ lẫn nhau trong công việc của các tiến trình với tài nguyên dùng chung.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:16

Câu 3: Trình bày khái niệm đèn hiệu và 2 ứng dụng của nó

Khái niệm đèn hiệu :

- Đèn hiệu là phương tiện đồng bộ hoá được E.W. Dijkstra đề xuất năm 1965.
- Đèn hiệu được mô tả bằng một biến kiểu nguyên với 2 tác nguyên là Wait (Chờ) và Signal (Báo hiệu):
typedef int semaphore; // Định nghĩa kiểu Đèn hiệu
wait (semaphore S)
{
while ( S <= 0 ); // Chờ bận nếu S<=0
S --; // Giảm S đi 1
}
signal (semaphore S)
{
S ++; // Tăng S lên 1
}

- Việc kiểm tra S <= 0 và giảm S (trong Wait) hoặc tăng S (trong Signal) phải được thực hiện trọn vẹn (không xảy ra ngắt trong thời gian thi hành), do đó Wait và Signal được gọi là các tác nguyên (Atomic Operations).

2 ứng dụng của đèn hiệu:

1. Giải quyết vấn đề VTT: Bằng đèn hiệu nhị phân
- Sử dụng đèn hiệu mutex với trạng thái ban đầu =1

+ Mã của tiến trình Pi bây giờ có cấu trúc:
Code:
typedef int semaphore;
semaphore mutex=1; // Binary Semaphore
while (1) // (Đèn hiệu nhị phân)
{
remainder section
wait (mutex);
critical section
signal (mutex);
remainder section
}
=> Loại trừ tính tương tranh, đảm bảo trong 1 thời điểm chỉ có 1 tiến trình ở đoạn tương tranh.

2. Đảm bảo các tiến trình làm việc đúng thứ tự

Giả sử P1 có mã S1,P2 có mã S2,cần tổ chức sao cho S2 chỉ thi hành sau S1.
+Ta dùng đèn hiệu sau:
semaphore synch = 0;
Cấu trúc P1:
S1
signal (synch) ;
Cấu trúc P2:
wait(synch);
S2

NguyenThiThuThuy (113A)

Tổng số bài gửi: 14
Join date: 17/07/2012
Age: 24



trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:17

Re: Thảo luận Bài 7

Semaphore là một cờ hiệu trong thực thi đa tuyến, nếu một tuyến cần sử dụng tài nguyên nó sẽ thông báo với semaphore.
-Khởi đầu Semaphore mang giá trị dương. Tuyến yêu cầu sử dụng tài nguyên bằng cách gọi hàm sem_wait(), semaphore sẽ kiểm tra giá trị của mình xem có >0 hay không.
-Nếu Semaphore vẫn còn >0, nó sẽ tự động làm giảm giá trị đi 1 và cho phép tuyến sử dụng tài nguyên.
-Nếu giá trị Semaphore <=0 hệ thống sẽ tạm thời dừng tuyến.
-Khi một tuyến sử dụng xong tài nguyên nó gọi hàm sem_post() để trả quyền sử dụng tài nguyên lại cho Semaphore cấp phát cho lần sử dụng khác.
Ứng dụng Semaphore:
-Bài toán nổi tiếng về tranh chấp tài nguyên dễ hiểu nhất là bài toán “sản xuất – tiêu thụ”.
-Hai tuyến chạy song song nhau. Một tuyến chịu trách nhiệm sản xuất ra sản phẩm. Một tuyến lấy sản phẩm ra để tiêu thụ.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:17


Ví dụ: Xe qua cầu yếu

Mã của tiến trình Xei có cấu trúc như sau:
CODE:
Typedef int semaphore;
Semaphore mutex = 1; //đèn hiệu nhị phân, có hai trạng thái
//0: đèn màu đỏ
//1: đèn màu xanh
While(1)
{
Đi đến cầu;
Wait(mutex); //chờ đèn xanh
Lên cầu; //đoạn tương tranh, đèn màu đỏ
Qua cầu; //đoạn tương tranh, đèn màu đỏ
Signal(mutex); //đèn chuyển sang màu xanh
Đi tiếp;
Quay về theo cầu khác;
}


Do chiếc cầu yếu nên mỗi thời điểm chỉ có 1 xe được phép qua cầu. Những xe khác khi đi đến đầu cầu sẽ ngủ tại lệnh wait(mutex) vì đèn đỏ. Sau khi một xe đã lên cầu và qua cầu xong thì lệnh signal(mutex) được thực hiện, tăng đèn mutex lên 1, đèn chuyển sang màu xanh. Một xe sau sẽ được đánh thức và lên cầu. Trong trường hợp này vùng tranh chấp là cây cầu.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:17

Re: Thảo luận Bài 7


Đoạn tương tranh là đoạn mã của tiến trình, khi thực hiện thì ảnh hưởng đến vùng tranh chấp
VD: Vùng tranh chấp là bảng đen, mỗi thời điểm có một sinh viên thao tác trên đó, sau khi sinh viên đó xong thì sinh viên khác mới tiếp tục được thao tác trên bảng.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:18

Câu 1 : Trình bày mục đích đồng bộ hóa công việc các tiến trình.Cho ví dụ minh họa?


• Đảm bảo tính nhất quán của tài nguyên dùng chung.
• Tránh được hiện tượng Deadlock (Hiện tượng kẹt tiến trình) .
ví dụ : bạn a lên bản viết một lá đơn phần họ tên ghi là nguyễn văn a và phần ký tên là lê văn b. lúc sau đó bạn b lên bảng sửa lại phần ký tên cho đúng là nguyễn văn a. lúc đó phái dưới lớp có bạn c lấy máy ảnh chụp lại cái bảng đang lúc bạn b đang sửa lại phần ký tên mới gi là nguyễn văn, dẫn đến nội dung sai lệch, không hoàn chỉnh và thiếu nhất quán. đáng lẽ bạn c phải chờ bạn b thực hiện song công việc là sửa phần ký tên là nguyễn văn a song rồi mới chụp thì nội dung mới đúng.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:18

Câu 3: Trình bày Khái niệm đèn hiệu như 1 phương tiện đồng bộ hóa công việc các tiến trình.

Khái niệm đèn hiệu
- Đèn hiệu là phương tiện đồng bộ hoá được E.W. Dijkstra đề xuất năm 1965.
- Đèn hiệu được mô tả bằng một biến kiểu nguyên với 2 tác nguyên là Wait (Chờ) và Signal (Báo hiệu):

typedef int semaphore; // Định nghĩa kiểu Đèn hiệu
wait (semaphore S)
{
while ( S <= 0 ); // Chờ bận nếu S<=0
S --; // Giảm S đi 1
}

signal (semaphore S)
{
S ++; // Tăng S lên 1
}

-Việc kiểm tra S <= 0 và giảm S (trong Wait) hoặc tăng S (trong Signal) phải được thực hiện trọn vẹn (không xảy ra ngắt trong thời gian thi hành), do đó Wait và Signal được gọi là các tác nguyên (Atomic Operations)

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  trinhquangtrong91 (113a) 14/9/2012, 22:18

Câu 2: Trình bày khái niệm đoạn tương tranh và tính loại trừ tương hỗ trong công việc của các tiến trình đồng hành song song cùng tranh chấp tài nguyên chung

- đoạn tương tranh (critical section problem) : là 1 phần trong một đoạn mã khi chạy sẽ tác động đến tài nguyên chung (ví dụ, vùng nhớ chung).
ví dụ: hai bạn a và b cùng tranh nhau lên bảng sửa bài tập của thầy cùng một lúc kết quả cả hai đều sửa sai.
- tính loại trừ lẫn nhau hay loại trừ tương hỗ(mutual exclusion): khi có một tiến trình đang ở trong đoạn tương tranh thì sẽ không có một tiến trình khác cũng ở trong đoạn tương tranh này.
ví dụ :khi bạn a lên bảng làm bài tập thì bạn b phải chờ khi đến lượt mình được lên.

trinhquangtrong91 (113a)

Tổng số bài gửi : 75
Join date : 22/07/2012
Age : 36

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 5 Empty Re: Thảo luận Bài 5

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

Trang 5 trong tổng số 9 trang Previous  1, 2, 3, 4, 5, 6, 7, 8, 9  Next

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết