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 (Đa luồng)

+70
lengocthuthao89 (i11c)
dongocthien (I11C)
PhamThiHoa-I91C
nguyenduc_gia.18(I11c)
LeMinhDuc (I11C)
HuynhVanNhut (I11C)
PhamDuyPhuong87(I11C)
tranleanhngoc88(i11c)
LeThiThuyDuong (I11C)
lamhuubinh(I91C)
BuiVanHoc(I11C)
DangMinhQuang(I11C)
ThanhThao04(I11C)
LeMInhTien(I11C)
TRANTHINHPHAT (I11C)
NguyenNgocMyTien(I11C)
DaoVanHoang (I11C)
NguyenTrongHuy(I11C)
chauchanduong (I11C)
ngocquynh2091(i11C)
08H1010052
HoangNgocQuynh(I11C)
DuongKimLong(I111C)
NguyenDoTu (I11C)
VOTHANHTRUNG(I11C)
TranMinh (I11C)
hoangdung_I91C
TranHaDucHuy (I11c)
PhamAnhKhoa(I11C)
TranVuThuyVan_(I11C)
DuongTrungTinh(I11C)
NguyThiGai (I11C)
TranHuynhDucHanh(I11C)
XuanThai_I11C
Nguyenminhduc (I11C)
NguyenDinhHop (I11C)
AnhDuong
NguyenTienPhong083 (I11C)
tranphanhieu36_i11c
DuongThiHien (I11c)
DangNgocMinh(I11C)
TrinhThiPhuongThaoI11C
NguyenThiThanhThuy(I11C)
minhgiangbc
LeTanDat (I11C)
nguyenminhlai.(I11C)
nguyenthanhphuong(I11C)
LaVanKhuong (I11C)
n.t.tuyet.trinh90 (I11C)
vohongcong(I111C)
DaoQuangSieu (I11C)
NgoLeYen48(I11C)
HoiHoangHongVu I11C
ToThiThuyTrang (I11C)
hoangquocduy.i11c
NguyenHaThanh97 (I11C)
DoThuyTien16 (I11C)
NgoDucTuan (I11C)
thanhnam06511c
VoMinhHoang (I11C)
NguyenHoangKimVu (I11C)
TruongThiThuyPhi(I11C)
PhamHuyHoang (I11C)
buithithudung24 (i11c)
nguyenthithuylinh (I11C)
NguyenThanhTam (I11C)
Tranvancanh(I11C)
NguyenXuanTri28
tranvantoan83(I11c)
Admin
74 posters

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

Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Phân biệt khái niện luồng với tiến trình & trình bày những lợi ích của công nghệ đa luồng

Bài gửi  ToThiThuyTrang (I11C) 7/10/2011, 06:31

Phân biệt khái niệm luồng với tiến trình
 Luồng: là tiến trình nhẹ (LWP - Light Weight Process), một đơn vị cơ bản sử dụng CPU. Luồng cũng có thông tin trạng thái như của tiến trình hệ thống (HWP - Heavy Weight Process).
Ví dụ: Lớp học là một tiến trình. Trong lớp sẽ có một giáo viên(đơn luồng) và các học viên (đa luồng)
 Tiến trình: là chương trình trong thời gian thực hiện (đặt dưới sự quản lý của hệ điều hành). Có sự phân biệt Tiến trình hệ thống (của Hệ điều hành) với Tiến trình người dùng.
Ví dụ: Lớp HCTH111C đang học là một tiến trình
Những ích lợi của công nghệ đ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ề).
Ví dụ: Các cô ở tổng đài 108 là các luồng. Khi khách hàng điện thoại hỏi 108, thì một trong các cô (cô thứ 1) sẽ trả lời. Nếu trong thời điểm đó khách hàng thứ hai gọi 108, thì một trong các cô (cô thứ 2) còn lại sẽ trả lời cho khách hàng.
 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.
Ví dụ: Trong nhà ta có kệ sách, tivi, xe gắn máy, ... mọi người trong nhà có thể dùng chung sách, tivi, xe máy.
 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). Ví dụ: Các bạn trong lớp là các luồng đang dùng chung một cái bảng, ai cần ghi thi ghi, ai cần thì chụp hình về xem
 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.
ToThiThuyTrang (I11C)
ToThiThuyTrang (I11C)

Tổng số bài gửi : 33
Join date : 25/08/2011
Age : 36
Đến từ : Bà Rịa-Vũng Tàu

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Ưu điểm và nhược điểm của một ứng dụng Multithreaded

Bài gửi  ToThiThuyTrang (I11C) 7/10/2011, 06:36

1- Lợi thế của một ứng dụng Multithreaded
* Cải thiện hiệu suất và đồng thời
Đối với các ứng dụng nhất định, hiệu quả và đồng thời có thể được cải thiện bằng cách sử dụng đa luồng và multicontexting với nhau. Trong các ứng dụng khác, hiệu suất có thể không bị ảnh hưởng hoặc thậm chí bị suy thoái bằng cách sử dụng đa luồng và multicontexting với nhau. Làm thế nào hiệu suất bị ảnh hưởng phụ thuộc vào ứng dụng của bạn.
* Đơn giản hóa mã hóa các cuộc gọi thủ tục từ xa và các cuộc hội thoại
Trong một số ứng dụng nó được dễ dàng hơn để mã cuộc gọi thủ tục khác nhau từ xa và các cuộc hội thoại trong chủ đề riêng biệt hơn để quản lý chúng từ cùng một thread.
* Đồng thời tiếp cận với nhiều ứng dụng
BEA Tuxedo khách hàng của bạn có thể được kết nối với nhiều ứng dụng cùng một lúc.
* Giảm số lượng máy chủ cần thiết
Bởi vì một máy chủ có thể gửi chủ đề dịch vụ nhiều, số lượng máy chủ để bắt đầu cho ứng dụng của bạn bị giảm. Khả năng này cho nhiều đề cử đặc biệt hữu ích cho các máy chủ thoại, nếu không phải được dành riêng cho một khách hàng cho toàn bộ thời gian của cuộc hội thoại.
Đối với các ứng dụng, trong đó chủ đề của khách hàng được tạo ra bởi Microsoft Internet Information Server API hoặc giao diện Netscape Enterprise Server (có nghĩa là, các NSAPI), việc sử dụng nhiều đề tài là điều cần thiết nếu bạn muốn có được những lợi ích đầy đủ khả năng bởi những công cụ này.

