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

Thảo luận Bài 5

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

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

Go down

Thảo luận Bài 5 - Page 4 Empty Tạo thread với visual C

Bài gửi  NguyenVanNghiem(HC11TH3A) 22/8/2012, 13:03

Tạo thread với visual C
#include
#include
#include

DWORD ThreadProc (LPVOID lpdwThreadParam );

//Global variable Shared by all threads
int nGlobalCount = 0;
//Main function which starts out each thread
int __cdecl main( int argc, char **argv)
{
int i, nThreads = 5;
DWORD dwThreadId;
//Determine the number of threads to start
if (argc > 1) {
nThreads = atoi( argv[1]);
}

//Set the global count to number of threads
nGlobalCount = nThreads;
//Start the threads
for (i=1; i<= nThreads; i++) {
//printf("i - %d\n",i);
if (CreateThread(NULL, //Choose default security
0, //Default stack size
(LPTHREAD_START_ROUTINE)&ThreadProc,
//Routine to execute
(LPVOID) &i, //Thread parameter
0, //Immediately run the thread
&dwThreadId //Thread Id
) == NULL)
{
printf("Error Creating Thread#: %d\n",i);
return(1);
}
else
{
printf("Global Thread Count: %d %d %d\n", nGlobalCount, nThreads, i);
Sleep(1000);
}
}
return 0;
}

//Thread Routine
DWORD ThreadProc (LPVOID lpdwThreadParam )
{
//Print Thread Number
printf ("Thread #: %d\n", *((int*)lpdwThreadParam));
//Reduce the count
nGlobalCount--;
//ENd of thread
return 0;
}

NguyenVanNghiem(HC11TH3A)

Tổng số bài gửi : 21
Join date : 19/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Luồng người dùng và luồng nhân &Mô hình đa luồng

Bài gửi  NguyenVanNghiem(HC11TH3A) 22/8/2012, 13:05


Chúng ta vừa mới thảo luận là xem xét luồng như một chiều hướng chung. Tuy
nhiên, hỗ trợ luồng được cung cấp hoặc ở cấp người dùng, cho các luồng người dùng
hoặc ở cấp nhân, cho các luồng nhân.

• 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
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 :
1. Mô hình nhiều-một
Mô hình nhiều-một (như hình IV.2) á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.
2. Mô hình một-một
Mô hình một-một (hình IV.3) á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.
3 Mô hình nhiều-nhiều
Mô hình nhiều-nhiều (như hình VI.4) đ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.


lengocthuthao89 (i11c)

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

Xem lý lịch thành viên Gửi tin nhắn

Về Đầu Trang

NguyenVanNghiem(HC11TH3A)

Tổng số bài gửi : 21
Join date : 19/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Thưc Thi Vấn Đề “Sản Xuất - Tiêu Thụ” (với nhiều luồng sản xuất - 50)

Bài gửi  ngongocdiep06 (113A) 22/8/2012, 14:46

Code:
#include <stdio.h>
#include <conio.h>
#include <windows.h>

#define BUFFER_SIZE  10
#define MAX  50

int buffer[BUFFER_SIZE];
int in=0;
int out=0;
int i=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());
   }
}

void Consumer(){
   int nextConsumed;
   while (1){
      while(in==out);
      nextConsumed=buffer[out];
      out=(out+1)%BUFFER_SIZE;
      // ... Tiêu thụ (nextConsumed)
      Sleep(GetTickCount()%5000);
   }
}

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<BUFFER_SIZE-1; i++)
printf("S%2d, ",buffer[i]);
   printf("S%2d",buffer[BUFFER_SIZE-1]);

   printf(LeftMargin);
   for(i=0; i<(out*5); i++) putchar(' ');printf("^out");
   printf("\n");
}

int main(){
     
      HANDLE ProducerHandle[MAX];
      HANDLE ConsumerHandle[MAX];

      DWORD ProducerID[MAX];
      DWORD ConsumerID[MAX];

      // tạo 50 luông sản xuất trong trạng thái ngủ
      for(i=0;i<MAX;i++){
              ProducerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Producer, 0, 4, &ProducerID[i]);
      }

      // Tạo 50 luồng tiêu thụ thi hành ngay
      for(i=0;i<MAX;i++){
              ConsumerHandle[i]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)Consumer, 0, 0, &ConsumerID[i]);
      }

   while(1){
      printf("\n- Nhấn P để sản xuất, 0 để kết thúc:”);
      switch (getch()){
         case 'P':
            for(i=0;i<MAX;i++){
                    ResumeThread(ProducerHandle[i]);
                                }
            break;
         case '0':
                                for(i=0;i<MAX;i++){
                    CloseHandle(ProducerHandle[i]);
                    CloseHandle(ConsumerHandle[i]);
                                }
            return 0;
      }
      Sleep(1);
      ShowBuffer();
   }
}

ngongocdiep06 (113A)

Tổng số bài gửi : 23
Join date : 16/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Resume Thread

Bài gửi  ngongocdiep06 (113A) 22/8/2012, 14:47

Sử dụng Visual C++ 6.0 lập trình đánh thức (Resume Thread) tất cả các luồng sản xuất. Biết rằng mục quản (Handle) của chúng lưu trong mảng khai báo bằng lệnh:

HANDLE ProducerHandles[50];

Code:
for(int i=0;i<50;i++){
ResumeThread(ProducerHandles[i]);
}

ngongocdiep06 (113A)

Tổng số bài gửi : 23
Join date : 16/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Phân biệt đa luồng và đa tiến trình

Bài gửi  TrangSiMinhHai (113A) 23/8/2012, 12:50

Giống nhau:
+ Đều có thông tin trạng thái. Thông tin này được lưu trữ trong PCB
+ Luồng còn được gọi là tiến trình nhẹ (Light Weight Process)
+ Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến một chương 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 một vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn đa tiến trình
Ví dụ: Trong lớp học, các bạn (luồng) trong cùng một lớp dễ mượn tập hơn các bạn học khác lớp.
+ Do luồng dùng chung tài nguyên nên việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn tiến trình.
Ví dụ: Trong nhà, ngăn riêng một phòng để ở sẽ nhanh hơn việc chờ nhà nước cấp cho một căn hộ.
+ Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.
+ Lập trình đa luồng dễ hơn đa tiến trình.
TrangSiMinhHai (113A)
TrangSiMinhHai (113A)

Tổng số bài gửi : 34
Join date : 17/07/2012
Age : 34
Đến từ : Xì Gòn

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Ích lợi của đa luồng

Bài gửi  TrangSiMinhHai (113A) 23/8/2012, 12:52

1. Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
VD:trong siêu thị có nhiếu quầy thanh toán cho khách hàng,khi 1 khách hàng cần thanh toán thì một trong các quầy sẽ thanh toán cho khách.Nếu 1 khách hàng khác có nhu cầu thanh toán thì có thể qua quầy kế bên mà không cần phải đợi.
2. Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
VD:Trong gia đình mọi người có thể dùng chung tivi,tủ lạnh...
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 tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
VD:Trong gia đình,khi có anh(chị) cưới vợ(chồng) thì không cần phải xây nhà mới vì rất tốn kém,mà chia căn phòng lớn thành nhiều phòng nhỏ để tiết kiệm hơn.
4. Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng.
TrangSiMinhHai (113A)
TrangSiMinhHai (113A)

Tổng số bài gửi : 34
Join date : 17/07/2012
Age : 34
Đến từ : Xì Gòn

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Tóm tắt luồng và đa luồng,cách tạo luồng

Bài gửi  LeKimHoang (113A) 24/8/2012, 22:09

*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)

LeKimHoang (113A)

Tổng số bài gửi : 25
Join date : 16/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Nguyên lý tập luồng và ứng dụng ,ví dụ minh họa.

Bài gửi  LeKimHoang (113A) 24/8/2012, 22:12

• Sơ qua về luồng (Thread)
Một luồng là một chuỗi liên tiếp những sự thực thi (mã lệnh hay câu lệnh) trong chương trình (ứng dụng). Trong một chương trình C#, dễ thấy việc thực thi được bắt đầu bằng phương thức main() và tiếp tục cho đến khi kết thúc hàm main(). Cấu trúc này rất hay cho những chương trình có một chuỗi xác định những nhiệm vụ liên tiếp, nhưng thường thì trong một chương trình ứng có nhiều hơn một công việc vào cùng một lúc.
Vấn đề quan trọng là bạn phải tìm ra một cách nào đó để chia một công việc lớn thành những công việc nhỏ mà trong đó có những việc có thể thực hiện một cách đồng thời. Ví dụ, sếp giao việc cho bạn là "Viết chương trình quản lý cho bộ phận mình". "Công việc lớn" này giả sử có thể gồm 3 việc nhỏ "thiết kế csdl", "thiết kế giao diện", và “coding xử lý". Sau đó được lãnh thưởng sau khi làm xong ứng dụng, càng nhanh trước thời hạn càng được thưởng nhiều tiền, trễ hạn sẽ bị phạt. Rõ ràng là bạn muốn làm xong việc càng sớm càng tốt nên bạn sẽ phối hợp thêm 2 bạn nữa: bạn A thì thiết kế giao diện, bạn B thì coding xử lý còn bạn thì thiết kế csdl. Cả 3 người cùng làm đồng thời. Thiết kế giao diện xong, csdl cũng đã hoàn tất, bạn phải đợi bạn B thông báo là coding xong thì bạn mới có thể báo cáo cho sếp để mà lãnh tiền thưởng . Như vậy multithread cho "thiết kế giao diện", "coding" và “thiết kế csdl” làm tăng hiệu suất thực hiện công việc của bạn (so với việc bạn làm tuần tự từng việc nhỏ).
• Ví dụ nhỏ về đa luồng Ví dụ này mình sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc.
Ở đây thì bạn cứ tưởng tượng ra rằng có hai bạn tên là A và B thi đếm từ 0 cho đến 100, bạn nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một bạn).
void A()
{
for(int i=0; i<=100; i++)
{
Console.WriteLine(i.ToString());
}
Console.WriteLine("A đã đọc xong"); // Báo cáo đã đọc xong
}

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

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

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

