Tải bản đầy đủ (.docx) (18 trang)

BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH :Tùy Chỉnh Mức Ưu Tiên Của Tiến Trình Trong Hệ Điều Hành Linux

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (3.22 MB, 18 trang )

Trường Đại Học Bách Khoa Hà Nội
Khoa Điện Tử Viễn Thông
BÁO CÁO BÀI TẬP LỚN
MÔN: HỆ ĐIỀU HÀNH
Tùy Chỉnh Mức Ưu Tiên Của Tiến Trình Trong Hệ Điều Hành Linux
GIẢNG VIÊN HƯỚNG DẪN :TS. PHẠM VĂN TIẾN
SINH VIÊN: BÙI TUẤN ANH
NGUYỄN DUY LINH
LÊ THÁI HƯNG
LÊ ANH VĂN
LỚP: KSTN-ĐTVT-K52
Hà Nội, 10/2011
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Mục lục
Group 4 – Lớp ĐTVT – KSTN – K52 2
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
I. Lời mở đầu
Nghiên cứu về hệ điều hành đã và đang là đề tài lôi cuốn nhiều nhà nghiên cứu.Sự phát
triển của phần cứng tốc độ xử lí cao, khả năng đa nhiệm, đã yêu cầu hệ điều hành phải có sự phát
triển trước và tương xứng.Một trong những vấn đề cơ bản nhất của hệ điều hành đó là xử lí đa
nhiệm.Và để hiểu rõ hơn chúng em đã chọn đề tài số 3: “ Tùy chỉnh mức ưu tiên của tiến trình
trong hệ điều hành Linux “ . Cảm ơn thầy Phạm Văn Tiến đã hướng dẫn giúp chúng em hoàn
thành bài tập lớn này.
II. Lý thuyết
2.1. Khái niệm tiến trình
Linux là hệ đa xử lý, tức khả năng thực thi nhiều tác vụ cùng một lúc. Một chương trình
máy tính là một chuỗi các chỉ lệnh mà theo đó máy tính phải thực hiện. Mặt khác tài nguyên máy
tính (CPU, bộ nhớ, tệp, các thiết bị…) là hữu hạn và khi các chương trình này chạy thì các
chương trình đều có nhu cầu trên các tài nguyên đó.Để đáp ứng nhu cầu tài nguyên, cần có một
sách lược chạy trình hiệu quả để đảm bảo tính đa nhiệm, nhiều người dùng.Cách phổ biến nhất là
cấp tài nguyên cho mỗi chương trình trong một lượng thời gian nhất định, sao cho các chương


trình đều có cơ hội thực hiện như nhau và trong thời gian thực hiện chương trình, cần kiểm soát
việc thực hiện đó chặt chẽ.Để làm được điều này, người ta đưa ra một khái niệm gọi là tiến trình
(process).
Vậy tiến trình có thể hiểu là thời gian thực hiện của một chương trình và việc thực hiện
đó chỉ xảy ra trong một khoảng thời gian nhất định (slice time).
Tuy nhiên, để thực hiện được chương trình, tiến trình sẽ sử dụng CPU để chạy các lệnh
của nó và bộ nhớ nơi có mã lệnh, dữ liệu và ngăn xếp. Một tiến trình khi thực hiện phải làm theo
một trình tự các chỉ lệnh trong vùng code của tiến trình và không nhảy tới các chỉ lệnh của tiến
trình khác; tiến trình chỉ có thể đọc/ghi truy nhập data và stack của nó nhưng không thể trên data
và stack của tiến trình khác.
Tiến trình liên lạc với các tiến trình khác và phần còn lại của hệ thống bằng các lời Gọi
Hệ Thống (system call). Hệ thống phân chia việc thực hiện ra làm 2 chế độ: user mode và kernel
mode.Kernel thực hiện mã của tiến trình, nó là một phần của mỗi tiến trình người dùng.
2.2. Các trạng thái của tiến trình
Khi một tiến trình thực thi, nó thay đổi trạng thái.Trạng thái của mỗi tiến trình được định
nghĩa bởi các hoạt động hiện hành của tiến trình đó. Mỗi tiến trình có thể ở một trong những
trạng thái sau:
• Mới (new): tiến trình đang được tạo ra
• Đang chạy (running): các chỉ thị đang được thực thi
Group 4 – Lớp ĐTVT – KSTN – K52 3
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
• Chờ (waiting): tiến trình đang chờ sự kiện xảy ra
• Sẵn sàng (ready): tiến trình đang chờ được gán tới một bộ xử lý.
• Kết thúc (terminated): tiến trình hoàn thành việc thực thi.
Các tên trạng thái này là bất kỳ và chúng có thể khác nhau ở các hệ điều hành khác
nhau.Tuy nhiên, các trạng thái mà chúng hiện diện được tìm thấy trên tất cả các hệ thống.Các hệ
điều hành xác định mô tả trạng thái quá trình. Chỉ một quá trình có thể đang chạy tức thì trên bất
kì bộ xử lý nào mặc dù quá trình có thể ở trạng thái sẵn sang và chờ.
Hình 2.1: lưu đồ trạng thái tiến trình
2.3. Mức ưu tiên của tiến trình