2- Nhược điểm của một ứng dụng Multithreaded
* Khó khăn của việc viết mã
ứng dụng Multithreaded và multicontexted không dễ dàng để viết. Chỉ lập trình viên có kinh nghiệm nên thực hiện mã hóa cho các loại ứng dụng.
• Khó khăn của gỡ rối
Đó là khó khăn hơn nhiều để tái tạo một lỗi trong ứng dụng đa luồng hoặc multicontexted hơn là để làm như vậy trong một ứng dụng đơn luồng đơn contexted,. Kết quả là, nó là khó khăn hơn, trong trường hợp trước đây, để xác định và xác minh nguyên nhân gốc rễ khi lỗi xảy ra.
• Khó khăn của việc quản lý đồng thời
Các nhiệm vụ quản lý tương tranh giữa các chủ đề rất khó khăn và có tiềm năng để giới thiệu những vấn đề mới vào ứng dụng.
• Khó khăn thử nghiệm
Kiểm tra một ứng dụng đa luồng là khó khăn hơn thử nghiệm một ứng dụng đơn luồng, vì khuyết tật này thường liên quan đến thời gian và khó khăn hơn để sinh sản.
• Khó khăn của porting mã hiện tại
Code hiện tại thường đòi hỏi quan trọng tái kiến trúc để tận dụng đa luồng. Các lập trình viên cần phải:
o Hủy bỏ các biến tĩnh
o Thay thế bất kỳ chức năng cuộc gọi mà không phải là thread-safe
o Thay thế các mã khác mà không phải là thread-safe
Bởi vì các cảng đã hoàn thành phải được kiểm tra và tái kiểm tra, công việc yêu cầu một cổng đa luồng ứng dụng là đáng kể.
ToThiThuyTrang (I11C)
ToThiThuyTrang (I11C)

Tổng số bài gửi : 33
Join date : 25/08/2011
Age : 36
Đến từ : Bà Rịa-Vũng Tàu

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  ToThiThuyTrang (I11C) 7/10/2011, 06:41

DoThuyTien16 (I11C) đã viết:Tập luồng (Thread Pools):
• 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 ch chờ cho đến khi có luồng được giải phóng.
Ví dụ:Trong mộ doanh trại quân đội sẽ có một tướng lĩnh (tiến trình cha) và sẽ có một đội binh( tập luồng).
Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh(sẵn sàng chờ công việc ).
Khi có một tên địch đột nhập, tướng lĩnh sẽ điều binh lính 1(một luồng) đi bắt tên địch( một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập ( nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng được đánh thức và đưa vào vận hành).
Su khi bắt địch xong ,binh sĩ sẽ trở về doanh trại ( luồng được trả về tập luồng).
Mình có ví dụ này bổ sung thêm:
Tối hôm qua thầy có cho ví dụ về đa luồng-công ty Phương Nam. Mình còn nhớ cái chi tiết là "nếu 5 người đăng nhập cùng lúc thì server bị treo". Theo mình nghĩ là do cùng một lúc có 5 tiến trình nên máy bị treo, sử dụng ASP như thầy nói thì chỉ có một tiến trình (với 5 người đăng nhập là 5 luồng ). Như vậy sử dụng đa luồng tiết kiệm về bộ nhớ và tài nguyên-->không dẫn đến trường hợp bị treo máy.
ToThiThuyTrang (I11C)
ToThiThuyTrang (I11C)

Tổng số bài gửi : 33
Join date : 25/08/2011
Age : 36
Đến từ : Bà Rịa-Vũng Tàu

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  HoiHoangHongVu I11C 7/10/2011, 07:19

nguyenthithuylinh (I11C) đã viết:*** Tập luồng (Thread Pools):

-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ụ:
Trong một doanh trai quân đội sẽ có một tướng lĩnh (tiến trình cha) và sẽ có một đội binh (tập luồng).
Đội binh này sẽ sẳn sàng chiến đầu khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có một tên địch đột nhập, Tướng lĩnh sẽ điều binh sĩ 1 (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành).
Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng)
Mình cũng cho 1 cái VD:
Trong công ty có 1 phòng kỹ thuật (tiến trình cha). Trong phòng kỹ thuật có các nhân viên kĩ thuật(tập luồng).
Có 1 khách hàng bị trục trặc về thiết bị của họ ( bị hư máy tính). Phòng kỹ thuật sẽ nhận được yêu cầu. và sẽ điều 1 nhân viên đi khắc phục sự cố cho khách hàng. Khắc phục xong thì nhân viên đó sẽ quay về nơi làm việc của họ và chờ sẵn sàng.

HoiHoangHongVu I11C

Tổng số bài gửi : 37
Join date : 26/08/2011
Đến từ : Biên Hòa - Đồng Nai

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Ví dụ ứng dụng công nghệ đa luồng.

Bài gửi  NgoLeYen48(I11C) 7/10/2011, 07:56

* Lập trình xử lý công việc bán vé máy bay.
* Gửi và rút tiền ở ngân hàng đều cần đến công nghệ
đa luồng.
NgoLeYen48(I11C)
NgoLeYen48(I11C)

Tổng số bài gửi : 34
Join date : 26/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Thêm 1 ví dụ về tập luồng (Thread Pools) !!!

Bài gửi  DaoQuangSieu (I11C) 7/10/2011, 08:49

DoThuyTien16 (I11C) đã viết:Tập luồng (Thread Pools):
• 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 ch chờ cho đến khi có luồng được giải phóng.
Ví dụ:Trong mộ doanh trại quân đội sẽ có một tướng lĩnh (tiến trình cha) và sẽ có một đội binh( tập luồng).
Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh(sẵn sàng chờ công việc ).
Khi có một tên địch đột nhập, tướng lĩnh sẽ điều binh lính 1(một luồng) đi bắt tên địch( một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập ( nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng được đánh thức và đưa vào vận hành).
Su khi bắt địch xong ,binh sĩ sẽ trở về doanh trại ( luồng được trả về tập luồng).
*Hầu hết các bạn đều trình bày đúng cái ví dụ mà hôm qua Thầy đã nói,mình xin đưa ra 1 ví dụ thực tiễn nữa là :
Trong một buỗi kiểm tra bài cũ thì giáo viên và những học sinh phía dưới (được gọi là 1 tập luồng) sẽ diễn ra như sau:
-Các học sinh phía dưới đã chuẩn bị bài cũ và sẵn sàng "chiến đấu",lúc này các học sinh đang trong trạng thái đợi.
-Khi các giáo viên gọi bất kỳ một học sinh nào, thì ngay tức khắc học sinh đó sẽ lên bảng trả bài hoặc làm bài tập...
-Khi các học sinh đó hoàn thành xong "công việc" của mình thì học sinh đó trở về vị trí cũ đợi tiếp và Giáo viên sẽ tiếp tục gọi học sinh tiếp theo.
*Các Luồng (học sinh) luôn trong trạng thái chờ và sẽ được đánh thức đưa vào vận hành.


Được sửa bởi DaoQuangSieu (I11C) ngày 7/10/2011, 09:42; sửa lần 1.

DaoQuangSieu (I11C)

Tổng số bài gửi : 29
Join date : 26/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Tại sao phải dùng code chung?

Bài gửi  vohongcong(I111C) 7/10/2011, 08:55

Hôm qua trên lớp thầy có hỏi 1 câu tại sao phải dùng code chung?.Có bạn trả lời rằng là dễ quản lý.Thầy nói đúng nhưng chưa chính xác lắm.và thầy nói nếu có sữa code thì thầy chỉ sửa 1 lần .Nếu sữa code riêng lẽ thì phải sữa rất nhiều.

Nhưng theo mình nói một cách dễ hiểu hơn đó chính là chạy code chung cho dễ đồng bộ.
vohongcong(I111C)
vohongcong(I111C)

Tổng số bài gửi : 32
Join date : 25/08/2011
Age : 35
Đến từ : Bến Tre

http://dmg.com.vn

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  n.t.tuyet.trinh90 (I11C) 7/10/2011, 08:58

VoMinhHoang (I11C) đã viết:- Mô hình Many – to – One là nhiều User level threads được ánh xạ vào một Kernel Thread. Việc quản lý được thực hiện ở User Level, khi có một thread bị block thì toàn bộ các Process cũng bị block theo.
- Mô hình One – to – One là mỗi User level thread được gắn với một Kernel thread. Khi có một user thread mới được tạo ra thì cũng cần tạo một Kernel thread tương ứng, lúc này chi phí quá lớn.
- Mô hình Many – to – Many nhiều User level thread được phân chia ánh xạ vào một số Kernel thread. Tránh được các khuyết điếm của 2 mô hình trên.

Bạn VoMinhHoang ơi! Bạn có thể giải thích và cho ví dụ cụ thể hơn được không? Mình không rõ các vấn đề này lắm! Thanks bạn!
n.t.tuyet.trinh90 (I11C)
n.t.tuyet.trinh90 (I11C)

Tổng số bài gửi : 24
Join date : 26/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  n.t.tuyet.trinh90 (I11C) 7/10/2011, 09:04

DoThuyTien16 (I11C) đã viết:Tập luồng (Thread Pools):
• 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 ch chờ cho đến khi có luồng được giải phóng.
Ví dụ:Trong mộ doanh trại quân đội sẽ có một tướng lĩnh (tiến trình cha) và sẽ có một đội binh( tập luồng).
Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh(sẵn sàng chờ công việc ).
Khi có một tên địch đột nhập, tướng lĩnh sẽ điều binh lính 1(một luồng) đi bắt tên địch( một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập ( nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng được đánh thức và đưa vào vận hành).
Su khi bắt địch xong ,binh sĩ sẽ trở về doanh trại ( luồng được trả về tập luồng).
thanhnam06511c đã viết:- 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 sang 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.
Ứng dụng: Tronfg 1 doanh trại quân đội sẽ có 1 tướng lĩnh ( tiến trình cha) và sẽ có 1 đội binh ( tập luồng). Đội binh này sẽ sẵn sàng chiến đấu khi có mẹnh lệnh (sẵn sàng chờ công việc). Khi có 1 tên địch đôp nhập thì tướng lĩnh sẽ điều binh sỉ (1 luồng) đi bất địch( một luồng được đánh thức và đưa vào vận hành). Trong khi đó them 1 tên địch khác đột nhập (nhận thêm 1 yêu cầu) tướng sĩ sẽ điều binh sĩ 2(1luo6ng2) đi bắt địch (một luồng khác được đánh thức và đưa vào vân hành). Sau khi bắt địch xong binh sĩ sẽ trở về doanh trại( luồng được trả về tập luồng)

Mình có ý kiến này mong các bạn không phiền. Mình thấy 2 bài này đăng lên giống nhau quá! Mình nghĩ là nếu bài nào post sau thì nên đọc lại các bài trước đó để tránh sự trùng lắp như thế. Bên cạnh đó mình cũng kiểm soát được để bổ sung thêm ý hoặc thảo luận vấn đề thêm.
n.t.tuyet.trinh90 (I11C)
n.t.tuyet.trinh90 (I11C)

Tổng số bài gửi : 24
Join date : 26/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty RE: NGUYÊN LÝ TẬP LUỒNG

Bài gửi  LaVanKhuong (I11C) 7/10/2011, 09:11

-Tập luồng(Thread pools): khi một luồng chính tạo ra tập luồng (tập luồng bao gồm nhiều luồng con sẵn sàn chờ công việc được giao )
-Khi tiến trình cha nhận được yêu cầu công việc , thì 1 luồng con trong tập được đánh thức và đưa vào vận hành .
-vận hành xong luồng con sẽ được trả về tập luồng .
-Nếu số yêu cầu lớn hơn số luồng trong tập luồng , tiến trình cha sẽ chờ đến khi có luồng được giải phóng .
Ví dụ:
Tổng đài điện thoại 108 , có nhiều nhân viên trực điện thoại là các luồng con ,cùng làm việc trong 1 văn phòng , mỗi nhân viên trực 1 điện thoại, khi không có cuộc gọi đến của khách hàng nhân viên không làm việc đang ở trạng thái ngủ , khi có cuộc gọi đến của khách hàng nhân viên trả lời cuộc gọi chính là luồng được đánh thức và đưa vào vận hành, kết thúc cuộc gọi của khách hàng , nhân viên lại được nghỉ .
Trong 1 Trung đội các chiến sĩ vận quân trang đầy đủ đang ở trạng thái ngủ(Chính là các luồng con) Tương lĩnh( la tiến trình cha), khi địch tới sẽ đánh thức 1, chiến sĩ dậy đối phó với địch,khi địch rút thì chiến sĩ đó lại tiếp tục về vị trí ngủ, nếu có địch tiếp tục tới có thể đánh thức chiến sĩ khác hoặc cũng là chiến sỉ đó.
Hay Web Phương Nam mà thầy trình bày trên lớp ví dụ web chỉ có 100 luồng truy xuất request nếu vượt quá giới hạn(101) thì phải chờ...



LaVanKhuong (I11C)

Tổng số bài gửi : 15
Join date : 26/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  nguyenthanhphuong(I11C) 7/10/2011, 09:14

n.t.tuyet.trinh90 (I11C) đã viết:
VoMinhHoang (I11C) đã viết:- Mô hình Many – to – One là nhiều User level threads được ánh xạ vào một Kernel Thread. Việc quản lý được thực hiện ở User Level, khi có một thread bị block thì toàn bộ các Process cũng bị block theo.
- Mô hình One – to – One là mỗi User level thread được gắn với một Kernel thread. Khi có một user thread mới được tạo ra thì cũng cần tạo một Kernel thread tương ứng, lúc này chi phí quá lớn.
- Mô hình Many – to – Many nhiều User level thread được phân chia ánh xạ vào một số Kernel thread. Tránh được các khuyết điếm của 2 mô hình trên.

Bạn VoMinhHoang ơi! Bạn có thể giải thích và cho ví dụ cụ thể hơn được không? Mình không rõ các vấn đề này lắm! Thanks bạn!

- Mô hình nhiều-một (Many - To - One ) ánh xạ nhiều luồng cấp người dùng tới
một luồng cấp nhân. Quản lý luồng được thực hiện trong không gian người dùng vì
thế nó hiệu quả nhưng toàn bộ quá trình sẽ bị khóa nếu một luồng thực hiện lời gọi hệ
thống khóa. Vì chỉ một luồng có thể truy xuất nhân tại một thời điểm nên nhiều luồng
không thể chạy song song trên nhiều bộ xử lý. Green threads-một thư viện luồng được
cài đặt trên các hệ điều hành không hỗ trợ luồng nhân dùng mô hình nhiều-một.

- Mô hình một-một (One - To - One) ánh xạ mỗi luồng người dùng tới một luồng
nhân. Nó cung cấp khả năng đồng hành tốt hơn mô hình nhiều-một bằng cách cho một
luồng khác chạy khi một luồng thực hiện lời gọi hệ thống nghẽn; nó cũng cho phép
nhiều luồng chạy song song trên các bộ xử lý khác nhau. Chỉ có một trở ngại trong
mô hình này là tạo luồng người dùng yêu cầu tạo một luồng nhân tương ứng. Vì chi
phí cho việc tạo luồng nhân có thể đè nặng lên năng lực thực hiện của ứng dụng, các
cài đặt cho mô hình này giới hạn số luồng được hỗ trợ bởi hệ thống. Windows NT,
Windows 2000 và OS/2 cài đặt mô hình một-một này.

- Mô hình nhiều-nhiều (Many - To - Many) đa hợp nhiều luồng cấp người dùng tới
số lượng nhỏ hơn hay bằng các luồng nhân. Số lượng các luồng nhân có thể được xác
định hoặc một ứng dụng cụ thể hay một máy cụ thể (một ứng dụng có thể được cấp
nhiều luồng nhân trên một bộ đa xử lý hơn trên một bộ đơn xử lý). Trong khi mô hình
nhiều-một cho phép người phát triển tạo nhiều luồng người dùng như họ muốn, thì
đồng hành thật sự là không đạt được vì nhân có thể lập thời biểu chỉ một luồng tại một
thời điểm. Mô hình một-một cho phép đồng hành tốt hơn nhưng người phát triển phải
cẩn thận không tạo ra quá nhiều luồng trong một ứng dụng. Mô hình nhiều-nhiều gặp
phải một trong hai vấn đề khiếm khuyết: người phát triển có thể tạo nhiều luồng
người dùng khi cần thiết và các luồng nhân tương ứng có thể chạy song song trên một
bộ đa xử lý. Khi một luồng thực hiện một lời gọi hệ thống khóa, nhân có thể lập thời
biểu một luồng khác thực thi. Solaris 2, IRIX, HP-UX, và Tru64 UNIX hỗ trợ mô
hình này.

---- Hy vọng giúp được bạn Trinh Smile

nguyenthanhphuong(I11C)

Tổng số bài gửi : 18
Join date : 30/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  nguyenthanhphuong(I11C) 7/10/2011, 09:15

Luồng người dùng và luồng nhân

- Luồng người dùng: được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng
tại cấp người dùng. Thư viện cung cấp hỗ trợ cho việc tạo luồng, lập thời biểu,
và quản lý mà không có sự hỗ trợ từ nhân. Vì nhân không biết các luồng cấp
người dùng, tất cả việc tạo luồng và lập thời biểu được thực hiện trong không
gian người dùng mà không cần sự can thiệp của nhân. Do đó, các luồng cấp
người dùng thường tạo và quản lý nhanh, tuy nhiên chúng cũng có những trở
ngại. Thí dụ, nếu nhân là đơn luồng thì bất cứ luồng cấp người dùng thực hiện
một lời gọi hệ thống nghẽn sẽ làm cho toàn bộ quá trình bị nghẽn, thậm chí
nếu các luồng khác sẳn dùng để chạy trong ứng dụng. Các thư viện luồng
người dùng gồm các luồng POSIX Pthreads, Mach C-threads và Solaris 2 UI-
threads.

- Luồng nhân: được hỗ trợ trực tiếp bởi hệ điều hành. Nhân thực hiện việc tạo
luồng, lập thời biểu, và quản lý không gian nhân. Vì quản lý luồng được thực
hiện bởi hệ điều hành, luồng nhân thường tạo và quản lý chậm hơn luồng
người dùng. Tuy nhiên, vì nhân được quản lý các luồng nếu một luồng thực
hiện lời gọi hệ thống nghẽn, nhân có thể lập thời biểu một luồng khác trong
ứng dụng thực thi. Trong môi trường đa xử lý, nhân có thể lập thời biểu luồng
trên một bộ xử lý khác. Hầu hết các hệ điều hành hiện nay như Windows NT,
Windows 2000, Solaris 2, BeOS và Tru64 UNIX (trước Digital UNIX)-hỗ trợ
các luồng nhân.

nguyenthanhphuong(I11C)

Tổng số bài gửi : 18
Join date : 30/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  nguyenthanhphuong(I11C) 7/10/2011, 09:34

Pthreads tham chiếu tới chuẩn POSIX (IEEE 1003.1c) định nghĩa API cho việc tạo và đồng bộ luồng. Đây là một đặc tả cho hành vi luồng không là một cài đặt. Người thiết kế hệ điều hành có thể cài đặt đặc tả trong cách mà họ muốn. Thông thường, các thư viện cài đặt đặc tả Pthread bị giới hạn đối với các hệ thống dựa trên cơ sở của UNIX như Solaris 2. Hệ điều hành Windows thường không hỗ trợ Pthreads mặc dù các ấn bản shareware là sẳn dùng trong phạm vi công cộng. Trong phần này chúng ta giới thiệu một số Pthread API như một thí dụ cho thư viện luồng cấp người dùng. Chúng ta sẽ xem nó như thư viện cấp người dùng vì không có mối quan hệ khác biệt giữa một luồng được tạo dùng Pthread và luồng được gắn với nhân. Chương trình C hiển thị trong hình dưới đây, mô tả một Pthread API cơ bản để xây dựng một chương trình đa luồng.

Chương trình hiển thị trong hình tạo một luồng riêng xác định tính tổng của một số nguyên không âm. Trong chương trình Pthread, các luồng riêng bắt đầu thực thi trong một hàm xác định. Trong hình, đây là một hàm runner. Khi chương trình này bắt đầu, một luồng riêng điều khiển bắt đầu trong main. Sau khi khởi tạo, main tạo ra luồng thứ hai bắt đầu điều khiển trong hàm runner. Bây giờ chúng ta sẽ cung cấp tổng quan của chương trình này chi tiết hơn. Tất cả chương trình Pthread phải chứa tập tin tiêu đề pthread.h. pthread_t tid khai báo danh biểu cho luồng sẽ được tạo. Mỗi luồng có một tập các thuộc tính gồm kích thước ngăn xếp và thông tin định thời. Khai báo pthread_attr_t attr hiện diện các thuộc tính
cho luồng. Chúng ta sẽ thiết lập các thuộc tính trong gọi hàm pthread_attr_init(&attr). Vì chúng ta không thiết lập rõ thuộc tính, chúng ta sẽ dùng thuộc tính mặc định được cung cấp. Một luồng riêng được tạo với lời gọi hàm pthread_create. Ngoài ra, để truyền định danh của luồng và các thuộc tính cho luồng, chúng ta cũng truyền tên của hàm, nơi một luồng mới sẽ bắt đầu thực thi, trong trường hợp này là hàm runner. Cuối cùng chúng ta sẽ truyền số nguyên được cung cấp tại dòng lệnh, argv[1]. Tại điểm này, chương trình có hai luồng: luồng khởi tạo trong main và luồng thực hiện việc tính tổng trong hàm runner. Sau khi tạo luồng thứ hai, luồng main sẽ chờ cho luồng runner hoàn thành bằng cách gọi hàm pthread_join. Luồng runner sẽ hoàn thành khi nó gọi hàm pthread_exit.

#include<pthread>
#include<stdio.h>
int sum: /*Dữ liệu này được chia sẻ bởi thread(s)*/
void *runner(void *param); /*luồng*/

main(int argc, char *argv[])
{
pthread_t tid; /*định danh của luồng*/
pthread_attr_t attr; /*tập hợp các thuộc tính*/
if(argc !=2){
fprintf(stderr, “usage: a.out <integer value>”);
exit();
}
if(atoi(argv[1] < 0)){
fprintf(stderr,”%d must be >= 0 \n”, atoi(argv[1]));
exit();
}
/*lấy các thuộc tính mặc định*/
pthread_attr_init(&attr);
/*tạo một luồng*/
pthread_create(&tid,&attr,runner, argv[1]);
/*bây giờ chờ luồng kết thúc*/
pthread_join(tid,NULL);
printf(“sum = %d\n”,sum);
/*Luồng sẽ bắt đầu điều khiển trong hàm này*/
void *runner(void *param)
{
int upper = atoi(param);
int i;
sum = 0;
if (upper > 0){
sum+= i;
}
pthread_exit(0);
}
}


nguyenthanhphuong(I11C)

Tổng số bài gửi : 18
Join date : 30/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Ví dụ nhỏ về Đa luồng-Multithreading C#.

Bài gửi  DaoQuangSieu (I11C) 7/10/2011, 09:52

Ví dụ này mình sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc.
Ở đây thì bạn cứ tưởng tượng ra rằng có hai thằng tên là A và B thi đếm từ 0 cho đến 100, thằng nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một thằng).


void A()
{
for(int i=0; i<=100; i++)
{
Console.WriteLine(i.ToString());
}
Console.WriteLine("A đã đọc xong"); // Báo cáo đã đọc xong
}

void B()
{
for(int i=0; i<=100; i++)
{
Console.WriteLine(i.ToString());
}
Console.WriteLine("B đã đọc xong"); // Báo cáo đã đọc xong
}
Bây giờ thầy giáo (hoặc là bạn) bỗng cao hứng gọi 2 thằng lên thi đọc --> 2 thằng A và B cùng đọc Đến đây trong phương thức hàm main() của chương trình bạn sẽ phải gọi 2 thằng này

static void main()
{
ThreadStart ts1 = new ThreadStart(A); // Chỉ định thằng A lên đọc
ThreadStart ts2 = new ThreadStart(B); // Chỉ định thằng B lên đọc

// Sẵn sàng cho cuộc đấu (thi đếm nhanh Very Happy)
Thread tA = new Thread(ts1);
Thread tB = new Thread(ts2);

// Bắt đầu bấm giờ
tA.Start();
tB.Start();
tA.Join();
tB.Join();
// Hai thằng tranh nhau đếm
Console.WriteLine("Cuộc thi kết thúc"); // Chờ đến khi 2 thằng đọc xong, không biết thằng nào sẽ thắng Very Happy
Console.ReadLine();
}
// Thư viện tham chiếu nằm trong namespace System.Threading;
// Bạn cần khai báo sử dụng nó using Sytem.Threading;

Có nhiều cách truyền tham số, tuỳ theo nhu cầu mà dùng sao cho phù hợp
Thông qua phương thức Start(object) thì bạn có thể truyền tham số theo cách này.

Ví dụ:
using System;
using System.Threading;
class ThreadSample
{
public static void Main()
{
Thread newThread = new Thread(ThreadSample.DoWork);
newThread.Start(100); // Dữ liệu truyền vào là một số nguyên

// Để Start luồng sử dụng phương thức thể hiện (instance method)
// thì trước tiên ta cần khởi tạo nó trước khi gọi

ThreadSample worker = new ThreadSample();
newThread = new Thread(worker.DoMoreWork);
newThread.Start("Truyền đối tượng cho thread thực thi");

// Nếu biết trước được đối tượng truyền vào thì ta cần ghép kiểu cho nó
// để việc sử dụng được hiệu quả hơn
}

public static void DoWork(object data)
{
Console.WriteLine("Ðây là luồng tĩnh.");
Console.WriteLine("Dữ liệu truyền vào: Data = {0}", data);
}

public void DoMoreWork(object data)
{
Console.WriteLine("Đây là luồng cần được khởi tạo");
Console.WriteLine("Dữ liệu truyền vào là: Data = {0}", data);
}

}
Đôi khi ta cũng sử dụng ThreadPool cho việc khởi chạy một luồng mới với tham số là _Param

ThreadPool.QueueUserWorkItem(new WaitCallback(_ThreadProc), _Param);

Bạn hãy tham khảo về nó tại đây: http://dotnetperls.com/threadpool

*Mong các bạn góp ý thêm.

DaoQuangSieu (I11C)

Tổng số bài gửi : 29
Join date : 26/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Bổ sung thêm ý kiếm về dùng chung code

Bài gửi  nguyenminhlai.(I11C) 7/10/2011, 10:03

vohongcong(I111C) đã viết:Hôm qua trên lớp thầy có hỏi 1 câu tại sao phải dùng code chung?.Có bạn trả lời rằng là dễ quản lý.Thầy nói đúng nhưng chưa chính xác lắm.và thầy nói nếu có sữa code thì thầy chỉ sửa 1 lần .Nếu sữa code riêng lẽ thì phải sữa rất nhiều.

Nhưng theo mình nói một cách dễ hiểu hơn đó chính là chạy code chung cho dễ đồng bộ.

khi dùng chung code thi công việc sủ lý nó đồng bộ, và khi cần nâng cấp nó sẽ dễ dàng hơn.

nguyenminhlai.(I11C)

Tổng số bài gửi : 24
Join date : 26/08/2011
Age : 35
Đến từ : Quảng Nam

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Hỏi

Bài gửi  nguyenminhlai.(I11C) 7/10/2011, 10:08

ToThiThuyTrang (I11C) đã viết:1- Lợi thế của một ứng dụng Multithreaded
* Cải thiện hiệu suất và đồng thời
Đối với các ứng dụng nhất định, hiệu quả và đồng thời có thể được cải thiện bằng cách sử dụng đa luồng và multicontexting với nhau. Trong các ứng dụng khác, hiệu suất có thể không bị ảnh hưởng hoặc thậm chí bị suy thoái bằng cách sử dụng đa luồng và multicontexting với nhau. Làm thế nào hiệu suất bị ảnh hưởng phụ thuộc vào ứng dụng của bạn.
* Đơn giản hóa mã hóa các cuộc gọi thủ tục từ xa và các cuộc hội thoại
Trong một số ứng dụng nó được dễ dàng hơn để mã cuộc gọi thủ tục khác nhau từ xa và các cuộc hội thoại trong chủ đề riêng biệt hơn để quản lý chúng từ cùng một thread.
* Đồng thời tiếp cận với nhiều ứng dụng
BEA Tuxedo khách hàng của bạn có thể được kết nối với nhiều ứng dụng cùng một lúc.
* Giảm số lượng máy chủ cần thiết
Bởi vì một máy chủ có thể gửi chủ đề dịch vụ nhiều, số lượng máy chủ để bắt đầu cho ứng dụng của bạn bị giảm. Khả năng này cho nhiều đề cử đặc biệt hữu ích cho các máy chủ thoại, nếu không phải được dành riêng cho một khách hàng cho toàn bộ thời gian của cuộc hội thoại.
Đối với các ứng dụng, trong đó chủ đề của khách hàng được tạo ra bởi Microsoft Internet Information Server API hoặc giao diện Netscape Enterprise Server (có nghĩa là, các NSAPI), việc sử dụng nhiều đề tài là điều cần thiết nếu bạn muốn có được những lợi ích đầy đủ khả năng bởi những công cụ này.

2- Nhược điểm của một ứng dụng Multithreaded
* Khó khăn của việc viết mã
ứng dụng Multithreaded và multicontexted không dễ dàng để viết. Chỉ lập trình viên có kinh nghiệm nên thực hiện mã hóa cho các loại ứng dụng.
• Khó khăn của gỡ rối
Đó là khó khăn hơn nhiều để tái tạo một lỗi trong ứng dụng đa luồng hoặc multicontexted hơn là để làm như vậy trong một ứng dụng đơn luồng đơn contexted,. Kết quả là, nó là khó khăn hơn, trong trường hợp trước đây, để xác định và xác minh nguyên nhân gốc rễ khi lỗi xảy ra.
• Khó khăn của việc quản lý đồng thời
Các nhiệm vụ quản lý tương tranh giữa các chủ đề rất khó khăn và có tiềm năng để giới thiệu những vấn đề mới vào ứng dụng.
• Khó khăn thử nghiệm
Kiểm tra một ứng dụng đa luồng là khó khăn hơn thử nghiệm một ứng dụng đơn luồng, vì khuyết tật này thường liên quan đến thời gian và khó khăn hơn để sinh sản.
• Khó khăn của porting mã hiện tại
Code hiện tại thường đòi hỏi quan trọng tái kiến trúc để tận dụng đa luồng. Các lập trình viên cần phải:
o Hủy bỏ các biến tĩnh
o Thay thế bất kỳ chức năng cuộc gọi mà không phải là thread-safe
o Thay thế các mã khác mà không phải là thread-safe
Bởi vì các cảng đã hoàn thành phải được kiểm tra và tái kiểm tra, công việc yêu cầu một cổng đa luồng ứng dụng là đáng kể.

Vậy bạn cho mình biết cụ thể là mục đích chính của ứng dụng Multithreaded dùng để làm gì, và nó ứng dụng cho việc gì ? Laughing Laughing Laughing

nguyenminhlai.(I11C)

Tổng số bài gửi : 24
Join date : 26/08/2011
Age : 35
Đến từ : Quảng Nam

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  Tranvancanh(I11C) 7/10/2011, 10:54

buithithudung24 (i11c) đã viết: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
Hôm qua trong lớp Thầy có hỏi 1 câu trong code của chương trình có 2 hàm là:
Sleep(1);
ShowBuffer();
Vậy 2 hàm trên nếu bỏ đi hàm Sleep có ảnh hưởng gì không và tại sao phải dùng hàm sleep bỏ nó đi có được không? Nếu bỏ nó đi thì hàm chạy sẽ sai, sai là do showbuffer ngày mà không ngủ trước.
1 Vd minh họa: Một người chụp hình và có 2 người đứng chờ bấm máy nếu người chụp hình chụp ngay không chờ 2 người kia hay có 1 người nữa cũng mún chụp ảnh mà chưa vào kịp thì bức ảnh sẽ bị lỡ, xấu đi. Phải chờ chuẩn bị xong hoàn toàn thì bức ảnh chụp nó mới hoàn hảo, đẹp. Nên phải có hàm Sleep để tiến trình chuẩn bị hoàn tất rồi mới thực thi mới show lên.
Hiii mình nhớ Thấy giảng như thế. thanks các bạn đã theo dõi.

Tranvancanh(I11C)

Tổng số bài gửi : 39
Join date : 16/09/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Trình bày nguyên lý tập luồng và cho ví dụ minh họa?

Bài gửi  LeTanDat (I11C) 7/10/2011, 13:08

- Tiến trình cha tạo lập sẵn một 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ụ như 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 trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng có trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
VD: Trong một doanh trại quân đội có một tướng lĩnh(tiến trình cha) và có một đội binh (tập luồng). Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh (sẵn sàng chờ công việc). Khi có một tên địch đột nhập (Nhận một yêu cầu), tướng lĩnh sẽ điều một binh sĩ (một luồng) đi bắt tên địch (một luồng được đánh thức và đưa vào vận hành). Trong khi đó, lại có thêm một tên địch khác đột nhập (nhận thêm một yêu cầu), tướng lĩnh điều binh sĩ 2 (một luồng) đi bắt địch (một luồng khác được đánh thức và đưa vào vận hành). Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng).