• Truyền tham số cho Thread Có nhiều cách truyền tham số, tuỳ theo nhu cầu mà dùng sao cho phù hợp
Thông qua phương thức Start(object) thì bạn có thể truyền tham số theo cách này.
Ví dụ:
using System;
using System.Threading;
class ThreadSample
{
public static void Main()
{
Thread newThread = new Thread(ThreadSample.DoWork);
newThread.Start(100); // Dữ liệu truyền vào là một số nguyên
// Để Start luồng sử dụng phương thức thể hiện (instance method)
// thì trước tiên ta cần khởi tạo nó trước khi gọi
ThreadSample worker = new ThreadSample();
newThread = new Thread(worker.DoMoreWork);
newThread.Start("Truyền đối tượng cho thread thực thi");
// Nếu biết trước được đối tượng truyền vào thì ta cần ghép kiểu cho nó
// để việc sử dụng được hiệu quả hơn
}
public static void DoWork(object data)
{
Console.WriteLine("Ðây là luồng tĩnh.");
Console.WriteLine("Dữ liệu truyền vào: Data = {0}", data);
}

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

}
Đôi khi ta cũng sử dụng ThreadPool cho việc khởi chạy một luồng mới với tham số là _Param
ThreadPool.QueueUserWorkItem(new WaitCallback(_ThreadProc), _Param);

Bạn hãy tham khảo về nó tại đây: http://dotnetperls.com/threadpool
• Chờ đợi một luồng khác Bằng việc sử dụng phương thức Join(); ta có thể cho phép chờ đợi một luồng khác thực hiện xong (để thu thập dữ liệu chẳng hạn - do chia nhỏ công việc mà), thì luồng đã gọi nó mới tiếp tục được công việc của nó
static void Main(string[] args)
{
Console.WriteLine("Main thread: Gọi luồng thứ 2 ThreadProc()...");

Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();

for (int i = 0; i < 50; i++)
{
Console.WriteLine("Main thread: Do Some Work.");
Thread.Sleep(0);
}

Console.WriteLine("Main thread finished: And call t.Join()");
Console.WriteLine("Main thread tạm thời đang được dừng lại");
t.Join(); // Dừng tại đây

// Sau khi ThreadProc hoàn tất Main thread tiếp tục công việc của nó
// Tiếp tục thực thi 3 dòng lệnh tiếp theo
Console.WriteLine("Thread.Join() has returned.");
Console.WriteLine("Main đã làm xong việc");
Console.ReadLine();
}

public static void ThreadProc()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0);
}
}
Đối số cho Join() có thể là int hoặc TimeSpan, khoảng thời gian giới hạn mà Main thread có thể chờ được, ví dụ
t.Join(10000);
nghĩa là, sau 10s mà ThreadProc chưa làm xong việc của nó thì Main thread không chờ nữa, tiếp tục công việc khác.

LeKimHoang (113A)

Tổng số bài gửi : 25
Join date : 16/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty một bài tập cách đây 2 năm của thầy các bạn giải nha

Bài gửi  LUUDINHTOAN(I11C) 26/8/2012, 20:57

Một hệ thống có 3 tiến trình với thời điểm đến và thời gian sử dụng CPU như sau:
Tiến trình Thời điểm đến (ms) CPU-Burst (ms)

P1 3 35

P2 10 20

P3 25 15

Dùng thuật giải Round-Robin với thời lượng 10 ms để điều phối CPU:
a. Thể hiện bằng biểu đồ Gantt. (1,0 điểm)
b. Tính thời gian chờ trung bình của các tiến trình. (1,0 điểm)

LUUDINHTOAN(I11C)

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

http://ocngonsaigon.com

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Trình bày khái niệm luồng .Cho ví dụ minh họa. So sánh với khái niệm tiến trình truyền thốn

Bài gửi  nguyenduchuy19 (113A) 30/8/2012, 20:58


Luồng:về cơ bản thì vẫn lá tiến trình nhưng là tiến trình nhẹ (LWP - Light Weight Process), một đơn vị cơ bản sử dụng CPU. Luồng cũng có các thông tin trạng thái như của tiến trình (HWP - Heavy Weight Process)
Ví dụ: mỗi làn xe trên đường phố là 1 tiến trình .Bên trong mỗi làn xe lại có rất nhiều xe đang di chuyển .Ở đây các xe được xem như là các luồng.
Tiến trình:là chương trình trong thời gian thực .
Điểm giống nhau giữa luồng và tiến trình :
Đều là tiến trình. Vì vậy luồng có đầy đủ các tính chất của 1 tiến trình .
Khác nhau:
Luồng là tiến trình nhẹ. Còn tiến trình là tiến trình nặng.
Tiến trình bao gồm nhiều luồng bên trong .Còn bên trong luồng không bao gồm luồng khác

Admin
- Ví dụ về Làn xe như trên là đúng nhưng chưa hay. Cách hiểu khác: Đường (tiến trình nặng) có nhiều Làn (luồng hay tiểu trình: tiến trình nhẹ bên trong).
- Luồng "nhẹ" hơn tiến trình vì: Tạo lập và Chuyển ngữ cảnh nhanh hơn ! Vả lại, tiến trình thông thường (truyền thống) chứa các luồng !

nguyenduchuy19 (113A)

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

Về Đầu Trang Go down

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

Bài gửi  NguyenThiKimNgan (113A) 3/9/2012, 18:00

Một hệ thống có 3 tiến trình với thời điểm đến và thời gian sử dụng CPU như sau:
Tiến trình Thời điểm đến (ms) CPU-Burst (ms)

P1 3 35

P2 10 20

P3 25 15

Dùng thuật giải Round-Robin với thời lượng 10 ms để điều phối CPU:
a. Thể hiện bằng biểu đồ Gantt. (1,0 điểm)
b. Tính thời gian chờ trung bình của các tiến trình. (1,0 điểm)

Thảo luận Bài 5 - Page 4 Rrsx



NguyenThiKimNgan (113A)

Tổng số bài gửi : 12
Join date : 19/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Phân Biệt Luồng với Tiến Trình

Bài gửi  TranThiThuyHang79 (113A) 9/9/2012, 21:40

*Giống nhau :
- Đều có thông tin trạng thái.
- Nhiều luồng or nhiều tiến trình có thể liên quan đến một chương trình.
- Tăng tốc tính toán.
- Chia sẻ tài nguyên cho nhau.
- Đả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.
Vd: Mượn xe trong gia đình thì dễ dàng hơn mượn xe của hàng xóm.
- Do 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 tiến trình.
Vd: Thêm ghế vào phòng học sẽ dễ hơn khi chờ mở thêm phòng mới.
- Cấp phát bộ nhớ & tài nguyên cho tiến trình thì tốn kém hơn luồng.
- Lập trình đa luồng thì dễ hơn đa tiến trình.

TranThiThuyHang79 (113A)

Tổng số bài gửi : 46
Join date : 24/07/2012
Age : 34
Đến từ : Tiền Giang

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Luồng người dùng và luồng nhân

Bài gửi  CaoTheAnh01(113A) 13/9/2012, 15:00

Chúng ta vừa mới thảo luận là xem xét luồng như một chiều hướng chung. Tuy nhiên, hỗ trợ luồng được cung cấp hoặc ở cấp người dùng, cho các luồng người dùng hoặc ở cấp nhân, cho các luồng nhân.

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.

CaoTheAnh01(113A)

Tổng số bài gửi : 28
Join date : 16/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Mô hình đa luồng

Bài gửi  CaoTheAnh01(113A) 13/9/2012, 15:02

1. 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.
2. 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.
3. 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.



CaoTheAnh01(113A)

Tổng số bài gửi : 28
Join date : 16/07/2012

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Thuận lợi của lập trình đa luồng

Bài gửi  PhanDiecLoi34 (113A) 13/9/2012, 23:03

1. sự đáp ứng: đa luồng là một ứng dụng giao tiếp cho phép một chương trình tiếp tục chay thậm chí nếu một phần của nó bị khoá hay đang thực hiện một thao tác dài. do đó tăng sự đáp ứng với người dùng. ví dụ: một trình diệt web vẫn có thể đáp ứng người dùng một luồng trong khi một ảnh được đáp ứng bởi một luồng khác.
2. chia sẻ tài nguyên:mặc định. các luồng chia sẻ bộ nhớ và 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 ứng dụng có nhiều hoạt động của những luồng khác nhau nằm trong cùng không gian địa chỉ
3. kinh tế: cấp phát tài nguyên cho việc tạo các quá trình là rất đắt. vì quá trình chia sẻ tài nguyên mà chúng thuộc về nên nó kinh tế hơn giữa việc 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í giữa việc tạo ra và duy trì một quá trình hơn một luồng.. tạo một quá trình chậm hơn khoản 30 lần tạo một luồng và chuyển đổi ngử cảnh chậm hơn 5 lần.
4.Sử dụng kiến trúc đa xử lý: các lợi điểm trong luồng có thể phát huy trong đ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 tại một thời điểm. đ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 các luông thường quá nhanh để tạo ra hình ảnh của sự song song nhưng trong thực tế chỉ có một luồng chỉ chạy tai một thời điểm.

PhanDiecLoi34 (113A)

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

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Lợi ích của đa luồng

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

Admin đã viết:Thảo luận những vấn đề liên quan đến Bài 5.

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


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

VD: Cô trực điện thoại ở tổng đài, nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .

VD: Một trình phục vụ web chấp nhận các yêu cầu khách hàng như trang web, hình ảnh, âm thanh, ..Một trình phục vụ web có thể có nhiều (hàng trăm) khách hàng truy xuất đồng thời nó. Nếu trình phục vụ web chạy như một quá trình đơn luồng truyền thống thì nó sẽ có thể chỉ phục vụ một khách hàng tại cùng thời điểm. Lượng thời gian mà khách hàng phải chờ yêu cầu của nó được phục vụ là rất lớn.

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

Thảo luận Bài 5 - Page 4 Empty Câu 1: Phân biệt khái niệm luồng - tiến trình và cho biết những ưu việt của công nghệ đa luồng

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

Câu 1: Phân biệt khái niệm luồng - tiến trình và cho biết những ưu việt của công nghệ đa luồng

