Thảo luận Bài 5
+72
LeThanhQuang (I22B)
NguyenTrongTinh(I22A)
MaiNguyenThanhLong(I22A)
QuangMinhTuan(I22B)
NguyenThiMai(I22A)
NguyenThiNgocPhuoc(122A)
LeNgocTung (I22A)
LETHIANHDAO48(I22B)
lekhanhhoa(I22B)
NguyenVanQuoc (I22B)
HaTrungMinhPhuc(I22B)
NguyenBaoLoc70(I22A)
PhamThiThao (I22B)
DuongKhanhThanh(I22B)
nguyenhoanglam_I22B
phungvanduong24(I12A)
tranngochuy(I22B)
NguyenCaoDuong(I22B)
phanthanhcan(I22A)
DuongTrungQuan
tranvanminh82(I22A)
NguyenKhanhDuy18 (I22B)
TranQuangTien(I22A)
NguyenNgocDan(I22B)
TrỉnhToQuyen(I12A)
vivanbieu(I22B)
VanNhatDongGiang(I22A)
NguyenVanSang(I22A)
TranThienTam (I22A)
NguyenPhuongNhu(I22B)
HuynhHuuTai(I22A)
Dao Duy Thanh(I22B)
NguyenVanTu(I22A)
dangvannhan(I22A)
NguyenVanPhat(I22B)
TruongTranThanhTu(I22B)
VoMinhThang(I22B)
VoMinhDien(I22B)
MaiXuanSon (I22B)
NguyenHuuMinh80(I22B)
dangthihoangly(I12A)
NguyenTienDat (I22A)
truongtph.i11c
NguyenHoangThien(I22B)
TranDangKhoa(I22A)
LeThiKimNgan67(I11C)
TranVuSang (I22B)
HongGiaPhu (I22A)
BuiTrongHung41(I11C)
NgT.KimHuyen(I22A)
PhamXuanThieu (I22A)
LêAnhNgữ(I22A)
nguyenthithutrang (I11C)
PhamQuocCuong (I22A)
NguyenHuuThien159 (I22B)
BuiThucTuan(I22B)
cat
NguyenBacHoi(I22B)
NguyenNhatHuy64(I22B)
LeAnhToan48(I22B)
NguyenTanDat(I22B)
dangmonghai(I12A)
NguyenManhHuy(I22B)
NgoVanTuyen(I22B)
NguyenHoangKimVu (I11C)
ChauQuangCam (I22B)
NguyenQuocHuy (I22B)
NguyenQuangHuy(I22B)
NguyenThanhQuoc(I22A)
HuynhDucQuang(I22B)
HoangThanhThien(I22B)
Admin
76 posters
Trang 5 trong tổng số 8 trang
Trang 5 trong tổng số 8 trang • 1, 2, 3, 4, 5, 6, 7, 8
Lập trình đa luồng với C# (tiếp theo)
Bây giờ ta sẽ thử xử lý tất cả exception có thể có của Sleep()
using System;
using System.Threading;
using System.Security;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
try {
Thread.Sleep(1);
}
catch (ArgumentException ae) {
Console.WriteLine(ae.ToString() );
}
catch (ThreadInterruptedException tie) {
Console.WriteLine(tie.ToString() );
}
catch (SecurityException se) {
Console.WriteLine(se.ToString() );
}
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
}
}
Chương trình này xử lý 3 exception. Hãy xem dòng đầu tiên. Ở đây có 1 namespace khác là: System.Security. Lớp SecurityException được định nghĩa trong namespace này.
We have to get the reference of the thread in our thread function to get the name of the thread. We can get the current thread name by using CurrentThread. CurrentThread is a static property of the Thread class. This property throws only one exception: SecurityException when the caller doesn’t have appropriate Security Permissions.
Ta phải lấy tên của luồng hiện hành bằng cách dùng thuộc tính CurrentThread. CurrentThread là 1 thuộc tính tĩnh của lớp Thread. Thuộc tính này chỉ quăng 1 exception: SecurityException khi lời gọi hàm không có Security Permissions thích hợp
using System;
using System.Threading;
using System.Security;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
try {
Thread.Sleep(1);
}
catch (ArgumentException ae) {
Console.WriteLine(ae.ToString() );
}
catch (ThreadInterruptedException tie) {
Console.WriteLine(tie.ToString() );
}
catch (SecurityException se) {
Console.WriteLine(se.ToString() );
}
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
}
}
Chương trình này xử lý 3 exception. Hãy xem dòng đầu tiên. Ở đây có 1 namespace khác là: System.Security. Lớp SecurityException được định nghĩa trong namespace này.
We have to get the reference of the thread in our thread function to get the name of the thread. We can get the current thread name by using CurrentThread. CurrentThread is a static property of the Thread class. This property throws only one exception: SecurityException when the caller doesn’t have appropriate Security Permissions.
Ta phải lấy tên của luồng hiện hành bằng cách dùng thuộc tính CurrentThread. CurrentThread là 1 thuộc tính tĩnh của lớp Thread. Thuộc tính này chỉ quăng 1 exception: SecurityException khi lời gọi hàm không có Security Permissions thích hợp
NguyenHoangThien(I22B)- Tổng số bài gửi : 38
Join date : 15/03/2013
Lập trình đa luồng với C# (tiếp theo)
Bây giờ ta sẽ thử xử lý tất cả exception có thể có của Sleep()
using System;
using System.Threading;
using System.Security;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
try {
Thread.Sleep(1);
}
catch (ArgumentException ae) {
Console.WriteLine(ae.ToString() );
}
catch (ThreadInterruptedException tie) {
Console.WriteLine(tie.ToString() );
}
catch (SecurityException se) {
Console.WriteLine(se.ToString() );
}
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
}
}
Chương trình này xử lý 3 exception. Hãy xem dòng đầu tiên. Ở đây có 1 namespace khác là: System.Security. Lớp SecurityException được định nghĩa trong namespace này.
We have to get the reference of the thread in our thread function to get the name of the thread. We can get the current thread name by using CurrentThread. CurrentThread is a static property of the Thread class. This property throws only one exception: SecurityException when the caller doesn’t have appropriate Security Permissions.
Ta phải lấy tên của luồng hiện hành bằng cách dùng thuộc tính CurrentThread. CurrentThread là 1 thuộc tính tĩnh của lớp Thread. Thuộc tính này chỉ quăng 1 exception: SecurityException khi lời gọi hàm không có Security Permissions thích hợp
Kết quả:
Before start thread
Thread 1=0
Thread 2=0
Thread 1=1
Thread 2=1
Thread 1=2
Thread 2=2
Thread 1=3
Thread 2=3
Thread 1=4
Thread 2=4
Thread 1=5
Thread 2=5
Thread 1=6
Thread 2=6
Thread 1=7
Thread 2=7
Thread 1=8
Thread 2=8
Thread 1=9
Thread 2=9
Có 2 phương thức để hủy luồng là Stop() và Abort(). Abort() có 2 phương thức chồng tên. 1 phương thức thực thi không cần tham số và 1 phương thức cần 1 tham số là 1 đối tượng. Abort() quăng ThreadAbortException(), exception này không bắt được
using System;
using System.Threading;
using System.Security;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
try {
Thread.Sleep(1);
}
catch (ArgumentException ae) {
Console.WriteLine(ae.ToString() );
}
catch (ThreadInterruptedException tie) {
Console.WriteLine(tie.ToString() );
}
catch (SecurityException se) {
Console.WriteLine(se.ToString() );
}
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
}
}
Chương trình này xử lý 3 exception. Hãy xem dòng đầu tiên. Ở đây có 1 namespace khác là: System.Security. Lớp SecurityException được định nghĩa trong namespace này.
We have to get the reference of the thread in our thread function to get the name of the thread. We can get the current thread name by using CurrentThread. CurrentThread is a static property of the Thread class. This property throws only one exception: SecurityException when the caller doesn’t have appropriate Security Permissions.
Ta phải lấy tên của luồng hiện hành bằng cách dùng thuộc tính CurrentThread. CurrentThread là 1 thuộc tính tĩnh của lớp Thread. Thuộc tính này chỉ quăng 1 exception: SecurityException khi lời gọi hàm không có Security Permissions thích hợp
Kết quả:
Before start thread
Thread 1=0
Thread 2=0
Thread 1=1
Thread 2=1
Thread 1=2
Thread 2=2
Thread 1=3
Thread 2=3
Thread 1=4
Thread 2=4
Thread 1=5
Thread 2=5
Thread 1=6
Thread 2=6
Thread 1=7
Thread 2=7
Thread 1=8
Thread 2=8
Thread 1=9
Thread 2=9
Có 2 phương thức để hủy luồng là Stop() và Abort(). Abort() có 2 phương thức chồng tên. 1 phương thức thực thi không cần tham số và 1 phương thức cần 1 tham số là 1 đối tượng. Abort() quăng ThreadAbortException(), exception này không bắt được
NguyenHoangThien(I22B)- Tổng số bài gửi : 38
Join date : 15/03/2013
Lập trình đa luồng với C# (tiếp theo)
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
try {
Thread.Sleep(1);
}
catch (ArgumentException ae) {
Console.WriteLine(ae.ToString() );
}
catch (ThreadInterruptedException tie) {
Console.WriteLine(tie.ToString() );
}
catch (SecurityException se) {
Console.WriteLine(se.ToString() );
}
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
try {
tid1.Abort(); //hủy luồng
tid2.Abort(); //hủy luồng
}
catch (ThreadAbortException tae) {
Console.WriteLine(tae.ToString() );
}
Console.WriteLine("End of Main");
}
}
Kết quả:
Before start Thread
End of Main
Không có luồng nào được thực thi. Khi 1 luồng bị hủy nó sẽ không được tạo lại.
Collapse | Copy Code
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
tid1.Abort();
tid2.Abort();
Console.WriteLine("After Abort");
tid1.Start();
tid2.Start();
Console.WriteLine("End of Main");
}
}
Chương trình này quăng System.Threading.ThreadStateException. Bây giờ hãy thử bắt exception này và đóng chương trình sau khi nó bị hủy 1 cách bất thường
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
tid1.Abort();
tid2.Abort();
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
Console.WriteLine("End of Main");
}
}
Ở đây ta bắt ThreadStatException và dùng phương thức ToString của lớp này. Phương thức ToString trả về tên đầy đủ của exception, và có thể 1 thông báo lỗi, tên của nội exception và stack trace.
Ta có thể đợi để hủy luồng bằng cách dùng phương thức Join. phương thức này có 3 phương thức chồng tên. 1 phương thức không tham số đợi khi luồng chết, 1 phương thức nhận tham số kiểu int và đợi luồng chết hoặc 1 khoảng thời gian xác định để hủy, 1 phương thức nhận tham chiếu là 1 đối tượng của TimeSpan.
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
try {
Thread.Sleep(1);
}
catch (ArgumentException ae) {
Console.WriteLine(ae.ToString() );
}
catch (ThreadInterruptedException tie) {
Console.WriteLine(tie.ToString() );
}
catch (SecurityException se) {
Console.WriteLine(se.ToString() );
}
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
try {
tid1.Abort(); //hủy luồng
tid2.Abort(); //hủy luồng
}
catch (ThreadAbortException tae) {
Console.WriteLine(tae.ToString() );
}
Console.WriteLine("End of Main");
}
}
Kết quả:
Before start Thread
End of Main
Không có luồng nào được thực thi. Khi 1 luồng bị hủy nó sẽ không được tạo lại.
Collapse | Copy Code
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Start();
tid2.Start();
tid1.Abort();
tid2.Abort();
Console.WriteLine("After Abort");
tid1.Start();
tid2.Start();
Console.WriteLine("End of Main");
}
}
Chương trình này quăng System.Threading.ThreadStateException. Bây giờ hãy thử bắt exception này và đóng chương trình sau khi nó bị hủy 1 cách bất thường
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
tid1.Abort();
tid2.Abort();
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
Console.WriteLine("End of Main");
}
}
Ở đây ta bắt ThreadStatException và dùng phương thức ToString của lớp này. Phương thức ToString trả về tên đầy đủ của exception, và có thể 1 thông báo lỗi, tên của nội exception và stack trace.
Ta có thể đợi để hủy luồng bằng cách dùng phương thức Join. phương thức này có 3 phương thức chồng tên. 1 phương thức không tham số đợi khi luồng chết, 1 phương thức nhận tham số kiểu int và đợi luồng chết hoặc 1 khoảng thời gian xác định để hủy, 1 phương thức nhận tham chiếu là 1 đối tượng của TimeSpan.
NguyenHoangThien(I22B)- Tổng số bài gửi : 38
Join date : 15/03/2013
Lập trình đa luồng với C# (tiếp theo)
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
tid1.Join();
tid2.Join(new TimeSpan(0, 0, 1) );
Console.WriteLine("End of Main");
}
}
Bây giờ chương trình đợi luồng đầu tiên thực thi xong và đợi luồng thứ 2 trong 1 giây.
Luồng có thể được thực thi bằng 2 cách: chạy nổi hoặc chạy ngầm. Một luồng ngầm được hoàn tất khi ứng dụng đóng lại, và mặt khác một luồng nổi không đợi đến khi ứng dụng đóng lại mới kết thúc. Chúng ta có thể thiết lập sự thực thi của luồng bằng thuộc tính IsBackground. Chương trình sau đây cho thấy cách sử dụng thuộc tính IsBackground.
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.IsBackground = true;
tid2.IsBackground = true;
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
Thread.Sleep(10);
Console.WriteLine("End of Main");
}
}
Kết quả là:
Before start thread
Thread 1=0
Thread 2=0
Thread 1=1
Thread 2=1
End of Main
Kết quả này cho thấy khii ứng dụng đóng lại cả 2 luồng ngầm đều kết thúc.
Chúng ta có thể gán độ ưu tiên cho luồng bằng cách dùng phương thức ThreadPriority của lớp Thread.
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
tid1.Join();
tid2.Join(new TimeSpan(0, 0, 1) );
Console.WriteLine("End of Main");
}
}
Bây giờ chương trình đợi luồng đầu tiên thực thi xong và đợi luồng thứ 2 trong 1 giây.
Luồng có thể được thực thi bằng 2 cách: chạy nổi hoặc chạy ngầm. Một luồng ngầm được hoàn tất khi ứng dụng đóng lại, và mặt khác một luồng nổi không đợi đến khi ứng dụng đóng lại mới kết thúc. Chúng ta có thể thiết lập sự thực thi của luồng bằng thuộc tính IsBackground. Chương trình sau đây cho thấy cách sử dụng thuộc tính IsBackground.
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.IsBackground = true;
tid2.IsBackground = true;
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
Thread.Sleep(10);
Console.WriteLine("End of Main");
}
}
Kết quả là:
Before start thread
Thread 1=0
Thread 2=0
Thread 1=1
Thread 2=1
End of Main
Kết quả này cho thấy khii ứng dụng đóng lại cả 2 luồng ngầm đều kết thúc.
Chúng ta có thể gán độ ưu tiên cho luồng bằng cách dùng phương thức ThreadPriority của lớp Thread.
NguyenHoangThien(I22B)- Tổng số bài gửi : 38
Join date : 15/03/2013
Lập trình đa luồng với C# (tiếp theo)
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Priority = ThreadPriority.Highest;
tid2.Priority = ThreadPriority.Lowest;
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
tid1.Join();
tid2.Join();
Console.WriteLine("End of Main");
}
}
Độ ưu tiên của thread1 là Highest và thread2 là Lowest. Những mức độ ưu tiên khác là AboveNormal, BelowNormal và Normal.
Phương thức GetDomain() trả về tên của tâp tin mà trong đó luồng đang chạy. Đây là 1 phương thức tĩnh nên ta dùng nó với tên lớp.
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
Console.WriteLine(Thread.GetDomain() );
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(i);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
tid1.Start();
}
}
Kết quả là:
Before start thread
Name: prog16.exe
No context policies.
0
1
2
3
4
5
6
7
8
9
Nguồn: codeproject.com
using System.Threading;
public class MyThread {
public void Thread1() {
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(thr.Name + "=" + i);
Thread.Sleep(1);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
MyThread thr2 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );
tid1.Name = "Thread 1";
tid2.Name = "Thread 2";
tid1.Priority = ThreadPriority.Highest;
tid2.Priority = ThreadPriority.Lowest;
try {
tid1.Start();
tid2.Start();
}
catch (ThreadStateException te) {
Console.WriteLine(te.ToString() );
}
tid1.Join();
tid2.Join();
Console.WriteLine("End of Main");
}
}
Độ ưu tiên của thread1 là Highest và thread2 là Lowest. Những mức độ ưu tiên khác là AboveNormal, BelowNormal và Normal.
Phương thức GetDomain() trả về tên của tâp tin mà trong đó luồng đang chạy. Đây là 1 phương thức tĩnh nên ta dùng nó với tên lớp.
using System;
using System.Threading;
public class MyThread {
public void Thread1() {
Console.WriteLine(Thread.GetDomain() );
for (int i = 0; i < 10; i++) {
Thread thr = Thread.CurrentThread;
Console.WriteLine(i);
}
}
}
public class MyClass {
public static void Main() {
Console.WriteLine("Before start thread");
MyThread thr1 = new MyThread();
Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
tid1.Start();
}
}
Kết quả là:
Before start thread
Name: prog16.exe
No context policies.
0
1
2
3
4
5
6
7
8
9
Nguồn: codeproject.com
NguyenHoangThien(I22B)- Tổng số bài gửi : 38
Join date : 15/03/2013
Ví dụ luồng và tiến trình
Mình đóng góp một ví dụ về luồng và tiến trình trong công ty mình
* Luồng:
Ví dụ: Dự án triển khai phần mềm ERP là một tiến trình. Trong dự án sẽ có một anh quản lý dự án đó(đơn luồng) và các kỉ sư(đa luồng) sẽ thực hiện công việc do anh trưởng dự án phân công
* Tiến trình:
Ví dụ: Dự án đang tiến hành là một tiến trình
* Luồng:
Ví dụ: Dự án triển khai phần mềm ERP là một tiến trình. Trong dự án sẽ có một anh quản lý dự án đó(đơn luồng) và các kỉ sư(đa luồng) sẽ thực hiện công việc do anh trưởng dự án phân công
* Tiến trình:
Ví dụ: Dự án đang tiến hành là một tiến trình
NguyenVanSang(I22A)- Tổng số bài gửi : 14
Join date : 13/03/2013
Nguyên lý tập luồng
Tập luồng (Thread Pools):
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha (ví dụ Web Server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong, luồng được đưa trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
VD:Trong quân đội luôn có 1 chỉ huy (tiến trình cha) và một đội binh (tập luồng). Các binh sĩ luôn được trang bị vũ trang đầy đủ, tất cả đều đang ngủ nhưng luôn sẵn sàng để chiến đấu (sẵn sàng chờ công việc). Khi có địch đến xâm nhập thì binh sĩ sẽ được điều ra đánh trận, sau khi đánh trận xong thì binh sĩ lại trở về ngủ
- Tiến trình cha tạo lập sẵn một tập luồng khi khởi động.
- Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
- Khi tiến trình cha (ví dụ Web Server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
- Phục vụ xong, luồng được đưa trả về tập luồng.
- Nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
VD:Trong quân đội luôn có 1 chỉ huy (tiến trình cha) và một đội binh (tập luồng). Các binh sĩ luôn được trang bị vũ trang đầy đủ, tất cả đều đang ngủ nhưng luôn sẵn sàng để chiến đấu (sẵn sàng chờ công việc). Khi có địch đến xâm nhập thì binh sĩ sẽ được điều ra đánh trận, sau khi đánh trận xong thì binh sĩ lại trở về ngủ
NguyenVanTu(I22A)- Tổng số bài gửi : 23
Join date : 12/03/2013
Trình bày mục đích đồng bộ hóa công việc các tiến trình.Cho ví dụ minh họa?
1/ Đồng bộ hóa tiến trình bao gồm:
+ Đồng bộ hóa cá tiến trình heavy với nhau.
+ Đồng bộ hóa cá tiến trình nhẹ.
+ Đồng bộ hó cá luồng bên trong tiến trình này với tiến trình khác.
Vì sao phải đồng bộ hóa tiến trình: Trong hệ thống có nhiều luồng hay tiến trình nhưng tài nguyên dùng chung thì chỉ có khả năng phục vụ vô hạn. Mà lại có nhiều tiến trình cần sử dụng tài nguyên này. Dẫn đến xung đột bế tắc, deadlock.
g
Mục đích: là giúp các tiến trình làm việc có trật tự, có trước có sau và có chờ lẫn nhau. Đồng thời tránh được deadlock.
VD: B đến rũ A đi chơi nhưng A đang bận làm 1 số việc. B muốn đi chơi với A thì phải chờ A làm xong hết mọi việc.
VD: Mỗi người trong lớp là 1 luồng nhẹ, 1 lớp là tiến trình heavy. Thầy gọi 1 số bạn lên bảng. Mọ người phải trật tự lên bảng từng người 1. Thấy là tiến trình hệ thống quản lý cá luồng này. Bạn nào muốn lên bảng phải chờ bạn lên trước làm xong thì mới được lên.
+ Đồng bộ hóa cá tiến trình heavy với nhau.
+ Đồng bộ hóa cá tiến trình nhẹ.
+ Đồng bộ hó cá luồng bên trong tiến trình này với tiến trình khác.
Vì sao phải đồng bộ hóa tiến trình: Trong hệ thống có nhiều luồng hay tiến trình nhưng tài nguyên dùng chung thì chỉ có khả năng phục vụ vô hạn. Mà lại có nhiều tiến trình cần sử dụng tài nguyên này. Dẫn đến xung đột bế tắc, deadlock.
g
Mục đích: là giúp các tiến trình làm việc có trật tự, có trước có sau và có chờ lẫn nhau. Đồng thời tránh được deadlock.
VD: B đến rũ A đi chơi nhưng A đang bận làm 1 số việc. B muốn đi chơi với A thì phải chờ A làm xong hết mọi việc.
VD: Mỗi người trong lớp là 1 luồng nhẹ, 1 lớp là tiến trình heavy. Thầy gọi 1 số bạn lên bảng. Mọ người phải trật tự lên bảng từng người 1. Thấy là tiến trình hệ thống quản lý cá luồng này. Bạn nào muốn lên bảng phải chờ bạn lên trước làm xong thì mới được lên.
NguyenVanTu(I22A)- Tổng số bài gửi : 23
Join date : 12/03/2013
So sánh điểm giống nhau và khác nhau của luồng với tiến trình.
SO SÁNH ĐIỂM GIỐNG NHAU & KHÁC NHAU GIỮA TIẾN TRÌNH VÀ LUỒNG
Giống nhau :
1. Đều có thông tin trạng thái
2. Luồng còn được gọi là tiến trình nhẹ
3. Nhiều luồng hay nhiều tiến trình có thể liên quan đến một chương trình
4. Chia sẻ tài nguyên cho nhau
5. Tăng tốc tính toán
6. Đảm bảo tính đơn thể
Khác nhau:
1. 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 đồ dùng trong gia đình thì dể hơn mượn của hàng xóm
2. Do luồng chung tài nguyên với cha & các luồng khác nên việc tạo lập & chuyển ngữ cảnh cũng
nhanh hơn tiến trình
VD : Việc ngăn riêng ra một phòng trong nhà thì nhanh hơn là mua một căn nhà mới.
3. Cấp phát bộ nhớ & tài nguyên cho tiến trình thì tốn kém hơn luồng
4. Lập trình đa luồng thì dể hơn đa tiến trình
Giống nhau :
1. Đều có thông tin trạng thái
2. Luồng còn được gọi là tiến trình nhẹ
3. Nhiều luồng hay nhiều tiến trình có thể liên quan đến một chương trình
4. Chia sẻ tài nguyên cho nhau
5. Tăng tốc tính toán
6. Đảm bảo tính đơn thể
Khác nhau:
1. 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 đồ dùng trong gia đình thì dể hơn mượn của hàng xóm
2. Do luồng chung tài nguyên với cha & các luồng khác nên việc tạo lập & chuyển ngữ cảnh cũng
nhanh hơn tiến trình
VD : Việc ngăn riêng ra một phòng trong nhà thì nhanh hơn là mua một căn nhà mới.
3. Cấp phát bộ nhớ & tài nguyên cho tiến trình thì tốn kém hơn luồng
4. Lập trình đa luồng thì dể hơn đa tiến trình
VanNhatDongGiang(I22A)- Tổng số bài gửi : 6
Join date : 12/03/2013
Những lợi ích của công nghệ đa luồng
LỢI ÍCH CỦA CÔNG NGHỆ ĐA LUÔNG
Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
Ví dụ: Các cô ở tổng đài 108 là các luồng. Khi khách hàng điện thoại hỏi 108, 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.
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.
VanNhatDongGiang(I22A)- Tổng số bài gửi : 6
Join date : 12/03/2013
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.
vivanbieu(I22B)- Tổng số bài gửi : 27
Join date : 09/03/2013
Câu 1: Trình bày khái niệm luồng (thread) . Phân tích những lợi ích của công nghệ đa luồng
+Khái niệm luồng:
-Luồng: (Thread) còn gọi là tiến trình nhẹ (LWP- Light weight Process), một đơn vị cơ bản sử dụng CPU.
Luồng có thông tin trạng thái như tiến trình truyền thống (HWP-Heavy Weight Process).
Nhiều luồng có thể dùng chung code với nhau.
-Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
+So sánh luồng và tiến trình truyền thống:
Một tiến trình truyền thống hay tiến trình nặng có một luồng điều khiển đơn.
*giống nhau:
- Đều có thông tin trạng thái
- Luồng cũng là tiến trình nhưng là tiến trình nhẹ (Light Weigh Process)
- Đa luồng hay đa 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ể
- 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
- Do dùng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
- Cấp phát tài nguyên bộ nhớ cho tiến trình khá tốn kém.
- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình.
*Sự khác nhau:
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
- Tạo mới một tiến trình khó hơn tạo mới một luồng.
- Luồng không cần gởi, nhận thông điệp.
- Luồng chuyển đổi ngữ cảnh nhanh và ít chiếm tài nguyên hơn tiến trình.
- Luồng chia sẻ tài nguyên dùng chung dể hơn tiến trình.
Những lợi ích của công nghệ đa luồng:
-khả năng đáp ứng 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: Tổng đài 1088 là nơi chuyên trả lời các thắc mắc của chúng ta. Trong tổng đài có nhiều nhân viên trực điện thoại. Mỗi nhân viên là một luồng(thread), khi một nhân viên bận thì có các nhân viên khác luôn trong tư thế sẵn sàng đáp ứng các nhu cầu cho chúng ta.
-chia sẻ tài nguyên: 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 một 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 một lớp học có thầy giáo và các học sinh. Cả lớp đó là một tiến trình, thầy giáo là luồng chính, các bạn học sinh là luồng phụ cùng học chung một bài học và cách làm việc giống nhau. Các học sinh dùng chung tài nguyên như máy chiếu, bảng, micro,...Việc dùng chung tài nguyên giữa các học sinh trong một lớp thì dễ dàng hơn nhiều so với việc dùng tài nguyên của lớp khác(một tiến trình khác).
-đa luồng sẽ tiết kiệm hơn vì việc tạo mới luồng nhanh hơn: 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 dù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.
-lập trình đa luồng dễ hơn lập trình đa tiến trình vì việc tương tác, truyền thông, liên lạc, dùng chung tài nguyên dễ hơn rất nhiều so với đa tiến trình.
-Luồng: (Thread) còn gọi là tiến trình nhẹ (LWP- Light weight Process), một đơn vị cơ bản sử dụng CPU.
Luồng có thông tin trạng thái như tiến trình truyền thống (HWP-Heavy Weight Process).
Nhiều luồng có thể dùng chung code với nhau.
-Tiến trình có thể có một luồng chính với nhiều luồng phụ. Mỗi luồng có khả năng chia sẻ tài nguyên với các luồng khác trong tiến trình.
+So sánh luồng và tiến trình truyền thống:
Một tiến trình truyền thống hay tiến trình nặng có một luồng điều khiển đơn.
*giống nhau:
- Đều có thông tin trạng thái
- Luồng cũng là tiến trình nhưng là tiến trình nhẹ (Light Weigh Process)
- Đa luồng hay đa 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ể
- 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
- Do dùng chung tài nguyên với luồng cha nên việc tạo lập và chuyển đổi ngữ cảnh cũng nhanh hơn tiến trình
- Cấp phát tài nguyên bộ nhớ cho tiến trình khá tốn kém.
- Lập trình đa luồng thì dễ hơn lập trình đa tiến trình.
*Sự khác nhau:
- Lập trình đa luồng dễ hơn lập trình đa tiến trình.
- Tạo mới một tiến trình khó hơn tạo mới một luồng.
- Luồng không cần gởi, nhận thông điệp.
- Luồng chuyển đổi ngữ cảnh nhanh và ít chiếm tài nguyên hơn tiến trình.
- Luồng chia sẻ tài nguyên dùng chung dể hơn tiến trình.
Những lợi ích của công nghệ đa luồng:
-khả năng đáp ứng 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: Tổng đài 1088 là nơi chuyên trả lời các thắc mắc của chúng ta. Trong tổng đài có nhiều nhân viên trực điện thoại. Mỗi nhân viên là một luồng(thread), khi một nhân viên bận thì có các nhân viên khác luôn trong tư thế sẵn sàng đáp ứng các nhu cầu cho chúng ta.
-chia sẻ tài nguyên: 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 một 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 một lớp học có thầy giáo và các học sinh. Cả lớp đó là một tiến trình, thầy giáo là luồng chính, các bạn học sinh là luồng phụ cùng học chung một bài học và cách làm việc giống nhau. Các học sinh dùng chung tài nguyên như máy chiếu, bảng, micro,...Việc dùng chung tài nguyên giữa các học sinh trong một lớp thì dễ dàng hơn nhiều so với việc dùng tài nguyên của lớp khác(một tiến trình khác).
-đa luồng sẽ tiết kiệm hơn vì việc tạo mới luồng nhanh hơn: 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 dù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.
-lập trình đa luồng dễ hơn lập trình đa tiến trình vì việc tương tác, truyền thông, liên lạc, dùng chung tài nguyên dễ hơn rất nhiều so với đa tiến trình.
vivanbieu(I22B)- Tổng số bài gửi : 27
Join date : 09/03/2013
Lợi ích của đa luồng
* Đả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.
+ 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.
+ 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 đó.
+ 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.
+ 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.
+Lập trình đa luồng dễ dàng hơn lập trình đa tiến trình
- 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.
+ 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.
+ 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 đó.
+ 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.
+ 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.
+Lập trình đa luồng dễ dàng hơn lập trình đa tiến trình
vivanbieu(I22B)- Tổng số bài gửi : 27
Join date : 09/03/2013
Luồng và tiến trình
Luồng:
Là loại tiến trình đặc biệt, nhẹ, nằm trong tiến trình truyền thống.
Là đơn vị được hệ điều hành quản lý.
Cũng là đơn vị cấp phát CPU.
Chuyển ngữ cảnh giữa các luồng nhanh hơn, nhẹ hơn,
Nhiều luồng có thể chung mã với nhau.
Tiến trình:
Là tiến trình nặng.
Bao giờ cũng có 1 luồng chính và nhiều luồng phụ
Là loại tiến trình đặc biệt, nhẹ, nằm trong tiến trình truyền thống.
Là đơn vị được hệ điều hành quản lý.
Cũng là đơn vị cấp phát CPU.
Chuyển ngữ cảnh giữa các luồng nhanh hơn, nhẹ hơn,
Nhiều luồng có thể chung mã với nhau.
Tiến trình:
Là tiến trình nặng.
Bao giờ cũng có 1 luồng chính và nhiều luồng phụ
TrỉnhToQuyen(I12A)- Tổng số bài gửi : 23
Join date : 10/03/2013
Lỡi ích của đ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 (ví dụ, 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:người 1 người thu ngân trong siêu thị đang tính tiền cho khách hàng mặc dù đằng sau còn rất nhiều người khách khác thì trong lúc đó cũng đang có nhiều người thu ngân khác phục vụ cho các khách hàng khác
- 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 một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.
VD:Mẫu csdl quản lí sinh viên trong trường nếu thống nhất dùng chung 1 mẫu thì dễ dàng chỉnh sửa nếu cần thay đổi
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một 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:2 sinh viên cùng phòng học cùng lớp thì nên đi 1 xe máy sẽ đỡ tốn kém hơn là mỗi người đi 1 xe
- 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ể được chạy bởi CPU riêng.
VD:với một CPU đa luồng bạn sẽ thấy sự cải thiện lớn khi xem DVD trong lúc máy vẫn đang chơi game online mà tốc độ không bị ảnh hưởng, bởi vì từng ứng dụng sẽ được gán trên các lõi khác nhau.
VD:người 1 người thu ngân trong siêu thị đang tính tiền cho khách hàng mặc dù đằng sau còn rất nhiều người khách khác thì trong lúc đó cũng đang có nhiều người thu ngân khác phục vụ cho các khách hàng khác
- 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 một vùng địa chỉ, do đó dễ chia sẻ tài nguyên hơn so với trường hợp đa tiến trình.
VD:Mẫu csdl quản lí sinh viên trong trường nếu thống nhất dùng chung 1 mẫu thì dễ dàng chỉnh sửa nếu cần thay đổi
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là một 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:2 sinh viên cùng phòng học cùng lớp thì nên đi 1 xe máy sẽ đỡ tốn kém hơn là mỗi người đi 1 xe
- 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ể được chạy bởi CPU riêng.
VD:với một CPU đa luồng bạn sẽ thấy sự cải thiện lớn khi xem DVD trong lúc máy vẫn đang chơi game online mà tốc độ không bị ảnh hưởng, bởi vì từng ứng dụng sẽ được gán trên các lõi khác nhau.
NguyenNgocDan(I22B)- Tổng số bài gửi : 16
Join date : 11/03/2013
Re: Thảo luận Bài 5
NguyenVanSang(I22A) đã viết:Mình đóng góp một ví dụ về luồng và tiến trình trong công ty mình
* Luồng:
Ví dụ: Dự án triển khai phần mềm ERP là một tiến trình. Trong dự án sẽ có một anh quản lý dự án đó(đơn luồng) và các kỉ sư(đa luồng) sẽ thực hiện công việc do anh trưởng dự án phân công
* Tiến trình:
Ví dụ: Dự án đang tiến hành là một tiến trình
Mình không hiểu anh quản lý dự án (đơn luồng) nghĩa là sao.
Như Thầy đã nói thì, anh quản lý dự án và các kỹ sư là đa luồng rồi. Chỉ có phân biệt ở đây là anh quản lý dự án là luồng chính mà thôi.
NguyenHoangKimVu (I11C)- Tổng số bài gửi : 62
Join date : 25/08/2011
Re: Thảo luận Bài 5
Cho mình hỏi mấy câu sau:
1/ "Một tiến trình có ít nhất một luồng (luồng chính) hoặc có thể có nhiều luồng (một luồng chính và nhiều luồng phụ)" => vậy tiến trình có thể có 2 luồng chính mỗi luồng chính có nhiều luồng phụ đúng không ?
2/ "Các luồng có thể chia sẽ tài nguyên cho luồng khác trong cùng một tiến trình" - "các tiến trình có thể chia sẽ tài nguyên với nhau" => có phải một luồng thuộc tiến trình A có thể chia sẽ tài nguyên với tiến trình B ( không phải luồng thuộc tiến trình B ) phải không ?
3/ "Một tiến trình có thể sinh ra nhiều tiến trình con khi thực hiện ?" => các tiến trình con này có thể chứa nhiều luồng con , hay bản chất các tiến trình con này chính là luồng ?
1/ "Một tiến trình có ít nhất một luồng (luồng chính) hoặc có thể có nhiều luồng (một luồng chính và nhiều luồng phụ)" => vậy tiến trình có thể có 2 luồng chính mỗi luồng chính có nhiều luồng phụ đúng không ?
2/ "Các luồng có thể chia sẽ tài nguyên cho luồng khác trong cùng một tiến trình" - "các tiến trình có thể chia sẽ tài nguyên với nhau" => có phải một luồng thuộc tiến trình A có thể chia sẽ tài nguyên với tiến trình B ( không phải luồng thuộc tiến trình B ) phải không ?
3/ "Một tiến trình có thể sinh ra nhiều tiến trình con khi thực hiện ?" => các tiến trình con này có thể chứa nhiều luồng con , hay bản chất các tiến trình con này chính là luồng ?
TranQuangTien(I22A)- Tổng số bài gửi : 17
Join date : 21/03/2013
Phân biệt khái niệm luồng với tiến trình và những ưu việt của công nghệ đa luồng
* Luồng: là tiến trình nhẹ (Light Weitgh Process), là một đơn vị cơ bản của sự sử dụng CPU, là một dòng điều khiển trong một tiến trình. Nếu tiến trình có nhiều luồng, nó có thể thực hiện nhiều tác vụ tại một thời điểm. các luồng trong một tiến trình chia sẻ với nhau đoạn mã, đoạn dữ liệu và các tài nguyên hệ thống khác như các tệp mở, các tín hiệu.
VD: Lớp học là 1 tiến trình, trong lớp có giảng viên (luồng) và các sinh viên (luồng).
* Tiến trình: là chương trình đang trong thời gian thực hiện (đặt dưới sự quản lí của HĐH). Là một thực thể chủ động của một chương trình, có thời gian sống nhất định. Có nhiều trạng thái và có thể chuyển từ trạng thái này sang trạng thái khác.
VD: Lớp I22B đang học là một tiến trình.
* Giống nhau: Tiến trình và Luồng cùng nói về việc xử lý các dữ liệu và chúng có mối liên hệ chặt chẽ với nhau mỗi thứ làm một vấn đề để khai thác dữ liệu và chúng cùng được sử lý bởi CPU.
* Khác nhau:
+ Tiến trình là một thể chủ động với con trỏ lệnh hay bộ đếm chương trình sẽ xác định chỉ thị lệnh tiếp theo sẽ thực thi và kèm theo các tài nguyên phục vụ cho hoạt động của tiến trình. Các tiến trình hoàn toàn độc lập với nhau chỉ có thể liên lạc thông qua các cơ chế thông tin giữa các tiến trình mà hệ điều hành cung cấp.có thời gian sống nhất định. Có nhiều trạng thái và có thể chuyển từ trạng thái này sang trạng thái khác
+ Luồng chỉ là một phần nhỏ trong tiến trình nó chỉ là các đoạn lệnh được nằm trong tiến trình. Các luồng nằm trong cùng một tiến trình lại chia sẻ một không gian địa chỉ chung điều này có nghĩa là các luồng có thể chia sẻ các biến toàn cục của tiến trình. Một luồng có thể truy xuất đến cả các stack của những luồng khác trong cùng tiến trình.
* Lợi ích của công nghệ đa luồng:
- Khả năng đáp ứng 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: Tổng đài 1080 là 1 hệ thống đa luồng vì có nhiều nhân viên sẵn sàng để trả lời câu hỏi. Khi khách hàng gọi đến tổng đài để hỏi thông tin thì 1 trong số các nhân viên sẽ trả lời, trong khi đó 1 khách hàng khác gọi đến thì sẽ có nhân viên khác trả lời nên sẽ nhanh hơn.
- Khả năng chia sẻ tài nguyên: 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 1 ngôi nhà có các thiết bị như ti vi, quạt, tủ lạnh, ... mọi thành viên trong nhà đều có thể sử dụng.
- Tiết kiệm: 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 nên 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: Khi 1 người trong gia đình lấy vợ và cần có không gian riêng, người trong gia đình sẽ ngăn ra thành 1 phòng riêng cho người đó. Như vậy sẽ đỡ tốn kém hơn khi mua hẳn 1 căn nhà mới.
- 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 vì tương tác, truyền thông và dùng chung tài nguyên giữa các luồng dễ hơn giữa các tiến trình.
VD: Lớp học là 1 tiến trình, trong lớp có giảng viên (luồng) và các sinh viên (luồng).
* Tiến trình: là chương trình đang trong thời gian thực hiện (đặt dưới sự quản lí của HĐH). Là một thực thể chủ động của một chương trình, có thời gian sống nhất định. Có nhiều trạng thái và có thể chuyển từ trạng thái này sang trạng thái khác.
VD: Lớp I22B đang học là một tiến trình.
* Giống nhau: Tiến trình và Luồng cùng nói về việc xử lý các dữ liệu và chúng có mối liên hệ chặt chẽ với nhau mỗi thứ làm một vấn đề để khai thác dữ liệu và chúng cùng được sử lý bởi CPU.
* Khác nhau:
+ Tiến trình là một thể chủ động với con trỏ lệnh hay bộ đếm chương trình sẽ xác định chỉ thị lệnh tiếp theo sẽ thực thi và kèm theo các tài nguyên phục vụ cho hoạt động của tiến trình. Các tiến trình hoàn toàn độc lập với nhau chỉ có thể liên lạc thông qua các cơ chế thông tin giữa các tiến trình mà hệ điều hành cung cấp.có thời gian sống nhất định. Có nhiều trạng thái và có thể chuyển từ trạng thái này sang trạng thái khác
+ Luồng chỉ là một phần nhỏ trong tiến trình nó chỉ là các đoạn lệnh được nằm trong tiến trình. Các luồng nằm trong cùng một tiến trình lại chia sẻ một không gian địa chỉ chung điều này có nghĩa là các luồng có thể chia sẻ các biến toàn cục của tiến trình. Một luồng có thể truy xuất đến cả các stack của những luồng khác trong cùng tiến trình.
* Lợi ích của công nghệ đa luồng:
- Khả năng đáp ứng 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: Tổng đài 1080 là 1 hệ thống đa luồng vì có nhiều nhân viên sẵn sàng để trả lời câu hỏi. Khi khách hàng gọi đến tổng đài để hỏi thông tin thì 1 trong số các nhân viên sẽ trả lời, trong khi đó 1 khách hàng khác gọi đến thì sẽ có nhân viên khác trả lời nên sẽ nhanh hơn.
- Khả năng chia sẻ tài nguyên: 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 1 ngôi nhà có các thiết bị như ti vi, quạt, tủ lạnh, ... mọi thành viên trong nhà đều có thể sử dụng.
- Tiết kiệm: 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 nên 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: Khi 1 người trong gia đình lấy vợ và cần có không gian riêng, người trong gia đình sẽ ngăn ra thành 1 phòng riêng cho người đó. Như vậy sẽ đỡ tốn kém hơn khi mua hẳn 1 căn nhà mới.
- 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 vì tương tác, truyền thông và dùng chung tài nguyên giữa các luồng dễ hơn giữa các tiến trình.
Được sửa bởi NguyenKhanhDuy18 (I22B) ngày 28/3/2013, 10:24; sửa lần 1.
NguyenKhanhDuy18 (I22B)- Tổng số bài gửi : 13
Join date : 10/03/2013
Lợi ích của đa luồng (Thread)
Khả năng đáp ứng (Responsiveness) tốt hơn: Trong khi một luồng bị ách hoặc quá bận, luồng khác vẫn vận hành bình thường (Luồng chính của trình duyệt vẫn tương tác với người dùng trong khi dữ liệu được lấy về).
- Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
- Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng
VD: Cô trực điện thoại ở tổng đài, nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
VD: Một trình phục vụ web chấp nhận các yêu cầu khách hàng như trang web, hình ảnh, âm thanh, ..Một trình phục vụ web có thể có nhiều (hàng trăm) khách hàng truy xuất đồng thời nó. Nếu trình phục vụ web chạy như một quá trình đơn luồng truyền thống thì nó sẽ có thể chỉ phục vụ một khách hàng tại cùng thời điểm. Lượng thời gian mà khách hàng phải chờ yêu cầu của nó được phục vụ là rất lớn.
- Chia sẻ tài nguyên (Resource Sharing): Theo mặc định, các luồng có thể dùng chung bộ nhớ và tài nguyên của luồng cha. Vài luồng cùng vận hành trong 1 vùng địa chỉ, do đó dễ dùng chung tài nguyên hơn so với trường hợp đa tiến trình.
- Tiết kiệm (Economy): Cấp phát bộ nhớ và tài nguyên cho tiến trình là công việc tốn kém. Do luồng chung tài nguyên với cha và các luồng khác, việc tạo lập và chuyển ngữ cảnh cũng nhanh hơn (Solaris 2: Tạo tiến trình chậm hơn 30 lần, Chuyển ngữ cảnh chậm hơn 5 lần).
- Tận dụng được thế mạnh của kiến trúc đa xử lý: Đa luồng làm tăng tính song song trên hệ máy nhiều CPU. Mỗi luồng có thể chạy bởi CPU riêng
VD: Cô trực điện thoại ở tổng đài, nếu chỉ có 1 cô phải trực 10 máy điện thoại thì khi chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tốt nhưng khi có khoảng 3 cuộc điện thoại trở lên thì cô không thể trả lời được kịp hết.
Nếu có nhiều cô cùng trực điện thoại thì lúc đó sẽ tốt hơn, đáp ứng được nhu cầu của khách hàng khi họ gọi đến .
VD: Một trình phục vụ web chấp nhận các yêu cầu khách hàng như trang web, hình ảnh, âm thanh, ..Một trình phục vụ web có thể có nhiều (hàng trăm) khách hàng truy xuất đồng thời nó. Nếu trình phục vụ web chạy như một quá trình đơn luồng truyền thống thì nó sẽ có thể chỉ phục vụ một khách hàng tại cùng thời điểm. Lượng thời gian mà khách hàng phải chờ yêu cầu của nó được phục vụ là rất lớn.
tranvanminh82(I22A)- Tổng số bài gửi : 11
Join date : 10/03/2013
Age : 36
nguyên lý tập luồng
Tập luồng(Thread Pools)
-tiến trình cha tạo lập sẵn một tập luồng khi khời động.
-Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
-Khi tiến trình cha(vd web server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
-Phục vụ xong, luồng được trả về tập luồng.
-nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
-tiến trình cha tạo lập sẵn một tập luồng khi khời động.
-Các luồng trong tập luồng luôn sẵn sàng chờ công việc.
-Khi tiến trình cha(vd web server) nhận thêm một yêu cầu, một luồng được đánh thức và đưa vào vận hành.
-Phục vụ xong, luồng được trả về tập luồng.
-nếu số yêu cầu lớn hơn số luồng trong tập, tiến trình cha chờ đến khi có luồng được giải phóng.
tranvanminh82(I22A)- Tổng số bài gửi : 11
Join date : 10/03/2013
Age : 36
Một số thông tin thêm về đa luồng VÀ các trạng thái của luồng
Một số thông tin thêm về đa luồng
- Hỗ trợ luồng được cung cấp hoặc ở cấp người dùng, cho các luồng người dùng hoặc ở cấp nhân, cho các luồng nhân như sau:
• Luồng người dùng: được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng tại cấp người dùng. Thư viện cung cấp hỗ trợ cho việc tạo luồng, lập thời biểu, và quản lý mà không có sự hỗ trợ từ nhân. Vì nhân không biết các luồng cấp người dùng, tất cả việc tạo luồng và lập thời biểu được thực hiện trong không gian người dùng mà không cần sự can thiệp của nhân. Do đó, các luồng cấp người dùng thường tạo và quản lý nhanh, tuy nhiên chúng cũng có những trở ngại. Thí dụ, nếu nhân là đơn luồng thì bất cứ luồng cấp người dùng thực hiện một lời gọi hệ thống nghẽn sẽ làm cho toàn bộ quá trình bị nghẽn, thậm chí nếu các luồng khác sẳn dùng để chạy trong ứng dụng. Các thư viện luồng người dùng gồm các luồng POSIX Pthreads, Mach C-threads và Solaris 2 UI-threads.
• Luồng nhân: được hỗ trợ trực tiếp bởi hệ điều hành. Nhân thực hiện việc tạo luồng, lập thời biểu, và quản lý không gian nhân. Vì quản lý luồng được thực hiện bởi hệ điều hành, luồng nhân thường tạo và quản lý chậm hơn luồng người dùng. Tuy nhiên, vì nhân được quản lý các luồng nếu một luồng thực hiện lời gọi hệ thống nghẽn, nhân có thể lập thời biểu một luồng khác trong ứng dụng thực thi. Trong môi trường đa xử lý, nhân có thể lập thời biểu luồng trên một bộ xử lý khác. Hầu hết các hệ điều hành hiện nay như Windows NT, Windows 2000, Solaris 2, BeOS và Tru64 UNIX (trước Digital UNIX)-hỗ trợ các luồng nhân.
Các trạng thái của luồng
-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
-Blocked : luồng đang đợi tài nguyên để tiếp tục hoặc bị 1 sự kiện của hệ thống
chặn ngang
- Hỗ trợ luồng được cung cấp hoặc ở cấp người dùng, cho các luồng người dùng hoặc ở cấp nhân, cho các luồng nhân như sau:
• Luồng người dùng: được hỗ trợ dưới nhân và được cài đặt bởi thư viện luồng tại cấp người dùng. Thư viện cung cấp hỗ trợ cho việc tạo luồng, lập thời biểu, và quản lý mà không có sự hỗ trợ từ nhân. Vì nhân không biết các luồng cấp người dùng, tất cả việc tạo luồng và lập thời biểu được thực hiện trong không gian người dùng mà không cần sự can thiệp của nhân. Do đó, các luồng cấp người dùng thường tạo và quản lý nhanh, tuy nhiên chúng cũng có những trở ngại. Thí dụ, nếu nhân là đơn luồng thì bất cứ luồng cấp người dùng thực hiện một lời gọi hệ thống nghẽn sẽ làm cho toàn bộ quá trình bị nghẽn, thậm chí nếu các luồng khác sẳn dùng để chạy trong ứng dụng. Các thư viện luồng người dùng gồm các luồng POSIX Pthreads, Mach C-threads và Solaris 2 UI-threads.
• Luồng nhân: được hỗ trợ trực tiếp bởi hệ điều hành. Nhân thực hiện việc tạo luồng, lập thời biểu, và quản lý không gian nhân. Vì quản lý luồng được thực hiện bởi hệ điều hành, luồng nhân thường tạo và quản lý chậm hơn luồng người dùng. Tuy nhiên, vì nhân được quản lý các luồng nếu một luồng thực hiện lời gọi hệ thống nghẽn, nhân có thể lập thời biểu một luồng khác trong ứng dụng thực thi. Trong môi trường đa xử lý, nhân có thể lập thời biểu luồng trên một bộ xử lý khác. Hầu hết các hệ điều hành hiện nay như Windows NT, Windows 2000, Solaris 2, BeOS và Tru64 UNIX (trước Digital UNIX)-hỗ trợ các luồng nhân.
Các trạng thái của luồng
-Running : đang chạy – được hiểu là khi hệ thống định rõ vị trí luồng trong CPU
-Ready to run : đã chạy ( nhưng chưa được định vị trí trong CPU )
-Resumed : luồng ở trạng thái “ready to run” sau khi suspended/ blocked
-Suspended : luồng tự nguyện dừng lại để cho 1 luồng khác chạy
-Blocked : luồng đang đợi tài nguyên để tiếp tục hoặc bị 1 sự kiện của hệ thống
chặn ngang
DuongTrungQuan- Tổng số bài gửi : 57
Join date : 16/02/2012
so sánh khái niệm với tiến trình. Những tính ưu việc của công nghệ đa luồng
So sánh giữa luồng và tiến trình:
Giống nhau: luồng cũng là một đơn vị cấp phát CPU bởi hệ điều hành
Khác nhau: luồng là một bộ phận tiến trình truyền thống.
Những tính ưu việ 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 1080 là các luồng. Khi khách hàng điện thoại hỏi 1080, 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 1080, 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.
Mong các bạn đóng góp thêm ý kiến
Giống nhau: luồng cũng là một đơn vị cấp phát CPU bởi hệ điều hành
Khác nhau: luồng là một bộ phận tiến trình truyền thống.
Những tính ưu việ 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 1080 là các luồng. Khi khách hàng điện thoại hỏi 1080, 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 1080, 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.
Mong các bạn đóng góp thêm ý kiến
DuongTrungQuan- Tổng số bài gửi : 57
Join date : 16/02/2012
Phân biệt đa luồng và đa tiến trình
Giống nhau:
+ Đều có thông tin trạng thái. 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.
+ Đề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.
DuongTrungQuan- Tổng số bài gửi : 57
Join date : 16/02/2012
CPU của Intel sử dụng công nghệ đa luồng
Các bạn có thể đi vào chi tiết ưu và nhược điểm của các dòng CPU lõi kép của Intel, để thấy được những sản phẩm thực tế sử dụng chức năng đa luồng:
1. Pentium D
Thế hệ đầu tiên và có thể nói là có nhiều nhược điểm nhất là Pentium D.
- Cache trên thực tế được áp dụng công nghệ Share Cache của hai nhân. Nhưng thực tế lớn nhất chỉ có 2.77 MB cho 4.0 MB lý thuyết
- Sức mạnh xử lý đa luồng được nhiều người mong đợi nhưng khá thất vọng.
- Sử dụng hai nhân có xung quá cao, sự điều phối xử lý chưa được thông minh cho lắm dẫn đến khi chạy tiêu thụ điện năng quá cao làm cho CPU rất nóng. Đây là nhược điểm nhiều người phàn nàn nhất.
- Chưa được áp dụng những công nghệ mới của kiến trúc Core.
Có thể nói Pentium D mới chỉ là thử nghiệm cho thế hệ đa nhân của Intel nên chưa thực sư đáp ứng mong đợi.
Những ưu điểm nổi trội của Pentium D:
- Sức mạnh sử lý đa luồng mạnh hơn Petium 4 rất nhiều .
- Bộ đệm được trang bị lên gấp đôi trên lý thuyết và 150% trên thực tế.
Pentium D phổ biến nhất ngày nay là
D925 - 3.0 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit . Lớn nhất có Pentium D 3.4 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit.
2.Pentium Dual Core
Đây là thế hệ đa nhân ngay sau Pentium D .
Ưu điểm : Hai nhân nên xử lý đa luồng rất mạnh .
- Điều phối xử lý thông mình hơn nên có thể hạ thấp được xung nhịp của Cores xuống còn 1.6 GHz (E2140), 1.8 GHz (E2160), 2.0 GHz (E2180). Do vậy tiết kiệm điện và tỏa ít nhiệt lượng hơn, khắc phục được nhược điểm lớn nhất của Pentium D.
- Thực tế nếu được hỗ trợ thêm GPU của VGA mạnh thì Pentium Dual Core chạy rất mạnh trong các tác vụ xử lý đồ họa cao cấp.
- Sử dụng kiến trúc Intel Core mới nhất của Intel (được áp dụng trong các CPU Core 2 thế hệ sau).
Nhược điểm:
- Share Cache trên nền Lõi cũ nên chỉ tăng được L2 Cache lên 1.0 MB.
3.Core 2 Duo, Core 2 Extreme và Core 2 Quad
Có đầy đủ các ưu điểm của Pentium E. Ngoài ra còn có các cải tiến sau.
- Khả năng điều phối sử lý thông minh hơn nhiều, điều này có hai tác dụng.
Thứ nhất là tăng khả năng xử lý trên lý thuyết lên đến 40%.
Sức mạnh xử lý đa luồng cũng mạnh lên rất nhiều
- Áp dụng công nghệ Share Cache tăng gấp đôi dung lượng bộ đệm trên lý thuyết và 165% trên thực tế.
- Tiết kiệm điện năng khoảng 40% có được nhờ công nghệ chia sẻ xử lý thông minh.
1. Pentium D
Thế hệ đầu tiên và có thể nói là có nhiều nhược điểm nhất là Pentium D.
- Cache trên thực tế được áp dụng công nghệ Share Cache của hai nhân. Nhưng thực tế lớn nhất chỉ có 2.77 MB cho 4.0 MB lý thuyết
- Sức mạnh xử lý đa luồng được nhiều người mong đợi nhưng khá thất vọng.
- Sử dụng hai nhân có xung quá cao, sự điều phối xử lý chưa được thông minh cho lắm dẫn đến khi chạy tiêu thụ điện năng quá cao làm cho CPU rất nóng. Đây là nhược điểm nhiều người phàn nàn nhất.
- Chưa được áp dụng những công nghệ mới của kiến trúc Core.
Có thể nói Pentium D mới chỉ là thử nghiệm cho thế hệ đa nhân của Intel nên chưa thực sư đáp ứng mong đợi.
Những ưu điểm nổi trội của Pentium D:
- Sức mạnh sử lý đa luồng mạnh hơn Petium 4 rất nhiều .
- Bộ đệm được trang bị lên gấp đôi trên lý thuyết và 150% trên thực tế.
Pentium D phổ biến nhất ngày nay là
D925 - 3.0 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit . Lớn nhất có Pentium D 3.4 GHz - 4.0 MB Cache L2 - Rated Bus 800 MHz - Speed Bus 233 MHz - Data Width 64 Bit.
2.Pentium Dual Core
Đây là thế hệ đa nhân ngay sau Pentium D .
Ưu điểm : Hai nhân nên xử lý đa luồng rất mạnh .
- Điều phối xử lý thông mình hơn nên có thể hạ thấp được xung nhịp của Cores xuống còn 1.6 GHz (E2140), 1.8 GHz (E2160), 2.0 GHz (E2180). Do vậy tiết kiệm điện và tỏa ít nhiệt lượng hơn, khắc phục được nhược điểm lớn nhất của Pentium D.
- Thực tế nếu được hỗ trợ thêm GPU của VGA mạnh thì Pentium Dual Core chạy rất mạnh trong các tác vụ xử lý đồ họa cao cấp.
- Sử dụng kiến trúc Intel Core mới nhất của Intel (được áp dụng trong các CPU Core 2 thế hệ sau).
Nhược điểm:
- Share Cache trên nền Lõi cũ nên chỉ tăng được L2 Cache lên 1.0 MB.
3.Core 2 Duo, Core 2 Extreme và Core 2 Quad
Có đầy đủ các ưu điểm của Pentium E. Ngoài ra còn có các cải tiến sau.
- Khả năng điều phối sử lý thông minh hơn nhiều, điều này có hai tác dụng.
Thứ nhất là tăng khả năng xử lý trên lý thuyết lên đến 40%.
Sức mạnh xử lý đa luồng cũng mạnh lên rất nhiều
- Áp dụng công nghệ Share Cache tăng gấp đôi dung lượng bộ đệm trên lý thuyết và 165% trên thực tế.
- Tiết kiệm điện năng khoảng 40% có được nhờ công nghệ chia sẻ xử lý thông minh.
DuongTrungQuan- Tổng số bài gửi : 57
Join date : 16/02/2012
Ví dụ Lập trình đa luồng dễ hơn lập trình đa tiến trình
Ví dụ 1:
Ví Dụ Về Đa luồng: Trong một ngôi nhà phân ra 2 luồng phòng khác nhau, có chung trần nhà, không tách biệt lập với nhau. Nhưng 2 luồng phòng này dùng chung một tài nguyên là máy điều hòa.
Ví Dụ về Đa Tiến Trình: Mỗi phòng trong nhà là 1 tiến trình, 2 phòng tách biệt nhau, 2 phòng không thể dùng chung một máy điều hòa.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình -> Một máy điều hòa chia ra nhìu luồng phòng tiết kiệm hơn là mỗi phòng 1 máy điều hòa.
Ví dụ 2:
•Ví Dụ Về Đa luồng:Trên 1 con đường có thể phân ra nhìu luồng xe khác nhau Nhưng các luồng dùng chung một tài nguyên là Mặt Đường.
•Ví Dụ về Đa Tiến Trình: Mỗi con đường là 1 tiến trính, 2 con đường riêng biệt không thể dùng chung một mặt đường.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình: -> Xây 1 con đường phân ra nhìu luồng xe chạy dễ hơn, tiết kiệm hơn là xây nhìu con đường.
Ví Dụ Về Đa luồng: Trong một ngôi nhà phân ra 2 luồng phòng khác nhau, có chung trần nhà, không tách biệt lập với nhau. Nhưng 2 luồng phòng này dùng chung một tài nguyên là máy điều hòa.
Ví Dụ về Đa Tiến Trình: Mỗi phòng trong nhà là 1 tiến trình, 2 phòng tách biệt nhau, 2 phòng không thể dùng chung một máy điều hòa.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình -> Một máy điều hòa chia ra nhìu luồng phòng tiết kiệm hơn là mỗi phòng 1 máy điều hòa.
Ví dụ 2:
•Ví Dụ Về Đa luồng:Trên 1 con đường có thể phân ra nhìu luồng xe khác nhau Nhưng các luồng dùng chung một tài nguyên là Mặt Đường.
•Ví Dụ về Đa Tiến Trình: Mỗi con đường là 1 tiến trính, 2 con đường riêng biệt không thể dùng chung một mặt đường.
=>Lập trình đa luồng dễ hơn lập trinh đa tiến trình: -> Xây 1 con đường phân ra nhìu luồng xe chạy dễ hơn, tiết kiệm hơn là xây nhìu con đường.
DuongTrungQuan- Tổng số bài gửi : 57
Join date : 16/02/2012
Trang 5 trong tổng số 8 trang • 1, 2, 3, 4, 5, 6, 7, 8
Similar topics
» Ôn tập thi Cuối kỳ
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
» Thảo luận các vấn đề của Môn học
» Thảo luận Bài 3
» Thảo luận bài 4
» Thảo luận Bài 7
Trang 5 trong tổng số 8 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết