Mục tiêu của các hệ phân chia thời gian time-sharing là chuyển đổiCPU qua lại giữa các tiến trình một cách thường xuyên để nhiều người sử dụng có thể tương tác cùng lúc với từng chương t
CƠ CỞ LÝ THUYẾT
Giới thiệu chung
Một tiến trình được định nghĩa là một thực thể chương trình đang được chạy trong hệ thống, chiếm dụng tài nguyên của hệ thống (Thời gian sử dụng CPU, bộ nhớ,…) Ví dụ, một web server chạy trong thiết bị là một tiến trình, hoặc một chương trình soạn thảo văn bản đang chạy trong thiết bị cũng là một tiến trình.
− Tiến trình tuần tự (MS_DOS): là các tiến trình mà điểm khởitạo của nó là điểm kết thúc của tiến trình trước đó
− Tiến trình song song (uniprocesser và multiprocessor): là các tiến trình mà điểm khởi tạo của tiến trình này mằn ở thân của các tiến trình khác, tức là có thể khởi tạo một tiến trình mới khi các tiến trình trước đó chưa kết thúc
Trong chế độ đa nhiệm có ba trạng thái liên quan mật thiết đếngiờ CPU bao gồm:
Hình 2 1 Các trạng thái tiến trình
− Sẵn sàng (ready): là trạng thái mà tiến trình được phân phối đầy đủ mọi tài nguyên cần thiết và đang chờ giờ CPU Với giờ CPU là thời gian mà CPU phục vụ cho tiến trình
− Thực hiện (running): là trạng thái mà tiến trình được phân phối đầy đủ mọi tài nguyên cần thiết và giờ CPU
− Đợi (waiting): là trạng thái tiến trình không thực hiện được vì thiếu một vài điều kiện nào đó (đợi dữ liệu vào/ra, đợi tài nguyên bổ sung ) Khi sự kiện mà nó chờ đợi xuất hiện, tiến trình sẽ quay lại trạng thái sẵn sàng
Như vậy, trong suốt thời gian tồn tại của mình, các tiến trình sẽ tuân thủ theo sơ đồ thực hiện sau:
Sửdụng CPU Sử dụng CPU Sử dụng CPU
Hình 2 2 Sơ đồ thực hiện tiến trình
2.1.4 Khái niệm lập lịch cho CPU
Lập lịch cho CPU là cơ chế để chọn tiến trình phải được thực hiện tiếp theo và phân CPU cho bổ tiến trình đó Tác này vụ được thực hiện bởi bộ lập lịch CPU hoặc bộ lập lịch ngắn hạn Mỗi tiến trình ở trạng thái sẵn sàng được gắn một thứ tự ưu tiên dựa vào các yếu tố sau: Thời điểm hình thành tiến trình, thời gian thực hiện tiến trình, thời gian kết thúc tiến trình
Lập lịch cho CPU là cơ sở của các hệ điều hành đa chương trình Trong môi trường hệ điều hành đa nhiệm, bộ phận điều phối tiến trình có nhiệm vụ xem xét và quyết định khi nào thì dừng tiến trình hiện tại để thu hồi processsor và chuyển processor cho tiến trình khác Và khi đã có processor thì chọn tiến trình ở trạng thái sẵn sàng để cấp processor cho nó
2.1.5 Mục đích của lập lịch cho CPU
Cơ chế lập lịch cần đạt được các mục tiêu sau:
− Đúng đắn, nghĩa là cơ chế lập lịchcầnphục vụ các tiến trình một cách “công bằng”, tránh tình huống có tiến trình bị rơi vào tình trạng chờ vô hạn.
− Đảm bảo khả năng thông qua lớn nhất, tức là tiến tới phục vụ số lượng tiến trình nhiều nhất có thể trong một đơn vị thời gian
− Thời gian phản ứng cần phải nhỏ nhất với tất cả các tiến trình, tối thiểu chi phí, tài nguyên hệ thống.
− Cân đối việc sử dụng tài nguyên, cần cố gắng nâng cao hiệu suất sử dụng tài nguyên, theo đó cần ưu tiên tiến trình sử dụng tài nguyên giá thành thấp.
− Đảm bảo cân đối giữa thời gian trả và lời hiệu suất sử dụng tài nguyên Cách tốt nhất để giảm thời gian trả là có tài nguyên trữ khi có yêu cầu có thể lời đủ dự để cấp phát ngay lập tức, nhưng điều đó cũng dẫn tới lãng phí tài nguyên
− Cần quan tâm các tiến trình đang sử dụng tài nguyên quan trọng, tránh tình trạng tiến trình có mức ưu tiên thấp chiếm tài nguyên mà tiến trình mức ưu tiên cao hơn cần Nếu tài nguyên đó là không chia sẻ thì hệ điều hành cần tạo điều kiện để tiến trình giải phóng tài nguyên nhanh nhất.
2.1.6 Các tiêu chuẩn của lập lịch
− CPU utilization: Giữ CPU bận nhiều nhất có thể Việc sử dụng CPU có thể từ 0 đến 100%
− Throughput: Nếu CPU bận thực thi các quá trình thì công việc đang được thực hiện Thước đo của công việc là số lượng tiến trình được hoàn thành trên một đơn vị thời gian gọi là thông lượng (throughput) Thông lượng càng lớn càng tốt
− Turnaround time: Khoảng thời gian từ thời điểm gửi tiến trình tới khi tiến trình hoàn thành, cần đạt giá trị nhỏ nhất
− Waiting time: tổng thời gian chờ trong hàng đợi sẵn sàng, cần phải nhỏ nhất
− Response time: Thời gian từ lúc gửi yêu cầu cho tới khi phản hồi đầu tiên được đưara, yêu cầuphải nhỏ nhất.
2.1.7 Các nguyên lý lập lịch
Thuật toán điều phối cần xem xét và quyết định thời điểm chuyển đổi CPU giữa các tiến trình Hệ điều hành có thể thực hiện cơ chế điều phối theo nguyên lý preemptive hoặc nonpreemptive:
❖ Điều phối preemptive: Nguyên lý này cho phép một tiến trình khi nhận được CPU sẽ có quyền độc chiếm CPU đến khi hoàn tất xử lý hoặc tự giải phóng CPU Khi đó quyết định điều phối sẻ xảy ra các trường hợp sau
• Khi một tiến trình chuyển từ trạng thái đang chạy sang trạng thái sẵn sàng (ví dụ: khi xảy ra ngắt)
• Khi một tiến trình chuyển từ trạng thái chờ sang trạng thái sẵn sàng (ví dụ: khi hoàn thành I / O)
• Khi một tiến trình chuyển từ trạng thái đang chạy sang trạng thái chờ (ví dụ: do kết quả của một yêu cầu I / O hoặc yêu cầuwait() để kết thúc một tiến trình con)
• Khi một tiến trình kết thúc
Các nguyên lý preemptive dễ cài đặt thuật toán Tuy nhiên lại không thích hợp cho hệ thống tổng quát nhiều người dùng.Vì nếu cho tiến trình thời gian chiếm giữ CPU tùy ý thì sẻ ngăn cản quá trình lý xử của các tiến trình còn lại.
Các thuật toán lập lịch
2.2.1 First-Come, First-Served (FCFS)
Giải thuật lập lịch first come, first serve (FCFS) hiểu đơn giản là: đến trước thì được phục vụ trước, tiến trình nào yêu cầu CPU trước thì sẽ được cấp phát CPU trước,tiến trình yêu cầu CPU sau thì phải đợi tiến trình hiện tại hoàn thành Với điều này, nó ứng dụng nonpreemptive mode tức là một tiến trình sẽ chiếm CPU cho- đến khi nào nó giải phóng CPU, bằng cách kết thúc hay yêu cầu nhập/xuất xảy ra
Ta có ba tiến trình được tuần tự đưa vào với các tên gọi là P1 P P2 3 và Burst time của chúng lần lượt là 24 3 3 Ta có các dữ liệu đầu vào cụ thể như bảng sau:
Bảng 2 1: Tiến trình thực hiện với FCFS
TH1 Thứ tự vào của các tiến trình là P1 P2 P3
Như vậy, xuất phát từ bên trái, ta sẽ nạp P vào để xử lý Khởi điểm, mốc thời1 gian luôn luôn mặc định bằng 0 Vì trong dữ liệu từ bảng thì P chiếm 24, tức là một1 đoạn khá lớn Sau đó, tiến trình tiếp theo sẽ được đưa vào, với burst time của P2 bằng 3, tức là trên biểu đồ Gantt, ta lấy 24 + 3 = 27 Sau khi P2 hoàn thành, nó sẽ đưa tiếp P3 vào, và P3 chiếm 3 nên trên đây, ta lấy tiếp 27 + 3 = 30 Như vậy, giản đồ đã cung cấp cho ta một cái nhìn trực quan nhằm minh họa cụ thể burst time của lần lượt các tiến trình P1 P2 P 3
Tiếp theo là xác định thời gian đợi của từng tiến trình Chúng ta có thể căn cứ vào con số bên trái của từng tiến trình trong giản đồ bên trên Như vậy: thời gian đợi lần lượt của P1 P2 P3 là 0 24 27 Bước cuối cùng của thuật toán, là xác đó định thời gian đợi trung bình của cả quá trình Ta có thời gian đợi trung bình là: (0 + 24 + 27) / 3 = 17
TH2 Thứ tự vào của các tiến trình là P2 P3 P1
Ta xác định được thời gian đợi ở lần này của từng tiến trình P2 P P3 1 sẽ là 0 3 6(căn cứ vào con số bên trái của từng tiến trình) Ta có thể xác định thời gian đợi trung bình: (0 + 3 + 6) / 3 = 3
Con số đã giảm đi rất nhiều so với ban đầu Như vậy, với thuật toán FCFS thì thời gian đợi trung bình không sẽ phải lúc nào cũng tối ưu nhất cho ta mà còn tùy thuộc vào thứ tự vào của các tiến trình
Và do thuật toán FCFS này ứng dụng nonpreemptive, nên nó sẽ đặc biệt phiền hà khi sử dụng trong những hệ thống chia sẻ thời gian Vì mỗi lần thực hiện, nó yêu cầu toàn quyền sử dụng CPU, và điều này sẽ gây nên khó dễ khăn cho hệ thống nếu có một người dùng nạp quá nhiều tiến trình mà các tiến trình đó có burst time lớn trong phiên sử dụng của mình
• Giữ cho CPU thực hiện liên tục các tiến trình
• CPU không phân bị phối lại (không bị ngắt).
• Chi phí thực hiện thấp nhất (vì không phải thay đổi thứ tự ưu tiên phục vụ, thứ tự ưu tiên là thứ tự của tiến trình trong hàng đợi).
• Thời gian chờ trung bình (Waiting time) cao
• Throughput CPU thấp vì FCFS chỉ xử lý được một tiến trình trong một thời gian
• Respone time và Turnaround time của các tiến trình đến sau dài phụ thuộc nhiều vào thời gian thực hiện của tiến trình đếntrước nó.
• Là một thuật toán lập lịch cho CPU sau khi tiến trình đã được cấp phát cho CPU, nó không bao sẽ giờ giải phóng CPU cho đến khi nó kết thúc quá trình thực thi
• Các tiến trình ngắn ở phía sau hàng đợi phải đợi tiến trình dài ở phía trước kết thúc
• Không phải là một kỹ thuật lý tưởng cho các hệ thống chia sẻ thời gian
• Vì tính đơn giản của FCFS nên hiệu quả không cao
• Thờigian đợi không tối ưu phụ thuộc vào thứ tự của các tiến trình
Một hướng giải quyết khác cho vấn đề điều phối tiến trình CPU là thuật toán shortest-job-first (SJF) Khi CPU được cấp, nó sẽ đưa vào tiến trình có chiều dài burst time nhỏ nhất để xử lý
Là một dạng độ ưu tiên đặc biệt với độ ưu tiên pi = thời_gian_còn_lại(Processi) Thuật toán shortest-job-first (SJF) Có thể được cài đặt preemptive hoặc nonpreemptive
T = 1: P2 vào (độ ưu tiên cao hơn P1), P2 dành quyền dùng CPU
Nếu trong các tiến trình cần nạp vào có 2 tiến trình giống nhau burst time, nó về sẽ áp dụng thuật toán FCFS để giải quyết vấn đề này Lấy một ví dụ về SJF, ta có bảng các tiến trình cần nạp vào như hình bên dưới, với quy ước các burst time của lần lượt các tiến trình cần nạp vào có đơn vị đồng nhất là milisecond
Bảng 2 2: Tiến trình thực hiện với SJF
Nếu dùng thuật toán SJF để giải quyết bài toán này, chúng ta sẽ có được lược đồ như hình bên dưới, áp dụng giản đồ Gantt trình bày để
Như vậy, thời gian chờ của P1 sẽ là 3 (ms), 16 (ms) đối với P2, 9 (ms) với tiến trình P3 và 0 (ms) cho P4 Từ đó, ta tính được thời gian chờ trung bình sẽ là: (3+16+9+0)/4=7 (ms) Hãy thử so sánh, ta sẽ thấy, nếu dùng FCFS để giải quyết vấn đề này, thì ta sẽ tốn tổng cộng 10.25 ms thời gian chờ trung bình
Thuật toán SJF đã được chứng minh là sẽ cho ra thời gian chờ trung bình cho các tiến trình cần xử lý với một số con tối thiểu nhất Bằng cách chuyển cách tiến trình ngắn hơn lên trước các tiến trình tốn thời gian dài, nó đã giảm một cách đáng kể thời gian chờ cho các tiến trình ngắn, kéo theo giảm rõ rệt thời gian chờ trung bình Vấn đề khó khăn thực sự đối với giải thuật SJF này đó là việc xác định độ dài tiếp theo cần đưa vào để CPU xử lý.
Phần mềm Visual Studio
3.2.1 Khái quát phần mềm Visual Studio
Hình 3 11 Phần mềm Visual Studio Microsoft Viual Studio (VS) là một IDE được Microsoft phát triển để hỗ trợ các lập trình viên trong quá trình viết mã Ngoài chức năng cơ bản là viết mã, build và debug,
VS còn cung cấp cho người dùng những chức năng như:
− Làm việc nhóm thông qua Team Foundation Server của Microsoft
− Các phím và plugins tắt hỗ trợ người dùng thao tác nhanh trong việc viết mã
− Tùy chỉnh liên kết các project và thư viện, tập tin liên quan
3.2.2 Một số tính năng của phần mềm Visual Studio
− Biên dịch code: Giống như bất kỳ một IDE khác, Visual Studio gồm có một trình soạnthảo mã hỗ trợ tô sáng cú pháp và hoàn thiện mả bằng các sử dụng IntelliSense không chỉ cho các hàm, biến và các phương pháp mà còn sử dụng cho các cấu trúc ngôn ngữ như: Truy vấn hoặc vòng điều khiển.Bên cạnh đó, các trình biên tập mã Visual Studio cũng hỗ trợ cài đặt dấu trang trong mã có để thể điều hướng một cách nhanh chóng và dàng Hỗ trợ các dễ điều hướng như: Thu hẹp các khối mã lệnh, tìm kiếm gia tăng,…
− Trình gỡ lỗi: Visual Studio có một trình gỡ lỗi có tính năng vừa lập trình gỡ lỗi cấp máy và gỡ lỗi cấp mã nguồn Tính năng này hoạt động với cả hai mã quản lý giống như ngôn ngữ máy và có thể sử dụng để gỡ lỗi các ứng dụng được viết bằng các ngôn ngữ đượchỗ trợ bởi Visual Studio
Triển khai bộ lập lịch hàng đợi phản hồi đa cấp trong Visual Studio
3.3.1 Cấu trúc tiến trình struct Process
{ processId; int arrivalTime; int burstTime; int
Process(intpid,intat,int , btinttw)
{ processId = pid; burstTime = bt; arrivalTime = at;
3.3.2 Cấu trúc MLFQ class MLFQ
{ int * pid; int * arrival_time; int * burst_time; int * waitingTime; int * responseTime; int * turnAroundTime; double avgWaitingTime; int waitTimer1, waitTimer2; double avgTurnAroundTime; double avgResponseTime; int totalPids = 0; queue queue0; queue queue1; queue queue2; queue tempQueue; queue tempQueue1; queue tempQueue2; vector granttChart; int counter; int currentQueue; int QUANTUM0, QUANTUM1, queue1WaitTime, queue2WaitTime; bool stop;