Thảo luận Bài 5

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

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down

Nguyên lý tập luồng và ứng dụng

Bài gửi  NguyenNhatHuy64(I22B) on 23/3/2013, 11:07

Tập luồng(Thread Pools): được có khi có một tiến trình cha tạo ra tập luồng khi khởi động.Các luồng trong tập luồng sẵn sàng cho công việc.Khi tiến trình cha nhận thêm yêu cầu,một luồng sẽ được đánh thức và đưa vào vận hành.Sau khi phục vụ xong,luồng sẽ được trả về tập luồng và nếu số yêu cầu sử dụng luồng nhiều thì tiến trình cha chờ đến khi tập luồng được giải phóng

Trong bài tòan nhà sản xuất nhà tiêu thụ,thì một tiến trình gồm nhà sản xuất sẽ có nhiều luồng giống nhau,và tiến trình nhà tiêu thụ cũng tạo nhiều tập luồng giống nhau(không phải 2 tập luồng này giống nhau,vì 2 tập luồng này giống ở trong bản chất của từng tiến trình)

Ví dụ khác có 1 web server tạo ra 100 luồng mỗi luồng phục vụ 1 HTML đáp ứng yêu cầu cho người sử dụng, khi người sử dụng khác yêu cầu sẽ tạo thêm luồng khác.và khi tất cả các luồng bị bận,chỉ còn cách đợi luồng khác được giải phóng.Ví dụ thêm bạn vào một trang web nào đó trang web không hiện lên và có ghi dòng Server Busy tức là yêu cầu của bạn chưa được đáp ứng

Ví dụ khác,bạn gọi đến tổng đài 116 để hỏi thông tin về chủ đề nào đó,bạn sẽ được kết nối,nói chuyện với tổng đài viên,nếu khõang 2 3 phút sau,bạn gọi lại,bạn sẽ được kết nối với tổng đài viên khác vì tổng người khia sử dụng cho người yêu khác rồi.

Tập luồng có ưu điểm nhanh và giúp được tiến trình bớt vất vả hơn nhưng nó luôn sẵn sàng trong trạng thái đã có,luôn sẵn sàng nên nó rất là tốn RAM.

NguyenNhatHuy64(I22B)

Tổng số bài gửi : 16
Join date : 09/03/2013
Age : 25

Xem lý lịch thành viên

Về Đầu Trang Go down

Chuẩn Pthreads

Bài gửi  NguyenThanhQuoc(I22A) on 23/3/2013, 12:00

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

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

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

p/s:Nguồn tham khảo, mong mọi người góp ý thêm

NguyenThanhQuoc(I22A)

Tổng số bài gửi : 18
Join date : 09/03/2013
Age : 24
Đến từ : lớp TH10a3, Dh mở tp.hcm

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  NguyenThanhQuoc(I22A) on 23/3/2013, 12:15

-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.

NguyenThanhQuoc(I22A)

Tổng số bài gửi : 18
Join date : 09/03/2013
Age : 24
Đến từ : lớp TH10a3, Dh mở tp.hcm

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  NguyenBacHoi(I22B) on 23/3/2013, 12:21

NguyenTanDat(I22B) đã viết:-Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn 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 luôn trong trạng thái sẵn sàng chiến đấu khi có mệnh lệnh (sẵn sàng chờ công việc).
Khi có quân địch đột nhập, tướng lĩnh sẽ điều một binh sĩ (một luồng) đi chiến đấu (một luồng được đánh thức và đưa vào vận hành).
Sau khi hoàn thành nhiệm vụ binh sĩ sẽ trở về doanh trại (luồng được trả về tập luồng) và vẫn luôn trong thạng thái sẵn sàng.
Mình bổ sung cho bài của bạn ví dụ trong máy tính:
-Nguyên lý tập luồng được sử dụng nhiều trong server (Web Database), lập trình hàm main() là luồng chính và các hàm còn lại là luồng con.

NguyenBacHoi(I22B)

Tổng số bài gửi : 8
Join date : 13/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Mô hình đa luồng

Bài gửi  NguyenThanhQuoc(I22A) on 23/3/2013, 12:30

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

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

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


NguyenThanhQuoc(I22A)

Tổng số bài gửi : 18
Join date : 09/03/2013
Age : 24
Đến từ : lớp TH10a3, Dh mở tp.hcm

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  cat on 23/3/2013, 14:53