- Phân biệt khái niệm luồng với tiến trình:

+ Luồng: là tiến trình nhẹ (LWP - Light Weight Process), một đơn vị cơ bản sử dụng CPU. Luồng cũng có thông tin trạng thái như của tiến trình hệ thống (HWP - Heavy Weight Process)
+ Tiến trình: là chương trình trong thời gian thực hiện (đặt dưới sự quản lý của hệ điều hành). Có sự phân biệt Tiến trình hệ thống (của Hệ điều hành) với Tiến trình người dùng.

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

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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



Windows 2000 cài đặt Win32 API. Win32 API là một API chủ yếu cho họ hệ điều hành Windows (Windows 95/98/NT và Windows 2000). Thực vậy, những gì được đề cập trong phần phần này áp dụng tới họ hệ điều hành nàyỨng dụng Windows chạy như một tiến trình riêng rẻ nơi mỗi tiến trình có thể chứa một hay nhiều luồng. Windows 2000 dùng ánh xạ một-một nơi mà mỗi luồng cấp người dùng ánh xạ tới luồng nhân được liên kết tới.Tuy nhiên, Windows cũng cung cấp sự hỗ trợ cho một thư viện có cấu trúc (fiber library) cung cấp chức năng của mô hình nhiều-nhiều. Mỗi luồng thuộc về một tiến trình có thể truy xuất một không gian địa chỉ ảo của tiến trình.Những thành phần thông thường của một luồng gồm:ID của luồng định danh duy nhất luồng Tập thanh ghi biểu diễn trạng thái của bộ xử lý Ngăn xếp người dùng khi luồng đang chạy ở chế độ người dùng. Tương tự, mỗi luồng cũng có một ngăn xếp nhân được dùng khi luồng đang chạy trong chế độ nhân Một vùng lưu trữ riêng được dùng bởi nhiều thư viện thời gian thực và thự viện liên kết động (DLLs).Tập thanh ghi, ngăn xếp và vùng lưu trữ riêng được xem như ngữ cảnh của luồng và được đặc tả kiến trúc tới phần cứng mà hệ điều hành chạy trên đó. Cấu trúc dữ liệu chủ yếu của luồng gồm:RTHREAD (executive thread block-khối luồng thực thi). KTHREAD (kernel thread-khối luồng nhân) TEB (thread environment block-khối môi trường luồng)Các thành phần chủ yếu của RTHREAD gồm một con trỏ chỉ tới tiến trình nào luồng thuộc về và địa chỉ của thủ tục mà luồng bắt đầu điều khiển trong đó. ETHREAD cũng chứa một con trỏ chỉ tới KTHREAD tương ứng.KTHREAD gồm thông tin định thời và đồng bộ hóa cho luồng. Ngoài ra, KTHREAD chứa ngăn xếp nhân (được dùng khi luồng đang chạy trong chế độ nhân) và con trỏ chỉ tới TEB.ETHREAD và KTHREAD tồn tại hoàn toàn ở không gian nhân; điều này có nghĩa chỉ nhân có thể truy xuất chúng. TEB là cấu trúc dữ liệu trong không gian người dùng được truy xuất khi luồng đang chạy ở chế độ người dùng. Giữa những trường khác nhau, TEB chứa ngăn xếp người dùng và một mảng cho dữ liệu đặc tả luồng (mà Windows gọi là lưu trữ cục bộ luồng)

Luồng Linux

Nhân Linux được giới thiệu trong ấn bản 2.2. Linux cung cấp một lời gọi hệ thống fork với chức năng truyền thống là tạo bản sao một tiến trình . Linux cũng cung cấp lời gọi hệ thống clone mà nó tương tự như tạo một luồng. clone có hành vi rất giống như fork, ngoại trừ thay vì tạo một bản sao của tiến trình gọi, nó tạo một tiến trình riêng chia sẻ không gian địa chỉ của tiến trình gọi. Nó chấm dứt việc chia sẻ không gian địa chỉ của tiến trình cha mà một tác vụ được nhân bản đối xử giống rất nhiều một luồng riêng rẻ.Chia sẻ không gian địa chỉ được cho phép vì việc biểu diễn của một tiến trình trong nhân Linux. Một cấu trúc dữ liệu nhân duy nhất tồn tại cho mỗi tiến trình trong hệ thống. Một cấu trúc dữ liệu nhân duy nhất tồn tại cho mỗi tiến trình trong hệ thống. Tuy nhiên, tốt hơn lưu trữ dữ liệu cho mỗi tiến trình trong cấu trúc dữ liệu là nó chứa các con trỏ chỉ tới các cấu trúc dữ liệu khác nơi dữ liệu này được được lưu. Ví dụ, cấu trúc dữ liệu trên tiến trình chứa các con trỏ chỉ tới các cấu trúc dữ liệu khác hiện diện danh sách tập tin đang mở, thông tin quản lý tín hiệu, và bộ nhớ ảo. Khi fork được gọi, một tiến trình mới được tạo cùng với một bản sao của tất cả cấu trúc dữ liệu của tiến trình cha được liên kết tới. Khi lời gọi hệ thống clone được thực hiện, một tiến trình mới chỉ tới cấu trúc dữ liệu của tiến trình cha, do đó cho phép tiến trình con chia sẻ bộ nhớ và tài nguyên của tiến trình cha. Một tập hợp cờ được truyền như một tham số tới lời gọi hệ thống clone. Tập hợp cờ này được dùng để hiển thị bao nhiêu tiến trình cha được chia sẻ với tiến trình con. Nếu không có cờ nào được đặt, không có chia sẻ xảy ra và clone hoạt động giống như fork. Nếu tất cả năm cờ được đặt, tiến trình con chia sẻ mọi thứ với tiến trình cha. Sự kết hợp khác của cờ cho phép các cấp độ chia sẻ khác nhau giữa hai mức độ cao nhất này. Điều thú vị là Linux không phân biệt giữa tiến trình và luồng. Thật vậy, Linux thường sử dụng thuật ngữ tác vụ-hơn là tiến trình hay luồng-khi tham chiếu tới dòng điều khiển trong chương trình. Ngoài tiến trình được nhân bản, Linux không hỗ trợ đa luồng, cấu trúc dữ liệu riêng hay thủ tục nhân. Tuy nhiên, những cài đặt Pthreads là sẳn dùng cho đa luồng cấp người dùng.

Luồng Java

Java là một trong số nhỏ ngôn ngữ cung cấp sự hỗ trợ tại cấp ngôn ngữ cho việc tạo và quản lý luồng. Tuy nhiên, vì các luồng được quản lý bởi máy ảo Java, không bởi một thư viện cấp người dùng hay nhân, rất khó để phân cấp luồng Java như cấp độ người dùng hay cấp độ nhân. Trong phần này chúng ta trình bày các luồng Java như một thay đổi đối với mô hình người dùng nghiêm ngặt hay mô hình cấp nhân.Tất cả chương trình tạo ít nhất một luồng điều khiển đơn. Thậm chí một chương trình Java chứa chỉ một phương thức main chạy như một luồng đơn trong máy ảo Java. Ngoài ra, Java cung cấp các lệnh cho phép người phát triển tạo và thao tác các luồng điều khiển bổ sung trong chương trình.[/quote]

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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


Đa Luồng là gì ?
Luồng - Thread: Một dòng các lệnh mà CPU phải thực thi.
Các hệ điều hành mới cho phép nhiều luồng được thực thi đồng thời. Chúng ta đã quen với việc mở nhiều ứng dụng trong một lần làm việc với máy tính.
- Một luồng là một chuỗi các lệnh nằm trong bộ nhớ (chương trình đã được nạp).
- 1 application thông thường khi thực thi là một luồng.
- Trong 1 application có thể có nhiều luồng. Thí dụ chuyển động của 10 đối tượng hiện hành trong 1 trò chơi là một luồng.

Lợi ích của đa luồng:
- Tăng hiệu suất sử dụng CPU: Phần lớn thời gian thực thi của 1 ứng dụng là chờ đợi nhập liệu từ user -> hiệu suất sử dụng CPU chưa hiệu quả.
- Tạo được sự đồng bộ giữa các đối tượng: thí dụ như trong 1 trò chơi, các nhân vật cùng nhau chuyển động.
- Quản lý được thời gian trong các ứng dụng nhu thi online, thời gian chơi một trò chơi.


trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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

Tạo thread với visual C
#include
#include
#include

DWORD ThreadProc (LPVOID lpdwThreadParam );

//Global variable Shared by all threads
int nGlobalCount = 0;
//Main function which starts out each thread
int __cdecl main( int argc, char **argv)
{
int i, nThreads = 5;
DWORD dwThreadId;
//Determine the number of threads to start
if (argc > 1) {
nThreads = atoi( argv[1]);
}

//Set the global count to number of threads
nGlobalCount = nThreads;
//Start the threads
for (i=1; i<= nThreads; i++) {
//printf("i - %d\n",i);
if (CreateThread(NULL, //Choose default security
0, //Default stack size
(LPTHREAD_START_ROUTINE)&ThreadProc,
//Routine to execute
(LPVOID) &i, //Thread parameter
0, //Immediately run the thread
&dwThreadId //Thread Id
) == NULL)
{
printf("Error Creating Thread#: %d\n",i);
return(1);
}
else
{
printf("Global Thread Count: %d %d %d\n", nGlobalCount, nThreads, i);
Sleep(1000);
}
}
return 0;
}

//Thread Routine
DWORD ThreadProc (LPVOID lpdwThreadParam )
{
//Print Thread Number
printf ("Thread #: %d\n", *((int*)lpdwThreadParam));
//Reduce the count
nGlobalCount--;
//ENd of thread
return 0;
}

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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

So sánh đa luồng với đa tiến trình ?

1. Giống nhau:

- Điều có thông tin trạng thái

- Luồng còn được gọi là tiến trình nhẹ.

- Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến 1 chương trình.

- Dùng chung tài nguyên từ tiến trình(hoạc luồng) cha.

- Cùng có chức năng xử lý song song.

- Chia sẻ tài nguyên cho nhau.

- Tăng tốc tính toán.