Trong các hệ phân chia thời gian, kernel sẽ phân phối CPU cho các tiến trình trong một
khoảng thời gian nhất định (time slice).Khi lượng thời gian này kết thúc, kernel sẽ lập biểu
(schedule) chọn tiến trình khác và cấp CPU cho tiến trình đó. Để lựa chọn tiến trình tiếp theo
được chạy, kernel sẽ tính toán dựa vào mức ưu tiên, kernel sẽ chuyển đổi bối cảnh từ tiến trình
đang chạy sang bối cảnh của tiến trình có mức ưu tiên cao nhất.
Trong hệ điều hành linux, mức ưu tiên của tiến trình được tính là giá trị“nice value”, có
trị số nằm trong khoảng từ -20 đến 19. Giá trị -20 là có mức ưu tiên cao nhất, giá trị 19 là có mức
ưu tiên thấp nhất.Ngoài ra, để hiển thị mức ưu tiên có giá trị không âm thì priority còn được thể
hiện nằm trong khoảng từ 0 đến 39.
Các tiến trình trong Linux có đặc thù “chen ngang” (preemptive), nên khi tiến trình đi vào
trạng thái “sẵn sang chạy”, kernel sẽ kiểm tra nếu số ưu tiên của nó lớn hơn của tiến trình đang
chạy thì tiến trình đang chạy sẽ bị ngắt (bị chen ngang), bộ định thời biểu (scheduler) sẽ chọn
Group 4 – Lớp ĐTVT – KSTN – K52 4
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
tiến trình khác trong các tiến trình như trên cho chạy. Tiến trình bị chen ngang không có nghĩa là
bị treo, mà chỉ đơn giản là tiến trình không được dùng CPU, vì tiến trình vẫn còn trong danh sách
các tiến trình chạy.
Group 4 – Lớp ĐTVT – KSTN – K52 5
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
III. Các thông số hiển thị của tiến trình cho người dùng
Linux cung cấp cho chúng ta đầy đủ các công cụ để theo dõi và tùy chỉnh các thông số hệ
thống của tiến trình. Chúng ta sẽ đi tìm hiểu qua 1 chút về các thông số này. Sử dụng lệnh top
hoặc htoptrong terminal, giúp ta hiển thị ra các thông số cơ bản nhất của tiến trình.
Hình 3.1. Màn hình hiển thị lệnh htop
Trong đó:
• PID – The process ID of the process.
• USER – The name of the user that owns the process.
• PR – The priority assigned to the process.
• NI – This is the nice value of the process.
• VIRT – The amount of virtual memory used by the process.