cat đã viết:- Tiến trình (process) là trạng thái tức thời của một chương trình đang chạy trên máy tính. Nó bao gồm bộ nhớ cần thiết để chạy chương trình (không gian địa chỉ của tiến trình) và khả năng kiểm soát hiện trạng của bộ xử lý trong tiến trình thực thi chương trình - đặt dưới sự quản lý của HĐH .Tiến trình có nhiều luồng nhưng chỉ có 1 luồng chính và nhiều luồng phụ. Mỗi tiến trình có 1 mã riêng biệt.
VD: Một lớp học (Tiến trình), có thầy ( hệ thống) và các bạn sinh viên (tiến trình con). Mỗi bạn sinh viên điều có mã số sv riêng (địa chỉ).
- Luồng (Thread): là một tiến trình, nhưng đặc biệt ở chỗ là nhẹ hơn tiến trình truyền thống nên còn được gọi là tiểu tiến trình. Luồng nhẹ hơn tiến trình vì nó nằm trong một tiến trình. Nhiều luồng có thể có chung mã.
VD. Lớp I22B (Tiến trình),có 100 bạn sv, có thầy ( luồng chính) và các bạn sinh viên ( luồng phụ). Các bạn sv được thầy hướng dẫn và nghe theo lời thầy.(có 100 luồng chung mã và được luồng chính điều khiển.)
Sự giống nhau và khác nhau giữa tiến trình và luồng.
Giống nhau:
- Bản chất đều là tiến trình, nên đều có thông tin trạng thái.
- Đều được hệ điều hành quản lý và cấp phát CPU.
- Chia sẻ tài nguyên cho nhau.

Khác nhau:
- Luồng nhẹ hơn tiến trình.
- Luồng có thể chung mã còn tiến trình thì không.
- Chuyển từ luồng này sang luồng kia nhanh hơn chuyển từ tiến trình này sang tiến trình kia.VD: Lớp I22B chuyển từ phòng 01 sang phòng 02 thì lâu hơn bạn A đổi chổ cho bạn B.
- Luồng chia sẻ tài nguyên nhanh hơn tiến trình. VD: lớp I22B cho lớp I22A mượn sách thì lâu hơn so với các bạn trong lớp I22B cho nhau mượn sách.
- Tạo mới một luồng nhanh hơn và tiết kiệm hơn tạo mới một tiến trình.VD: Tạo 1 phòng học khó hơn sắp chổ ngồi cho 1 bạn trong lớp.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
Lợi ích của công nghệ đa luồng
- Làm được nhiều việc trong 1 lúc đáp ứng được nhu cầu của người dùng. VD: người dùng có thể vừa nghe nhạc vừa đánh văn bản.
- Khả năng đáp ứng tốt (luồng này không trả lời thì có luồng khác trả lời). VD: tổng đài Vietel có nhiều tổng đài viên sẽ giải quyết các câu hỏi khi khách hàng gọi tới nhanh hơn là chỉ có 1 tổng đài viên.
- Lập trình đa luồng dễ hơn lập trình đa tiến trình (tương tác, truyền thông, liên lạc dùng chung tài nguyên với nhau dễ hơn nhiều so với đa tiến trình truyền thông).

cat

Tổng số bài gửi : 1
Join date : 10/03/2013
Age : 26
Đến từ : Long An

Xem lý lịch thành viên

Về Đầu Trang Go down

Lợi ích của đa luồng

Bài gửi  BuiThucTuan(I22B) on 23/3/2013, 15:03

