Thảo luận Bài 5
+100
NguyenTuanHai_I12A
lymydung_I12A
DiepMaiNgocYen(I12A)
tranthithanhuyen85 (I11C)
minhtam_I12C
nguyenthanhnghi_I12C
nguyenthihongtham_I12C
LeMInhTien(I11C)
DuongTrungQuan
Đỗ Phan Diễm Hương I12A
TRANTHINHPHAT (I11C)
TrinhThiPhuongThaoI12C
TRANTHUYOANH_10H1010066
nguyenthaihiep (I11C)
maidangvu_I12A
huynhtamhaoI12A
TranVanBao(I12A)
TranPhiLong (I11C)
quynhnhi.nguyen_I12A
BuiAnhNgoc(I12C)
DaoThaiHuyI12A
HUYNHMINHHAI(I12A)
VoTrongQuyet-I12A
phamphihung55
PhamDucPhuong(I12A)
nguyenthanhphongHC11TH2A
ngothihanHC11TH2A
NguyenXuanTri28
LeMinhDuc (I11C)
nguyen_tuan_phat_I12A
BuiHuongTra(I12A)
NguyenHongHaiI12C
lengocthuthao89 (i11c)
huynhvanhung(I12A)
leminhtam13(I12A)
NguyenThiHue48(I12A)
quicly_I111c
lethianhnhat_I12A
lethanhsang_I12A
phanngocthinh(i12a)
hoanghaiyen
Đinh Đông Dương
NgoXuanQuoc_(102C)
trantrungnam-HC11TH2A
Nguyen Doan Linh051(I11c)
HUYNHDUCANHI12A
levanhop.it
LeQuocKhanh-11H1010059
nguyenthipha1510
nguyenhuutho
NguyenthechinhI12A
TaThucCuongI12C
LeXuanHau (I12C)
TranThiMyKhanh(I12A)
ng_dang_khoa_HC11TH2A
TranTrungTinh(I12A)
plminhhoangI12A
LePhucHiep(102C)
thailongI12C
NguyenAnhTan15 (I12C)
NguyenDangPhongI12A
lacongchinh_I12A
NguyenHaThanh97 (I11C)
ngophicamI12A
TranTrungHienI12C
phamduyI12A
TranThiAnhDao89I12C
nguyenthingocmai_I12A
phuongnguyen
TranLeThanhVu_I12A
TranHoangNhanI12C
dangmonghai(I12A)
LeThiMaiPhuongI12A
maihuynam(I91c)
TranMinhTuan143(I12A)
vothingocthuy87(I11C)
DoanNgocDan(I12A)
hoxuanvu_I12A
letanthanh18(I12A)
HoNgocTuan142(I12A)
NguyenVanBenI12C
NguyenNgocDuy(I12A)
TranThiNgocQuynh(I12C)
tranvanthien27(I12C)
luthioanh-I12A
LeThanhTung (I11C)
NgoPhuQuoc_I12C
NguyenThiHongYen(I12A)
NguyenHoangThangI12A
hoanggiangI12C
TrinhVinhThanh (I12A)
HoNguyenQuocTuy(I12A)
PhamQuangHien_I12A
nguyenthimao_I12A
nguyenvanhonglac_0066
BuiDaiNghia-102C
DaoQuangTri38(I12A)
TruongQuocTrung_I12A
TranHuyCuong17 (I12A)
Admin
104 posters
Trang 7 trong tổng số 9 trang
Trang 7 trong tổng số 9 trang • 1, 2, 3, 4, 5, 6, 7, 8, 9
Ví dụ Lập trình đa luồng dễ hơn lập trình đa tiến trình
Ví Dụ về Đa Luồng Và Đa Tiến Trình:
Ví dụ 1:
Ví Dụ Về Đa luồng: Trong một ngôi nhà phân ra 2 luồng phòng khác nhau, có chung trần nhà, không tách biệt lập với nhau. Nhưng 2 luồng phòng này dùng chung một tài nguyên là máy điều hòa.
Ví Dụ về Đa Tiến Trình: Mỗi phòng trong nhà là 1 tiến trình, 2 phòng tách biệt nhau, 2 phòng không thể dùng chung một máy điều hòa.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình -> Một máy điều hòa chia ra nhìu luồng phòng tiết kiệm hơn là mỗi phòng 1 máy điều hòa.
Ví dụ 2:
•Ví Dụ Về Đa luồng:Trên 1 con đường có thể phân ra nhìu luồng xe khác nhau Nhưng các luồng dùng chung một tài nguyên là Mặt Đường.
•Ví Dụ về Đa Tiến Trình: Mỗi con đường là 1 tiến trính, 2 con đường riêng biệt không thể dùng chung một mặt đường.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình: -> Xây 1 con đường phân ra nhìu luồng xe chạy dễ hơn, tiết kiệm hơn là xây nhìu con đường.
Ví dụ 1:
Ví Dụ Về Đa luồng: Trong một ngôi nhà phân ra 2 luồng phòng khác nhau, có chung trần nhà, không tách biệt lập với nhau. Nhưng 2 luồng phòng này dùng chung một tài nguyên là máy điều hòa.
Ví Dụ về Đa Tiến Trình: Mỗi phòng trong nhà là 1 tiến trình, 2 phòng tách biệt nhau, 2 phòng không thể dùng chung một máy điều hòa.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình -> Một máy điều hòa chia ra nhìu luồng phòng tiết kiệm hơn là mỗi phòng 1 máy điều hòa.
Ví dụ 2:
•Ví Dụ Về Đa luồng:Trên 1 con đường có thể phân ra nhìu luồng xe khác nhau Nhưng các luồng dùng chung một tài nguyên là Mặt Đường.
•Ví Dụ về Đa Tiến Trình: Mỗi con đường là 1 tiến trính, 2 con đường riêng biệt không thể dùng chung một mặt đường.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình: -> Xây 1 con đường phân ra nhìu luồng xe chạy dễ hơn, tiết kiệm hơn là xây nhìu con đường.
PhamQuangHien_I12A- Tổng số bài gửi : 62
Join date : 22/02/2012
Age : 35
Đến từ : Quãng Ngã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.
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
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.
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
HUYNHMINHHAI(I12A)- Tổng số bài gửi : 18
Join date : 22/02/2012
Các trạng thái của luồng ( Thread States )
1-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
2-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
3-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
4-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
5-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
2-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
3-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
4-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
5-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
HUYNHMINHHAI(I12A)- Tổng số bài gửi : 18
Join date : 22/02/2012
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 mô hình 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.
HUYNHMINHHAI(I12A)- Tổng số bài gửi : 18
Join date : 22/02/2012
Một số hàm thông dụng của Thread
start bắt đầu thực thi thread
• sleep đưa trạng thái về trạng thái đợi (không thực thi nữa)
• resume thực thi lại thread từ trạng thái đợi hoặc dead-lock
• join đợi để cho đến khi thread này chết
• isAlive kiểm tra thread còn đang sống hay đã bị kill
• getName lấy tên của thread
• getPriority trả về độ ưu tiên của thread
• setName đặt tên cho thread
• setPriority đặt độ ưu tiên cho thread
• …
Ví dụ tương tự việc sử dụng thread với Runnable interface, chúng ta cũng có thể kế thừa tự lớp có sẵn là Thread như sau:
class StringThread extends Thread {
public void run() {
System.out.println("Inherit successfully from Thread class!");
}
}
public class TestClass {
public static void main(String[] args) {
StringThread t = new StringThread();
new Thread(t).start();
}
}
Kết quả in ra sẽ là: Inherit successfully from Thread class!
1.3 Các lớp Timer, TimerTask và SchedulingTask
Timer là một lớp tiện ích giúp cho việc lập lịch và kiểm soát việc thực thi một task vụ nào đó. Ví dụ bạn muốn dùng việc cập nhật thông trong 5 phút tới, hay thông tin chỉ được tồn tại 10h sau đó sẽ tự động bị xóa đi,… Một số hàm thông dụng trong Timer như:
• schedule lên lịch để thực thi task khi nào bắt đầu, kết thúc hay lặp lại, …
• cancel dừng timer và hủy tất cả các task đã lên lịch trong timer
• purge xóa tất cả các task đã dùng trong hàng đợi timer
TimerTask là một lớp trừu tượng implement Runnable interface, nó giúp cho việc lập lịch thực thi các thread
Ví dụ ta có một lớp MyTimerTask kế thừa từ TimerTask như bên dưới
class MyTimerTask extends TimerTask {
public void run() {
System.out.println("Running the scheduled task by Timer");
System.gc();
}
}
public class TestClass {
public static void main(String[] args) {
Timer timer = new Timer();
MyTimerTask task = new MyTimerTask();
timer.schedule(task, 3000, 2000);//Execute task after 3 senconds and then repeat in 2 seconds period
}
}
Kết quả in ra màn hình sau 5 giây sẽ là: Running the scheduled task by Timer
Running the scheduled task by Timer
• sleep đưa trạng thái về trạng thái đợi (không thực thi nữa)
• resume thực thi lại thread từ trạng thái đợi hoặc dead-lock
• join đợi để cho đến khi thread này chết
• isAlive kiểm tra thread còn đang sống hay đã bị kill
• getName lấy tên của thread
• getPriority trả về độ ưu tiên của thread
• setName đặt tên cho thread
• setPriority đặt độ ưu tiên cho thread
• …
Ví dụ tương tự việc sử dụng thread với Runnable interface, chúng ta cũng có thể kế thừa tự lớp có sẵn là Thread như sau:
class StringThread extends Thread {
public void run() {
System.out.println("Inherit successfully from Thread class!");
}
}
public class TestClass {
public static void main(String[] args) {
StringThread t = new StringThread();
new Thread(t).start();
}
}
Kết quả in ra sẽ là: Inherit successfully from Thread class!
1.3 Các lớp Timer, TimerTask và SchedulingTask
Timer là một lớp tiện ích giúp cho việc lập lịch và kiểm soát việc thực thi một task vụ nào đó. Ví dụ bạn muốn dùng việc cập nhật thông trong 5 phút tới, hay thông tin chỉ được tồn tại 10h sau đó sẽ tự động bị xóa đi,… Một số hàm thông dụng trong Timer như:
• schedule lên lịch để thực thi task khi nào bắt đầu, kết thúc hay lặp lại, …
• cancel dừng timer và hủy tất cả các task đã lên lịch trong timer
• purge xóa tất cả các task đã dùng trong hàng đợi timer
TimerTask là một lớp trừu tượng implement Runnable interface, nó giúp cho việc lập lịch thực thi các thread
Ví dụ ta có một lớp MyTimerTask kế thừa từ TimerTask như bên dưới
class MyTimerTask extends TimerTask {
public void run() {
System.out.println("Running the scheduled task by Timer");
System.gc();
}
}
public class TestClass {
public static void main(String[] args) {
Timer timer = new Timer();
MyTimerTask task = new MyTimerTask();
timer.schedule(task, 3000, 2000);//Execute task after 3 senconds and then repeat in 2 seconds period
}
}
Kết quả in ra màn hình sau 5 giây sẽ là: Running the scheduled task by Timer
Running the scheduled task by Timer
PhamQuangHien_I12A- Tổng số bài gửi : 62
Join date : 22/02/2012
Age : 35
Đến từ : Quãng Ngãi
Ưu điểm và nhược điểm của một ứng dụng Multithreaded (đa luồng)
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ể.
* 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ể.
một so ví dụ về đa luồng trong Java
đa luồng trong Java theo mình nghĩ là Thread.
Mục tiêu của Thread là để tạo ra nhiều tiểu trình chạy song song với nhau để thực hiện 1 số việc nào đó. Để làm vậy, cần tạo 1 lớp như sau:
1. Implement interface Runnable
2. Extends lớp Thread và overide hàm run().
ví dụ:
class Apple extends Thread {
void run() {}
}
public class test{
public void main(){
Apple a = new Apple();
a.start();
}
}
Lưu ý là: hàm run() chỉ là để chạy tiểu trình sẽ thực hiện song song, còn để gọi nó thì phải xài hàm start(). Còn ko gọi, mà gọi run() trực tiếp thì nó sẽ ko chạy song song mà nó sẽ chạy như 1 hàm bình thường, tức là chỉ có 1 tiểu trình chạy mà thôi chứ ko phải 2.
Ngoài ra, bạn cũng có thể tìm hiểu về hàm join(), sleep(), wait(), notify(), yeild() và có thể là setPriority()...
Cụ thể hơn một tí nè các bạn
join(): nếu a gọi b.join() thì khi b thực hiện xong công việc thì a mới chạy tiếp.
wait(): nếu a gọi b.wait() thì a sẽ tạm dừng và đợi cho b khi nào làm xong cái trò gì đó, gọi notify() hay notifyAll() thì a mới chạy tiếp.
notify(): cái này dùng để báo mấy thread khác đang đợi được phép chạy tiếp. Lưu ý là wait() với notify() phải ở trong một khối synchronize mới chịu chạy.
sleep(): nếu a chạy sleep() thì nó sẽ dừng lại bao nhiêu giây rồi chạy tiếp.
yeild(): nếu a gọi lệnh này, nó từ trạng thái đang chạy sẽ bị quánh bật về trạng thái sẵn sàng, dùng lệnh này để cho mấy thread khác có cơ hội chạy. Nhưng nó chỉ có tác dụng với các thread có cùng độ ưu tiên.
setPriority(): chỉ định độ ưu tiên cho một thread. thread có độ ưu tiên cao hơn sẽ được chạy và chiếm cpu nhiều hơn.
Mục tiêu của Thread là để tạo ra nhiều tiểu trình chạy song song với nhau để thực hiện 1 số việc nào đó. Để làm vậy, cần tạo 1 lớp như sau:
1. Implement interface Runnable
2. Extends lớp Thread và overide hàm run().
ví dụ:
class Apple extends Thread {
void run() {}
}
public class test{
public void main(){
Apple a = new Apple();
a.start();
}
}
Lưu ý là: hàm run() chỉ là để chạy tiểu trình sẽ thực hiện song song, còn để gọi nó thì phải xài hàm start(). Còn ko gọi, mà gọi run() trực tiếp thì nó sẽ ko chạy song song mà nó sẽ chạy như 1 hàm bình thường, tức là chỉ có 1 tiểu trình chạy mà thôi chứ ko phải 2.
Ngoài ra, bạn cũng có thể tìm hiểu về hàm join(), sleep(), wait(), notify(), yeild() và có thể là setPriority()...
Cụ thể hơn một tí nè các bạn
join(): nếu a gọi b.join() thì khi b thực hiện xong công việc thì a mới chạy tiếp.
wait(): nếu a gọi b.wait() thì a sẽ tạm dừng và đợi cho b khi nào làm xong cái trò gì đó, gọi notify() hay notifyAll() thì a mới chạy tiếp.
notify(): cái này dùng để báo mấy thread khác đang đợi được phép chạy tiếp. Lưu ý là wait() với notify() phải ở trong một khối synchronize mới chịu chạy.
sleep(): nếu a chạy sleep() thì nó sẽ dừng lại bao nhiêu giây rồi chạy tiếp.
yeild(): nếu a gọi lệnh này, nó từ trạng thái đang chạy sẽ bị quánh bật về trạng thái sẵn sàng, dùng lệnh này để cho mấy thread khác có cơ hội chạy. Nhưng nó chỉ có tác dụng với các thread có cùng độ ưu tiên.
setPriority(): chỉ định độ ưu tiên cho một thread. thread có độ ưu tiên cao hơn sẽ được chạy và chiếm cpu nhiều hơn.
BuiAnhNgoc(I12C)- Tổng số bài gửi : 6
Join date : 16/02/2012
Đa luồng trong Server_client
Một số bạn trên mạng thử viết ứng dụng Server_client nhưng găp 1 số vấn đề nan giải và đăc câu hỏi?
Làm sao để Server tiếp nhận 1 lúc được nhiều Client truy cập ? Ứng dụng của họ tự viết gặp tình trạng khi Client truy cập xong thì Server cũng tự đóng luôn ! Vậy là cách nào để chỉ khi tác động lên Server thì Server nó mới đóng ?
Theo mình nghĩ cái này mình cần dùng đa luồng.
Khi mổi mẫu tin được gửi đến server thì sẻ tiếp nhận mẫu tin đó và xử lý, như vậy là nó kết thúc công việc của hàm nhận!
Bạn cần tạo ra một tiến đoạn nhận (thread), bản chất của cái này là nó sẻ lặp vô hạn (nhưng ko bị treo chương trình đâu nhé vì nó đã mở ra một thread khác rồi), và nó sẻ ở trạng thái luôn luôn lắng nghe các mẫu tin gửi đến, nếu có mẫu tin gửi đến thì server sẻ accept, xử lý và quay trở lại trạng thái lắng nghe
Demo một đoạn code cho bạn về Thread
PHP Code:
ServerSocket Sserver;
public class MyThread extends Thread
{
public void run()
{
while(true)
{
System.out.print("Dang cho...");
Socket nhan = Sserver.accept();
//Làm gì đó
System.out.print("Da nhan");
}
}
}
chú ý Để chạy thread trên thì khai báo đối tượng của nó và gọi phương thức <object>.start();
Làm sao để Server tiếp nhận 1 lúc được nhiều Client truy cập ? Ứng dụng của họ tự viết gặp tình trạng khi Client truy cập xong thì Server cũng tự đóng luôn ! Vậy là cách nào để chỉ khi tác động lên Server thì Server nó mới đóng ?
Theo mình nghĩ cái này mình cần dùng đa luồng.
Khi mổi mẫu tin được gửi đến server thì sẻ tiếp nhận mẫu tin đó và xử lý, như vậy là nó kết thúc công việc của hàm nhận!
Bạn cần tạo ra một tiến đoạn nhận (thread), bản chất của cái này là nó sẻ lặp vô hạn (nhưng ko bị treo chương trình đâu nhé vì nó đã mở ra một thread khác rồi), và nó sẻ ở trạng thái luôn luôn lắng nghe các mẫu tin gửi đến, nếu có mẫu tin gửi đến thì server sẻ accept, xử lý và quay trở lại trạng thái lắng nghe
Demo một đoạn code cho bạn về Thread
PHP Code:
ServerSocket Sserver;
public class MyThread extends Thread
{
public void run()
{
while(true)
{
System.out.print("Dang cho...");
Socket nhan = Sserver.accept();
//Làm gì đó
System.out.print("Da nhan");
}
}
}
chú ý Để chạy thread trên thì khai báo đối tượng của nó và gọi phương thức <object>.start();
BuiAnhNgoc(I12C)- Tổng số bài gửi : 6
Join date : 16/02/2012
[Thảo luận] Ví dụ về Tập luồng (Thread Pools)
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ụ1:
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).
- Sau khi bắt địch xong ,binh sĩ sẽ trở về doanh trại ( luồng được trả về tập luồng).
Ví dụ 2:
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.
• 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ụ1:
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).
- Sau khi bắt địch xong ,binh sĩ sẽ trở về doanh trại ( luồng được trả về tập luồng).
Ví dụ 2:
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.
(Sưu tầm)
NgoXuanQuoc_(102C)- Tổng số bài gửi : 42
Join date : 17/02/2011
Age : 36
Phân biệt đa luồng và đa tiến trình
Giống nhau:
Đề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 một chu trình
Chia sẻ tài nguyên cho nhau, tăng tốc tính toán, đảm bảo tính đơn thể
Khác nhau:
Do luồng cùng vận hành trong 1 vùng địa chỉ, vì vậy dễ dùng chung tài nguyên hơn đa tiến trình ví dụ mượn đồ trong gia đình dễ mượn đồ hơn của hàng xóm
Do luồng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
Ví dụ:
Việc ngăn riêng ra một phòng trong nhà thì dễ hơn được nhà nước cấp cho một căn hộ
Cấp phát tài nguyên cho bộ nhớ thì tốn kém
Lập trình đa luồng thì dễ hơn lập trình đa tiến trình
Đề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 một chu trình
Chia sẻ tài nguyên cho nhau, tăng tốc tính toán, đảm bảo tính đơn thể
Khác nhau:
Do luồng cùng vận hành trong 1 vùng địa chỉ, vì vậy dễ dùng chung tài nguyên hơn đa tiến trình ví dụ mượn đồ trong gia đình dễ mượn đồ hơn của hàng xóm
Do luồng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
Ví dụ:
Việc ngăn riêng ra một phòng trong nhà thì dễ hơn được nhà nước cấp cho một căn hộ
Cấp phát tài nguyên cho bộ nhớ thì tốn kém
Lập trình đa luồng thì dễ hơn lập trình đa tiến trình
quynhnhi.nguyen_I12A- Tổng số bài gửi : 17
Join date : 07/03/2012
Trình bày nguyên lý tập luồng và Ví dụ minh họa
Trình bày nguyên lý tập luồng và 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)
*** 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)
TranPhiLong (I11C)- Tổng số bài gửi : 22
Join date : 26/08/2011
Khái niệm đa luồng
Khái niệm đa luồng. So sánh luồng với tiến trình (giống và khác nhau ở chỗ nào?)
* Khái niệm đa luồng: Luồng còn gọi là tiến trình nhẹ (LWP-Light Weight Process), cũng là một đơn vị cơ bản sử dụng CPU.
* So sánh:
- Tiến trình (Process) là chuơng trình trong thời gian thực hiện (đặt dưới sự quản lý của HĐH).
- 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ó thông 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
* Khái niệm đa luồng: Luồng còn gọi là tiến trình nhẹ (LWP-Light Weight Process), cũng là một đơn vị cơ bản sử dụng CPU.
* So sánh:
- Tiến trình (Process) là chuơng trình trong thời gian thực hiện (đặt dưới sự quản lý của HĐH).
- 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ó thông 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
TranPhiLong (I11C)- Tổng số bài gửi : 22
Join date : 26/08/2011
Phân biệt luồng và tiến trình
Giống nhau:
Đề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 một chu trình
Chia sẻ tài nguyên cho nhau, tăng tốc tính toán, đảm bảo tính đơn thể
Khác nhau:
- Do luồng cùng vận hành trong 1 vùng địa chỉ, vì vậy dễ dùng chung tài nguyên hơn đa tiến trình ví dụ mượn đồ trong gia đình dễ mượn đồ hơn của hàng xóm
- Do luồng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
- Tiến trình: được thực hiện tuần tự, cái nào ra cái đó(tất nhiên là hệ thống đó phải hỗ trợ nhiều tiến trình)
- Luồng: Một ứng dụng có nhiều tiến trình, mỗi tiến trình có nhiều luồng, hoạt động cùng lúc và ít tốn tài nguyên hệ thống.
Ví dụ:
Việc ngăn riêng ra một phòng trong nhà thì dễ hơn được nhà nước cấp cho một căn hộ
Cấp phát tài nguyên cho bộ nhớ thì tốn kém
Lập trình đa luồng thì dễ hơn lập trình đa tiến trình
Đề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 một chu trình
Chia sẻ tài nguyên cho nhau, tăng tốc tính toán, đảm bảo tính đơn thể
Khác nhau:
- Do luồng cùng vận hành trong 1 vùng địa chỉ, vì vậy dễ dùng chung tài nguyên hơn đa tiến trình ví dụ mượn đồ trong gia đình dễ mượn đồ hơn của hàng xóm
- Do luồng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
- Tiến trình: được thực hiện tuần tự, cái nào ra cái đó(tất nhiên là hệ thống đó phải hỗ trợ nhiều tiến trình)
- Luồng: Một ứng dụng có nhiều tiến trình, mỗi tiến trình có nhiều luồng, hoạt động cùng lúc và ít tốn tài nguyên hệ thống.
Ví dụ:
Việc ngăn riêng ra một phòng trong nhà thì dễ hơn được nhà nước cấp cho một căn hộ
Cấp phát tài nguyên cho bộ nhớ thì tốn kém
Lập trình đa luồng thì dễ hơn lập trình đa tiến trình
TranVanBao(I12A)- Tổng số bài gửi : 21
Join date : 15/02/2012
Những ích lợi của đa luồng và các mô hình đa luồng
+ Lợi ích :
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ườidù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ùngchung 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ốnké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ảnhcũ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ênhệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng
+ Mô Hình Đa Luồng :
Mô hình Many – to – One là nhiều User level threads được ánh xạ vào mộtKernel 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 Kernelthread. 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àomột số Kernel thread. Tránh được các khuyết điếm của 2 mô hình trên
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ườidù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ùngchung 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ốnké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ảnhcũ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ênhệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng
+ Mô Hình Đa Luồng :
Mô hình Many – to – One là nhiều User level threads được ánh xạ vào mộtKernel 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 Kernelthread. 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àomột số Kernel thread. Tránh được các khuyết điếm của 2 mô hình trên
huynhtamhaoI12A- Tổng số bài gửi : 24
Join date : 17/02/2012
Age : 34
Ví dụ về luồng và và đa luồng
Ví dụ về luồng và và đa luồng:
+ Nhiều gói phần mềm chạy trên các máy để bàn PC là đa luồng
* Một trình duyệt Web có thể có một luồng hiển thị hình ảnh, văn bản trong khi một luồng khác
lấy dữ liệu từ mạng
* Một trình soạn thảo văn bản có thể có một luồng hiển thị đồ họa, luồng thứ hai đọc sự bấm phím trên bàn phím từ người dùng, một luồng thứ ba thực hiện việc kiểm tra chính tả và từ vựng chạy trong chế độ nền.
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.
+ Nhiều gói phần mềm chạy trên các máy để bàn PC là đa luồng
* Một trình duyệt Web có thể có một luồng hiển thị hình ảnh, văn bản trong khi một luồng khác
lấy dữ liệu từ mạng
* Một trình soạn thảo văn bản có thể có một luồng hiển thị đồ họa, luồng thứ hai đọc sự bấm phím trên bàn phím từ người dùng, một luồng thứ ba thực hiện việc kiểm tra chính tả và từ vựng chạy trong chế độ nền.
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.
NguyenXuanTri28- Tổng số bài gửi : 39
Join date : 05/09/2011
Tóm tắt luồng và đa luồng,cách tạo luồng
*Luồng là gì?
Luồng là một dòng điều khiển trong phạm vi một quá trình. Quá trình đa luồng
gồm nhiều dòng điều khiển khác nhau trong cùng không gian địa chỉ. Những lợi điểm
của đa luồng gồm đáp ứng nhanh đối với người dùng, chia sẻ tài nguyên trong quá
trình, tính kinh tế, và khả năng thuận lợi trong kiến trúc đa xử lý.
Luồng cấp người dùng là các luồng được nhìn thấy bởi người lập trình và không
được biết bởi nhân. Thư viện luồng trong không gian người dùng điển hình quản lý
luồng cấp người dùng. Nhân của hệ điều hành hỗ trợ và quản lý các luồng cấp nhân.
Thông thường, luồng cấp người dùng nhanh hơn luồng cấp nhân trong việc tạo và
quản lý. Có ba loại mô hình khác nhau liên quan đến luồng cấp người dùng và luồng
cấp nhân. Mô hình nhiều-một ánh xạ nhiều luồng người dùng tới một luồng nhân. Mô
hình một-một ánh xạ mỗi luồng người dùng tới một luồng nhân tương ứng. Mô hình
nhiều-nhiều đa hợp nhiều luồng người dùng tới một số lượng nhỏ hơn hay bằng luồng
nhân.
Những chương trình đa luồng giới thiệu nhiều thử thách cho việc lập trình, gồm
ngữ nghĩa của lời gọi hệ thống fork và exec. Những vấn đề khác gồm huỷ bỏ luồng,
quản lý tín hiệu, và dữ liệu đặc tả luồng. Nhiều hệ điều hành hiện đại cung cấp nhân
hỗ trợ luồng như Windows NT, Windows 2000, Solaris 2 và Linux. Pthread API cung
cấp tập hợp các hàm để tạo và quản lý luồng tại cấp người dùng. Java cung cấp một
API tương tự cho việc hỗ trợ luồng. Tuy nhiên, vì các luồng Java được quản lý bởi
JVM và không phải thư viện luồng cấp người dùng hay nhân, chúng không rơi vào
loại luồng người dùng hay nhân.
*Tạo 1 luồng
Một cách để tạo một luồng rõ ràng là tạo một lớp mới được phát sinh từ lớp Thread và viết đè phương thức run của lớp Thread.
Một đối tượng của lớp phát sinh sẽ chạy như một luồng điều khiển đơn trong máy ảo
Java. Tuy nhiên, tạo một đối tượng được phát sinh từ lớp Thread không tạo một luồng
mới, trái lại phương thức start mới thật sự tạo luồng mới. Gọi phương thức start cho
đối tượng mới thực hiện hai thứ:
1) Nó cấp phát bộ nhớ và khởi tạo một luồng mới trong máy ảo Java.
2) Nó gọi phương thức run, thực hiện luồng thích hợp để được chạy bởi máy ảo
Java. (Chú ý, không thể gọi phương thức run trực tiếp, gọi phương thức start
sẽ gọi phương thức run)
Luồng là một dòng điều khiển trong phạm vi một quá trình. Quá trình đa luồng
gồm nhiều dòng điều khiển khác nhau trong cùng không gian địa chỉ. Những lợi điểm
của đa luồng gồm đáp ứng nhanh đối với người dùng, chia sẻ tài nguyên trong quá
trình, tính kinh tế, và khả năng thuận lợi trong kiến trúc đa xử lý.
Luồng cấp người dùng là các luồng được nhìn thấy bởi người lập trình và không
được biết bởi nhân. Thư viện luồng trong không gian người dùng điển hình quản lý
luồng cấp người dùng. Nhân của hệ điều hành hỗ trợ và quản lý các luồng cấp nhân.
Thông thường, luồng cấp người dùng nhanh hơn luồng cấp nhân trong việc tạo và
quản lý. Có ba loại mô hình khác nhau liên quan đến luồng cấp người dùng và luồng
cấp nhân. Mô hình nhiều-một ánh xạ nhiều luồng người dùng tới một luồng nhân. Mô
hình một-một ánh xạ mỗi luồng người dùng tới một luồng nhân tương ứng. Mô hình
nhiều-nhiều đa hợp nhiều luồng người dùng tới một số lượng nhỏ hơn hay bằng luồng
nhân.
Những chương trình đa luồng giới thiệu nhiều thử thách cho việc lập trình, gồm
ngữ nghĩa của lời gọi hệ thống fork và exec. Những vấn đề khác gồm huỷ bỏ luồng,
quản lý tín hiệu, và dữ liệu đặc tả luồng. Nhiều hệ điều hành hiện đại cung cấp nhân
hỗ trợ luồng như Windows NT, Windows 2000, Solaris 2 và Linux. Pthread API cung
cấp tập hợp các hàm để tạo và quản lý luồng tại cấp người dùng. Java cung cấp một
API tương tự cho việc hỗ trợ luồng. Tuy nhiên, vì các luồng Java được quản lý bởi
JVM và không phải thư viện luồng cấp người dùng hay nhân, chúng không rơi vào
loại luồng người dùng hay nhân.
*Tạo 1 luồng
Một cách để tạo một luồng rõ ràng là tạo một lớp mới được phát sinh từ lớp Thread và viết đè phương thức run của lớp Thread.
Một đối tượng của lớp phát sinh sẽ chạy như một luồng điều khiển đơn trong máy ảo
Java. Tuy nhiên, tạo một đối tượng được phát sinh từ lớp Thread không tạo một luồng
mới, trái lại phương thức start mới thật sự tạo luồng mới. Gọi phương thức start cho
đối tượng mới thực hiện hai thứ:
1) Nó cấp phát bộ nhớ và khởi tạo một luồng mới trong máy ảo Java.
2) Nó gọi phương thức run, thực hiện luồng thích hợp để được chạy bởi máy ảo
Java. (Chú ý, không thể gọi phương thức run trực tiếp, gọi phương thức start
sẽ gọi phương thức run)
NguyenXuanTri28- Tổng số bài gửi : 39
Join date : 05/09/2011
Những Lợi ích của Công Nghệ Đa Luồng
1. Kha nang dap ung(Responsiveness) tot hon: trong khi mot luong bi ach hoac qua ban, luong khac van van hanh binh thuong(luong chinh cua trinh duyet van tuong tac voi nguoi dung trong khi du lieu duoc lay ve).
2.Chia se tai nguyen(Resource Sharing): theo mac dinh,cac luong co the dung chung bo nho va tai nguyen cua luong cha. Vai luong cung van hanh trong 1 vung dia chi,do do de dung chung tai nguyen hon so voi truong hop da tien trinh.
3.Tiet kiem(Economy): cap phat bo nho va tai nguyen cho tien trinh la cong viec ton kem. Do luong chung tai nguyen voi cha va cac luong khac, viec tao lap va chuyen ngu canh cung nhanh hon(Solaris 2: tao tien trinh cham hon 30 lan,chuyen ngu canh cham hon 5 lan).
4. Tan dung duoc the manh cua kien truc da xu ly: da luong lam tanh tinh song song tren he may nhieu CPU. Moi luong co the chay boi CPU rieng.
5. Lap trinh da luong de hon lap trinh da tien trinh.
2.Chia se tai nguyen(Resource Sharing): theo mac dinh,cac luong co the dung chung bo nho va tai nguyen cua luong cha. Vai luong cung van hanh trong 1 vung dia chi,do do de dung chung tai nguyen hon so voi truong hop da tien trinh.
3.Tiet kiem(Economy): cap phat bo nho va tai nguyen cho tien trinh la cong viec ton kem. Do luong chung tai nguyen voi cha va cac luong khac, viec tao lap va chuyen ngu canh cung nhanh hon(Solaris 2: tao tien trinh cham hon 30 lan,chuyen ngu canh cham hon 5 lan).
4. Tan dung duoc the manh cua kien truc da xu ly: da luong lam tanh tinh song song tren he may nhieu CPU. Moi luong co the chay boi CPU rieng.
5. Lap trinh da luong de hon lap trinh da tien trinh.
NguyenXuanTri28- Tổng số bài gửi : 39
Join date : 05/09/2011
Đa luồng, các trạng thái và mô hình
Đ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.
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
Các trạng thái của luồng ( Thread States )
1-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
2-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
3-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
4-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
5-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
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 mô hình 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.
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.
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
Các trạng thái của luồng ( Thread States )
1-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
2-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
3-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
4-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
5-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
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 mô hình 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.
TranVanBao(I12A)- Tổng số bài gửi : 21
Join date : 15/02/2012
THỰC THI VẤN ĐỀ “SẢN XUẤT – TIÊU THỤ”
#include
#include
#include
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
void Producer(){
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE;
SuspendThread(GetCurrentThread());//luồng sx hiện hành được trả về mục quản hiện hành chuyển sang trạng thái ngủ cho đến khi đc đánh thức
}
}
void Consumer(){
int nextConsumed;
while (1){
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000);//nhận số ms kể từ khi HĐH khởi động cho đến thời điểm gọi hàm này.Cụ thể ở đây là ngủ ko quá 5s
}
}
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; 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;
HANDLE ConsumerHandle1, ConsumerHandle2;
DWORD ProducerID1, ProducerID2; // mỗi luồng đc cấp 1 ID
DWORD ConsumerID1, ConsumerID2;// mỗi luồng đc cấp 1 ID
// 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);//luồng tạo ra ko hoạt động mà ngủ ngay và đc cấp cho mục quản là ID1
ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,
0, 4, &ProducerID2);//luồng tạo ra ko hoạt động mà ngủ ngay và đc cấp cho mục quản là ID2
// Tạo 2 luồng Tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID1);//luồng tạo ra và chạy ngay và đc cấp cho mục quản là ID1
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);//luồng tạo ra và chạy ngay và đc cấp cho mục quản là ID2
while(1){ //liên tục đưa ra câu thông báo để lựa chọn
printf("\n- Nhấn P/p để sản xuất, 0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1);
break;
case 'p':
ResumeThread(ProducerHandle2);
break;
case '0':
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// để luồng chính trễ đi 1 ms trước khi hiện bộ đệm ra màn hình
ShowBuffer();//hiện nội dung bộ đệm ra màn hình
}
}
#include
#include
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in=0;
int out=0;
int nextProduced=1;
void Producer(){
while (1){
// ... Sản xuất (nextProduced)
while(((in+1)%BUFFER_SIZE)==out);
buffer[in]=nextProduced++;
in=(in+1)%BUFFER_SIZE;
SuspendThread(GetCurrentThread());//luồng sx hiện hành được trả về mục quản hiện hành chuyển sang trạng thái ngủ cho đến khi đc đánh thức
}
}
void Consumer(){
int nextConsumed;
while (1){
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
// ... Tiêu thụ (nextConsumed)
Sleep(GetTickCount()%5000);//nhận số ms kể từ khi HĐH khởi động cho đến thời điểm gọi hàm này.Cụ thể ở đây là ngủ ko quá 5s
}
}
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; 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;
HANDLE ConsumerHandle1, ConsumerHandle2;
DWORD ProducerID1, ProducerID2; // mỗi luồng đc cấp 1 ID
DWORD ConsumerID1, ConsumerID2;// mỗi luồng đc cấp 1 ID
// 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);//luồng tạo ra ko hoạt động mà ngủ ngay và đc cấp cho mục quản là ID1
ProducerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Producer,
0, 4, &ProducerID2);//luồng tạo ra ko hoạt động mà ngủ ngay và đc cấp cho mục quản là ID2
// Tạo 2 luồng Tiêu thụ thi hành ngay
ConsumerHandle1=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID1);//luồng tạo ra và chạy ngay và đc cấp cho mục quản là ID1
ConsumerHandle2=CreateThread(0,0,
(LPTHREAD_START_ROUTINE)Consumer,
0, 0, &ConsumerID2);//luồng tạo ra và chạy ngay và đc cấp cho mục quản là ID2
while(1){ //liên tục đưa ra câu thông báo để lựa chọn
printf("\n- Nhấn P/p để sản xuất, 0 để kết thúc:”);
switch (getch()){
case 'P':
ResumeThread(ProducerHandle1);
break;
case 'p':
ResumeThread(ProducerHandle2);
break;
case '0':
CloseHandle(ProducerHandle1);
CloseHandle(ProducerHandle2);
CloseHandle(ConsumerHandle1);
CloseHandle(ConsumerHandle2);
return 0;
}
Sleep(1);// để luồng chính trễ đi 1 ms trước khi hiện bộ đệm ra màn hình
ShowBuffer();//hiện nội dung bộ đệm ra màn hình
}
}
DaoQuangTri38(I12A)- Tổng số bài gửi : 26
Join date : 22/02/2012
Bài Tập 1 (Về đa luồng)
Lập trình bằng Visual C++ 6.0, để tạo tập luồng gồm 30 luồng sản xuất và 30 luồng tiêu thụ
- Code:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
int count_Producer;
int count_Consumer;
void Producer() //Luồng phụ sản xuất
{
while(1)
{
count_Producer++;
Sleep(1000); //Nghỉ 1000ms = 1 giây
}
}
void Consumer() //Luồng phụ tiêu thụ
{
while(1)
{
count_Consumer++;
Sleep(1000); //Nghỉ 1000ms = 1 giây
}
}
void main()
{
HANDLE ProducerHandle[30]; //Mảng gồm 30 phần tử chứa mục quản của các luồng sản xuất
HANDLE ConsumerHandle[30]; //Mảng gồm 30 phần tử chứa mục quản của các luồng tiêu thụ
DWORD ProducerID[30]; //Mảng gồm 30 phần tử chứa ID của các luồng sản xuất
DWORD ConsumerID[30]; //Mảng gồm 30 phần tử chứa ID của các luồng tiêu thụ
count_Producer=0;
count_Consumer=0;
//Vòng lặp để tạo tuần tự các luồng sản xuất và các luồng tiêu thụ
for(int i=0;i<30;i++)
{
//Tạo luồng Sản xuất thứ i trong trạng thái ngủ
ProducerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID[i]);
//Tạo luồng Tiêu thụ thứ i trong trạng thái ngủ
ConsumerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,4,&ConsumerID[i]);
}
}
Được sửa bởi maidangvu_I12A ngày 5/4/2012, 02:02; sửa lần 1.
maidangvu_I12A- Tổng số bài gửi : 28
Join date : 28/02/2012
Bài Tập 2 (Về đa luồng)
Đánh thức để đưa vào vận hành các luồng sản xuất và các luồng tiêu thụ đã tạo
- Code:
for(int j=0;j<30;j++)
{
ResumeThread(ProducerHandle[j]); //Đánh thức luồng sản xuất thứ j
ResumeThread(ConsumerHandle[j]); //Đánh thức luồng tiêu thụ thứ j
}
maidangvu_I12A- Tổng số bài gửi : 28
Join date : 28/02/2012
Bài Tập 3 (Về đa luồng)
Tạm ngưng các luồng sản xuất và tiêu thụ
- Code:
for(int k=0;k<30; k++)
{
SuspendThread(ProducerHandle[k]); //Đưa luồng sản xuất thứ k về trạng thái ngủ
SuspendThread(ConsumerHandle[k]); //Đưa luồng tiêu thụ thứ k về trạng thái ngủ
}
maidangvu_I12A- Tổng số bài gửi : 28
Join date : 28/02/2012
Tổng hợp code của 3 bài tập về đa luồng
- Code:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define MAX 30 //Định nghĩa số lượng của các luồng sản xuất và tiêu thụ
int count_Producer;
int count_Consumer;
void Producer() //Luồng phụ sản xuất
{
while(1)
{
count_Producer++;
Sleep(1000); //Nghỉ 1000ms = 1 giây
}
}
void Consumer() //Luồng phụ tiêu thụ
{
while(1)
{
count_Consumer++;
Sleep(1000); //Nghỉ 1000ms = 1 giây
}
}
void main()
{
HANDLE ProducerHandle[MAX]; //Mảng gồm 30 phần tử chứa mục quản của các luồng sản xuất
HANDLE ConsumerHandle[MAX]; //Mảng gồm 30 phần tử chứa mục quản của các luồng tiêu thụ
DWORD ProducerID[MAX]; //Mảng gồm 30 phần tử chứa ID của các luồng sản xuất
DWORD ConsumerID[MAX]; //Mảng gồm 30 phần tử chứa ID của các luồng tiêu thụ
count_Producer=0;
count_Consumer=0;
//Vòng lặp để tạo tuần tự các luồng sản xuất và các luồng tiêu thụ
for(int i=0;i<MAX;i++)
{
//Tạo luồng Sản xuất thứ i trong trạng thái ngủ
ProducerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer,0,4,&ProducerID[i]);
//Tạo luồng Tiêu thụ thứ i trong trạng thái ngủ
ConsumerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer,0,4,&ConsumerID[i]);
}
//Đánh thức để đưa vào vận hành các luồng sản xuất và các luồng tiêu thụ đã tạo
for(int j=0;j<MAX;j++)
{
ResumeThread(ProducerHandle[j]); //Đánh thức luồng sản xuất thứ j
ResumeThread(ConsumerHandle[j]); //Đánh thức luồng tiêu thụ thứ j
}
//Đưa các luồng sản xuất và các luồng tiêu thụ về trạng thái ngủ
for(int k=0;k<MAX; k++)
{
SuspendThread(ProducerHandle[k]);
SuspendThread(ConsumerHandle[k]);
}
}
maidangvu_I12A- Tổng số bài gửi : 28
Join date : 28/02/2012
Re: Thảo luận Bài 5
+ Nguyên lý tập luồng và ứng dụng. 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ụ cho 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 trại quân đội sẽ có một 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 đột nhập (nhận thêm một yêu cầu). Tướng lĩnh sẽ điều binh sĩ 1 (1 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 khác), 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). 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ụ cho 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 trại quân đội sẽ có một 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 đột nhập (nhận thêm một yêu cầu). Tướng lĩnh sẽ điều binh sĩ 1 (1 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 khác), 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). Sau khi bắt địch xong, binh sĩ sẽ trở về doanh trại (luồng đươc trả về tập luồng).
nguyenthaihiep (I11C)- Tổng số bài gửi : 34
Join date : 31/08/2011
V/v Em đã trả lời đúng một câu hỏi của thầy trên lớp
Em thưa thầy,
Bài 5 học về Đa luồng, thầy có nêu một ví dụ về một thế mạnh của đa luồng qua ví dụ như sau:
Chung code, dán code bên ngoài cửa quy định hôm nay mỗi SV phải làm gì. Em đã nêu việc dùng chung dán code như thế sẽ tiết kiệm được chi phí
=> Thưa thầy thầy đã nói là cách trả lời của em đúng một phần. Câu trả lời đúng nhất có một bạn khác đã trả lời dó là dễ bảo trì, đảm bảo tính đồng bộ
Họ tên và mã số sinh viên của em, mòng thầy cộng điểm cho em, em cám ơn .
10H1010066 TRẦN THÚY OANH.
Admin
Được, nhưng em đưa không đúng chỗ !
Bài 5 học về Đa luồng, thầy có nêu một ví dụ về một thế mạnh của đa luồng qua ví dụ như sau:
Chung code, dán code bên ngoài cửa quy định hôm nay mỗi SV phải làm gì. Em đã nêu việc dùng chung dán code như thế sẽ tiết kiệm được chi phí
=> Thưa thầy thầy đã nói là cách trả lời của em đúng một phần. Câu trả lời đúng nhất có một bạn khác đã trả lời dó là dễ bảo trì, đảm bảo tính đồng bộ
Họ tên và mã số sinh viên của em, mòng thầy cộng điểm cho em, em cám ơn .
10H1010066 TRẦN THÚY OANH.
Admin
Được, nhưng em đưa không đúng chỗ !
TRANTHUYOANH_10H1010066- Tổng số bài gửi : 8
Join date : 23/02/2012
Trang 7 trong tổng số 9 trang • 1, 2, 3, 4, 5, 6, 7, 8, 9
Trang 7 trong tổng số 9 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết