ĐẠI HỌC BÁCH KHOA HÀ NỘITRƯỜNG ĐIỆN – ĐIỆN TỬ BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH Đề tài: Tìm hiểu về quản lý tiến trình, luồng, tìm hiểu các vấn đề đồng bộ hóa trên Window Giảng viên hướ
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI
TRƯỜNG ĐIỆN – ĐIỆN TỬ
BÁO CÁO BÀI TẬP LỚN
HỆ ĐIỀU HÀNH
Đề tài: Tìm hiểu về quản lý tiến trình, luồng,
tìm hiểu các vấn đề đồng bộ hóa trên Window
Giảng viên hướng dẫn: TS.Nguyễn Thanh Bình
Nhóm sinh viên thực hiện: Nhóm 21
Trang 2Mục lục
I GI I THI U ĐỀỀ TÀI Ớ Ệ 4
II GI I THI U CHUNG VỀỀ TIỀẾN TRÌNH VÀ LUỒỀNG Ớ Ệ 4
1 Tiến trình 4
1.1 Khái niệm tiến trình 4
1.2 Trạng thái của 1 tiến trình trong window 5
1.3. Cấu trúc dữ liệu tiến trình chính của windows 5
2 Luồng 9
2.1 Tổng quan về luồng 9
2.2 Lập trình đa lõi 10
2.3 Mô hình đa luồng 10
2.4 Thành phần quản lý luồng trong Windows 12
2.5 Một số hàm quản lý luồng trên Windows 12
3 Khởi tạo, kết thúc tiến trình sử dụng hàm trong WIN32 API 13
III CÁC VẤẾN ĐỀỀ VỀỀ T ƯƠ NG TRANH VÀ ĐỒỀNG B HÓA Ộ 14
1 Giới thiệu về tương tranh và đồng bộ 14
2 Các vấn đề trong tương tranh và đồng bộ hóa 14
2.1 Nhu cầu độc quyền truy xuất 14
2.2 Vấấn đềề Miềền găng (Critical - Section) 15
3 Các gi i pháp phầần mềầm ả 17
3.1 Gi i pháp Peterson ả 17
3.2 Gi i pháp Dekkerả 18
3.3 Gi i pháp phấền c ngả ứ 20
3.4 Mutex Lock 23
3.5 S d ng cấấu trúc Semaphoreử ụ 24
IV TH C HI N TRI N KHAI CÁC VẤẾN ĐỀỀ VỀỀ ĐỒỀNG B HÓA KINH ĐI N Ự Ệ Ể Ộ Ể 27
1 Vấấn đềề: b đ m gi i h n / s n xuấất – tiều th (bouned bufer / producer - consumer) ộ ệ ớ ạ ả ụ 27
1.1 Đặt vấn đề 27
1.2 Giải pháp 28
2 Vấn đề đọc ghi – ghi( Reader -Writer) 35
2.1 Đặt vấn đề 35
2.2 Giải pháp 35
Trang 32.3 Triển khai giải pháp giải quyết vấn đề đọc ghi 36
3 Dining Philosopher 38
3.1 Đặt vấn đề 38
3.2 Giải pháp 38
3.3 Thực hiện triển khai giải pháp cho Dining Philosopher 39
L i c m n ờ ả ơ 41
Danh m c tài li u tham kh o ụ ệ ả 42
Trang 4I GIỚI THIỆU ĐỀ TÀI
Tất cả các hệ điều hành từ hệ điều hành đơn người sử dụng đến hệ điều hành hỗ trợhàng ngàn người sử dụng đểu phải xây dựng dựa trên khái niệm tiến trình Vì thế, mộtyêu cấu quan trọng trong thiết kế hệ điều hành là thành phần quản lý tiến trình của hệđiều hành phải đáp ứng tất cả những gì liên quan đến tiến trình:
- Hệ điều hành phải cho phép thực hiện nhiều tiến trình đồng thời để khai thác tối đathời gian xử lý của processor nhưng cũng cung cấp được hồi đáp hợp lý
- Hệ điều hành phải cấp phát tài nguyên để tiến trình hoạt động một cách hiệu quảvới một chính sách hợp lý nhưng không xảy ra tình trạng tắc nghẽn trong hệ thống
- Hệ điều hành phải có nhiệm vụ tạo ra tiến trình, điều khiển sự hoạt động của tiếntrình và kết thúc tiến trình
Mỗi hệ điều hành có những đặc trưng riêng trong sử dụng thuật toán cũng như xâydựng phần mềm quản lý Ở đề tài này, nhóm chúng em sẽ đề cập đến kiến thức cơ bản vềquản lý tiến trình trong Hệ điều hành Windows
Bảng phân công nhiệm vụ
Phạm Minh Vũ Tìm hiểu tiến trình và WIN32 API
Nguyễn Văn Minh Tìm hiểu về luồng
Hàn Lâm Huy Tìm hiểu các vấn đề về tương tranh và đồng bộ hóa
Cao Hoàng Sơn Các giải pháp xử lý tương tranh và đồng bộ hóa
II GIỚI THIỆU CHUNG VỀ TIẾN TRÌNH VÀ LUỒNG
1 Tiến trình
1.1 Khái niệm tiến trình
Trong khoa học máy tính, tiến trình (tiếng Anh: process) là một thực thể
(instance) của một chương trình máy tính đang được thực thi Một tiến trình có
Trang 5riêng một không gian địa chỉ, có ngăn xếp (stack) riêng rẽ, có bảng chứa các đặc
tả tập tin (file descriptor) được mở cùng tiến trình và đặc biệt là có một địnhdanh PID (process identifier) duy nhất trong toàn bộ hệ thống vào thời điểm tiếntrình đang chạy
1.2 Trạng thái của 1 tiến trình trong window
Khi thực hiện, TT thay đổi trạng thái
• Khởi tạo (New) TT đang được khởi tạo
• Sẵn sàng (Ready) TT đang đợi sử dụng processor vật
lý
• Thực hiện (Running) Các câu lệnh của TT đang được
thực hiện
• Chờ đợi (Waiting) TT đang chờ đợi 1 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) TT thực hiện xong
Trạng thái của TT là một phần trong hoạt động hiện tại
của TT
I.3 Cấu trúc dữ liệu tiến trình chính của windows
Mỗi tiến trình Windows được đại diện bởi một khối điều hành tiến trình(EPROCESS) Bên cạnh việc chứa nhiều thuộc tính liên quan đến một tiếntrình, một khối EPROCESS còn chứa và trỏ đến một số cấu trúc dữ liệu liênquan khác Ví dụ: mỗi tiến trình có một hoặc nhiều luồng được đại diện bởi cáckhối chuỗi điều hành (ETHREAD) Khối EPROCESS và các cấu trúc dữ liệuliên quan của nó tồn tại trong không gian địa chỉ hệ thống, ngoại trừ khối môitrường tiến trình (PEB), tồn tại trong không gian địa chỉ tiến trình (vì nó chứathông tin cần được truy cập bằng mã chế độ người dùng)
Trang 6Hình 1-1 Cấu trúc dữ liệu được liên kết với các tiến trình và luồng
Hình 1-2 Cấu trúc của một khối điều hành tiến trình
Trang 71.3.1 Khối điều hành tiến trình (EPROCESS)
Nội dung của Khối EPROCESS
cơ sở mặc định, mặt nạ quan hệ và tổng thời gian của nhân và người dùng và chu kỳ xung nhịp CPU cho các luồng trong tiến trình
Nhận dạng tiến trình ID tiến trình duy nhất, tạo ID tiến trình, tên hình ảnh
đang chạy, tiến trình trạm cửa sổ đang chạy.Khối hạn ngạch Giới hạn về việc sử dụng bộ xử lý, nhóm không
phân trang, nhóm phân trang và sử dụng tệp trang cộng với việc sử dụng nhóm không phân trang và không phân trang của tiến trình hiện tại và cao điểm (Lưu ý: Một số tiến trình có thể chia sẻ cấu trúc này: tất cả các tiến trình hệ thống trong phiên 0 trỏ đến một khối hạn ngạch toàn hệ thống; tất cả các tiến trình khác trong các phiên tương tác đều chia sẻ một khối hạn ngạch duy nhất.)
Bộ mô tả địa chỉ ảo
(VAD)
Chuỗi cấu trúc dữ liệu mô tả trạng thái của các phần của không gian địa chỉ tồn tại trong tiến trình.Thông tin bộ làm việc Con trỏ đến danh sách tập hợp làm việc (cấu trúc
MMWSL); kích thước bộ làm việc hiện tại, cao điểm, tối thiểu và tối đa; lần cắt cuối cùng; số lỗi trang; ưu tiên bộ nhớ; cờ vây; lịch sử lỗi trang.Thông tin bộ nhớ ảo Kích thước ảo hiện tại và cao nhất, sử dụng tệp
trang, mục nhập bảng trang phần cứng cho thư mục trang tiến trình
Đối tượng gỡ lỗi Đối tượng điều hành mà qua đó cơ sở hạ tầng gỡ lỗi
ở chế độ người dùng sẽ gửi thông báo khi một trong
Trang 8Thành phần Mục đích
các luồng của tiến trình gây ra sự kiện gỡ lỗi
Mã thông báo truy
cập (TOKEN)
Đối tượng điều hành mô tả hồ sơ bảo mật của tiến trình này
Xử lý bàn Địa chỉ của bảng xử lý mỗi tiến trình
Bản đồ thiết bị Địa chỉ của thư mục đối tượng để giải quyết các
tham chiếu tên thiết bị trong (hỗ trợ nhiều người dùng)
Khối môi trường xử
lý (PEB)
Thông tin hình ảnh (địa chỉ cơ sở, số phiên bản, danh sách mô-đun), thông tin đống xử lý và sử dụng lưu trữ cục bộ luồng (Lưu ý: Các con trỏ đến đống quy trình bắt đầu ở byte đầu tiên sau PEB.)Khối tiến trình của hệ
thống con Windows
(W32PROCESS)
Chi tiết tiến trình cần thiết bởi thành phần chế độ hạtnhân của hệ thống con Windows
1.3.2 Khối hạt nhân tiến trình (KPROCESS hay PCB)
Khối hạt nhân tiến trình (KPROCESS), là một phần của khối EPROCESS và khốimôi trường tiến trình (PEB), được trỏ tới bởi khối EPROCESS, chứa các chi tiết bổsung về đối tượng quá trình Khối KPROCESS đôi khi được gọi là PCB hoặc khốiđiều khiển tiến trình Nó chứa thông tin cơ bản mà hạt nhân Windows cần để lên lịchcho các luồng bên trong một tiến trình
Trang 9Hình 1-3 Cấu trúc của khối điều khiển tiến trình
o Tiêu đề đối tượng điều phối chung
o Con trỏ đến thư mục trang tiến trình
o Danh sách các khối nhân luồng(KTHREAD) thuộc tiến trình
o Mức độ ưu tiên cơ sở mặc định
o Mặt nạ quan hệ
o Tổng thời gian của nhân và người dùng
o Chu kỳ xung nhịp CPU cho các luồng trong tiến trình
- ExitThread: Luồng chỉ định được thoát trước khi có thể gọi bất kỳ trình hủy nào hoặc bất
- Các ứng dụng đa luồng có nhiều luồng trong một quy trình duy nhất, mỗi luồng có
bộ đếm chương trình, ngăn xếp và tập hợp các thanh ghi riêng, nhưng chia sẻ mã, dữliệu chung và một số cấu trúc nhất định như tệp đang mở
Luồng là một phần thực thi của tiến trình
Trang 102.2 Lập trình đa lõi
- Một xu hướng gần đây trong kiến trúc máy tính của Windows là sản xuất chip có nhiều lõi, hoặc CPU trên một chip duy nhất.Một ứng dụng đa luồng chạy trên chip lõi đơn truyền thống sẽ phải xen kẽ các luồng Tuy nhiên, trên chip đa lõi, các luồng
có thể được trải rộng trên các lõi có sẵn, cho phép xử lý các tiến trình song song
- Các loại thực hiện song song: Về lý thuyết, có hai cách khác nhau để song song một khối lượng công việc:
+ Data parallelism phân chia dữ liệu giữa nhiều lõi (luồng) và thực hiện cùng một nhiệm vụ trên mỗi tập con của dữ liệu Ví dụ: chia một hình ảnh lớn thành nhiều phần và thực hiện xử lý hình ảnh kỹ thuật số giống nhau trên mỗi phần trên các lõi khác nhau
+ Task parallelism phân chia các tác vụ khác nhau cần thực hiện giữa các lõi khác nhau và thực hiện chúng đồng thời.Trong thực tế, không có chương trình nào được phân chia hoàn toàn chỉcho một hoặc một trong những chương trình này, mà thay vào đó là một loại tổ hợp lai nào đó
2.3 Mô hình đa luồng
-Việc quản lý tất cả các luồng được thực hiện thông qua lớp Luồng, bao gồm các luồng được tạo bởi thời gian chạy ngôn ngữ chung và những luồng được tạo bên ngoài thời gian chạy đi vào môi trường được quản lý để thực thi mã Thời gian chạy giám sát tất cả các luồng trong quy trình của nó đã từng thực thi mã trong môi trường thực thi được quản lý
- Có hai loại luồng được quản lý trong một hệ thống hiện đại: Luồng người dùng và luồng hạt nhân Các luồng người dùng được hỗ trợ phía trên hạt nhân, không hỗ trợ hạt nhân
- Các luồng nhân được hỗ trợ trong nhân của chính hệ điều hành Windows hỗ trợ các luồng cấp nhân, cho phép nhân thực hiện nhiều tác vụ đồng thời và phục vụ nhiều lệnh gọi hệ thống nhân đồng thời
- Trong một triển khai cụ thể, các luồng người dùng phải được ánh xạ tới các luồng hạt nhân
Windows sử dụng phối hợp 2 chiến lược sau đây
Trang 112.3.2 Mô hình nhiều- nhiều
- Mô hình nhiều-nhiều ghép bất kỳ số luồng nào của người dùng vào một số luồng nhân bằng hoặc nhỏ hơn, kết hợp các tính năng tốt nhất của mô hình một-một và nhiều-một
Trang 12Hình: Mô hình nhiều – nhiều
- Người dùng không có giới hạn về số lượng chủ đề được tạo
Chặn các cuộc gọi hệ thống nhân không chặn toàn bộ quá trình
- Các quá trình có thể được chia thành nhiều bộ xử lý
- Các quy trình riêng lẻ có thể được cấp phát số lượng luồng nhân thay đổi, tùy thuộc vào số lượng CPU hiện có và các yếu tố khác
2.4 Thành phần quản lý luồng trong Windows
- Thư viện luồng API Win32 hỗ trợ mô hình luồng một-một
- Win32 cũng cung cấp thư viện fiber hỗ trợ mô hình nhiều-nhiều
- Các thành phần luồng Win32 bao gồm:
2.5 Một số hàm quản lý luồng trên Windows
- CreateThread: Khởi tạo một luồng mới
- TerminateThread: Hủy bỏ một luồng chỉ định
- SuspendThread: Quá trình thực thi của luồng được chỉ định bị tạm dừng và số lượng tạm ngừng của luồng được tăng lên
- ResumeThread: Kiểm tra số lượng tạm ngưng của luồng
- Sleep: Chỉ định một luồng từ bỏ phần thời gian còn lại của nó và vô hiệu hóa nó trong một khoảng thời gian
- WaitForSingleObject: Kiểm tra trạng thái hiện tại của luồng được chỉ định
- ExitThread: Luồng chỉ định được thoát trước khi có thể gọi bất kỳ trình hủy nào hoặc bất kỳ quá trình dọn dẹp tự động nào khác
- GetCurrentThread: Luồng được gọi có thể sử dụng hàm này để gọi chính nó trong quá trình xử lý
- SetThreadPriority: Thiết lập mức ưu tiên cơ bản cho luồng dựa trên lớp ưu tiên củatiến trình của nó
Trang 133 Khởi tạo, kết thúc tiến trình sử dụng hàm trong WIN32 API
- Một tiến trình windows được tạo khi mà ứng dụng gọi hàm tạo tiến trình như là hàmCreate Process, Create Process As User, Create Process With Token Who hoặc CreateProcess With LogonW Để tạo một tiến trình cần những thông tin trong thư việnclient-sever Kernel32.dll, trình thực thi của Windows và tiến trình hệ thống con củaWindows
- Các bước tạo một tiến trình mới:
Để tạo một tiến trình với hàm API CreateProcess thì phải qua 7 bước cơ bản:B1: Xác thực các thông số; chuyển đổi các cờ và tùy chọn của hệ thống con Windowsthành các đối tác gốc của chúng; phân tích cú pháp, xác thực và chuyển đổi danh sáchthuộc tính thành đối tác gốc của nó
B2: Mở tệp hình ảnh (.exe) sẽ được thực thi bên trong tiến trình
B3: Tạo đối tượng tiến trình điều hành Windows
B4: Tạo luồng ban đầu (ngăn xếp, ngữ cảnh và đối tượng luồng điều hành Windows) B5: Thực hiện sau khi tạo, khởi tạo tiến trình dành riêng cho hệ thống con Windows B6: Bắt đầu thực thi luồng ban đầu (trừ khi cờ CREATE_ SUSPENDED được chỉđịnh)
B7: Trong bối cảnh của quy trình và luồng mới, hãy hoàn tất việc khởi tạo không gianđịa chỉ (chẳng hạn như tải các tệp DLL được yêu cầu) và bắt đầu thực thi chươngtrình
Trang 14III CÁC VẤN ĐỀ VỀ TƯƠNG TRANH VÀ ĐỒNG BỘ HÓA
1 Giới thiệu về tương tranh và đồng bộ
Việc quản lý tiến trình và luồng trong HĐH hiện đại được chia thành ba loại: đachương trình (multiprogramming) - nhiều tiến trình chạy đồng thời trên một CPU; đa
xử lý (multiprocessing) - nhiều tiến trình hoạt động trong hệ thống có nhiều CPU, và
xử lý phân tán (distributed system) - nhiều tiến trình hoạt động trong mỗi trườngphân tán Trong cả 3 kiểu trên, vấn đề thiết kế cơ bản vẫn là Tương tranh - các tiếntrình hoạt động đồng thời Mặc dù lợi ích rất lớn, nhưng tương tranh cũng làm nảysinh nhiều vấn đề, chẳng hạn như cạnh tranh tài nguyên, bế tắc, Truy cập đồng thờitới dữ liệu chia sẻ có thể gây ra sự không nhất quán trong dữ liệu Vì vậy, để đảm bảocác tiến trình có thể thực thi đồng thời và cộng tác với nhau, hệ thống phải có cơ chếcho phép các tiến trình trao đổi dữ liệu cũng như đồng bộ hóa hoạt động
2 Các vấn đề trong tương tranh và đồng bộ hóa
2.1 Nhu cầu độc quyền truy xuất
Khi 2 hoặc nhiều tiến trình truy nhập cùng lúc vào một biến dùng chung và muốnthay đổi dữ liệu của biến, kết quả việc thực thi có thể thay đổi phụ thuộc vào thứ tựthực hiện cụ thể của các tiến trình
Ví dụ: Giả sử hiện tại counter = 5 và 2 tiến trình được thực thi đồng thời:
producer: counter := counter + 1
consumer: counter := counter – 1
Khi thi hành trên 1 kiến trúc máy tính cụ thể, 2 tiến trình có thể chuyển sang ngôn ngữ máy như sau:
producer: register1 := counter;
Trang 15To: producer thực thi register1 := counter {register1 =
T,: producer thực thi register := register1 1 + {register1 =
T2: consumer thực thi register := counter2 {register = 2
T3; cosumer thực thi register := register2 2 - {register2 =
T4: producer thực thi counter := register1 {counter = 6}
T5: consumer thực thi counter := register2 {counter = 4}
Kết quả counter = 4 Nếu đảo ngược thứ tự T và T thì 4 5 counter = 6 Khi thựcthi riêng rẽ, 2 tiến trình này chạy đúng, nhưng khi thực thi đồng thời, kết quả có thể
là 4 hoặc 6, mặc dù về mặt logic kết quả chính xác phải là 5 Nguyên nhân là cả hai
tiến trình đồng thời thao tác trên biến counter
Trong trường hợp trên, các tiến trình ở trạng thái tương tranh (race condition)khi nhiều tiến trình cùng cập nhật vào biến dùng chung, khiến kết quả không đượcnhư mong muốn Do vậy, phải đảm bảo tại thời điểm cụ thể chỉ có duy nhất một tiếntrình được thay đổi biến dùng chung (các tiến trình phải đồng bộ với nhau)
2.2 Vấn đề Miền găng (Critical - Section)
Cấu trúc chung của tiến trình P có dạng:i
Xét hệ thống gồm n tiến trình {Po, P|, , Pn-1} Mỗi tiến trình có đoạn mã gọi
là miền găng chứa các lệnh có thể thay đổi các biến dùng chung Hệ thống phải đảmbảo tại bất kỳ thời điểm nào tối đa chì có một tiến trình được thi hành đoạn mã trongmiền găng (gọi là bước vào miền găng) Khi đó biến dùng chung chì bị tác động bởi tối đa một tiến trình Khi đó các tiến trình thay phiên nhau bước vào miền găng và
hệ thống vẫn đảm bảo độc quyền truy xuất tài nguyên dùng chung, vấn đề miền gàng
là thiết kể giao
thức đồng bộ hóa các tiến trình Nói chung, mỗi tiến trình phải xin phép bước vào miền găng (thực hiện trong phần entry section) , thực hiện cập nhật dữ liệu dùng chung rồi thông báo thoát khôi miền gàng (thực hiện trong phần exit section), những