1. Đảm bảo được khả năng đáp ứng của tiến trình tốt hơn, khi lập trình đa luồng thì một khi 1 luồng có sự cố thì luồng khác vẫn làm việc, vẫn phản hồi ,trong trường hợp lập trình đơn luồng khi gặp sự cố thì luồng đó sẽ chậm và làm chậm luôn cả tiến trình, đa luồng một ứng dụng giao tiếp cho phép một chương trình tiếp tục chạy thậm chí nếu một phần của nó bị khóa hay đang thực hiện một thao tác dài, do đó gai tăng sự đáp ứng đối với người dùng, Ví dụ : một trình duyệt web vẫn có thể đáp ứng người dùng bằng một luồng trong khi vẫn nạp bằng một luồng khác.
Ví dụ : Các nhân viên bán hàng là các luồng , khi khách hàng đến mua hàng, thì một trong các nhận viên trong cửa hàng sẽ tu vấn và bán hàng cho khách, nhưng cùng thời điểm đó khách hàng thứ hai cũng tới mua hàng,thì một trong các nhân viên còn lại sẽ tư vấn và bán hàng cho vị khách đó.
2. Theo mặc định các luồng có thể dùng chung bộ nhớ và tai nguyên của luồng cha. Thuận lợi của việc chia sẻ mã là nó cho phép một ứng dụng có nhiều hoạt động của các luồng khác nằm trong cùng không gian, địa chỉ,vài luồng cùng vận hành trong một vùng địa chỉ 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à có kệ sách, xe máy, máy vi tính … mọi người có thể dùng chung và sử dụng chung kệ sách, xe máy, máy vi tính. Trong khi không thể dùng chung những đồ dùng trên với nhà khác được
Trong lớp chúng ta có thể dùng bảng củ lớp mình, chúng ta có thể chia sẻ các thông tin cần thiết cho tất cả các thành viên ở trong lớp biết,trong khi chúng ta khong thể dùng chung bảng của lớp khác để chia sẻ thông tin cho lớp mình được.
3. 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 rất tốn kém. Do luồng có thể dùng chung tài nguyên với luồng cha và các luồng khác, việc tạo lập ngữ cảnh cũng nhanh hơn (Solaris2, 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 của lớp, ai cần ghi thì ghi, ai cần thì chụp hình về xem
Có thể bố trí một chỗ ngồi ở trong lớp cho một bạn đến sau dễ dàng hơn việc làm một chiếc ghế khác cho bạn đó.
4. Chuyển ngữ cảnh từ luồng này sang luồng khác thì nhanh hơn chuyển ngữ cảnh từ tiến trình này sang tiến trình khác.
5. Tận dụng được ưu thế kiến trúc đa xử lý (nhiều CPU). Khi đa luồng thì 1 luồng dùng CPU này và 1 luồng dùng CPU khác sẽ nhanh hơn và các luồng có thể làm việc song song , mỗi luồng có thể chạy bởi CPU riêng. Tiến trình đa luồng sẽ làm việc nhanh hơn tiến trình đơn luồng.
6. Lập trình đa luồng dễ dàng hơn lập trình đa tiến trình


Được sửa bởi BuiThucTuan(I22B) ngày 23/3/2013, 15:12; sửa lần 1.

BuiThucTuan(I22B)

Tổng số bài gửi : 14
Join date : 09/03/2013
Age : 26

Xem lý lịch thành viên

Về Đầu Trang Go down

Hai ví dụ ứng dụng công nghệ đa luồng

Bài gửi  NguyenHuuThien159 (I22B) on 23/3/2013, 15:07

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

NguyenHuuThien159 (I22B)

Tổng số bài gửi : 4
Join date : 21/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Thêm 2 VD minh họa về nguyên lý tập luồng

Bài gửi  NguyenHuuThien159 (I22B) on 23/3/2013, 15:19

Vd1: Trong 1 doanh trại quân đội sẽ có 1 tướng lĩnh(tiến trình cha) và sẽ có 1 đội binh (tập luồng).
đội binnh này sẵn sàng chiến đâu khi có mệnh lệnh(sẵn sag chờ công việc).
Khi cho 1 tên địch đột nhập, Tướng lĩnh sẽ điều binh sỹ 1(1 luồng) đi bắt tên địch (1 luồng được đánh thức và đưa vào vận hành).
Trong khi đó lại có 1 tên địch khác đột nhập (nhận thêm 1 yeu cầu), Tướng lĩnh sẽ điều binh sỹ 2 (1 luồng) đi bắt địch (1 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).

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

NguyenHuuThien159 (I22B)

Tổng số bài gửi : 4
Join date : 21/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  PhamQuocCuong (I22A) on 23/3/2013, 17:16

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.

PhamQuocCuong (I22A)

Tổng số bài gửi : 20
Join date : 10/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  nguyenthithutrang (I11C) on 23/3/2013, 21:35

NguyenQuocHuy (I22B) đã viết:#include < stdio . h >
#include < conio . h >
#include < windows . h > // Sử dụng được hàm win32 API

#define BUFFER_SIZE 10 // định nghĩa một buffer có 10 khoang chứa

int buffer[BUFFER_SIZE];
int in=0; // giá trị vị trí xếp sản phẩm vào
int out=0;// giá trị 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, 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ẽ đượ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,(chờ in tăng lên 1) rồi mới showbuffer !
ShowBuffer();
}
}

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

