Tải bản đầy đủ (.pdf) (30 trang)

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.pdf

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 (2.89 MB, 30 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>ĐẠI HỌC BÁCH KHOA HÀ NỘI</b>

TRƯỜNG ĐIỆN – ĐIỆN TỬ

<b>BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH</b>

<b>Đề tài: Tìm hiểu về quản lý tiến trình, luồng,</b>

tìm hiểu các vấn đề đồng bộ hóa trên Window

<b>Giảng viên hướng dẫn: TS.Nguyễn Thanh BìnhNhóm sinh viên thực hiện: Nhóm 21</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>Mục lục</b>

<small>I.GI I THI U ĐỀỀ TÀIỚỆ...4</small>

<small>II. GI I THI U CHUNG VỀỀ TIỀẾN TRÌNH VÀ LUỒỀNGỚỆ...4</small>

<b><small>1.Tiến trình...4</small></b>

<b><small>1.1</small></b> <small>Khái niệm tiến trình...4</small>

<b><small>1.2</small></b> <small>Trạng thái của 1 tiến trình trong window...5</small>

<b><small>1.3.</small></b> <small>Cấu trúc dữ liệu tiến trình chính của windows...5</small>

<b><small>2.1</small></b> <small>Tổng quan về luồng...9</small>

<b><small>2.2</small></b> <small>Lập trình đa lõi...10</small>

<b><small>2.3</small></b> <small>Mơ hình đa luồng...10</small>

<b><small>2.4 Thành phần quản lý luồng trong Windows...12</small></b>

<b><small>2.5 Một số hàm quản lý luồng trên Windows...12</small></b>

<b><small>3. Khởi tạo, kết thúc tiến trình sử dụng hàm trong WIN32 API...13</small></b>

<small>III. CÁC VẤẾN ĐỀỀ VỀỀ TƯƠNG TRANH VÀ ĐỒỀNG B HÓAỘ...14</small>

<b><small>1.Giới thiệu về tương tranh và đồng bộ...14</small></b>

<b><small>2. Các vấn đề trong tương tranh và đồng bộ hóa...14</small></b>

<b><small>2.1. Nhu cầu độc quyền truy xuất...14</small></b>

<b><small>2.2</small></b> <small>Vấấn đềề Miềền găng (Critical - Section)...15</small>

<small>IV. TH C HI N TRI N KHAI CÁC VẤẾN ĐỀỀ VỀỀ ĐỒỀNG B HÓA KINH ĐI NỰỆỂỘỂ ...27</small>

<small>1.Vấấn đềề: b đ m gi i h n / s n xuấất – tiều th (bouned bufer / producer - consumer)ộ ệớ ạảụ...27</small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b><small>2.3</small></b> <small>Triển khai giải pháp giải quyết vấn đề đọc ghi...36</small>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>I.GIỚI THIỆU ĐỀ TÀI</b>

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ến

trì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>Bảng phân cơng nhiệm vụ</b>

1.1Khái niệm tiến trình

Trong khoa học máy tính, <b>tiến trình</b> (tiếng Anh: <b>process) là một thực thể</b>

(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ó

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

riêng một khơng gian địa chỉ, có ngăn xếp (stack) riêng rẽ, có bảng chứa các đặctả 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 tồn bộ hệ thống vào thời điểm tiếntrình đang chạy.

1.2Trạng thái của 1 tiến trình trong window

Khi thực hiện, TT thay đổi trạng thái • <b>Khởi tạo (New) </b>TT đang được khởi tạo

• <b>Sẵn sàng (Ready) </b>TT đang đợi sử dụng processor vật lý

• <b>Thực hiện (Running) </b>Các câu lệnh của TT đang được thực hiện

<b> • Chờ đợi (Waiting) TT đang chờ đợi 1 sự kiện nào đó</b>

xuất hiện (sự hồn thành thao tác vào/ra)

<b> • Kết thúc (Terminated) TT thực hiện xong</b>

Trạng thái của TT là một phần trong hoạt động hiện tại của TT

<b>I.3. Cấu trúc dữ liệu tiến trình chính của windows</b>

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).

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Hì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

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b> 1.3.1 Khối điều hành tiến trình (EPROCESS)</b>

Nội dung của Khối EPROCESS

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.

Cổng gọi thủ tục cục bộ kế thừa ngoại lệ (LPC)

Kênh giao tiếp giữa các tiến trình mà trình quản lý tiến trình sẽ gửi một thơng báo khi một trong các luồng của tiến trình gây ra một ngoại lệ.

Đố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

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

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.

<b> 1.3.2 Khối hạt nhân tiến trình (KPROCESS hay PCB)</b>

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.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

Hình 1-3. Cấu trúc của khối điều khiển tiến trìnho 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.

<b>- ExitThread: Luồng chỉ định được thốt trước khi có thể gọi bất kỳ trình hủy nào hoặc bất</b>

- 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.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

2.2Lậ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.3Mơ 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 ngồ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.

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

- Hầu hết các triển khai của mơ hình này đều đặt giới hạn về số lượng luồng có thể được tạo.

<b>2.3.2 Mơ hình nhiều- nhiều</b>

- 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.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Hì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 tồn bộ q trình.- Các q 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.

<b> 2.4 Thành phần quản lý luồng trong Windows</b>

- 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:

+ ID chuỗi.+ Registers.

+ Ngăn xếp người dùng được sử dụng trong chế độ người dùng và ngăn xếp nhân được sử dụng trong chế độ nhân.

+ Một khu vực lưu trữ riêng được sử dụng bởi nhiều thư viện thời gian chạy và thư viện liên kết động (DLL).

<b> 2.5 Một số hàm quản lý luồng trên Windows</b>

- 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 q 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ó.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>3. Khởi tạo, kết thúc tiến trình sử dụng hàm trong WIN32 API</b>

- 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 hồ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.

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

<b>III. CÁC VẤN ĐỀ VỀ TƯƠNG TRANH VÀ ĐỒNG BỘ HÓA</b>

<b>1. Giới thiệu về tương tranh và đồng bộ</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; đaxử 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 qn 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.

<b>2. Các vấn đề trong tương tranh và đồng bộ hóa</b>

<b> 2.1. Nhu cầu độc quyền truy xuất</b>

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;register1 := register + 1;<small>1</small>counter := register1consumer: register := counter;<small>2</small>

register2 := register + 1;<small>2</small>counter := register2

Với register và register đều là thanh ghi nằm trong CPU, thậm chí có thể là cùng <small>12</small>một thanh ghi vật lí.

<b>Giả sử sự thực thi đồng thời producer và consumer với thứ tự các chỉ thị:</b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

To: producer thực thi register1 := counter {register1 = T,: producer thực thi register := register<small>11 + {register1 = </small>T2: consumer thực thi register := counter<small>2</small> {register = <small>2</small>T3; cosumer thực thi register := register<small>22 - {register2 = </small>T4: producer thực thi counter := register<small>1</small> {counter = 6}T5: consumer thực thi counter := register2 {counter = 4}

Kết quả <b>counter = 4. </b>Nếu đảo ngược thứ tự T và T thì <small>45</small> <b>counter = 6. </b>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

<b>tiến trình đồng thời thao tác trên biến counter. </b>

Trong trường hợp trên, các tiến trình ở trạng thái tương tranh (<b>race condition</b>)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).

<b>2.2 Vấn đề Miền găng (Critical - Section) </b>

Cấu trúc chung của tiến trình P có dạng:<small>i</small>

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à <b>miền găng </b>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ànglà 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 <b>entry section</b>) , thực hiện cập nhật dữ liệu dùng chung rồi thơng báo thốt khơi miền gàng (thực hiện trong phần <b>exit section</b>), những

</div>

×