- Đảm bảo tính đơn thể.

2. Khác nhau:

- Do các luồng cùng vận hành trong cùng 1 địa chỉ vì vậy dễ dùng chung tài nguyên hơn đa tiến trình

- Do các luồng chung tài nguyên với cha và các luồng khác nên việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn và ít chiếm tài nguyên hơn tiến trình.

- Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.

- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình. Bởi vì trao đổi dữ liệu của lập trình đa luồng dễ hơn việc trao dữ liệu của lập trình đa tiến trình

- Đa tiến trình tốn resources hơn đa luồng.

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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

So sánh đa luồng với đa tiến trình ?

1. Giống nhau:

- Điều có thông tin trạng thái

- Luồng còn được gọi là tiến trình nhẹ.

- Nhiều luồng hoặc nhiều tiến trình có thể liên quan đến 1 chương trình.

- Dùng chung tài nguyên từ tiến trình(hoạc luồng) cha.

- Cùng có chức năng xử lý song song.

- Chia sẻ tài nguyên cho nhau.

- Tăng tốc tính toán.

- Đảm bảo tính đơn thể.

2. Khác nhau:

- Do các luồng cùng vận hành trong cùng 1 địa chỉ vì vậy dễ dùng chung tài nguyên hơn đa tiến trình

- Do các luồng chung tài nguyên với cha và các luồng khác nên việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn và ít chiếm tài nguyên hơn tiến trình.

- Cấp phát bộ nhớ và tài nguyên cho tiến trình thì tốn kém hơn luồng.

- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình. Bởi vì trao đổi dữ liệu của lập trình đa luồng dễ hơn việc trao dữ liệu của lập trình đa tiến trình

- Đa tiến trình tốn resources hơn đa luồng.

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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

Ta nên bít Đa Luồng là gì ? rồi mới ghi lợi ích Đa Luồng ..
Đa Luồng là gì ?
Luồng - Thread: Một dòng các lệnh mà CPU phải thực thi.
Các hệ điều hành mới cho phép nhiều luồng được thực thi đồng thời. Chúng ta đã quen với việc mở nhiều ứng dụng trong một lần làm việc với máy tính.
- Một luồng là một chuỗi các lệnh nằm trong bộ nhớ (chương trình đã được nạp).
- 1 application thông thường khi thực thi là một luồng.
- Trong 1 application có thể có nhiều luồng. Thí dụ chuyển động của 10 đối tượng hiện hành trong 1 trò chơi là một luồng.

Lợi ích của đa luồng:
- Tăng hiệu suất sử dụng CPU: Phần lớn thời gian thực thi của 1 ứng dụng là chờ đợi nhập liệu từ user -> hiệu suất sử dụng CPU chưa hiệu quả.
- Tạo được sự đồng bộ giữa các đối tượng: thí dụ như trong 1 trò chơi, các nhân vật cùng nhau chuyển động.
- Quản lý được thời gian trong các ứng dụng nhu thi online, thời gian chơi một trò chơi.

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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

Câu 3: Lập trình đa luồng trong windows
• Windows sử dụng các hàm trong thư viện Win32 API.
• Ứng dụng Windows vận hành như một tiến trình với 1 hoặc nhiều luồng.
• Bài toán Sản xuất-Tiêu thụ có thể được thực thi bằng Ứng dụng đa luồng (Visual C++ 6.0).
• Nhận độ ưu tiên của luồng bằng hàm: int GetThreadPriority (HANDLE threadHandle)
• Thay đổi độ ưu tiên của luồng bằng hàm:BOOL SetThreadPriority (HANDLE threadHandle, int priority)
Với độ ưu tiên priority:
THREAD_PRIORITY_LOWEST ( -2)
THREAD_PRIORITY_BELOW_NORMAL ( -1)
THREAD_PRIORITY_NORMAL ( 0 )
THREAD_PRIORITY_ABOVE_NORMAL (+1)
THREAD_PRIORITY_HIGHEST (+2)

• Có thể lập trình đa luồng với Visual Basic 6.0:
. Sản xuất – Tiêu thụ
. Animations
. Colors
//

trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

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

Ví dụ về Đa Luồng trong C#


1. Sơ qua về luồng (Thread)

Bài viết này mình sẽ hướng dẫn cho các bạn mới tìm hiểu về đa luồng và ứng dụng của nó và được mô tả trên ngôn ngữ C# cho dễ hiểu. Trước tìm hiểu nó cũng vất vả vì nó khó hiểu giờ muốn giúp chút xíu gì đó cho các bạn (Bạn sẽ cảm thấy vô cùng đơn giản nếu làm việc nhiều với nó, đó chỉ là do kỹ năng của mình yếu lên cảm thấy phức tạp)
Một luồng là một chuỗi liên tiếp những sự thực thi (mã lệnh hay câu lệnh) trong chương trình (ứng dụng). Trong một chương trình C#, dễ thấy việc thực thi được bắt đầu bằng phương thức main() và tiếp tục cho đến khi kết thúc hàm main(). Cấu trúc này rất hay cho những chương trình có một chuỗi xác định những nhiệm vụ liên tiếp, nhưng thường thì trong một chương trình ứng có nhiều hơn một công việc vào cùng một lúc. Một ví dụ rất hay và khá thực tế mà mình thấy trên diễn đàn tin học của "can_qua", các bạn cùng tham khảo

