Thảo luận Bài 4
+28
KhanhChan
NguyenVanNhieu74 (HLT3)
HuynhQuangLuc52 (HLT3)
NguyenTrungTruc(HLT3)
NguyenVietLong08(HLT3)
PhamAnhDung_HLT3
LeThanhQuan (TH10A2)
DuongHaiLong_HLT3
LeVanVan69 (I22B)
dangthituyetnhungTH08a1
vothihongngoc72 (HLT3)
PhanVietTrung(HLT3)
NguyenHaAn(I22A)
NguyenQuocCuong(HLT3)
VoMinhThienHLT3
HuynhHuuPhat(HLT3)
CaoBaDuc-25-HLT3
NguyenHuuSonLam(TH10A1)
truongphamhuytruong.i11c
VoThiHuynhVan(TH09A2)
TranNguyenBinh(HLT3)
HuynhNgoHaiDang(HLT3)
VanPhuAnhTuan95(HLT3)
LamQuocVu(HLT3)
LeThiHuyenTrang(HLT3)
NguyenThiThuThao(TH09A2)
NguyenChiKien(HLT3)
Admin
32 posters
Trang 4 trong tổng số 4 trang
Trang 4 trong tổng số 4 trang • 1, 2, 3, 4
Hàng chờ công việc ( Job Queue) và Hàng chờ sẵn sàng ( Ready Queue)
Job Queue: là hàng chờ công việc, chứa các tiến trình chờ được vận hành.
Ready Queue: là hàng chờ sẵn sàng, chứa các tiến trình chờ được cấp CPU.
Cả hai hàng chờ đều là các hàng chờ chứa các tiến trình cần vận hành.
- Dùng giải thuật điều phối chậm(Long - term Scheduler) để đưa các tiến trình từ Job Queue vào Ready Queue.
- Dùng giải thuật điều phối nhanh(Short - term Scheduler) chọn các tiến trình trong Ready Queue để cấp CPU.
PhanNgocThoai(I22B)
Tổng số bài gửi: 17
Join date: 22/03/2013
Xem lý lịch thành viên Gửi tin nhắn
Ready Queue: là hàng chờ sẵn sàng, chứa các tiến trình chờ được cấp CPU.
Cả hai hàng chờ đều là các hàng chờ chứa các tiến trình cần vận hành.
- Dùng giải thuật điều phối chậm(Long - term Scheduler) để đưa các tiến trình từ Job Queue vào Ready Queue.
- Dùng giải thuật điều phối nhanh(Short - term Scheduler) chọn các tiến trình trong Ready Queue để cấp CPU.
PhanNgocThoai(I22B)
Tổng số bài gửi: 17
Join date: 22/03/2013
Xem lý lịch thành viên Gửi tin nhắn
NguyenVanNhieu74 (HLT3)- Tổng số bài gửi : 20
Join date : 23/03/2014
Age : 34
Phân biệt 2 loại tiến trình Hướng CPU (CPU-Bound) và Hướng I/O (I/O-Bound)
- Hướng CPU (CPU-Bound): tính toán nhiều, ít I/O
- Hướng I/O (I/O-Bound): tính toán ít, nhiều I/O
Ví dụ:
- Hướng CPU: scan virus, scan registry....
(những công việc đòi hỏi CPU phải tính toán nhiều, sử dụng nhiều bộ nhớ (RAM))
- Hướng I/O: download 1 fille trên mạng phải chờ đến khi kết thúc
Lưu ý:
-Nếu tiến trình toàn hướng CPU thì không tốt do lúc đó CPU hoạt động nhiều và bị nóng
- Nếu toàn hướng I/O thì CPU không hoạt đông -> không khai thác hiệu quả của CPU
=>Phải kết hợp cả 2 tiến trình này để tối ưu hoạt động (hỗn hợp như thế nào là do hệ điều hành quyết định)
- Hướng I/O (I/O-Bound): tính toán ít, nhiều I/O
Ví dụ:
- Hướng CPU: scan virus, scan registry....
(những công việc đòi hỏi CPU phải tính toán nhiều, sử dụng nhiều bộ nhớ (RAM))
- Hướng I/O: download 1 fille trên mạng phải chờ đến khi kết thúc
Lưu ý:
-Nếu tiến trình toàn hướng CPU thì không tốt do lúc đó CPU hoạt động nhiều và bị nóng
- Nếu toàn hướng I/O thì CPU không hoạt đông -> không khai thác hiệu quả của CPU
=>Phải kết hợp cả 2 tiến trình này để tối ưu hoạt động (hỗn hợp như thế nào là do hệ điều hành quyết định)
NguyenVanNhieu74 (HLT3)- Tổng số bài gửi : 20
Join date : 23/03/2014
Age : 34
Sự giống, khác nhau của Luồng và Tiến trình!
*Sự giống nhau:
- Luồng là tiến trình đặc biệt (luồng cũng là tiến trình nhưng là tiến trình nhẹ (Light Weigh Process)).
- Luồng nằm trong lòng tiến trình truyền thống.
- Đều có thông tin trạng thái.
- Đ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.
Ví dụ: Mình cần tiền làm gì đó gấp mượn người thân quen gần mình nhất thì dễ hơn mượn của người ngoài xa hơn.
- 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.
Ví dụ: Việc ngăn phòng riêng ra trong nhà thì dễ hơn việc xây thêm hay mua thêm một nhà khác.
*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.
- Cấp phát tài nguyên bộ nhớ cho tiến trình khá tốn kém.
- Luồng là tiến trình đặc biệt (luồng cũng là tiến trình nhưng là tiến trình nhẹ (Light Weigh Process)).
- Luồng nằm trong lòng tiến trình truyền thống.
- Đều có thông tin trạng thái.
- Đ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.
Ví dụ: Mình cần tiền làm gì đó gấp mượn người thân quen gần mình nhất thì dễ hơn mượn của người ngoài xa hơn.
- 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.
Ví dụ: Việc ngăn phòng riêng ra trong nhà thì dễ hơn việc xây thêm hay mua thêm một nhà khác.
*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.
- Cấp phát tài nguyên bộ nhớ cho tiến trình khá tốn kém.
KhanhChan- Tổng số bài gửi : 12
Join date : 20/03/2014
Khái niệm và chức năng của PCB
Một khối điều khiển tiến trình (Process Control Block - PCB) là một cấu trúc dữ liệu trong nhân hệ điều hành chứa thông tin cần thiết để quản lý một tiến trình nhất định.
PCB là một cấu trúc dữ liệu chứa những thông tin quan trọng về process và có thể khác nhau trong các hệ thống khác nhau bao gồm những thông tin sau:
Định danh của tiến trình (process identifier hay PID)
Giá trị các thanh ghi của tiến trình, trong đó đáng chú ý là con trỏ chương trình và con trỏ stack
Không gian địa chỉ của tiến trình
Độ ưu tiên (trong đó tiến trình có giá trị cao hơn được ưu tiên trước, ví dụ nice trong các hệ điều hành Unix)
Thông tin kế toán tiến trình, ví dụ như thời điểm thực thi gần nhất, bao nhiêu thời gian CPU đã sử dụng...
Con trỏ tới PCB tiếp theo, nghĩa là con trỏ tới tiến trình tiếp theo được chạy
Thông tin V/R(Virtual reality) (ví dụ các thiết bị V/R được cấp phát cho tiến trình, danh sách các tệp đang mở...)
Khi chuyển ngữ cảnh, tiến trình đang thực hiện bị dừng lại và một tiến trình khác có cơ hội thực hiện. Nhân dừng việc thực hiện của tiến trình, sao chép các giá trị trong thanh ghi vào PCB và cập nhật thanh ghi với các giá trị của PCB của tiến trình mới.[list][*]
Vị trí của PCB
Vì PCB chứa những thông tin tối quan trọng đối với tiến trình, nó phải được giữ trong một vùng bộ nhớ được bảo vệ. Trong một số hệ điều hành,, PCB được đặt ở đầu của ngăn xếp nhân của tiến trình.
PCB là đối tượng quan trọng, nhờ nó HĐH có thể có được toàn bộ thông tin cơ bản nhất về một process.
PCB là một cấu trúc dữ liệu chứa những thông tin quan trọng về process và có thể khác nhau trong các hệ thống khác nhau bao gồm những thông tin sau:
Định danh của tiến trình (process identifier hay PID)
Giá trị các thanh ghi của tiến trình, trong đó đáng chú ý là con trỏ chương trình và con trỏ stack
Không gian địa chỉ của tiến trình
Độ ưu tiên (trong đó tiến trình có giá trị cao hơn được ưu tiên trước, ví dụ nice trong các hệ điều hành Unix)
Thông tin kế toán tiến trình, ví dụ như thời điểm thực thi gần nhất, bao nhiêu thời gian CPU đã sử dụng...
Con trỏ tới PCB tiếp theo, nghĩa là con trỏ tới tiến trình tiếp theo được chạy
Thông tin V/R(Virtual reality) (ví dụ các thiết bị V/R được cấp phát cho tiến trình, danh sách các tệp đang mở...)
Khi chuyển ngữ cảnh, tiến trình đang thực hiện bị dừng lại và một tiến trình khác có cơ hội thực hiện. Nhân dừng việc thực hiện của tiến trình, sao chép các giá trị trong thanh ghi vào PCB và cập nhật thanh ghi với các giá trị của PCB của tiến trình mới.[list][*]
Vị trí của PCB
Vì PCB chứa những thông tin tối quan trọng đối với tiến trình, nó phải được giữ trong một vùng bộ nhớ được bảo vệ. Trong một số hệ điều hành,, PCB được đặt ở đầu của ngăn xếp nhân của tiến trình.
PCB là đối tượng quan trọng, nhờ nó HĐH có thể có được toàn bộ thông tin cơ bản nhất về một process.
TranNguyenBinh(HLT3)- Tổng số bài gửi : 42
Join date : 18/03/2014
Age : 34
Đến từ : Tiền Giang
Lợi ích của công nghệ đa luồng.
Ví dụ: Các cô ở tổng đài 188 là một ví dụ minh họa của đa luồng. Khi khách hàng điện thoại đến 188 hỏi, nếu chỉ có 1 cô phải trực 10 máy điện thoại thì sẽ không trả lời tốt khi có khoảng 3 cuộc điện thoại trở lên, nếu chỉ có 1 cuộc điện thoại gọi đến thì cô sẽ trả lời tố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 Như vậy 1 cô trực tổng đài phục vụ khách hàng khi gọi đến gọi là đơn luồng, nhiều cô trực tổng đài gọi là đa luồng.
Ví dụ: Trong nhà có ti vi, tủ lạnh, điều hòa,…. Mọi người trong nhà có thể dùng chung các vật dụng đó.
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 thì ghi, ai cần thì chụp về xem,…
Lập trình đa luồng dễ hơn lập trình đa tiến trình (tạo mới luồng dễ hơn, chia sẻ tài nguyên dễ hơn.)
TranNguyenBinh(HLT3)- Tổng số bài gửi : 42
Join date : 18/03/2014
Age : 34
Đến từ : Tiền Giang
Hai phương thức liên lạc giữa các tiến trình
Liên lạc trực tiếp (Direct Communications)
Theo địa chỉ đối xứng (Symmetric Scheme):
Send (P, Message) - Gửi thông điệp cho P
Receive (Q, Message) - Nhận thông điệp từ Q
Đặc điểm:
Liên kết được thiết lập tự động giữa mỗi cặp tiến trình.
Liên kết chỉ giữa 2 tiến trình.
Chỉ có 1 liên kết giữa mỗi cặp.
Tính đối xứng của liên lạc (2 bên đều biết đích xác tên của nhau khi Gửi/Nhận).
Theo địa chỉ phi đối xứng (Asymmetric Scheme):
Send (P, Message) - Gửi thông điệp cho P
Receive (id, Message) - Nhận thông điệp từ tiến trình bất kỳ, Biến id chứa số hiệu tiến trình gửi
Liên lạc gián tiếp (Indirect Communications)
Qua các Hộp thư (Mailboxes) hoặc Cổng (Ports).
Hộp thư là một thực thể qua đó thông điệp được gửi đến và lấy ra.
Mỗi hộp thư có định danh riêng.
Hai tiến trình phải chung nhau một hộp thư nào đó.
Hai loại hộp thư:
1.Hộp thư tiến trình (Process Mailbox): Nằm trong vùng địa chỉ của một tiến trình nào đó.
2.Hộp thư hệ điều hành (OS Mailbox): Nằm trong vùng địa chỉ của HĐH
Theo địa chỉ đối xứng (Symmetric Scheme):
Send (P, Message) - Gửi thông điệp cho P
Receive (Q, Message) - Nhận thông điệp từ Q
Đặc điểm:
Liên kết được thiết lập tự động giữa mỗi cặp tiến trình.
Liên kết chỉ giữa 2 tiến trình.
Chỉ có 1 liên kết giữa mỗi cặp.
Tính đối xứng của liên lạc (2 bên đều biết đích xác tên của nhau khi Gửi/Nhận).
Theo địa chỉ phi đối xứng (Asymmetric Scheme):
Send (P, Message) - Gửi thông điệp cho P
Receive (id, Message) - Nhận thông điệp từ tiến trình bất kỳ, Biến id chứa số hiệu tiến trình gửi
Liên lạc gián tiếp (Indirect Communications)
Qua các Hộp thư (Mailboxes) hoặc Cổng (Ports).
Hộp thư là một thực thể qua đó thông điệp được gửi đến và lấy ra.
Mỗi hộp thư có định danh riêng.
Hai tiến trình phải chung nhau một hộp thư nào đó.
Hai loại hộp thư:
1.Hộp thư tiến trình (Process Mailbox): Nằm trong vùng địa chỉ của một tiến trình nào đó.
2.Hộp thư hệ điều hành (OS Mailbox): Nằm trong vùng địa chỉ của HĐH
TranNguyenBinh(HLT3)- Tổng số bài gửi : 42
Join date : 18/03/2014
Age : 34
Đến từ : Tiền Giang
Giải thích đa luồng và có ví dụ cụ thể
Các bạn xem thử ví dụ này xem có được khô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).
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
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 )
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");
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
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).
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
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 )
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");
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
MaiHuyNam(HLT3)- Tổng số bài gửi : 21
Join date : 09/03/2013
Cấu trúc dữ liệu Khối kiểm soát tiến trình (Process Control Block - PCB )
Hệ điều hành quản lý các tiến trình trong hệ thống thông qua khối quản lý tiến trình (process control block - PCB). PCB là một vùng nhớ lưu trữ các thông tin mô tả cho tiến trình, với các thành phần chủ yếu bao gồm:
Số hiệu của tiến trình (Process number): mỗi tiến trình có một số hiệu tiến trình giúp phân biệt các tiến trình với nhau.
Trạng thái tiến trình (Process state): xác định trạng thái hiện hành của tiến trình, có thể là tạo mới (new), sẵn sang (ready), đang chạy (running),…
Ngữ cảnh của tiến trình: mô tả các tài nguyên tiến trình đang trong quá trình, hoặc để phục vụ cho hoạt động hiện tại, hoặc để làm cơ sở phục hồi hoạt động cho tiến trình, bao gồm các thông tin về:
Thông tin giao tiếp: phản ánh các thông tin về quan hệ của tiến trình với các tiến trình khác trong hệ thống:
Các thông tin thống kê: đây là những thông tin thống kê về hoạt động của tiến trình, như thời gian đã sử dụng CPU, thời gian chờ, thời gian thực tế đã chạy, thời hạn... Các thông tin này có thể có ích cho công việc đánh giá tình hình hệ thống và dự đoán các tình huống tương lai.
Số hiệu của tiến trình (Process number): mỗi tiến trình có một số hiệu tiến trình giúp phân biệt các tiến trình với nhau.
Trạng thái tiến trình (Process state): xác định trạng thái hiện hành của tiến trình, có thể là tạo mới (new), sẵn sang (ready), đang chạy (running),…
Ngữ cảnh của tiến trình: mô tả các tài nguyên tiến trình đang trong quá trình, hoặc để phục vụ cho hoạt động hiện tại, hoặc để làm cơ sở phục hồi hoạt động cho tiến trình, bao gồm các thông tin về:
- Trạng thái CPU (CPT-state-rec): bao gồm nội dung các thanh ghi, quan trọng nhất là con trỏ lệnh IP lưu trữ địa chỉ câu lệnh kế tiếp tiến trình sẽ xử lý. Các thông tin này cần được lưu trữ khi xảy ra ngắt nhằm cho phép phục hồi hoạt động của tiến trình đúng như trước khi bị ngắt.
- Bộ xử lý (Processor): dùng cho máy có cấu hình nhiều CPU, xác định số hiệu CPU mà tiến trình đang sử dụng.
- Bộ nhớ chính (Main store): danh sách các khối nhớ được cấp cho tiến trình.
- Tài nguyên sử dụng (Resource): danh sách các tài mguyên hệ thống mà tiến trình đang sử dụng.
- Tài nguyên tạo lập (Created resource): danh sách các tài nguyên được tiến trình tạo lập.
Thông tin giao tiếp: phản ánh các thông tin về quan hệ của tiến trình với các tiến trình khác trong hệ thống:
- Tiến trình cha (Parent process): tiến trình tạo lập tiến trình này.
- Tiến trình con (Progeny process): các tiến trình do tiến trình này tạo lập.
- Độ ưu tiên (Priority): giúp bộ điều phối có thông tin để lựa chọn tiến trình được cấp CPU.
Các thông tin thống kê: đây là những thông tin thống kê về hoạt động của tiến trình, như thời gian đã sử dụng CPU, thời gian chờ, thời gian thực tế đã chạy, thời hạn... Các thông tin này có thể có ích cho công việc đánh giá tình hình hệ thống và dự đoán các tình huống tương lai.
VoMinhQuang (HLT3)- Tổng số bài gửi : 20
Join date : 09/03/2014
Thao tác trên tiến trình
Hệ điều hành cung cấp các thao tác chủ yếu sau đây trên một tiến trình:
Tạo lập tiến trình:
Trong quá trình xử lý, một tiến trình có thể tạo lập nhiều tiến trình mới bằng cách sử dụng một lời gọi hệ thống tương ứng. Tiến trình gọi lời gọi hệ thống để tạo tiến trình mới sẽ được gọi là tiến trình cha, tiến trình được tạo gọi là tiến trình con. Mỗi tiến trình con đến lượt nó lại có thể tạo các tiến trình mới… Quá trình này tiếp tục sẽ tạo ra một cây tiến trình.
Các công việc hệ điều hành cần thực hiện khi tạo lập tiến trình bao gồm:
Khi một tiến trình tạo lập một tiến trình con, tiến trình con có thể sẽ được hệ điều hành trực tiếp cấp phát tài nguyên hoặc được tiến trình cha cho thừa hưởng một số tài nguyên ban đầu.
Khi một tiến trình tạo tiến trình mới, tiến trình ban đầu có thể xử lý theo một trong hai khả năng sau:
Các hệ điều hành khác nhau có thể chọn lựa các cài đặt khác nhau để thực hiện thao tác tạo lập một tiến trình.
Kết thúc tiến trình:
Một tiến trình kết thúc xử lý khi nó hoàn tất chỉ thị cuối cùng và sử dụng một lời gọi hệ thống để yêu cầu hệ điều hành hủy bỏ nó. Đôi khi một tiến trình có thể yêu cầu hệ điều hành kết thúc xử lý của một tiến trình khác. Khi một tiến trình kết thúc, hệ điều hành thực hiện các công việc:
Hầu hết các hệ điều hành không cho phép các tiến trình con tiếp tục tồn tại nếu tiến trình cha đã kết thúc. Trong những hệ thống như thế, hệ điều hành sẽ tự động phát sinh một loạt các thao tác kết thúc tiến trình con.
- Tạo lập tiến trình (Create).
- Kết thúc tiến trình (Destroy).
- Tạm dừng tiến trình (Suspend).
- Tái kích hoạt tiến trình (Resume).
- Thay đổi độ ưu tiên tiến trình.
Tạo lập tiến trình:
Trong quá trình xử lý, một tiến trình có thể tạo lập nhiều tiến trình mới bằng cách sử dụng một lời gọi hệ thống tương ứng. Tiến trình gọi lời gọi hệ thống để tạo tiến trình mới sẽ được gọi là tiến trình cha, tiến trình được tạo gọi là tiến trình con. Mỗi tiến trình con đến lượt nó lại có thể tạo các tiến trình mới… Quá trình này tiếp tục sẽ tạo ra một cây tiến trình.
Các công việc hệ điều hành cần thực hiện khi tạo lập tiến trình bao gồm:
- Định danh cho tiến trình mới phát sinh.
- Đưa tiến trình vào danh sách quản lý của hệ thống.
- Xác định độ ưu tiên cho tiến trình.
- Tạo PCB cho tiến trình.
- Cấp phát các tài nguyên ban đầu cho tiến trình.
Khi một tiến trình tạo lập một tiến trình con, tiến trình con có thể sẽ được hệ điều hành trực tiếp cấp phát tài nguyên hoặc được tiến trình cha cho thừa hưởng một số tài nguyên ban đầu.
Khi một tiến trình tạo tiến trình mới, tiến trình ban đầu có thể xử lý theo một trong hai khả năng sau:
- Tiến trình cha tiếp tục xử lý đồng hành với tiến trình con.
- Tiến trình cha chờ đến khi một tiến trình con nào đó, hoặc tất cả các tiến trình con kết thúc xử lý.
Các hệ điều hành khác nhau có thể chọn lựa các cài đặt khác nhau để thực hiện thao tác tạo lập một tiến trình.
Kết thúc tiến trình:
Một tiến trình kết thúc xử lý khi nó hoàn tất chỉ thị cuối cùng và sử dụng một lời gọi hệ thống để yêu cầu hệ điều hành hủy bỏ nó. Đôi khi một tiến trình có thể yêu cầu hệ điều hành kết thúc xử lý của một tiến trình khác. Khi một tiến trình kết thúc, hệ điều hành thực hiện các công việc:
- Thu hồi các tài nguyên hệ thống đã cấp phát cho tiến trình.
- Hủy tiến trình khỏi tất cả các danh sách quản lý của hệ thống.
- Hủy bỏ PCB của tiến trình.
Hầu hết các hệ điều hành không cho phép các tiến trình con tiếp tục tồn tại nếu tiến trình cha đã kết thúc. Trong những hệ thống như thế, hệ điều hành sẽ tự động phát sinh một loạt các thao tác kết thúc tiến trình con.
VoMinhQuang (HLT3)- Tổng số bài gửi : 20
Join date : 09/03/2014
Cấp phát tài nguyên cho tiến trình
Khi có nhiều người sử dụng đồng thời làm việc trong hệ thống, hệ điều hành cần phải cấp phát các tài nguyên theo yêu cầu cho mỗi người sử dụng. Do tài nguyên hệ thống thường rất giới hạn và có khi không thể chia sẻ, nên hiếm khi tất cả các yêu cầu tài nguyên đồng thời đều được thỏa mãn. Vì thế cần phải nghiên cứu một phương pháp để chia sẻ một số tài nguyên hữu hạn giữa nhiều tiến trình người dùng đồng thời. Hệ điều hành quản lý nhiều loại tài nguyên khác nhau (CPU, bộ nhớ chính, các thiết bị ngoại vi…), với mỗi loại cần có một cơ chế cấp phát và các chiến lược cấp phát hiệu quả. Mỗi tài nguyên được biểu diễn thông qua một cấu trúc dữ liệu, khác nhau về chi tiết cho từng loại tài nguyên, nhưng cơ bản chứa đựng các thông tin sau:
Các mục tiêu của kỹ thuật cấp phát:
Để có thể thõa mãn các mục tiêu kể trên, cần phải giải quyết các vấn đề nảy sinh khi có nhiều tiến trình đồng thời yêu cầu một tài nguyên không thể chia sẻ.
- Định danh tài nguyên.
- Trạng thái tài nguyên: đây là các thông tin mô tả chi tiết trạng thái tài nguyên: phần nào của tài nguyên đã cấp phát cho tiến trình, phần nào còn có thể sử dụng?
- Hàng đợi trên một tài nguyên: danh sách các tiến trình đang chờ được cấp phát tài nguyên tương ứng.
- Bộ cấp phát: là đoạn code đảm nhiệm việc cấp phát một tài nguyên đặc thù. Một số tài nguyên đòi hỏi các giải thuật đặc biệt (như CPU, bộ nhớ chính, hệ thống tập tin), trong khi những tài nguyên khác (như các thiết bị nhập/ xuất) có thể cần các giải thuật cấp phát và giải phóng tổng quát hơn.
Các mục tiêu của kỹ thuật cấp phát:
- Bảo đảm một số lượng hợp lệ các tiến trình truy xuất đồng thời đến các tài nguyên không chia sẻ được.
- Cấp phát tài nguyên cho tiến trình có yêu cầu trong một khoảng thời gian trì hoãn có thể chấp nhận được.
- Tối ưu hóa sự sử dụng tài nguyên.
Để có thể thõa mãn các mục tiêu kể trên, cần phải giải quyết các vấn đề nảy sinh khi có nhiều tiến trình đồng thời yêu cầu một tài nguyên không thể chia sẻ.
VoMinhQuang (HLT3)- Tổng số bài gửi : 20
Join date : 09/03/2014
Phân biệt Job Queue ( hàng chờ công việc) và Ready Queue (hàng chờ sẵn sàng)
Job Queue: là hàng chờ công việc, chứa các tiến trình chờ được vận hành.
Ready Queue: là hàng chờ sẵn sàng, chứa các tiến trình chờ được cấp CPU.
Giống nhau:- Đều là các hàng chờ chứa các tiến trình cần vận hành.
- Đều cần thuật giải điều phối để sắp xếp các tiến trình.
Khác nhau:- Đều là các hàng chờ chứa các tiến trình cần vận hành.
- Đều cần thuật giải điều phối để sắp xếp các tiến trình.
Khác nhau:
- Dùng giải thuật điều phối chậm(Long - term Scheduler) để đưa các tiến trình từ Job Queue vào Ready Queue.
- Dùng giải thuật điều phối nhanh(Short - term Scheduler) chọn các tiến trình trong Ready Queue để cấp CPU.
Ready Queue: là hàng chờ sẵn sàng, chứa các tiến trình chờ được cấp CPU.
Giống nhau:- Đều là các hàng chờ chứa các tiến trình cần vận hành.
- Đều cần thuật giải điều phối để sắp xếp các tiến trình.
Khác nhau:- Đều là các hàng chờ chứa các tiến trình cần vận hành.
- Đều cần thuật giải điều phối để sắp xếp các tiến trình.
Khác nhau:
- Dùng giải thuật điều phối chậm(Long - term Scheduler) để đưa các tiến trình từ Job Queue vào Ready Queue.
- Dùng giải thuật điều phối nhanh(Short - term Scheduler) chọn các tiến trình trong Ready Queue để cấp CPU.
dangthituyetnhungTH08a1- Tổng số bài gửi : 41
Join date : 19/03/2014
Tiến trình khác chương trình thế nào
- Tiến trình (Process) 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 (HDH) với tiến trình người dùng.
- Bản thân chương trình không là tiến trình vì là thực thể Thụ động (Passive), trong khi tiến trình là thực thể Hoạt động (Active) với nhiều thông tin và trạng thái trong đó có Bộ đếm chương trình (Program Counter) cho biết vị trí lệnh tiến hành.
- Bản thân chương trình không là tiến trình vì là thực thể Thụ động (Passive), trong khi tiến trình là thực thể Hoạt động (Active) với nhiều thông tin và trạng thái trong đó có Bộ đếm chương trình (Program Counter) cho biết vị trí lệnh tiến hành.
TranTuanPhat93(HLT3)- Tổng số bài gửi : 11
Join date : 05/05/2014
Phân tích vai trò của khối kiểm soát tiến trình trong công việc quản lý tiến trình của Hệ điều hành
Khối kiểm soát tiến trình (Process Control Block-PCB) là 1 bảng trong Ram. Hệ điều hành lưu lại toàn bộ các công việc của tiến trình.
Khối kiểm soát tiến trình như là 1 bức ảnh được sao chụp lưu lại trong Ram, để khi chương trình đột xuất đóng thì ta có thể khôi phục lại các chương trình từ Ram.
Tiến trình có lúc hoạt động và có lúc ngừng, Chúng ta cứ nghĩ tiến trình hoạt động liên tục nhưng thực chất là có ngừng và trước khi ngừng thì sẽ lưu lại ở thanh Ram.
Ví dụ :
Các bạn trong lớp đều là tiến trình người dùng, nội dung là bảng đen (bộ nhớ dùng chung) và thầy là Hệ điều hành. Thầy gọi bạn A lên bảng làm bài tập, 1 lúc sau thầy gọi bạn B lên bảng làm bài kế tiếp. Vì bạn A đã viết hết bảng, bạn B không sử dụng bảng được nên thầy đóng vai trò là Hệ điều hành hệ thống lưu lại nội dung bài tập bạn A vừa làm xong, bạn B có thể xoá bảng và làm bài khác. Khi B làm xong thì bạn A tiếp tục làm việc nhưng lại không còn nội dung, thì thầy( Hệ điều hành hệ thống) sẽ giúp bạn A khôi phục lại nội dung, và tiếp tục giải bài tập.
Khối kiểm soát tiến trình như là 1 bức ảnh được sao chụp lưu lại trong Ram, để khi chương trình đột xuất đóng thì ta có thể khôi phục lại các chương trình từ Ram.
Tiến trình có lúc hoạt động và có lúc ngừng, Chúng ta cứ nghĩ tiến trình hoạt động liên tục nhưng thực chất là có ngừng và trước khi ngừng thì sẽ lưu lại ở thanh Ram.
Ví dụ :
Các bạn trong lớp đều là tiến trình người dùng, nội dung là bảng đen (bộ nhớ dùng chung) và thầy là Hệ điều hành. Thầy gọi bạn A lên bảng làm bài tập, 1 lúc sau thầy gọi bạn B lên bảng làm bài kế tiếp. Vì bạn A đã viết hết bảng, bạn B không sử dụng bảng được nên thầy đóng vai trò là Hệ điều hành hệ thống lưu lại nội dung bài tập bạn A vừa làm xong, bạn B có thể xoá bảng và làm bài khác. Khi B làm xong thì bạn A tiếp tục làm việc nhưng lại không còn nội dung, thì thầy( Hệ điều hành hệ thống) sẽ giúp bạn A khôi phục lại nội dung, và tiếp tục giải bài tập.
VoNhuQuynh(HLT3)- Tổng số bài gửi : 6
Join date : 18/03/2014
Phân biệt các loại trình điều phối
Điều phối chậm (Long-term scheduler (or job scheduler)) :
• Chọn process nào sẽ được đưa vào ready queue (từ New chuyển sang Ready)
• Kiểm soát Độ đa chương
• Do có nhiều thời gian (tới vài phút), loại scheduler này có điều kiện để lựa chọn kỹ càng nhằm phối hợp cân đối 2 loại tiến trình
. Hướng CPU: tính toán nhiều, ít I/O.
Ví dụ: Công ty có 1 chiếc ô tô (CPU). Trong công ty có nhiều nhân viên cần đi công tác (nhiều process). Ô tô (CPU) phải phục vụ những nhân viên (process) đó --> Ô tô (CPU) luôn trong trạng thái bận
. Hướng I/O: tính toán ít, nhiều I/O
Ví dụ: Công ty có 1 chiếc ô tô (CPU), các nhân viên trong công ty chỉ ngồi nghiên cứu (nhiều I/O). Ô tô luôn để trong ga ra không có người sử dụng. Do đó lãng phí ô tô (CPU)
• Mục đích cân bằng tải
Điều phối nhanh (Short-term scheduler (or CPU scheduler)) :
• Còn gọi là Điều phối CPU.
• Chọn tiến trình từ Ready Queue để cấp CPU.
• Có tần suất công việc cao. Thường cứ 100 ms lại tốn 10 ms để xác định tiến trình kế tiếp, như vậy 10/(100+10)=9% thời gian CPU được dùng để điều phối công việc.
• Chọn process nào sẽ được đưa vào ready queue (từ New chuyển sang Ready)
• Kiểm soát Độ đa chương
• Do có nhiều thời gian (tới vài phút), loại scheduler này có điều kiện để lựa chọn kỹ càng nhằm phối hợp cân đối 2 loại tiến trình
. Hướng CPU: tính toán nhiều, ít I/O.
Ví dụ: Công ty có 1 chiếc ô tô (CPU). Trong công ty có nhiều nhân viên cần đi công tác (nhiều process). Ô tô (CPU) phải phục vụ những nhân viên (process) đó --> Ô tô (CPU) luôn trong trạng thái bận
. Hướng I/O: tính toán ít, nhiều I/O
Ví dụ: Công ty có 1 chiếc ô tô (CPU), các nhân viên trong công ty chỉ ngồi nghiên cứu (nhiều I/O). Ô tô luôn để trong ga ra không có người sử dụng. Do đó lãng phí ô tô (CPU)
• Mục đích cân bằng tải
Điều phối nhanh (Short-term scheduler (or CPU scheduler)) :
• Còn gọi là Điều phối CPU.
• Chọn tiến trình từ Ready Queue để cấp CPU.
• Có tần suất công việc cao. Thường cứ 100 ms lại tốn 10 ms để xác định tiến trình kế tiếp, như vậy 10/(100+10)=9% thời gian CPU được dùng để điều phối công việc.
dangthituyetnhungTH08a1- Tổng số bài gửi : 41
Join date : 19/03/2014
Phân biệt điều phối chậm và điều phối nhanh
Điều phối chậm (Long-term scheduler (or job scheduler)) :
- Chọn process nào sẽ được đưa vào ready queue (từ New chuyển sang Ready)
- Kiểm soát Độ đa chương
- Do có nhiều thời gian (tới vài phút), loại scheduler này có điều kiện để lựa chọn kỹ càng nhằm phối hợp cân đối 2 loại tiến trình
+ Hướng CPU: tính toán nhiều, ít I/O.
Ví dụ: Công ty có một chiếc ô tô (CPU), có nhiều nhân viên cần đi công tác (nhiều tiến trình) phải sử dụng ô tô. Do đó, ô tô (CPU) bận (phục vụ) cho nhiều người (nhiều tiến trình).
+ Hướng I/O: tính toán ít, nhiều I/O
Ví dụ: Công ty có một chiếc ô tô (CPU), các nhân viên trong công ty ko cần sử dụng đến ô tô (I/O). Vậy quá lãng phí ô tô (CPU)
- Mục đích cân bằng tải
Điều phối nhanh (Short-term scheduler (or CPU scheduler)) :
- Còn gọi là Điều phối CPU.
- Chọn tiến trình từ Ready Queue để cấp CPU.
- Có tần suất công việc cao. Thường cứ 100 ms lại tốn 10 ms để xác định tiến trình kế tiếp, như vậy 10/(100+10)=9% thời gian CPU được dùng để điều phối công việc.
- Chọn process nào sẽ được đưa vào ready queue (từ New chuyển sang Ready)
- Kiểm soát Độ đa chương
- Do có nhiều thời gian (tới vài phút), loại scheduler này có điều kiện để lựa chọn kỹ càng nhằm phối hợp cân đối 2 loại tiến trình
+ Hướng CPU: tính toán nhiều, ít I/O.
Ví dụ: Công ty có một chiếc ô tô (CPU), có nhiều nhân viên cần đi công tác (nhiều tiến trình) phải sử dụng ô tô. Do đó, ô tô (CPU) bận (phục vụ) cho nhiều người (nhiều tiến trình).
+ Hướng I/O: tính toán ít, nhiều I/O
Ví dụ: Công ty có một chiếc ô tô (CPU), các nhân viên trong công ty ko cần sử dụng đến ô tô (I/O). Vậy quá lãng phí ô tô (CPU)
- Mục đích cân bằng tải
Điều phối nhanh (Short-term scheduler (or CPU scheduler)) :
- Còn gọi là Điều phối CPU.
- Chọn tiến trình từ Ready Queue để cấp CPU.
- Có tần suất công việc cao. Thường cứ 100 ms lại tốn 10 ms để xác định tiến trình kế tiếp, như vậy 10/(100+10)=9% thời gian CPU được dùng để điều phối công việc.
VoMinhThienHLT3- Tổng số bài gửi : 9
Join date : 21/03/2014
Trang 4 trong tổng số 4 trang • 1, 2, 3, 4
Similar topics
» THẢO LUẬN MÔN HỌC
» Thảo luận Bài 8
» Thảo luận Bài 7
» Thảo luận về đề thi HK1
» [Đề thi giữa kỳ] I22B ( 8-4-2013 )
» Thảo luận Bài 8
» Thảo luận Bài 7
» Thảo luận về đề thi HK1
» [Đề thi giữa kỳ] I22B ( 8-4-2013 )
Trang 4 trong tổng số 4 trang
Permissions in this forum:
Bạn không có quyền trả lời bài viết