LeTanDat (I11C)

Tổng số bài gửi : 24
Join date : 30/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Những mô hình đa luồng

Bài gửi  LeTanDat (I11C) 7/10/2011, 13:47

- Mô hình many-to-One là nhiều user level threads được ánh xạ vào một Kernal thread. Việc quản lý được thực hiện ở user level, khi có một thread bị block thì toàn bộ các process cũng bị block theo.
- Mô hình one-to-one là mỗi user level thread được gắn với một kernal thread. Khi có một user thread mới được tạo ra thì cũng cần tạo một kernal thread tương ứng, lúc này chi phí quá lớn.
- Mô hình many-to-many nhiều user level thread được phân chia ánh xạ vào một số kernal thread. Tránh được các khuyết điểm của hai mô hình trên.

LeTanDat (I11C)

Tổng số bài gửi : 24
Join date : 30/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  minhgiangbc 7/10/2011, 14:41

Tranvancanh(I11C) đã viết:
buithithudung24 (i11c) đã viết: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
Hôm qua trong lớp Thầy có hỏi 1 câu trong code của chương trình có 2 hàm là:
Sleep(1);
ShowBuffer();
Vậy 2 hàm trên nếu bỏ đi hàm Sleep có ảnh hưởng gì không và tại sao phải dùng hàm sleep bỏ nó đi có được không? Nếu bỏ nó đi thì hàm chạy sẽ sai, sai là do showbuffer ngày mà không ngủ trước.
1 Vd minh họa: Một người chụp hình và có 2 người đứng chờ bấm máy nếu người chụp hình chụp ngay không chờ 2 người kia hay có 1 người nữa cũng mún chụp ảnh mà chưa vào kịp thì bức ảnh sẽ bị lỡ, xấu đi. Phải chờ chuẩn bị xong hoàn toàn thì bức ảnh chụp nó mới hoàn hảo, đẹp. Nên phải có hàm Sleep để tiến trình chuẩn bị hoàn tất rồi mới thực thi mới show lên.
Hiii mình nhớ Thấy giảng như thế. thanks các bạn đã theo dõi.
đây quả là 1 vd rất là dễ hiểu,thanks bạn.mà công nhận thầy của chúng ta thật giỏi khi lấy những vd lạ mà rất là thật để có thể truỳên đạt những tinh hoa kiến thức cho cho học trò của mình Shocked

minhgiangbc

Tổng số bài gửi : 24
Join date : 16/09/2011
Age : 37
Đến từ : lâm đồng

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Y nghĩa 1 vài hàm trong bài toán sx va tt

Bài gửi  minhgiangbc 7/10/2011, 15:24

Y nghĩa 1 vai ham trong bài toán
#include <stdio.h> -->khai báo
#include <conio.h>
#include <windows.h>
#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; i<BUFFER_SIZE-1; i++)
printf("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ụ
}
}


minhgiangbc

Tổng số bài gửi : 24
Join date : 16/09/2011
Age : 37
Đến từ : lâm đồng

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  minhgiangbc 7/10/2011, 15:56

DaoQuangSieu (I11C) đã viết:
DoThuyTien16 (I11C) đã viết:Tập luồng (Thread Pools):
• 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 ch chờ cho đến khi có luồng được giải phóng.
Ví dụ:Trong mộ doanh trại quân đội sẽ có một tướng lĩnh (tiến trình cha) và sẽ có một đội binh( tập luồng).
Đội binh này sẽ sẵn sàng chiến đấu khi có mệnh lệnh(sẵn sàng chờ công việc ).
Khi có một tên địch đột nhập, tướng lĩnh sẽ điều binh lính 1(một luồng) đi bắt tên địch( một luồng được đánh thức và đưa vào vận hành).
Trong khi đó, lại có thêm một tên địch khác đột nhập ( nhận thêm một yêu cầu), Tướng lĩnh sẽ điều binh sĩ 2 (một luồng) đi bắt địch (một luồng được đánh thức và đưa vào vận hành).
Su khi bắt địch xong ,binh sĩ sẽ trở về doanh trại ( luồng được trả về tập luồng).
*Hầu hết các bạn đều trình bày đúng cái ví dụ mà hôm qua Thầy đã nói,mình xin đưa ra 1 ví dụ thực tiễn nữa là :
Trong một buỗi kiểm tra bài cũ thì giáo viên và những học sinh phía dưới (được gọi là 1 tập luồng) sẽ diễn ra như sau:
-Các học sinh phía dưới đã chuẩn bị bài cũ và sẵn sàng "chiến đấu",lúc này các học sinh đang trong trạng thái đợi.
-Khi các giáo viên gọi bất kỳ một học sinh nào, thì ngay tức khắc học sinh đó sẽ lên bảng trả bài hoặc làm bài tập...
-Khi các học sinh đó hoàn thành xong "công việc" của mình thì học sinh đó trở về vị trí cũ đợi tiếp và Giáo viên sẽ tiếp tục gọi học sinh tiếp theo.
*Các Luồng (học sinh) luôn trong trạng thái chờ và sẽ được đánh thức đưa vào vận hành.
thanks bạn nhìu,những ví dụ như thế này rất bổ ích

minhgiangbc

Tổng số bài gửi : 24
Join date : 16/09/2011
Age : 37
Đến từ : lâm đồng

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Bổ sung thêm về đa luồng

Bài gửi  NguyenThiThanhThuy(I11C) 7/10/2011, 20:38

Trong những trường hợp cụ thể một ứng dụng đơn có thể được yêu cầu thực hiện nhiều tác vụ đơn. Thí dụ, một trình phục vụ web chấp nhận các yêu cầu khách hàng như trang web, hình ảnh, âm thanh, ..Một trình phục vụ web có thể có nhiều (hàng trăm) khách hàng truy xuất đồng thời nó. Nếu trình phục vụ web chạy như một quá trình đơn luồng truyền thống thì nó sẽ có thể chỉ phục vụ một khách hàng tại cùng thời điểm. Lượng thời gian mà khách hàng phải chờ yêu cầu của nó được phục vụ là rất lớn.
Một giải pháp là có một trình phục vụ chạy như một quá trình đơn chấp nhận các yêu cầu. Khi trình phục vụ nhận một yêu cầu, nó sẽ tạo một quá trình riêng để phục vụ yêu cầu đó. Thật vậy, phương pháp tạo ra quá trình này là cách sử dụng thông thường trước khi luồng trở nên phổ biến. Tạo ra quá trình có ảnh hưởng rất lớn như được trình bày ở chương trước. Nếu quá trình mới sẽ thực hiện cùng tác vụ như quá trình đã có thì tại sao lại gánh chịu tất cả chi phí đó? Thường sẽ hiệu quả hơn cho một quá trình chứa nhiều luồng phục vụ cùng một mục đích. Tiếp cận này sẽ đa luồng quá trình trình phục vụ web. Trình phục vụ sẽ tạo một luồng riêng lắng nghe các yêu cầu người dùng; khi yêu cầu được thực hiện nó không tạo ra quá trình khác mà sẽ tạo một luồng khác phục vụ yêu cầu.
Luồng cũng đóng một vai trò quan trọng trong hệ thống lời gọi thủ tục xa (remote process call-RPC). Như đã trình bày ở chương trước, RPCs cho phép giao tiếp liên quá trình bằng cách cung cấp cơ chế giao tiếp tương tự như các lời gọi hàm hay thủ tục thông thường. Điển hình, các trình phục vụ RPCs là đa luồng. Khi một trình phục vụ nhận một thông điệp, nó phục vụ thông điệp dùng một luồng riêng. Điều này cho phép phục vụ nhiều yêu cầu đồng hành.

NguyenThiThanhThuy(I11C)

Tổng số bài gửi : 10
Join date : 07/09/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  TrinhThiPhuongThaoI11C 7/10/2011, 22:13

DoThuyTien16 (I11C) đã viết:LẬP TRÌNH ĐA LUỒNG TRONG WINDOWS
- Windows là hệ điều hành đồ họa trực quan, do đó 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ể 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ụ 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…
- ví dụ: tổng đài 1080
- ví dụ: Bài toán sản xuất – Tiêu thụ có thể được thực thi bằng ứng dụng đa luồng.
Mình bổ sung ví dụ về "Tổng đài 1080"
-Tổng đài 1080, mỗi một nhân viên của tổng đài là một luồng. Khi có người gọi vào, một nhân viên được gọi ra để trả lời. Khi số người gọi vào lớn hơn số nhân viên trong tổng đài thì người gọi phải chờ cho đến khi có một nhân viên tổng đài xong việc.

TrinhThiPhuongThaoI11C

Tổng số bài gửi : 19
Join date : 29/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Trình bày khái niệm Luồng, cho vd minh họa. So sánh luồng với tiến trình.

Bài gửi  DangNgocMinh(I11C) 8/10/2011, 07:16

thanhnam06511c đã viết:- Luồng(Thread) còn gọi là tiến trình nhẹ(LWP- Light Weight Process),một đơn vị cơ bản sử dụng CPU.--_ - - Luồng cũng có thong tin trạng thái như của tiến trình truyền thống(HWP- Heavy Weight Process)
- Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
- Nhiều luồng có thể cùng chung một mã chương trình
Ví dụ :Lớp học là một tiến trình . Trong lớp sẽ có 1 giáo viên (đơn luồng) và các học viên (đa luồng)
mình có ý kiến này xin đóng góp
Khái niệ m: Một luồng là một dòng xử lý cơ bản trong hệ thống .
Mỗi luồng xử lý tuần tự đoạn code của nó, sỡ hữu một con trỏ
lệnh, tập các thanh ghi và một vùng nhớ stack riêng
Phân biệt luồng và tiến trình:
Luồng được coi là mức thấp hơn của tiến trình, mỗi tiến trình có thể
gồm nhiều luồng
Hoạt động của các luồng giống như tiến trình nhưng các luồng cùng
chia xẻ không gian địa chỉ chung, các tiến trình thì hoàn toàn độc lập
Khi máy tính có nhiêù CPU, mỗi CPU có thể thực hiện các công viêc
khác nhau hoặc các luồng khác nhau cho cùng một công viêc.
ví dụ người ca sĩ đang hát là đơn luồng khán giả ngồi xem là đa luồng ^^

DangNgocMinh(I11C)

Tổng số bài gửi : 26
Join date : 31/08/2011

Về Đầu Trang Go down

Thảo luận Bài 5 (Đa luồng) - Page 2 Empty Re: Thảo luận Bài 5 (Đa luồng)

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

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

Về Đầu Trang

- Similar topics

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