• RES – The amount of physical RAM the process is using in kilobytes.
• SHR – The amount of shared memory used by the process.
• S – The status of the process. Possible vales include:
D – Uninterruptibly sleeping.
R – Running.
Group 4 – Lớp ĐTVT – KSTN – K52 6
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
S – Sleeping.
T – Traced or stopped.
Z – Zombied.
• %CPU – The percentage of CPU time used by the process.
• %MEM – The percentage of available physical RAM used by the process.
• TIME+ – The total amount of CPU time the process has consumed since being
started.
• COMMAND – The name of the command that was entered to start the process.
Ở đây, trong bài tập lớn này, nhóm em chỉ hiển thị các thông số PID, NI, và
COMMAND là các thông số cần thiết.
Group 4 – Lớp ĐTVT – KSTN – K52 7
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
IV. Thực hiện bài tập lớn
4.1. Yêu cầu
Viết chương trình / sửa mã nguồn nhân (kernel) hệ điều hành linux làm các công việc sau:
• Tùy chỉnh mức ưu tiên hủy các tiến trình thông qua một giao diện GUI. Các tiến trình
được tùy chỉnh là các chương trình duyệt web, email, chat, game, text editor…
• Chạy nhiều tiến trình đưa hệ thống về trạng thái khan hiếm bộ nhớ, kiểm tra kết quả hủy
tiến trình. Đưa ra bằng chứng chứng tỏ tiến trình bị hủy đúng là tiến trình có mức ưu tiên
thấp theo ý muốn người dùng.
4.2. Thực hiện
Để thực hiện yêu cầu đề bài, nhóm chúng em lựa chọn ngôn ngữ lập trình C để viết chương
trình. Cụ thể là dùng phần mềm Qt Creator

4.2.1. Cách thức hiển thị các tiến trình
Yêu cầu hiển thị: PID, NI, và COMMAND.
Các tiến trình được lưu trữ đầy đủ trong folder : “home/user/proc/” lưu trữ đầy đủ các
folder với số hiệu PID là tên các folder. Bên trong chứa đầy đủ thông tin về các PID.
Thông số NI có thể được lấy bằng cách sử dụng thư viện sys/resource.h như sau:
Trong hàm getpriority cung cấp cho ta giá trị NI của PID.Biến which có thể nhận 1 trong các
giá trị sau: PRIO_PROCESS, PRIO_PGRP, hoặc PRIO_USER. Biến who ở đây chính là giá trị
PID của tiến trình.
Thông số COMMAND được đọc từ file cmdline bên trong mỗi folder PID. Ở ví dụ dưới
đây, ta hiển thị chương trình firefox có PID = 1973
Group 4 – Lớp ĐTVT – KSTN – K52 8
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.1: Cấu trúc tổ chức quản lý PID trong linux.
4.2.2. Cách thức thay đổi giá trị ưu tiên của tiến trình
Để thay đổi giá trị ưu tiên của tiến trình, sử dụng “renice”.
Cấu trúc: renice -nincrement[-g | -p | -u]ID
Lưu ý: Giá trị ưu tiên của tiến trình được thay đổi trong khoảng nào là phụ thuộc vào tài khoản
của user. Đối với user root thì tiến trình được phép thay đổi từ mức cao nhất -20 đến mức thấp
nhất 19, còn đối với user thường thì tiến trình lựa chọn chỉ được phép thay đổi giá trị NI từ mức
0 đến mức 19. Ví dụ:
Hình 4.2 Hàm renice
4.2.3. Cách thức hủy tiến trình
Để thực hiện phương thức hủy tiến trình, ngôn ngữ C cung cấp cho chúng ta thư viện và
hàm:
#include <sys/types.h>
#include <signal.h>
Int kill(pid_t pid, int sig);
Trong đó: pidlà dấu hiệu nhận biết của một tiến trình.
Group 4 – Lớp ĐTVT – KSTN – K52 9
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux

sig là hằng số tín hiệu giao tiếp tiến trình.
Ở đây, ta sử dụng tín hiệu SIGINT để ngắt tiến trình.Dưới đây là một số tín hiệu thường
gặp:
SIGHUP Tín hiệu này được phát đến các tiến trình vào lúc cuối khi mà nó tự
ngắt. Nó cũng được phát đến mọi tiến trình có tiến trình chính tự ngắt.
SIGINT Tín hiệu này được phát đến các tiến trình khi ta ra lệnh ngắt.
SIGQUIT Tương tự như trên khi ta gõ vào ^D
SIGILL Lệnh không hợp lệ, tín hiệu được phát ra khi phát hiện 1 lệnh không
đúng ở cấp độ vật lý (ví dụ như 1 tiến trình thực hiện một lệnh mà máy
tính chông có lệnh này)
SIGTRAP Tín hiệu được phát ra sau mỗi lệnh trong trường hợp tiến trình có sử
dụng lệnh ptrace().
SIGIOT Bẫy được phát khi có các vấn đề về vật lý
SIGEMT Bẫy của lệnh phát, được phát ra khi có lỗi vật lý trong khi thực hiện.
SIGFPE Được phát ra khi có lỗi về tính toán như một số có dấu phẩy nối có định
dạng không hợp lý. Gần như luôn chỉ ra lỗi khi lập trình.
SIGKILL Trang bị để kết thúc tiến trình. Không thể bỏ qua hoặc cắt tín hiệu này.
SIGBUS Được phát khi gặp lỗi trên bus.
SYSGEGV Được phát ra khi gặp lỗi trên phân đoạn sự truy cập dữ liệu bên ngoài
phân đoạn dữ liệu được cấp phát cho tiến trình.
SIGSYS Đối số không đúng cho hệ thống gọi
SIGPIPE Viết trên một ống dẫn không mở để đọc
SIGALRM Phát ra khi đồng hồ của một tiến trình ngừng lại. Đồng hồ được hoạt
động bằng lệnh alrm().
SIGTERM Được phát ra khi một tiến trình kết thúc bình thường. Cũng có thể dùng
để dừng 1 hệ thống để kết thúc tất cả các tiến trình hoạt động.
4.2.4. Xây dựng giao diện đồ họa
Để xây dựng giao diện người dùng cho chương trình, nhóm đã thử rất nhiều công cụ phát
triển như Eclipse, Anjuta, Glade với gói công cụ hỗ trợ như thư viện Gtk+ tuy nhiên nhận thấy
rằng việc lập trình với các gói công cụ như vậy cần nhiều thời gian tìm hiểu xây dựng từ đầu, n

và không phù hợp với yêu cầu của bài tập lớn này.
Cuối cùng nhóm quyết định chọn công cụ Qt để phát triển.Qt là công cụ lập trình GUI miễn
phí được Nokia phát triển. Chúng ta có thể download Qt thông qua Application/Ubuntu
Software Center chọn Qt Creator
Group 4 – Lớp ĐTVT – KSTN – K52 10
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.3 Cài đặt phần mềm Qt
Hình 4.4 Giao diện chương trình
4.3. Kết quả
4.3.1. Hiển thị các tiến trình
Chạy file biên dịch ra, ta được giao diện lựa chọn. Lựa chọn hiển thị danh sách các tiến
trình ta được kết quả như hình dưới.
Hình 4.5: Hiển thị các tiến trình
4.3.2. Thay đổi mức ưu tiên các tiến trình
Sử dụng lựa chọn thay đổi mức ưu tiên của tiến trình, ta thu được các kết quả.
Đối với tài khoản sử dụng bình thường (không phải root), ta chỉ có thể thay đổi được các
giá trị NI trong khoảng từ 0 đến 19, nếu muốn thay đổi giá trị NI xuống âm thì ta phải đăng nhập
với tài khoản root.
Group 4 – Lớp ĐTVT – KSTN – K52 11
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.6 Tiến trình gedit trước khi thay đổi mức ưu tiên
Hình 4.7 Tiến trình gedit sau khi thai đổi mức ưu tiên
4.3.3. Hủy tiến trình
Từ danh sách tùy chọn, ta lựa chọn tùy chọn hủy tiến trình.Sau khi xác định số PID của
tiến trình muốn hủy (chọn hoặc gõ số), thì tiến trình đó sẽ bị hủy. Dưới đây là hình vẽ minh họa
sự hủy tiến trình của chương trình gedit có PID = 2587
Chương trình gedit trước khi bị hủy đang ở hình nền sau terminal.
Group 4 – Lớp ĐTVT – KSTN – K52 12
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.8 Tiến trình gedit khi bị hủy