nguyenthithutrang (I11C)

Tổng số bài gửi : 33
Join date : 26/08/2011
Age : 28
Đến từ : Lâm Đồng

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  nguyenthithutrang (I11C) on 23/3/2013, 21:44

Thảo luận những vấn đề liên quan đến Bài 5

Ưu điểm và nhược điểm của một ứng dụng Multithreaded
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ể.

nguyenthithutrang (I11C)

Tổng số bài gửi : 33
Join date : 26/08/2011
Age : 28
Đến từ : Lâm Đồng

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  LêAnhNgữ(I22A) on 23/3/2013, 21:49

Lúc nảy thầy thêm vào phần "Lợi ích của đa luồng" mà ko có trong sách:
5.Lập trình đa luồng dễ hơn lập trình đa tiến trình, dễ dàng trong việc dùng chung bộ nhớ, liên lạc, truyền thông,...

Thầy cho em hỏi thêm về hệ đa xử lý có nhiều CPU đấy, mỗi máy bình thường mà các bạn đang sử dụng thì nó có 1 CPU, còn cái máy nhiều CPU thì nó như thế nào ạh??? nó ra sao nhi???

Admin
Tìm trên Mạng !

LêAnhNgữ(I22A)

Tổng số bài gửi : 15
Join date : 23/03/2013
Age : 25
Đến từ : Tây Ninh

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  nguyenthithutrang (I11C) on 23/3/2013, 21:50

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
Smile

nguyenthithutrang (I11C)

Tổng số bài gửi : 33
Join date : 26/08/2011
Age : 28
Đến từ : Lâm Đồng

Xem lý lịch thành viên

Về Đầu Trang Go down

Ích lợi của đa luồng

Bài gửi  PhamXuanThieu (I22A) on 23/3/2013, 22:40

+ Khả năng đáp ứng: cho phép một chương trình tiếp tục chạy mặc dù một phần bị khóa hay đang thực hiện thao tác khác, do đó vẫn gia tăng đáp ứng đối với người dùng. Ví dụ: có thể vào nhiều trang web trong khi chỉ có một đường truyền.
+ Chia sẻ tài nguyên: các luồng chia sẻ bộ nhớ và các tài nguyên của các tiến trình. Nó cho phép một ứng dụng có nhiều hoạt động của các luồng khác nhau nằm trong cùng không gian địa chỉ. Ví dụ: mọi người trong một gia đình có thể sử dụng chung: máy tính, máy giặt, xe máy, ...
+ Tiết kiệm: vì các luồng chia sẻ tài nguyên của tiến trình của chúng nên nó tiết kiệm hơn để tạo và chuyển ngữ cảnh giữa các luồng. Thường thì tiến trình sẽ mất nhiều thời gian hơn để tạo và quản lý so với luồng. Ví dụ: giấy báo điểm của một lớp được gián ở phòng đào tạo chứ không cần phải phát cho từng sinh viên.
+ Sử dụng kiến trúc đa xử lý: mỗi luỗng thực thi song song trên một bộ xử lý khác nhau. Một tiến trình đơn luồng chỉ có thể chạy trên một CPU. Đa luồng trên một máy nhiều CPU gia tăng tính đồng hành. Trong cấu trúc đơn xử lý, CPU thường chuyển đổi qua lại giữa mỗi luồng quá nhanh để tạo ra hình ảnh của sự song song nhưng trong thực tế chỉ một luồng đang chạy tại một thời điểm.
+ Chuyển ngữ cảnh từ luồng này sang nguồn khác nhanh hơn từ tiến trình này sang tiến trình khác.
+ Lập trình đa luồng dễ hơn lập trình đa tiến trình.

PhamXuanThieu (I22A)

Tổng số bài gửi : 11
Join date : 09/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  PhamXuanThieu (I22A) on 23/3/2013, 22:54

LêAnhNgữ(I22A) đã viết:Lúc nảy thầy thêm vào phần "Lợi ích của đa luồng" mà ko có trong sách:
5.Lập trình đa luồng dễ hơn lập trình đa tiến trình, dễ dàng trong việc dùng chung bộ nhớ, liên lạc, truyền thông,...