Vấn đề quan trọng là bạn phải tìm ra một cách nào đó để chia một công việc lớn thành những công việc nhỏ mà trong đó có những việc có thể thực hiện một cách đồng thời. Ví dụ, mẹ giao việc cho con là "làm việc xong mới được đi coi xi-nê". "Công việc lớn" này có thể gồm 3 việc nhỏ "quét nhà", "rửa chén", và đi coi "xi-nê". Trong đó chỉ được "coi xi-nê" sau khi làm xong hai việc kia. Rõ ràng là bạn muốn làm xong việc nhà càng sớm càng tốt để vi vút, nên bạn kêu thằng em bạn quét nhà, bạn thì rửa chén, cả hai người cùng làm đồng thời. Rửa chén xong trước, bạn phải đợi thằng em bạn thông báo là quét nhà cũng xong thì bạn mới vù đi coi xi-nê được. Như vậy multithread cho "rửa chén" và "quét nhà" làm tăng hiệu suất thực hiện công việc của bạn (so với việc bạn làm tuần tự rửa chén, quét nhà, coi xi-nê).

2. Ví dụ nhỏ về đa luồng
Ví dụ này mình sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc.
Ở đây thì bạn cứ tưởng tượng ra rằng có hai thằng tên là A và B thi đếm từ 0 cho đến 100, thằng nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một thằng).
CODE:
void A()
{
for(int i=0; i<=100; i++)
{
Console.WriteLine(i.ToString());
}
Console.WriteLine("A đã đọc xong"); // Báo cáo đã đọc xong
}

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


Bây giờ thầy giáo (hoặc là bạn) bỗng cao hứng gọi 2 thằng lên thi đọc --> 2 thằng A và B cùng đọc Đến đây trong phương thức hàm main() của chương trình bạn sẽ phải gọi 2 thằng này

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

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

// Bắt đầu bấm giờ
tA.Start();
tB.Start();
tA.Join();
tB.Join();
// Hai thằng tranh nhau đếm
Console.WriteLine("Cuộc thi kết thúc"); // Chờ đến khi 2 thằng đọc xong, không biết thằng nào sẽ thắng Very Happy
Console.ReadLine();
}

// Thư viện tham chiếu nằm trong namespace System.Threading;
// Bạn cần khai báo sử dụng nó using Sytem.Threading;

Truyền tham số cho Thread
Có nhiều cách truyền tham số, tuỳ theo nhu cầu mà dùng sao cho phù hợp
Thông qua phương thức Start(object) thì bạn có thể truyền tham số theo cách này.
Ví dụ:
CODE:
using System;
using System.Threading;
class ThreadSample
{
public static void Main()
{
Thread newThread = new Thread(ThreadSample.DoWork);
newThread.Start(100); // Dữ liệu truyền vào là một số nguyên

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

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

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

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

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

}

Đôi khi ta cũng sử dụng ThreadPool cho việc khởi chạy một luồng mới với tham số là _Param
CODE:
ThreadPool.QueueUserWorkItem(new WaitCallback(_ThreadProc), _Param);

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

Chờ đợi một luồng khác
Bằng việc sử dụng phương thức Join(); ta có thể cho phép chờ đợi một luồng khác thực hiện xong (để thu thập dữ liệu chẳng hạn - do chia nhỏ công việc mà), thì luồng đã gọi nó mới tiếp tục được công việc của nó
CODE:

static void Main(string[] args)
{
Console.WriteLine("Main thread: Gọi luồng thứ 2 ThreadProc()...");

Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();

for (int i = 0; i < 50; i++)
{
Console.WriteLine("Main thread: Do Some Work.");
Thread.Sleep(0);
}

Console.WriteLine("Main thread finished: And call t.Join()");
Console.WriteLine("Main thread tạm thời đang được dừng lại");
t.Join(); // Dừng tại đây

// Sau khi ThreadProc hoàn tất Main thread tiếp tục công việc của nó
// Tiếp tục thực thi 3 dòng lệnh tiếp theo
Console.WriteLine("Thread.Join() has returned.");
Console.WriteLine("Main đã làm xong việc");
Console.ReadLine();
}

public static void ThreadProc()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("ThreadProc: {0}", i);
Thread.Sleep(0);
}
}


Đối số cho Join() có thể là int hoặc TimeSpan, khoảng thời gian giới hạn mà Main thread có thể chờ được, ví dụ
CODE:
t.Join(10000);

nghĩa là, sau 10s mà ThreadProc chưa làm xong việc của nó thì Main thread không chờ nữa, tiếp tục công việc khác

trantrungnam-HC11TH2A

Tổng số bài gửi: 59
Join date: 20/02/2012
Age: 22
Đến từ: binh phuoc



trinhquangtrong91 (113a)

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

Về Đầu Trang Go down

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

Bài gửi  Sponsored content


Sponsored content


Về Đầu Trang Go down

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

Về Đầu Trang

- Similar topics

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