Ấn refresh sẽ thấy tiến trình này đã mất đi trong phần mềm
Hình 4.9 Tiến trình gedit sau khi refresh
4.3.4. Kiểm tra kết quả hủy tiến trình
Yêu cầu: Chạy nhiều tiến trình đưa hệ thống về trạng thái khan hiếm bộ nhớ, kiểm tra
kết quả hủy tiến trình. Đưa ra bằng chứng chứng tỏ tiến trình bị hủy đúng là tiến trình có mức ưu
tiên thấp theo ý muốn người dùng.
Hướng giải quyết: Đối với yêu cầu trên thì nhóm em vẫn chưa tìm ra được 1 phương
án khả thi mà có thể theo dõi một cách rõ ràng. Trước hết nhóm em đi kiểm tra hoạt động của
tiến trình khi được set priority ở các mức khác nhau.
• Kiểm tra hoạt động của tiến trình với các mức priority khác nhau:
Để kiểm tra được sự hoạt động của tiến trình, nhóm em sử dụng tham số TIME+ được
hiển thị trong “top” hoặc “htop”. TIME+ là tham số đo thời gian chiếm dụng CPU của
tiến trình.
Group 4 – Lớp ĐTVT – KSTN – K52 13
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Cụ thể ở đây, ta tính thời gian chiếm dụng CPU của tiến trình “htop” ở các mức NI
khác nhau: mức -20, mức 0, và mức 19. Lưu ý ở đây là các chương trình chạy cùng lúc
này ở mọi thời điểm đo là không thay đổi, ta chỉ thay đổi giá trị NI của htop thôi.
Ở đây, ta đo thời gian chiếm dụng CPU của tiến trình htop trong khoảng thời gian thực
là 10 phút!!!
 Tiến trình “htop” với NI=-20
Hình 4.10: htop với NI = -20 ở 7:39:00am có TIME+ = 3:22,00 s
Group 4 – Lớp ĐTVT – KSTN – K52 14
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.11: htop với NI=-20 ở 7h:54am có TIME+=3:35,08s
 Tiến trình “htop” với NI = 0
Hình 4.12: htop với NI =0 tại 7:04:0am có TIME+=3:01,61s
Group 4 – Lớp ĐTVT – KSTN – K52 15
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.13: htop với NI=0 tại 7:19:00am có TIME+=3:13,36s

 Tiến trình “htop” với mức NI = 19:
Hình 4.14: htop với NI = 19 tại 7:20:00am có TIME+=3:13,92s
Group 4 – Lớp ĐTVT – KSTN – K52 16
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Hình 4.15: htop với NI=19 tại 7:35:00am có TIME+=3:20,06s
Tổng kết kiểm tra hoạt động của tiến trình htop:
Giá trị NI Thời gian chiếm dụng CPU trong 10 phút
-20 3:35,08 – 3:22,00 = 13,08 giây
0 3:13,06 – 3:01,61 = 11,45 giây
19 3:20,06 – 3:13,92 = 6,14 giây
Qua bảng trên, ta nhận thấy tiến trình với mức ưu tiên cao hơn sẽ có thời gian chiếm
dụng CPU cao hơn.
• Kiểm tra kết quả hủy tiến trình:
Đối với yêu cầu này, chúng em chưa kiểm tra được sự hủy tiến trình có mức ưu tiên
thấp khi hệ thống ở trạng thái khan hiếm bộ nhớ. Ở các thử nghiệm của chúng em, thì tiến
trình có mức ưu tiên thấp nhất (trong khi gán cho các tiến trình còn lại mức cao nhất) cũng
không bị OS kill mà chỉ rơi vào trạng thái chờ và khi đó thời gian chiếm dụng CPU của nó
giảm đi rõ rệt và tăng tiến rất chậm.
Group 4 – Lớp ĐTVT – KSTN – K52 17
Tùy chỉnh mức ưu tiên của tiến trình trong hệ điều hành Linux
Tài liệu tham khảo
1. Operating System Concepts 7
th
Edition
2. />3. />4. />5. />6. />7. />Group 4 – Lớp ĐTVT – KSTN – K52 18

×