Thầy cho em hỏi thêm về hệ đa xử lý có nhiều CPU đấy, mỗi máy bình thường mà các bạn đang sử dụng thì nó có 1 CPU, còn cái máy nhiều CPU thì nó như thế nào ạh??? nó ra sao nhi???
Theo mình hiểu thì trong hệ đa xử lý (nhiều CPU) cũng như hệ đơn xử lý (1 CPU hay xử lý lô) không có hai luồng cũng như hai tiến trình chạy cùng một thời điểm, chỉ vì quá trình xử lý của CPU trong hệ đa xử lý chuyển đổi qua lại giữa các luồng quá nhanh tạo ra hình ảnh song song. Trong sách thầy cũng có đề cập đến là "làm tăng tính song song", chứ thầy không nói thẳng là song song.

PhamXuanThieu (I22A)

Tổng số bài gửi : 11
Join date : 09/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Trình bày và so sánh khái niệm luồng với tiến trình. Cho biết những lợi ích của công nghệ đa luồng???

Bài gửi  NgT.KimHuyen(I22A) on 23/3/2013, 23:01

+ Tiến trình là chương trình đang trong thời gian thực hiện.
VD: trong lớp mỗi sinh viên đều là 1 tiến trình và trạng thái của các tiến trình lun thay đổi theo thời gian.
+ Tiến trình có thể có 1 luồng chính với nhiều luồng phụ
+ Luồng: còn gọi là tiến trình nhẹ, là một đơn vị cơ bản sử dụng CPU.
VD: lớp là 1 tiến trình, thầy là luồng chính còn sinh viên là luồng phụ Smile

* Giống nhau:
- Là đơn vị được cấp bởi CPU và được điều phối bởi hđh.
- đều có khối kiểm soát PCB.
- có thể chuyển ngữ cảnh
-được cấp phát vùng nhớ

*Khác nhau:
-Luồng không chứa gì hết.
-Trong tiến trình có chứa luồng.
-Luồng là một tiểu trình con nằm trong tiến trình cha.
-Chuyển ngữ cảnh giữa các luồng nhanh hơn giữa các tiến trình
-Tạo luồng nhanh hơn tạo tiến trình
- Quản lý công việc của luồng dễ hơn.
-Cấp phát bộ nhớ cho tiến trình tốn kém hơn cho luồng.
-Luồng ít chiếm tài nguyên hơn tiến trình.

NgT.KimHuyen(I22A)

Tổng số bài gửi : 15
Join date : 10/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  NgT.KimHuyen(I22A) on 23/3/2013, 23:16

LêAnhNgữ(I22A) đã viết:Lúc nảy thầy thêm vào phần "Lợi ích của đa luồng" mà ko có trong sách:
5.Lập trình đa luồng dễ hơn lập trình đa tiến trình, dễ dàng trong việc dùng chung bộ nhớ, liên lạc, truyền thông,...

Thầy cho em hỏi thêm về hệ đa xử lý có nhiều CPU đấy, mỗi máy bình thường mà các bạn đang sử dụng thì nó có 1 CPU, còn cái máy nhiều CPU thì nó như thế nào ạh??? nó ra sao nhi???

H nghĩ:
-Khi máy tính có nhiều CPU, mỗi CPU có thể thực hiện các công việc khác nhau hoặc các luồng khác nhau cho cùng một công việc.
-Khi hệ thông chỉ có 1 CPU, mỗi luồng được thực hiện luân phiên nhau và không có luồng nào chiếm ưu thế trong CPU.
hi ^^!

NgT.KimHuyen(I22A)

Tổng số bài gửi : 15
Join date : 10/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Sự giống và khác nhau giữa "tiến trình" và "luồng"

Bài gửi  PhamXuanThieu (I22A) on 24/3/2013, 00:20

Giống nhau:
- Đều có thể nhận thông tin trạng thái để xác định hoạt động hiện hành(như: running, blocked, hay ready)
- Cùng có chức năng xử lý song song (trên hệ nhiều CPU).
- Được cấp phát tài nguyên mặc dù có thể sẽ không được cấp phát đồng thời.
- Tăng tốc tính toán.
- Đảm bảo tính đơn thể.
- 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.
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. (ví dụ: khi mở nhiều trang web khác nhau trên cùng một trình duyệt thì tốc độ mở 1 trang web sẽ khác tốc độ mở 10 và khác hơn nữa là 100 trang web thì băng thông dành cho mỗi trang web sẽ nhỏ dần nhưng vẫn có thể load trang đó lên trong một thời gian nào đó chứ không giống như tiến trình - chỉ cấp phát thiết bị khi CPU xử lý lần lượt các tiến trình trong khi các tiến trình còn lại vẫn nằm trong hàng đợi)
- 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.

