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 1 trong tổng số 9 trang
Trang 1 trong tổng số 9 trang • 1, 2, 3, 4, 5, 6, 7, 8, 9
Lợi ích của đa luồng (Thread)
-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
VD: Cô trực điện thoại ở tổng đài, nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
VD: 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.
- 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
VD: Cô trực điện thoại ở tổng đài, nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
VD: 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.
phamanhtuan95(113A)- Tổng số bài gửi : 22
Join date : 18/07/2012
Câu 1: Phân biệt khái niệm luồng với tiến trình. Và trình bày những ưu việt của công nghệ đa luồng
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 HC11TH3A đ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.
• 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 HC11TH3A đ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.
HaHoangCongTien80 (113A)- Tổng số bài gửi : 22
Join date : 17/07/2012
Câu 1: Phân biệt khái niệm luồng - tiến trình và cho biết những ưu việt của công nghệ đa luồng
- 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)
+ 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.
- Những ưu việt (í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.
+ Lập trình đa luồng dễ hơn lập trình đa tiến trình, tạo mới 1 tiến trình lâu hơn tạo mới 1 luồng, liên lạc giữa các luồng dễ hơn tiến trình.
+ Gửi nhận thông điệp nhanh hơn.
+ 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)
+ 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.
- Những ưu việt (í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.
+ Lập trình đa luồng dễ hơn lập trình đa tiến trình, tạo mới 1 tiến trình lâu hơn tạo mới 1 luồng, liên lạc giữa các luồng dễ hơn tiến trình.
+ Gửi nhận thông điệp nhanh hơn.
NguyenThiThuThuy (113A)- Tổng số bài gửi : 18
Join date : 17/07/2012
Age : 36
Bổ sung câu 1
Tính ưu việt của luồng:
- Tiết kiệm tài nguyên hơn.
- Lập trình đa luồng dễ "thở" hơn lập trình đa tiến trình
Ví dụ :
- Khi ta thêm mới hay tạo mới 1 luồng giống như trong lớp có thêm 1 bạn mới vô học.
- Còn thêm mới 1 tiến trình, tạo mới 1 tiến trình giống như mở thêm 1 lớp học ( phức tạp vì phải thông qua rất nhiều thứ: văn phòng khoa, trường, xem xét cơ sở hạ tầng có đủ đáp ứng không...)
- Tiết kiệm tài nguyên hơn.
- Lập trình đa luồng dễ "thở" hơn lập trình đa tiến trình
Ví dụ :
- Khi ta thêm mới hay tạo mới 1 luồng giống như trong lớp có thêm 1 bạn mới vô học.
- Còn thêm mới 1 tiến trình, tạo mới 1 tiến trình giống như mở thêm 1 lớp học ( phức tạp vì phải thông qua rất nhiều thứ: văn phòng khoa, trường, xem xét cơ sở hạ tầng có đủ đáp ứng không...)
Được sửa bởi LeLamThang (113A) ngày 13/8/2012, 21:47; sửa lần 1.
LeLamThang (113A)- Tổng số bài gửi : 35
Join date : 15/02/2012
Câu 3: Cơ bản về lập trình đa luồng trong windows
- 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,...
- 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,...
NguyenThiThuThuy (113A)- Tổng số bài gửi : 18
Join date : 17/07/2012
Age : 36
Trình bày nguyên lý tập luồng ( thread pools )
+ Tiến trình cha tạo lập sẵn 1 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 nhận thêm 1 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ờ cho đến khi luồng được giải phó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 nhận thêm 1 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ờ cho đến khi luồng được giải phóng.
buidainghia(113A)- Tổng số bài gửi : 43
Join date : 20/07/2012
Age : 35
Câu 2: Trình bày nguyên lý tập nguồn và cho ví dụ minh họa
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)
• 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)
NguyenNgocTrungNam (113A)- Tổng số bài gửi : 35
Join date : 16/07/2012
Các hàm quan trọng trong bài toán sản xuất tiêu thụ
mình ghi chú lại các hàm WIN32 API dùng trong bài toán sản xuất tiêu thụ mà trên lớp thầy có nhắc tới (dành cho những bạn ghi không kịp hoặc hôm nay nghĩ học)
- SuspendThread(): Tạm ngừng luồng sản xuất hiện hành đưa về trạng thái ngủ.
- GetCurrentThread(): Trả về mục quản của luồng sản xuất hiện hành.
- Sleep(): Dùng để ngủ một khoảng thời gian cho trước.
- GetTickCount(): Nhận số ms trôi qua kể từ khi Hệ Điều Hành khởi động cho tới thời điểm gọi hàm này.
//có gì các bạn bổ sung thêm.
- SuspendThread(): Tạm ngừng luồng sản xuất hiện hành đưa về trạng thái ngủ.
- GetCurrentThread(): Trả về mục quản của luồng sản xuất hiện hành.
- Sleep(): Dùng để ngủ một khoảng thời gian cho trước.
- GetTickCount(): Nhận số ms trôi qua kể từ khi Hệ Điều Hành khởi động cho tới thời điểm gọi hàm này.
//có gì các bạn bổ sung thêm.
LeLamThang (113A)- Tổng số bài gửi : 35
Join date : 15/02/2012
Re: Thảo luận Bài 5
Giải thích code Sản Xuất Tiêu Thụ Đa Luồng
#include < stdio . h >
#include < conio . h >
#include < windows . h > // lập trình đa luồng đồng hành, sử dụng được hàm win32 API
#define BUFFER_SIZE 10 // định nghĩa một buffer có số khoang chứa là 10
int buffer[BUFFER_SIZE];
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra
int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên
void Producer(){ // nhà sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây đến khi nào có chỗ trống
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthread: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}
void Consumer(){ // nhà tiêu thụ
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây cho đến khi nào trong buffer có sản phẩm
nextConsumed=buffer[out]; //sản phẩm ở vị trí out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về 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, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này ngủ trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội 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; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng tiêu thụ
// 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);// các đối số đầu ko quan tâm vì có mới chạy được
// số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //0: luồng tiêu thụ vận hành ngay, ko ngủ
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sản xuất cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}
#include < stdio . h >
#include < conio . h >
#include < windows . h > // lập trình đa luồng đồng hành, sử dụng được hàm win32 API
#define BUFFER_SIZE 10 // định nghĩa một buffer có số khoang chứa là 10
int buffer[BUFFER_SIZE];
int in=0; // biến in chứa giá trị chỉ vị trí xếp sản phẩm vào
int out=0;// biến out chứa giá trị chỉ vị trí lấy sản phẩm ra
int nextProduced=1;// biến trung gian, chứa số hiệu sản phẩm đầu tiên
void Producer(){ // nhà sản xuất
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);// khoang chứa đầy thì quẩn tại đây đến khi nào có chỗ trống
buffer[in]=nextProduced++; // cho sản phẩm vào mảng tại vị trí in
in=(in+1)%BUFFER_SIZE; //sau khi chèn sản phẩm vào mảng, tăng in lên 1, nếu in đang nằm ở vị trí cuối mảng sẽ nhảy về đầu mảng
SuspendThread(GetCurrentThread()); //getcureentthread: hàm của thư viện win32 API, trả về giá trị mục quản của luồng hiện hành, vd: 1700. SuspendThread(): ngừng luồng có mục quản là giá trị trong ngoặc, vd: SuspendThread(1700) ngừng luồng có mục quản 1700
}
}
void Consumer(){ // nhà tiêu thụ
int nextConsumed; // biến chứa sản phẩm được tiêu thụ
while (1){
while(in==out); //trong khoang chứa hết sản phẩm thì quẩn tại đây cho đến khi nào trong buffer có sản phẩm
nextConsumed=buffer[out]; //sản phẩm ở vị trí out được đưa vào biến netxconsumed
out=(out+1)%BUFFER_SIZE;//out tăng lên 1, nếu out đang nằm ở cuối mảng thì nhảy lên đầu mảng
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000); // hàm gettickcount() sẽ trả về 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, kết quả sẽ ra được con số rất lớn và chia lấy số dư cho 5000 sẽ ra được 1 con số từ 0-4999, cho luồng tiêu thụ này ngủ trong khoảng thời gian đó.
}
}
void ShowBuffer(){ // In nội 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; // lưu mục quản của 2 nhà sx vào 2 biến ProducerHandle1, ProducerHandle2
HANDLE ConsumerHandle1, ConsumerHandle2; //lưu mục quản của 2 nhà tiêu thụ
DWORD ProducerID1, ProducerID2; // mã số định danh của luồng sản xuất
DWORD ConsumerID1, ConsumerID2; // mã số định danh của luồng tiêu thụ
// 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);// các đối số đầu ko quan tâm vì có mới chạy được
// số 4 chỉ ra luồng vừa tạo sẽ không chạy mà ngủ luôn, &ProducerID1 chỉ ra luồng sẽ có mã số định danh là ProducerID1
// sau khi làm lệnh này, sẽ có 2 luồng, luồng ctrinh này và luồng producer
ProducerHandle2=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0, 4, &ProducerID2);
// Tạo 2 luồng tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0, 0, &ConsumerID1); //0: luồng tiêu thụ vận hành ngay, ko ngủ
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);
while(1){
printf("\n- Nhap P/p de san xuat, 0 de ket thuc:”);
//P đánh thức nhà sx1, p sx2
switch (getch()){//biết người sử dụng bấm gì
case 'P':
ResumeThread(ProducerHandle1); //đánh thức luồng 1
break;
case 'p':
ResumeThread(ProducerHandle2);//đánh thức luồng 2
break;
case '0':
CloseHandle(ProducerHandle1);// hủy đối tượng(ở đây là luồng) có mục quản
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// ngủ 1 ms, tức là luồng chính sẽ trễ 1 chút để sản xuất cho xong(chờ in tăng lên 1) rồi mới showbuffer ra
ShowBuffer();
}
}
Được sửa bởi NguyenThiNgocPhuong(113A) ngày 13/8/2012, 22:26; sửa lần 2.
NguyenThiNgocPhuong(113A)- Tổng số bài gửi : 34
Join date : 17/07/2012
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
• 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
Được sửa bởi PhamQuocAnh02 (113A) ngày 19/8/2012, 19:36; sửa lần 1.
PhamQuocAnh02 (113A)- Tổng số bài gửi : 27
Join date : 16/07/2012
Một số thông tin thêm về đa luồng và các trạng thái của luồng
1. Một số thông tin thêm về đa luồng
- Hỗ trợ luồng được cung cấp hoặc ở cấp người dùng, cho các luồng người dùng hoặc ở cấp nhân, cho các luồng nhân như sau:
• 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.
2. Các trạng thái của luồng
-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
-Blocked : luồng đang đợi tài nguyên để tiếp tục hoặc bị 1 sự kiện của hệ thống
chặn ngang
- Hỗ trợ luồng được cung cấp hoặc ở cấp người dùng, cho các luồng người dùng hoặc ở cấp nhân, cho các luồng nhân như sau:
• 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.
2. Các trạng thái của luồng
-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
-Blocked : luồng đang đợi tài nguyên để tiếp tục hoặc bị 1 sự kiện của hệ thống
chặn ngang
NguyenVanLam(I13A)- Tổng số bài gửi : 31
Join date : 26/07/2012
bổ sung câu 1 bài 5
lợi ích đa luồng
- khả năng đáp ứng tốt hơn
ví dụ : ta lấy que đánh vào con chó đang ngủ. nếu nó kêu chứng tỏ tính phản hồi, trả lời của nó tốt.
- chia sẻ tài nguyên dễ dàng hơn
ví dụ : chia sẻ tài nguyên trong gia đình ví dụ như xem ti vi thì dễ dàng hơn là chia sẻ với hàng xóm.
- tiết kiệm hơn
ví dụ : cha mẹ tạo thêm phòng cho anh chị lập gia đình tốt hơn là mua một căn nhà mới
- tận dụng được thế mạnh kiến trúc đa sử lý
ví dụ : một hệ thống có nhiều động cơ mạnh mẽ hơn là một hệ thống chỉ có một động cơ
- lập trình đa luồng dễ hơn lập trình đa tiến trình
vì : tạo luồng mới dễ hơn và gửi nhận thông điệp dễ hơn giữa các luồng
- khả năng đáp ứng tốt hơn
ví dụ : ta lấy que đánh vào con chó đang ngủ. nếu nó kêu chứng tỏ tính phản hồi, trả lời của nó tốt.
- chia sẻ tài nguyên dễ dàng hơn
ví dụ : chia sẻ tài nguyên trong gia đình ví dụ như xem ti vi thì dễ dàng hơn là chia sẻ với hàng xóm.
- tiết kiệm hơn
ví dụ : cha mẹ tạo thêm phòng cho anh chị lập gia đình tốt hơn là mua một căn nhà mới
- tận dụng được thế mạnh kiến trúc đa sử lý
ví dụ : một hệ thống có nhiều động cơ mạnh mẽ hơn là một hệ thống chỉ có một động cơ
- lập trình đa luồng dễ hơn lập trình đa tiến trình
vì : tạo luồng mới dễ hơn và gửi nhận thông điệp dễ hơn giữa các luồng
PhamQuocAnh02 (113A)- Tổng số bài gửi : 27
Join date : 16/07/2012
Khái niệm luồng và ví dụ minh họa
Luồng: còn được gọi là 1 tiến trình nhẹ, nằm bên trong các tiến trình lớn. Có thể nói chúng là một đơn vị nhò sử dụng cpu. Chúng có thông tin về trạng thái như một tiến trình truyền thống.
VD1: Các bạn đi trên đường một chiều thì một chiều đó chình là một luồng hay 1 tiến trình, nhưng trong luồng đó người ta phân ra các luồng nhỏ hơn đó là các làn xe ô tô, xe tải, xe máy, và đi bộ. Các làn đó được gọi là một luồng hay 1 tiến trình nhẹ.
VD2: Trong công ty các bạn có : Sếp, thư kí, kế toán, nhân viên văn phòng...... Thì công ty là một luồng lớn hay 1 tiến trình để sản xuất là một sản phẩm gì đó vd như cơ khí, còn những cá thể trong công ty sẽ là một luồng hay một tiến trình nhẹ để xử lý các công việc khác nhau
VD1: Các bạn đi trên đường một chiều thì một chiều đó chình là một luồng hay 1 tiến trình, nhưng trong luồng đó người ta phân ra các luồng nhỏ hơn đó là các làn xe ô tô, xe tải, xe máy, và đi bộ. Các làn đó được gọi là một luồng hay 1 tiến trình nhẹ.
VD2: Trong công ty các bạn có : Sếp, thư kí, kế toán, nhân viên văn phòng...... Thì công ty là một luồng lớn hay 1 tiến trình để sản xuất là một sản phẩm gì đó vd như cơ khí, còn những cá thể trong công ty sẽ là một luồng hay một tiến trình nhẹ để xử lý các công việc khác nhau
NguyenTrungTruc (113A)- Tổng số bài gửi : 15
Join date : 19/07/2012
Re: Thảo luận Bài 5
Vì sao phải dùng chung một mã chương trình cho nhiều luồng?
- Đảm bảo tính nhất quán và giảm tải bộ nhớ..
ví dụ : lơp TH3A là một tiến trình, mỗi sinh viên trong lớp là một luồng và Thầy Giáo cũng là 1 luồng..mã chương trình là thông báo về nội qui được thầy dán trước lớp.Nếu mỗi sv đều được cấp một nội quy mà không phải dán trước lớp thì khi có sự thay đổi về nội qui thì thầy phải thay đổi cho 120 sv chưa cả những sv không được cập nhật nội qui kịp thời.Điều này dẫn đến việc không đồng bộ giữa các tiến trình trong hệ thống tiến trình lớp hoc.
- Đảm bảo tính nhất quán và giảm tải bộ nhớ..
ví dụ : lơp TH3A là một tiến trình, mỗi sinh viên trong lớp là một luồng và Thầy Giáo cũng là 1 luồng..mã chương trình là thông báo về nội qui được thầy dán trước lớp.Nếu mỗi sv đều được cấp một nội quy mà không phải dán trước lớp thì khi có sự thay đổi về nội qui thì thầy phải thay đổi cho 120 sv chưa cả những sv không được cập nhật nội qui kịp thời.Điều này dẫn đến việc không đồng bộ giữa các tiến trình trong hệ thống tiến trình lớp hoc.
NguyenHuuLinh31(113A)- Tổng số bài gửi : 33
Join date : 19/07/2012
Bổ sung câu 1 bài 5
Ta nên bít Đa Luồng là gì ? rồi mới ghi lợi ích Đa Luồng ..
Đa Luồng là gì ?
Luồng - Thread: Một dòng các lệnh mà CPU phải thực thi.
Các hệ điều hành mới cho phép nhiều luồng được thực thi đồng thời. Chúng ta đã quen với việc mở nhiều ứng dụng trong một lần làm việc với máy tính.
- Một luồng là một chuỗi các lệnh nằm trong bộ nhớ (chương trình đã được nạp).
- 1 application thông thường khi thực thi là một luồng.
- Trong 1 application có thể có nhiều luồng. Thí dụ chuyển động của 10 đối tượng hiện hành trong 1 trò chơi là một luồng.
Lợi ích của đa luồng:
- Tăng hiệu suất sử dụng CPU: Phần lớn thời gian thực thi của 1 ứng dụng là chờ đợi nhập liệu từ user -> hiệu suất sử dụng CPU chưa hiệu quả.
- Tạo được sự đồng bộ giữa các đối tượng: thí dụ như trong 1 trò chơi, các nhân vật cùng nhau chuyển động.
- Quản lý được thời gian trong các ứng dụng nhu thi online, thời gian chơi một trò chơi.
Đa Luồng là gì ?
Luồng - Thread: Một dòng các lệnh mà CPU phải thực thi.
Các hệ điều hành mới cho phép nhiều luồng được thực thi đồng thời. Chúng ta đã quen với việc mở nhiều ứng dụng trong một lần làm việc với máy tính.
- Một luồng là một chuỗi các lệnh nằm trong bộ nhớ (chương trình đã được nạp).
- 1 application thông thường khi thực thi là một luồng.
- Trong 1 application có thể có nhiều luồng. Thí dụ chuyển động của 10 đối tượng hiện hành trong 1 trò chơi là một luồng.
Lợi ích của đa luồng:
- Tăng hiệu suất sử dụng CPU: Phần lớn thời gian thực thi của 1 ứng dụng là chờ đợi nhập liệu từ user -> hiệu suất sử dụng CPU chưa hiệu quả.
- Tạo được sự đồng bộ giữa các đối tượng: thí dụ như trong 1 trò chơi, các nhân vật cùng nhau chuyển động.
- Quản lý được thời gian trong các ứng dụng nhu thi online, thời gian chơi một trò chơi.
NguyenTrungTruc (113A)- Tổng số bài gửi : 15
Join date : 19/07/2012
CPU của Intel sử dụng công nghệ đa luồng
1. Pentium D
Thế hệ đầu tiên và có thể nói là có nhiều nhược điểm nhất là Pentium D.
- Cache trên thực tế được áp dụng công nghệ Share Cache của hai nhân. Nhưng thực tế lớn nhất chỉ có 2.77 MB cho 4.0 MB lý thuyết
- Sức mạnh xử lý đa luồng được nhiều người mong đợi nhưng khá thất vọng.
- Sử dụng hai nhân có xung quá cao, sự điều phối xử lý chưa được thông minh cho lắm dẫn đến khi chạy tiêu thụ điện năng quá cao làm cho CPU rất nóng. Đây là nhược điểm nhiều người phàn nàn nhất.
- Chưa được áp dụng những công nghệ mới của kiến trúc Core.
Có thể nói Pentium D mới chỉ là thử nghiệm cho thế hệ đa nhân của Intel nên chưa thực sư đáp ứng mong đợi.
Những ưu điểm nổi trội của Pentium D:
- Sức mạnh sử lý đa luồng mạnh hơn Petium 4 rất nhiều .
- Bộ đệm được trang bị lên gấp đôi trên lý thuyết và 150% trên thực tế.
Pentium D phổ biến nhất ngày nay là
D925 - 3.0 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit . Lớn nhất có Pentium D 3.4 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit.
2.Pentium Dual Core
Đây là thế hệ đa nhân ngay sau Pentium D .
Ưu điểm : Hai nhân nên xử lý đa luồng rất mạnh .
- Điều phối xử lý thông mình hơn nên có thể hạ thấp được xung nhịp của Cores xuống còn 1.6 GHz (E2140), 1.8 GHz (E2160), 2.0 GHz (E2180). Do vậy tiết kiệm điện và tỏa ít nhiệt lượng hơn, khắc phục được nhược điểm lớn nhất của Pentium D.
- Thực tế nếu được hỗ trợ thêm GPU của VGA mạnh thì Pentium Dual Core chạy rất mạnh trong các tác vụ xử lý đồ họa cao cấp.
- Sử dụng kiến trúc Intel Core mới nhất của Intel (được áp dụng trong các CPU Core 2 thế hệ sau).
Nhược điểm:
- Share Cache trên nền Lõi cũ nên chỉ tăng được L2 Cache lên 1.0 MB.
3.Core 2 Duo, Core 2 Extreme và Core 2 Quad
Có đầy đủ các ưu điểm của Pentium E. Ngoài ra còn có các cải tiến sau.
- Khả năng điều phối sử lý thông minh hơn nhiều, điều này có hai tác dụng.
Thứ nhất là tăng khả năng xử lý trên lý thuyết lên đến 40%.
Sức mạnh xử lý đa luồng cũng mạnh lên rất nhiều
- Áp dụng công nghệ Share Cache tăng gấp đôi dung lượng bộ đệm trên lý thuyết và 165% trên thực tế.
- Tiết kiệm điện năng khoảng 40% có được nhờ công nghệ chia sẻ xử lý thông minh.
Thế hệ đầu tiên và có thể nói là có nhiều nhược điểm nhất là Pentium D.
- Cache trên thực tế được áp dụng công nghệ Share Cache của hai nhân. Nhưng thực tế lớn nhất chỉ có 2.77 MB cho 4.0 MB lý thuyết
- Sức mạnh xử lý đa luồng được nhiều người mong đợi nhưng khá thất vọng.
- Sử dụng hai nhân có xung quá cao, sự điều phối xử lý chưa được thông minh cho lắm dẫn đến khi chạy tiêu thụ điện năng quá cao làm cho CPU rất nóng. Đây là nhược điểm nhiều người phàn nàn nhất.
- Chưa được áp dụng những công nghệ mới của kiến trúc Core.
Có thể nói Pentium D mới chỉ là thử nghiệm cho thế hệ đa nhân của Intel nên chưa thực sư đáp ứng mong đợi.
Những ưu điểm nổi trội của Pentium D:
- Sức mạnh sử lý đa luồng mạnh hơn Petium 4 rất nhiều .
- Bộ đệm được trang bị lên gấp đôi trên lý thuyết và 150% trên thực tế.
Pentium D phổ biến nhất ngày nay là
D925 - 3.0 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit . Lớn nhất có Pentium D 3.4 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit.
2.Pentium Dual Core
Đây là thế hệ đa nhân ngay sau Pentium D .
Ưu điểm : Hai nhân nên xử lý đa luồng rất mạnh .
- Điều phối xử lý thông mình hơn nên có thể hạ thấp được xung nhịp của Cores xuống còn 1.6 GHz (E2140), 1.8 GHz (E2160), 2.0 GHz (E2180). Do vậy tiết kiệm điện và tỏa ít nhiệt lượng hơn, khắc phục được nhược điểm lớn nhất của Pentium D.
- Thực tế nếu được hỗ trợ thêm GPU của VGA mạnh thì Pentium Dual Core chạy rất mạnh trong các tác vụ xử lý đồ họa cao cấp.
- Sử dụng kiến trúc Intel Core mới nhất của Intel (được áp dụng trong các CPU Core 2 thế hệ sau).
Nhược điểm:
- Share Cache trên nền Lõi cũ nên chỉ tăng được L2 Cache lên 1.0 MB.
3.Core 2 Duo, Core 2 Extreme và Core 2 Quad
Có đầy đủ các ưu điểm của Pentium E. Ngoài ra còn có các cải tiến sau.
- Khả năng điều phối sử lý thông minh hơn nhiều, điều này có hai tác dụng.
Thứ nhất là tăng khả năng xử lý trên lý thuyết lên đến 40%.
Sức mạnh xử lý đa luồng cũng mạnh lên rất nhiều
- Áp dụng công nghệ Share Cache tăng gấp đôi dung lượng bộ đệm trên lý thuyết và 165% trên thực tế.
- Tiết kiệm điện năng khoảng 40% có được nhờ công nghệ chia sẻ xử lý thông minh.
NguyenNgocTrungNam (113A)- Tổng số bài gửi : 35
Join date : 16/07/2012
Re: Thảo luận Bài 5
Những lợi ích 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. Nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
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.
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. Nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
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.
NguyenThiNgocPhuong(113A)- Tổng số bài gửi : 34
Join date : 17/07/2012
bổ sung thêm
- bảo đảm tính đúng đắn khi có sự thay đổi, thông tin luôn được cập nhật.NguyenHuuLinh31(113A) đã viết:Vì sao phải dùng chung một mã chương trình cho nhiều luồng?
- Đảm bảo tính nhất quán và giảm tải bộ nhớ..
ví dụ : lơp TH3A là một tiến trình, mỗi sinh viên trong lớp là một luồng và Thầy Giáo cũng là 1 luồng..mã chương trình là thông báo về nội qui được thầy dán trước lớp.Nếu mỗi sv đều được cấp một nội quy mà không phải dán trước lớp thì khi có sự thay đổi về nội qui thì thầy phải thay đổi cho 120 sv chưa cả những sv không được cập nhật nội qui kịp thời.Điều này dẫn đến việc không đồng bộ giữa các tiến trình trong hệ thống tiến trình lớp hoc.
ví dụ : cái code dán ngoài của quy định phải làm gì, khi anh công nhân vác bao gạo xếp vào phòng anh ta phải đọc được nội dung cái code này và tìm chỗ còn trống để xếp bao gạo vào nếu không có chỗ trống thì anh này phải chờ đến khi nào chống mới được xếp bao gạo vào.
khi thay đổi code thì giả dụ 100 anh công nhân chỉ có 98 anh được cung cấp code mới 2 anh còn lại vẫn dùng code cũ.
Được sửa bởi PhamQuocAnh02 (113A) ngày 19/8/2012, 19:42; sửa lần 1.
PhamQuocAnh02 (113A)- Tổng số bài gửi : 27
Join date : 16/07/2012
Re: Thảo luận Bài 5
Câu 2: trình bày nguyên lý tập luồng (thread pools) cho ví dụ minh họa
- 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ụ:
ví dụ 1: Năm 1999 thầy đi đến Mạng Phương Nam: Mạng Phương Nam là áp dụng công nghệ CGI(COMMON GATEWAY INTERFACE)(ĐA TIẾN TRÌNH) cho nhu cầu tìm kiếm việc làm qua mạng. khi đó Mạng Phương Nam gặp sự cố , khi có nhiều người gửi yêu cầu cùng một lúc thì server treo phải reset lại server cho nạp lại vì công nghệ CGI sử dụng Heavy Weight Process. khi đó thầy đưa ra phương án giải quyết cho sự cố trên là áp dụng công nghệ ASP(ACTIVE SERVER PAGES)(ĐA LUỒNG) VÀ đã giải quyết được sự cố và giúp Mạng Phương Nam nâng cao hơn về tính năng quản lý và giao diện web.
Ví dụ 2:
Trong một 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 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)
- 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ụ:
ví dụ 1: Năm 1999 thầy đi đến Mạng Phương Nam: Mạng Phương Nam là áp dụng công nghệ CGI(COMMON GATEWAY INTERFACE)(ĐA TIẾN TRÌNH) cho nhu cầu tìm kiếm việc làm qua mạng. khi đó Mạng Phương Nam gặp sự cố , khi có nhiều người gửi yêu cầu cùng một lúc thì server treo phải reset lại server cho nạp lại vì công nghệ CGI sử dụng Heavy Weight Process. khi đó thầy đưa ra phương án giải quyết cho sự cố trên là áp dụng công nghệ ASP(ACTIVE SERVER PAGES)(ĐA LUỒNG) VÀ đã giải quyết được sự cố và giúp Mạng Phương Nam nâng cao hơn về tính năng quản lý và giao diện web.
Ví dụ 2:
Trong một 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 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)
Được sửa bởi NguyenThiNgocPhuong(113A) ngày 13/8/2012, 23:17; sửa lần 1.
NguyenThiNgocPhuong(113A)- Tổng số bài gửi : 34
Join date : 17/07/2012
Thảo luận Bài 5
CODE :
#include
#include
#include
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
//nha san xuat
void Producer()
{
while(1)//vòng lặp bất tận
{
while(((in+1)% BUFFER_SIZE)==out); //Busy-Waiting vòng lặp chờ bận 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(GetcurrenThread()); //luồng hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
//GetcurrenThread()-> trả về mục quản của luồng hiện hành
}
}
//nha tieu thu
void Consumed()
{
int nextconsumed;
while(1)
{
while(in==out); //vòng lặp Busy-Waiting 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
Sleep(GetTickCount()% 5000);
//Sleep() ngủ 1 khoảng thời gian cho trước
//GetTickCount() -> nhận số milli giây 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
}
}
//ham MAIN
int main()
{
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT
DWORD ProducerID1; //chứa ID NSX
DWORD ConsumerID1; //chứa ID NTT
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:trạng thái ngủ
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 thức
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);
// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;
}
Sleep(1); //ngừng 1 khoảng thời gian nhất định trước khi ShowBuffer
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}
Kết quả hàm ShowBuffer() :
- sleep(1): trước khí show buffer luồng chính trễ đi 1 mili giây trước khi thực hiện đưa nôi dung buffer ra màn hình
- kết quả đúng:sau khi đưa sản phẩm 2 vào bộ đệm in tăng lên 1
- kết quả sai: sản phẩm 2 đã đưa vào bộ đệm mà in chưa tăng lên 1
#include
#include
#include
#define BUFFER_SIZE 10;
int buffer[BUFFER_SIZE];
int in;
int out;
int nextproduced=1;
//nha san xuat
void Producer()
{
while(1)//vòng lặp bất tận
{
while(((in+1)% BUFFER_SIZE)==out); //Busy-Waiting vòng lặp chờ bận 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(GetcurrenThread()); //luồng hiện hành được chuyển sang trạng thái ngủ cho đến khi được đánh thức
//GetcurrenThread()-> trả về mục quản của luồng hiện hành
}
}
//nha tieu thu
void Consumed()
{
int nextconsumed;
while(1)
{
while(in==out); //vòng lặp Busy-Waiting 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
Sleep(GetTickCount()% 5000);
//Sleep() ngủ 1 khoảng thời gian cho trước
//GetTickCount() -> nhận số milli giây 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
}
}
//ham MAIN
int main()
{
HANDLE ProducerHandle1; //biến Handle chứa mục quản NSX
HANDLE ConsumerHandle1; // biến Handle chứa mục quản NTT
DWORD ProducerID1; //chứa ID NSX
DWORD ConsumerID1; //chứa ID NTT
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:trạng thái ngủ
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 thức
while(1)
{
printf("\n- Nhan phim P/p de san xuat, nhan 0 de ket thuc:");
switch (getch())
{
case 'P': //nhấn phím P=Producing
ResumeThread(ProducerHandle1);
// đánh thức Producer lúc này đang ở trạng thái ngủ
break;
case 'p':
ResumeThread(ProducerHandle2); // tương tự như trên
break;
case '0': //giải phóng Producer và Consumer khỏi bộ nhớ
CloseHandle(ProducerHandle1);
CloseHandle(ConsumerHandle1);
return 0;
}
Sleep(1); //ngừng 1 khoảng thời gian nhất định trước khi ShowBuffer
ShowBuffer(); //show kết quả sau khi sản xuất tiêu thụ
}
}
Kết quả hàm ShowBuffer() :
- sleep(1): trước khí show buffer luồng chính trễ đi 1 mili giây trước khi thực hiện đưa nôi dung buffer ra màn hình
- kết quả đúng:sau khi đưa sản phẩm 2 vào bộ đệm in tăng lên 1
- kết quả sai: sản phẩm 2 đã đưa vào bộ đệm mà in chưa tăng lên 1
NguyenThiThuThuy (113A)- Tổng số bài gửi : 18
Join date : 17/07/2012
Age : 36
So sánh đa luồng với đa tiến trình
1. Giống nhau:
- Điều có thông tin trạng thái
- Luồng còn được gọi là tiến trình nhẹ.
- Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến 1 chương trình.
- Dùng chung tài nguyên từ tiến trình(hoạc luồng) cha.
- Cùng có chức năng xử lý song song.
- Chia sẻ tài nguyên cho nhau.
- Tăng tốc tính toán.
- Đảm bảo tính đơn thể.
2. Khác nhau:
- Do các luồng cùng vận hành trong cùng 1 địa chỉ vì vậy dễ dùng chung tài nguyên hơn đa tiến trình
- Do các luồ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 và ít chiếm tài nguyên hơn tiến trình.
- Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.
- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình. Bởi vì trao đổi dữ liệu của lập trình đa luồng dễ hơn việc trao dữ liệu của lập trình đa tiến trình
- Đa tiến trình tốn resources hơn đa luồng.
- Điều có thông tin trạng thái
- Luồng còn được gọi là tiến trình nhẹ.
- Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến 1 chương trình.
- Dùng chung tài nguyên từ tiến trình(hoạc luồng) cha.
- Cùng có chức năng xử lý song song.
- Chia sẻ tài nguyên cho nhau.
- Tăng tốc tính toán.
- Đảm bảo tính đơn thể.
2. Khác nhau:
- Do các luồng cùng vận hành trong cùng 1 địa chỉ vì vậy dễ dùng chung tài nguyên hơn đa tiến trình
- Do các luồ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 và ít chiếm tài nguyên hơn tiến trình.
- Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.
- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình. Bởi vì trao đổi dữ liệu của lập trình đa luồng dễ hơn việc trao dữ liệu của lập trình đa tiến trình
- Đa tiến trình tốn resources hơn đa luồng.
NguyenVanLam(I13A)- Tổng số bài gửi : 31
Join date : 26/07/2012
Các mô hình đa luồng
- 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.
- 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.
NguyenVanLam(I13A)- Tổng số bài gửi : 31
Join date : 26/07/2012
Hàm trong win32 API về đa luồng
Các hàm của Win32 API dùng để lập trình đa luồng :
- CreateThread(): Tạo một luồng để thực thi trong địa chỉ lời gọi tiến trình
- ExitThread(): Dùng để kêt thúc một luồng
- GetCurrentThread(): Có chức năng trả về mục quản tạm cho luồng hiện hành
- TerminateThread(): Có chức năng ngắt luồng
- SetThreadPriority(): Có chức năng thiết lập giá trị ưu tiên cho một luồng
- CreateThread(): Tạo một luồng để thực thi trong địa chỉ lời gọi tiến trình
- ExitThread(): Dùng để kêt thúc một luồng
- GetCurrentThread(): Có chức năng trả về mục quản tạm cho luồng hiện hành
- TerminateThread(): Có chức năng ngắt luồng
- SetThreadPriority(): Có chức năng thiết lập giá trị ưu tiên cho một luồng
NguyenThiThuThuy (113A)- Tổng số bài gửi : 18
Join date : 17/07/2012
Age : 36
Re: Thảo luận Bài 5
Câu 3: Lập trình đa luồng trong windows
• Windows sử dụng các hàm trong thư viện Win32 API.
• Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng.
• 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 (Visual C++ 6.0).
• Nhận độ ưu tiên của luồng bằng hàm: int GetThreadPriority (HANDLE threadHandle)
• Thay đổi độ ưu tiên của luồng bằng hàm:BOOL SetThreadPriority (HANDLE threadHandle, int priority)
Với độ ưu tiên priority:
THREAD_PRIORITY_LOWEST ( -2)
THREAD_PRIORITY_BELOW_NORMAL ( -1)
THREAD_PRIORITY_NORMAL ( 0 )
THREAD_PRIORITY_ABOVE_NORMAL (+1)
THREAD_PRIORITY_HIGHEST (+2)
• Có thể lập trình đa luồng với Visual Basic 6.0:
. Sản xuất – Tiêu thụ
. Animations
. Colors
//
• Windows sử dụng các hàm trong thư viện Win32 API.
• Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng.
• 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 (Visual C++ 6.0).
• Nhận độ ưu tiên của luồng bằng hàm: int GetThreadPriority (HANDLE threadHandle)
• Thay đổi độ ưu tiên của luồng bằng hàm:BOOL SetThreadPriority (HANDLE threadHandle, int priority)
Với độ ưu tiên priority:
THREAD_PRIORITY_LOWEST ( -2)
THREAD_PRIORITY_BELOW_NORMAL ( -1)
THREAD_PRIORITY_NORMAL ( 0 )
THREAD_PRIORITY_ABOVE_NORMAL (+1)
THREAD_PRIORITY_HIGHEST (+2)
• Có thể lập trình đa luồng với Visual Basic 6.0:
. Sản xuất – Tiêu thụ
. Animations
. Colors
//
lechaukhoa(113A)- Tổng số bài gửi : 23
Join date : 16/07/2012
Đến từ : Tân An-Long An
Trang 1 trong tổng số 9 trang • 1, 2, 3, 4, 5, 6, 7, 8, 9
Similar topics
» Giải giúp bài RRS này nhé
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
Trang 1 trong tổng số 9 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết