Team Monsters TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ──────── ─────── BÁO CÁO MÔN HỌC Lập trình hệ thống Tên đề tài Tìm hiểu về quản lí tiến trình trên hệ điều hành windows Sinh viên thực hiện Hoàng Mạnh Hiệp 20161438 Trần Thanh Tú 20164487 Giảng viên hướng dẫn ĐỖ QUỐC HUY HÀ NỘI 12 2020 MỤC LỤC Contents Lời mở đầu 3 I Tiến trình 4 1 Khái niệm 4 2 Trạng thái tiến trình 4 3 Tạo tiến trình 5 a Lý thuyết 5 b Liệt kê tất cả process trong windows 6 c Tạo tiến trình.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
──────── * ───────
BÁO CÁO MÔN HỌC
Lập trình hệ thống
Tên đề tài: Tìm hiểu về quản lí tiến trình trên hệ
điều hành windows
Sinh viên thực hiện:
Giảng viên hướng dẫn: ĐỖ QUỐC HUY
HÀ NỘI 12-2020
Trang 2MỤC LỤC
Contents
Lời mở đầu 3
I Tiến trình 4
1 Khái niệm 4
2 Trạng thái tiến trình 4
3 Tạo tiến trình 5
a Lý thuyết 5
b Liệt kê tất cả process trong windows: 6
c Tạo tiến trình với CreateProcess 6
4 Kết thúc tiến trình 9
5 Độ ưu tiên trong tiến trình 10
II Luồng 12
1 Khái niệm 12
2 Tạo luồng với hàm CreateThread () 12
Tài liệu tham khảo 14
Trang 3Lời mở đầu
Trên thực tế không có sự thành công nào mà không gắn liền với những sự hỗ trợ, giúp đỡ dù ít hay nhiều, dù trực tiếp hay gián tiếp của người khác Trong suốt thời gian từ khi bắt đầu học tập ở giảng đường đại học đến nay, em đã nhận được rất nhiều sự quan tâm, giúp đỡ của quý thầy cô, gia đình và bạn bè Với lòng biết
ơn sâu sắc nhất, em xin gửi lời cảm ơn đến thầy Trịnh Anh Phúc, Giảng viên Khoa Công nghệ Thông tin Trường Đại học Bách Khoa Hà Nội đã giúp đỡ nhóm
em hoàn thành tốt bài tập này
Trong quá trình hoàn thành bài tập, cũng như là trong quá trình làm bài báo cáo khó tránh khỏi sai sót, rất mong các thầy, cô bỏ qua Đồng thời do trình độ lý luận cũng như kinh nghiệm thực tiễn còn hạn chế nên bài báo cáo không thể tránh khỏi những thiếu sót, em rất mong nhận được ý kiến đóng góp thầy để em học thêm được nhiều kinh nghiệm và sẽ hoàn thành tốt hơn bài báo cáo những lần sau.
Hà Nội, tháng 12 - 2020
Trang 4I Tiến trình
1 Khái niệm
Chương trình – Program:
một file chạy được chứa các chỉ lệnh (instruction) được viết để thực thi một công việc nào đó trên máy tính có thể thực thi được
Nằm ở bộ nhớ ngoài của máy tính
Tiến trình:
Là chương trình đang thực hiện, được cung cấp tài nguyên (CPU,
bộ nhớ, thiết bị vào/ra .) để hoàn thành công việc
Tài nguyên được cấp khi khởi tạo tiến trình hay khi tiến trình đang thực hiện
Mỗi tiến trình có một số định danh (process ID, hay pid), là một số dương để xác định tiến trình đó là duy nhất trong hệ thống Lập trình viên có thể tác động lên tiến trình (ví dụ kill tiến trình) bằng một số system call với đối số truyền vào là process ID đó Có thể lấy process ID của tiến trình đang chạy bằng system call getpid () với prototype như sau:
2 Trạng thái tiến trình
Tiến trình bao gồm các trạng thái và khi thực hiện thì tiến trình thay sẽ đổi trạng thái Việc thay đổi trạng thái chính là một phần trong hoạt động hiện tại của tiến trình Các trạng thái của tiến trình bao gồm
Khởi tạo (New) Tiến trình đang được khởi tạo
Sẵn sàng (Ready) Tiến trình đang đợi sử dụng processor vật lý
Thực hiện (Running) Các câu lệnh của tiến trình đang được thực hiện
Chờ đợi (Waiting) Tiến trình đang chờ đợi một sự kiện nào đó xuất hiện (sự hoàn thành thao tác vào/ra)
Kết thúc (Terminated) Tiến trình thực hiện xong
Lưu đồ thay đổi trạng thái tiến trình:
Trang 5Tiến trình gồm:
Tiến trình đơn luồng: Là một chương trình thực hiện chỉ một luồng thực thi
o Có một luồng câu lệnh thực thi
o Cho phép thực hiện chỉ một nhiệm vụ tại một thời điểm
Tiến trình đa luồng: Có nhiều luồng thực thi
o Cho phép thực hiện nhiều hơn một nhiệm vụ tại một thời điểm
3 Tạo tiến trình
a Lý thuyết
Các tiến trình có thể tạo ra các tiến trình khác thông qua lời gọi hệ thống
Ví dụ: system(“notepad.exe”)
Tiến trình gọi (calling process) là tiến trình cha (parent process), tiến trình mới được được tạo là tiến trình con của tiến trình đó
Tiến trình con có thể tạo tiến trình con khác ⇒Cây tiến trình
Có 2 tùy chọn cho tiến trình cha sau khi tạo ra tiến trình mới:
(1) Tiến trình cha tiếp tục thực thi, đồng thời với việc thực thi của tiến trình con
(2) Tiến trình cha đợi cho tới khi tiến trình con của nó kết thúc
Việc tạo tiến trình gặp một số vấn đề như sau:
Vấn đề phân phối tài nguyên:
Tiến trình con lấy tài nguyên từ hệ điều hành
Tiến trình con lấy tài nguyên từ tiến trình cha và có thể lấy:
Trang 6o Tất cả các tài nguyên
o Một phần tài nguyên của tiến trình cha (ngăn ngừa việc tạo quá nhiều tiến trình con)
Vấn đề thực hiện:
Tiến trình cha tiếp tục thực hiện đồng thời với tiến trình con
Tiến trình cha đợi tiến trình con kết thúc
b Liệt kê tất cả process trong windows:
Để liệt kê các process đang chạy trong window ta có thể sử dụng các cách như sau:
Sử dụng lệnh tasklist trong command prompt
Sử dụng hàm CreateToolhelp32Snapshot mà Microsoft cung cấp
hàm này có 2 tham số:
o dwFlags: sử dụng TH32CS_SNAPPROCESS: bao gôm tất
cả tiến trình trong hệ thống
o th32ProcessID: 0 process hiện tại
Hàm Process32First, Process32Next: Thông tin tiến trình đầu tiên process
o hSnapshot: kq trả về từ hàm CreateToolhelp32Snapshot:
o lppe: con trỏ PROCESSENTRY32
Mục đích chính của các hàm này là lấy ra tất cả process đang chạy qua hàm CreateToolhelp32Snapshot sau đó lặp dần để lấy tưng process với hàm Process32Next
c Tạo tiến trình với CreateProcess
Khởi tạo 1 tiến trình mới và 1 primary thread của nó
Tiến trình được tạo là tiến trình con, tiến trình gọi là tiến trình cha
BOOL CreateProcess (
LPCWSTR lpApplicationName,
LPWSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCWSTR lpCurrentDirectory,
LPSTARTUPINFOW lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
Trang 7Giá trị trả về của hàm:
True: Hàm success
False: Hàm fail
Tham số:
lpApplicationName: Tên của module được thực thi Tham số này hay được để NULL, thay vào đó sử dụng lpCommandLine để chỉ thị process nào được thực thi
lpCommandLine: Dòng lện được thực thi
o Sử dụng đường dẫn tương tự như trong command line để cho biết process nào sẽ được thực thi
o Nếu tên file thực thi không có phần mở rộng, EXE sẽ được gán
o Nếu tên file thực thi không chứa đường dẫn thư mục, hệ thống search file thực thi theo tuần tự sau:
1 Trong thư mục ứng dụng được load
2 Thư mục hiện tại cho tiến trình cha
3 Trong thư mục System/System32
4 Trong thư mục Windows
5 Trong các thư mục đươc list trong biến môi trường PATH
lpProcessAttributes: Con trỏ tới cấu trúc
SECURITY_ATTRIBUTES, quyết định xem handle trả về cho thread object mới có thể được kế thừa bởi các tiến trình con Nếu lpProcessAttributes là NULL, handle không thể được kế thừa
bInheritHandles:
o Nếu tham số này là TRUE, mỗi handle có thể kế thừa trong calling process được kế thừa trong tiến trình mới
o Nếu tham số này là FALSE, các handle không được kế thừa
o Chú ý rằng, các handle có cùng giá trị và quền truy cập như handle ban đầu
dwCreationFlags: Cờ cho phép chỉ định độ ưu tiên (priority class) của tiến trình và tạo tiến trình theo cách thực nào
Danh sách các giá trị Process Creation Flags
Constant/value Description
Trang 8CREATE_NEW_CONSOLE Tạo cửa sổ console mới cho
tiến trình mới, thay vì thừa
kế console của tiến trình cha(default) Cờ này không được sử dụng với
DETACHED_PROCESS CREATE_NO_WINDOW Tiến trình là 1 ứng dụng
console, nhưng được chạy
mà không có console window Console handle cho ứng udngj không đươc set
Cờ này đươc bỏ qua nếu ứng dụng không phải là ứng dụng console
CREATE_NEW_PROCESS_GROUP Tiến trình mới là tiến trình
root của 1 nhóm tiến trình mới group tiến trình bao gồm tất cả các tiến trình là
“hậu duệ” của tiến trình root ProcessID của nhóm tiến trình mới cũng giống với PID, đươc trả về trong IpProcessInformation
Goup tiến trình được sử dụng bới
GenerateConsoleCtrlEvent
để enable gửi 1 tín hiệu CTRL+C sẽ được disable tới tất cả các process trong nhóm tiến trình mới
Cờ này bị bỏ qua nếu sử dụng
CREATE_NEW_CONSOLE CREATE_SUSPENDED Primary thread của tiến trình
mới được tạo trong trạng thái suspend Và không chạy cho đến khi Resume Thread đươc gọi
Trang 9Danh sách các giá trị GetPriorityClass
Priority Class Flag Identifier
Giá trị mặc định là NORMAL_PRIORITY_CLASS
lpEnvironment: Một con trỏ tới block environment của tiến trình mới Nếu là NULL, tiến trình mới sử dụng environment của tiến trình gọi
lpCurrentDirectory: Đường dẫn đẩy đủ tới thư mục cho tiến trình
o Nếu tham số này là NULL, tiến trình con sẽ có current drive
và thư mục giống với tiến trình gọi
lpStartupInfo: Một con trỏ tới STARTUPINFO struct
lpProcessInformation: Một con trỏ tới PROCESS_INFORMATION structure để nhận thông tin xác định cho tiến trình mới
o Handle trong PROCESS_INFORMATION struct phải được đóng với CloseHandle khi không còn cần thiết
4 Kết thúc tiến trình
Các tiến trình có thể yêu cầu kết thúc chính nó bằng cách gọi hàm exit()
Khi kết thúc tiến trình, tất cả resource của hệ thống được giải phóng, các file được flush và đóng…
Tiến trình kết thúc khi hoàn thành câu lệnh cuối và yêu cầu HĐH xóa
nó (exit) khi đó tiến trình sẽ:
o Gửi trả dữ liệu tới tiến trình cha
o Các tài nguyên đã cung cấp được trả lại hệ thống
Tiến trình cha có thể kết thúc sự thực hiện của tiến trình con:
Trang 10o Tiến trình cha phải biết định danh tiến trình con(PID) ⇒ tiến trình con phải gửi định danh cho tiến trình cha khi được khởi tạo
o Sử dụng lời gọi hệ thống (abort): Tiến trình cha kết thúc tiến trình con khi tiến trình con sử dụng vượt quá mức tài nguyên được cấp Nhiệm vụ cung cấp cho tiến trình con không còn cần thiết nữa và khi tiến trình cha kết thúc và hệ điều hành không cho phép tiến trình con tồn tại khi tiến trình cha kết thúc
⇒Cascading termination
o VD: khi kết thúc hệ thống
Trong windows để kết thúc một tiến trình có thể sử dụng các cách sau:
o Sử dụng hàm gọi system theo cú pháp sau:
System (“taskkill /PID <process_id> /F”)
o Sử dụng hàm TerminateProcess (HANDLE hProcess, UINT
uExitCode) trong đó:
hProcess: Thẻ tiến trình bị kết thúc đóng
uExitCode: Mã kết thúc tiến trình
Khi hàm này được thực hiện thì nó sẽ kết thúc một tiến trình chỉ định và tất cả các luồng của nó
5 Độ ưu tiên trong tiến trình
Hệ điều hành windows chia sẻ tài nguyên xử lí cho các process đang chạy dựa trên độ ưu tiên của nó Với một process có độ ưu tiên cao thì
sẽ nhận được nhiều tài nguyên hơn và ngược lại
Có thể chỉ định mức độ ưu tiên cho một tiến trình, với các mức độ ưu tiên như sau: Realtime, High, Above normal, Normal, Below normal, Low
Để thay đổi độ ưu tiên của một process có thể thực hiện theo các cách sau:
o Thao tác trực tiếp trên task manager:
Trang 11o Sử dụng command line:
o Sử dụng hàm SetPriorityClass trong C:
Hàm này bao gồm 2 tham số đầu vào:
o hProcess: process cần set độ ưu tiên được lấy ra từ OpenProcess
o dwPriorityClass: độ ưu tiên bao gôm các tham số như sau:
ABOVE_NORMAL_PRIORITY_CLASS, BELOW_NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, IDLE_PRIORITY_CLASS,
NORMAL_PRIORITY_CLASS, REALTIME_PRIORITY_CLASS,
Trang 12II Luồng
1 Khái niệm
• Là đơn vị sử dụng CPU cơ bản, gồm:
o Định danh luồng (ID Thread)
o Bộ đếm chương trình (Program Computer)
o Tập các thanh ghi (Rigisters)
o Không gian stack
• Trong mô hình đơn luồng, một tiến trình là một luồng
• Trong mô hình đa luồng, một tiến trình có thể có nhiều luồng, gọi là multithreaded process Các luồng chia sẻ bộ nhớ ảo của tiến trình
Luồng mức người dùng (User threads)
Được cài đặt bởi thư viện luồng tại mức người dùng
o Thư viện hỗ trợ tạo, điều phối, quản lý luồng
Thao tác luồng được thực hiện trong không gian người dung (nhân không biết gì về luồng người dùng nên không can thiệp)
o Tạo và quản lý luồng nhanh chóng
Nếu nhân đơn luồng ⇒Một luồng đang chờ đợi vào ra có thể làm cho toàn bộ tiến trình phải đợi theo
Luồng mức hệ thống (Kernel threads)
Được hỗ trợ trực tiếp bởi HĐH
o Nhân thực hiện tạo, lập lịch, quản lý luồng trong không gian nhân
Hệ điều hành quản lý luồng:
o Chậm trong tạo và quản lý luồng
o Một luồng chờ đợi vào ra, không ảnh hưởng tới luồng khác
Trong môi trường đa VXL, nhân có thể điều phối các luồng
cho các VXL khác nhau
2 Tạo luồng với hàm CreateThread ()
HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress, drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
Trang 13LPDWORD lpThreadId);
Trong đó:
LPSECURITY_ATTRIBUTES lpThreadAttributes
o Trỏ tới cấu trúc an ninh: thẻ trả về có thể được kế thừa?
DWORD dwStackSize
o Kích thước ban đầu của stack cho luồng mới
LPTHREAD_START_ROUTINE lpStartAddress
o Trỏ tới hàm được thực hiện bởi luồng mới
LPVOID lpParameter
o Trỏ tới các biến được gửi tới luồng mới (tham số của hàm)
DWORD dwCreationFlags
o Phương pháp tạo luồng
CREATE_SUSPENDED : Luồng ở trạng thái tạm ngừng
o 0: Luồng được thực hiện ngay lập tức
LPDWORD lpThreadId
o Biến ghi nhận định danh luồng mới
Kết quả trả về: Thẻ của luồng mới hoặc giá trị NULL nếu
không tạo được luồng mới
Trang 14Tài liệu tham khảo
1 Slide hệ điều hành – TS Phạm Đăng Hải
2 Web:
https://docs.microsoft.com/enus/windows/win32/api/proce ssthreadsapi/