PhamXuanThieu (I22A)

Tổng số bài gửi : 11
Join date : 09/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Nêu 2 ví dụ ứng dụng công nghệ đa luồng.

Bài gửi  BuiTrongHung41(I11C) on 24/3/2013, 01:03

Ví dụ 1 : 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ô (người thứ nhất) 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
Ví dụ 2 : trong nhà có kệ sách, xe máy, máy vi tính … mọi người có thể dùng chung và sử dụng chung kệ sách, xe máy, máy vi tính. Trong khi không thể dùng chung những đồ dùng trên với nhà khác được
Trong lớp chúng ta có thể dùng bảng củ lớp mình, chúng ta có thể chia sẻ các thông tin cần thiết cho tất cả các thành viên ở trong lớp biết,trong khi chúng ta không thể dùng chung bảng của lớp khác để chia sẻ thông tin cho lớp mình được.

Admin
Hai ví dụ trên thuộc loại khác nhau !


BuiTrongHung41(I11C)

Tổng số bài gửi : 17
Join date : 26/02/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  HongGiaPhu (I22A) on 24/3/2013, 01:50

Trong tiến trình có thể có nhiều tiểu trình còn được gọi là luồng.
Luồng (Thread) còn được gọi là tiểu trình nhẹ (LWP - Light Weight Process) là một đơn vị cơ bản sử dụng CPU. Trong một tiến trình có nhiều tiến trình trong đó có một luồng chính và nhiều luồng phụ, các luồng này có thể chia sẻ các tài nguyên cho nhau và nhiều luồng có thể dùng chung một mã code.

Lợi ích của đa luồng:

1/ Khả năng đáp ứng, phản hồi (Responsiveness): Trong suốt quá trình vận hành, khi một luồng bị bận hoặc tắc nghẽn thì các luồng khác vẫn vận hành bình thường để thực hiện công việc của người dùng.
Vd: Các trực đài viên (các luồng) sẽ cùng nhau đáp ứng thắc mắc của khách hàng khi gọi tới cùng 1 tổng đài (trong 1 tiến trình cha).

2/ Chia sẻ tài nguyên (Resource Sharing): Do được sinh ra trong một tiến trình cha, các luồng có thể dùng chung bộ nhớ và tài nguyên với luồng cha.
Vd: Trong 1 gia đình (1 tiến trình), các thành viên trong một gia đình (các luồng bên trong) sẽ dùng chung các thiết bị (tài nguyên) như xem chung tivi, dùng chung máy giặt, tủ lạnh...

3/ Tiết kiệm (Economy): Do cùng khả năng chia sẻ và dùng chung tài nguyên của các luồng trong 1 tiến trình sẽ tiết kiệm tài nguyên hơn nhiều so với CPU cấp phát tài nguyên cho các tiến trình khác nhau.
Vd: Cùng với ví dụ trên, rõ ràng ta thấy việc các thành viên trong gia đình dùng chung các thiết bị như vậy sẽ tiết kiệm chi phí kinh tế hơn nhiều so với việc mỗi thành viên bỏ tiền túi ra và dùng riêng cho mỗi thiết bị.

4/ Tận dụng và khai thác tối ưu của kiến trúc đa xử lí: Nếu như một máy tính có nhiều CPU thì công nghệ đa luồng được khai thác rất hiệu quả khi một luồng có thể chạy trên CPU này trong khi luồng khác có thể dùng CPU khác để cùng song song làm việc => tốc độ công việc được cải thiện rõ rệt.
Vd: Trong một công ty, các nhân viên sẽ được trang bị một máy tính độc lập (một CPU) và cùng làm việc trong công ty mà sẽ nhanh hơn nhiều so với việc mỗi nhân viên chờ đến lượt mình sử dụng nếu công ty chỉ có một máy tính.

5/ Lập trình đa luồng sẽ dễ hơn nhiều so với lập trình đa tiến trình.
farao
avatar
HongGiaPhu (I22A)

Tổng số bài gửi : 25
Join date : 10/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  HongGiaPhu (I22A) on 24/3/2013, 02:04

LêAnhNgữ(I22A) đã viết:Lúc nảy thầy thêm vào phần "Lợi ích của đa luồng" mà ko có trong sách:
5.Lập trình đa luồng dễ hơn lập trình đa tiến trình, dễ dàng trong việc dùng chung bộ nhớ, liên lạc, truyền thông,...

Thầy cho em hỏi thêm về hệ đa xử lý có nhiều CPU đấy, mỗi máy bình thường mà các bạn đang sử dụng thì nó có 1 CPU, còn cái máy nhiều CPU thì nó như thế nào ạh??? nó ra sao nhi???

Theo mình thì đối với CPU 1 nhân, thì khái niệm đa tiến trình, đa luồng thì CPU sẽ xử lí bằng cách chạy tuần tự các tiến trình trong một khoảng thời gian ngắn, tiến trình này chạy xong tới tiến trình khác, mỗi thread cũng được CPU cấp 1 khoảng thời gian ngắn để thực thi rồi chuyển sang thread khác, nhưng có điều là đối với ứng dụng nào được nhấn tiêu điểm (Focus) như bàn phím, click chuột thì ứng dụng đó sẽ trở thành ứng dụng kích hoạt chính.
Còn đối với CPU đa nhân thì mỗi thread sẽ chạy song song thực thi công việc trên mỗi nhân nên tốc độ xử lí công việc sẽ nhanh hơn nhiều. farao
avatar
HongGiaPhu (I22A)

Tổng số bài gửi : 25
Join date : 10/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Tập luồng (Thread Pools)

Bài gửi  HongGiaPhu (I22A) on 24/3/2013, 02:22

Tập luồng (Threads Pools) cũng gần như đa luồng có điều trong tập luồng thì tiến trình cha sẽ tạo sẵn một tập luồng khi khởi động, các luồng con này được cấp sẵn tài nguyên, bộ nhớ và các luồng này luôn trong trạng thái sẵn sàng để thực thi công việc ngay khi tiến trình cha kêu gọi, đánh thức, khi một luồng giải quyết công việc xong thì được trả về tập luồng để chờ đánh thức để thực thi công việc khác, trong trường hợp nếu như các luồng trong tập luồng đều đang làm việc mà có yêu cầu thực thi công việc thì tiến trình cha phải chờ tới khi có luồng được giải phóng trả về.
Ví dụ: Các vận động viên hay đấu thủ đều đã phải tập luyện để hình thành những kĩ năng để luôn có khả năng phản ứng với đấu thủ, do đó trong một cuộc thi đấu thì họ luôn ở trạng thái sẵn sàng để chờ tiếng kêu của trọng tài hoặc ban tổ chức để lên thi đấu, tranh tài với nhau. Xong thì họ lại vào trạng thái tập luyện sẵn sàng để chờ một cuộc thi khác. farao
avatar
HongGiaPhu (I22A)

Tổng số bài gửi : 25
Join date : 10/03/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

Khái niệm luồng, khái niệm tiến trình, những điểm giống và khác nhau

Bài gửi  TranVuSang (I22B) on 24/3/2013, 02:32

_Luồng(Thread): hay còn gọi là tiểu trình, luồng cũng là tiến trình nhưng luồng là tiến trình đặc biệt là tiến trình nhẹ(Light Weight Process). Nó nhẹ là vì nó nằm trong lòng tiến trình truyền thống, nó là tiến trình nhưng là tiến trình con của tiến trình truyền thống, tiến trình truyền thống có thể bao gồm nhiều tiến trình nhỏ như vậy. Và luồng cũng là 1 đơ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. Nhiều luồng có thể cùng chung một mã chương trình.
_Tiến trình: Tiến trình (process) là trạng thái tức thời của một chương trình đang chạy trên máy tính. Nó bao gồm bộ nhớ cần thiết để chạy chương trình và khả năng kiểm soát hiện trạng của bộ xử lý trong quá trình thực thi chương trình, đặt dưới sự quản lý của hệ điều hành.
Có 2 loại tiến trình: tiến trình hệ thống và tiến trình người dùng.
Tiến trình hệ thống : Để phục vụ nhiều người dùng, một quá trình có thể cần phải phân nhánh, hay tạo bản sao của chính nó để tạo ra một quá trình con. Cũng giống như quá trình mẹ, quá trình con cũng có không gian địa chỉ và tiến trình điều khiển riêng. Tuy nhiên, thường thì khi quá trình mẹ chấm dứt, mọi quá trình con mà nó khởi động cũng sẽ tự động chấm dứt.
Tiến trình người dùng : khác với tiến trình hệ thống, tiến trình người dùng thể hiện các luồng công việc, chúng được điều khiển bởi người dùng để xác định vị trí hoạt động để xử lý hoàn chỉnh hơn theo ý muốn của người dùng, để phục vụ người dùng.
Những điểm giống nhau giữa luồng và tiến trình:
_Cả luồng và tiến trình đều có PCB riêng.
_Luồng cũng là 1 đơn vị được HĐH quản lý.
_Luồng cũng là đối tượng được cấp phát CPU bởi hệ thống,
_Cả luồng và tiến trình đều có thể chia sẽ tài nguyên cho nhau.
Những điểm khác nhau giữa luồng và tiến trình:
_Luồng nhẹ hơn, nhỏ hơn và chuyển ngữ cảnh giữa các luồng sẽ nhanh hơn chuyển ngữ cảnh giữa tiến trình này sang tiến trình kia,.
_Tiến trình truyền thống chứa nhiều luồng bên trong và thường sẽ có 1 luồng chính và nhiều luồng phụ.
_Nhiều luồng có thể có chung mã với nhau.
_Đa luồng giúp cho hệ thống ứng dụng có khả năng đáp ứng tốt hơn đa tiến trình
_Đa luồng chia sẽ tài nguyên tốt hơn đa tiến trình
_Đa luồng sẽ tiết kiệm hơn đa tiến trình
_Đa luồng tận dụng được thế mạnh của kiến trúc đa xử lý
_Lập trình đa luồng dễ hơn lập trình đa tiến trình.

TranVuSang (I22B)

Tổng số bài gửi : 53
Join date : 09/03/2013
Age : 27

Xem lý lịch thành viên

Về Đầu Trang Go down

thuận lợi của lập trình đa luồng

Bài gửi  LeThiKimNgan67(I11C) on 24/3/2013, 02:46

Những thuận lợi của lập trình đa luồng có thể được chia làm bốn loại:

• Sự đáp ứng: đa luồng một ứng dụng giao tiếp cho phép một chương trình tiếp tục chạy thậm chí nếu một phần của nó bị khóa hay đang thực hiện một thao tác dài, do đó gia tăng sự đáp ứng đối với người dùng. Thí dụ, một trình duyệt web vẫn có thể đáp ứng người dùng bằng một luồng trong khi một ảnh đang được nạp bằng một luồng khác.

• Chia sẻ tài nguyên: Mặc định, các luồng chia sẻ bộ nhớ và các tài nguyên của các quá trình mà chúng thuộc về. Thuận lợi của việc chia sẽ mã là nó cho phép một ứng dụng có nhiều hoạt động của các luồng khác nhau nằm trong cùng không gian địa chỉ.

• Kinh tế: cấp phát bộ nhớ và các tài nguyên cho việc tạo các quá trình là rất đắt. Vì các luồng chia sẻ tài nguyên của quá trình mà chúng thuộc về nên nó kinh tế hơn để tạo và chuyển ngữ cảnh giữa các luồng. Khó để đánh giá theo kinh nghiệm sự khác biệt chi phí cho việc tạo và duy trì một quá trình hơn một luồng, nhưng thường nó sẽ mất nhiều thời gian để tạo và quản lý một quá trình hơn một luồng. Trong Solaris 2, tạo một quá trình chậm hơn khoảng 30 lần tạo một luồng và chuyển đổi ngữ cảnh chậm hơn 5 lần.

• Sử dụng kiến trúc đa xử lý: các lợi điểm của đa luồng có thể phát huy trong kiến trúc đa xử lý, ở đó mỗi luồng thực thi song song trên một bộ xử lý khác nhau. Một quá trình đơn luồng chỉ có thể chạy trên một CPU. Đa luồng trên một máy nhiều CPU gia tăng tính đồng hành. Trong kiến trúc đơn xử lý, CPU thường chuyển đổi qua lại giữa mỗi luồng quá nhanh để tạo ra hình ảnh của sự song song nhưng trong thực tế chỉ một luồng đang chạy tại một thời điểm.

LeThiKimNgan67(I11C)

Tổng số bài gửi : 23
Join date : 26/02/2013

Xem lý lịch thành viên

Về Đầu Trang Go down

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

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

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

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang


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