1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo bài tập lớn hệ điều hành đề tài advanced scheduler process termination messages

19 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

Trong quá trình học tập học phần Hệ ều hành do thầy Phạm Văn Tiến giảng dạ chúng em đã đượđi y c hướng dẫn, trợ giáo để hoàn thành việc thực hành các dự án trong khóa học về hệ điều hành

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

Đề tài: Advanced Scheduler & Process Termination Messages

Giảng viên hướng dẫn : TS.Phạm Văn Tiến

Trang 2

LỜI NÓI ĐẦU

Hiện nay, khoa học kĩ thuật trên thế ới ngày càng phát triển mạnh mẽ Khoa gihọc kĩ thuật đóng vai trò không thể ếu trong đời sống hiện đại ngày nay củthi a chúng ta nó hiện diện trong từng sản phẩm, từng vật dụng mà chúng ta sử dụng hàng ngày Vì vậy việ học tập và đạo tạo, kế ừa và phát triển những thành tực th u khoa học cho thế hệ mới ngày nay là vô cùng quan trọng đặc biệt là thế hệ sinh viên Việc tiếp cận đó cần phải tiếp cận cả về mặt lí thuyết lẫn thực hành, như vậy việc học tập và đào tạo mới có thể đạt được hiệu quả tốt nhất, đáp ứng được cho xã hội nguồn nhân lực khoa học kĩ thuật chất lượng cao Trong quá trình học tập học phần Hệ ều hành do thầy Phạm Văn Tiến giảng dạ chúng em đã đượđi y c hướng dẫn, trợ giáo để hoàn thành việc thực hành các dự án trong khóa học về hệ điều hành Pintos.

Sau khi trải qua một khoảng thời gian, nhóm chúng em đã cơ bản hoàn thành việc lập trình để ểu hơn về hệ ều hành Pintos, giải quyết được một vấn đề hi đitrong hệ ều hành này Trong bài báo cáo này, nhóm chúng đi em sẽ đi trình bày cụ thể ững gì đã làm được trong những tuần vừa qua thông qua 4 chương sau:nh

Chương 1: ới thiệu hệ ều hành PintosGiđiChương 2: Advanced Scheduler

Chương 3: Process Termination MessagesChương 4: Kết luận

Nhóm xin chân thành cảm ơn TS đã tận tâm hướng dẫ chúng em trong quá n trình tìm hiểu và hoàn thiện báo cáo này!

Trang 3

CHƯƠNG 1 GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS4

2.3 Phương pháp giải quyết9

2.5 Mô tả mã nguồn đã sửa đổi, bổ sung10

3.4 Triển khai mã nguồn14 3.5 Sửa đổi mã nguồn và bổ sung14

Trang 4

BẢNG PHÂN CÔNG CÔNG VIỆC

1 Advanced Scheduler

- Xác định công thức priority, tìm hiểu và viết code liên quan , tổng hợp code và chạy : thread_update_priority()compare_threads_by_priority()

- Xác định công thức recent_cpu,tìm hiểu và viế t code liên quan : thread_tick ()

- Xác định công thức load_avg,tìm hiểu và viết code liên quan

2 Process Termination Messages

Tìm hiểu và viết code liên quan setup_stack(), process_is_parent_of (), remove_child()process_close_all()process_init()

Tìm hiểu và viết code liên quan:

process_execute () start_process()

Tìm hiểu và viết code liên quan :

process_wait () process_exit()load() install_page()

Trang 5

CHƯƠNG 1.GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS

Chương này giới thiệu tổng quan về hệ điều hành Pintos và tổng quan về cây thư mục nguồn của hệ điều hành Pintos

Tổng quan về Pintos

Pintos là một khung hệ điều hành đơn giản cho kiến trúc 80x86 Nó hỗ trợ kernel threads, loading và running user programs và một file system, nhưng nó thực hiện tất cả những điều này một cách rất đơn giản Các cơ chế này còn có nhiều vấn đề cần khắc phục để hệ điều hành có thể ạy một cách tối ưu.ch

Hình 1: 4 Project dựa trên hệ điều hành Pintos mà Stanford đưa ra

Ngoài ra Stanford đưa ra CS140 Problem Set 0: Synchronization – Đồng bộ hóa để sinh viên làm quen với mã nguồn của Pintos Khi người dùng triển khai thành công (PASS các bài TEST) các nội dung được đề ra này, hệ điều hành Pintos sẽ hoạt động hiệu quả, hiệu suất cao, tiết kiêm các tài nguyên của bộ nhớ, năng lượng và thời gian của máy tính Trong báo cáo sẽ sử dụng QEMU là trình mô phỏng.

Cây thư mục nguồn

Quan sát vào bên trong mã nguồn Đây là cấu trúc thư mụ trong “…/pintos-c anonmaster/src”

Trang 6

-Thư mục Mô tả

“threads/” Mã nguồn cơ sở kernel, mà bạn sẽ thay đ i tổ ừ Project 1 “userprog/” Mã nguồn cho trình tải chương trình người dùng, mà bạn sẽ

sửa đổi từ Project 2

“vm/” Một thư mục gần như trống rỗng Bạn sẽ ển khai bộ tri nhớ ảo ở đây trong Project 3

“filesys/” Mã nguồn cho hệ ống tệp cơ bản Bạn sẽ sử dụng tệp này thbắt đầu với Project 2, nhưng bạn sẽ không sửa đổi nó cho đến Project 4.

“devices/” Mã nguồn cho giao tiếp thiết bị I/O: bàn phím, bộ đếm thời gian, đĩa, … Bạn sẽ sửa đổi việc triển khai bộ hẹn giờ trong Project 1

“lib/” Đây là tập các thư viện C chuẩn, được biên dịch vào kernel và các chương trình người dùng chạy dưới nó, bắt đầu từ Project 2 Tiêu đề trong thư mục này được đưa vào bằng #include <…>“lib/kernel/” Các phần của thư viện C chỉ có trong kernel Pintos Bao gồm

một số kiểu dữ liệu: bitmap, linked list, hash table.

“lib/user/” Các phần của thư viện C chỉ có trong chương trình người dùng.

“tests/” Các bài test cho từng dự án Bạn có thể sửa đổi mã này nếu nó giúp bạn kiểm tra nội dung của mình, nhưng chúng tôi sẽ thay thế nó bằng mã gốc trước khi test thử nghiệm.

“examples/” Ví dụ cho chương trình ngườ dùng được sử dụng trong i Project 2

Những files này có thể hữu ích nếu bạn quyết định thử làm việc với Pintos trên máy tính riêng Nếu không có thể bỏ qua chúng.

Tổng quan về Threads

Các trạng thái của tiến trình được mô tả ở hình dưới.

Trang 7

Hình 2: Sơ đồ FSM của một threads

Trong Pintos, các trạng thái của luồng được khai báo bởi cấu trúc “enum thread_status”• THREAD_RUNNING: Luồng đang chiếm CPU và làm việc trong CPU.

• THREAD_READY: Luồng sẵn sàng làm việc nhưng chưa được đưa vào CPU, được đặt trong hàng đợi ready queue chờ đến lượt.

• THREAD_BLOCKED: Luồng đang chờ một sự kiện nào đó xảy ra mới tiếp tục làm việc Khi đó luồng được đưa vào trạng thái THREAD_BLOCKED để nhường CPU cho các luồng khác trong ready queue làm việc.

• THREAD_DYING: Luồng đã thực hiện xong việc và được TERMINATED Nó sẽ được tiêu hủy.

Các hàm chuyển đổi giữa các trạng thái của luồng được mô tả ở hình dưới Chúng được khởi tạo trong “src/threads/thread.c”

Trang 8

Hình 3: Sơ đồ hàm chuyển trạng thái của threadsCấu trúc của luồng được khai báo trong “threads/thread.h”:• tid_t_tid: Thread identifier

• enum thread_status status: Thread state• char name[16]: Name (for debugging purpose)• uint8_t *stack: Saved stack pointer

• int priority: Priority (from 0 to 63)

• int base_priority: Base priority for priority donation• struct list_elem allelem: List element for all threads list• struct list_elem elem: List element

Trang 9

CHƯƠNG 2.Advanced Scheduler

Chương này mô tả mục tiêu, phương pháp, triển khai mã nguồn, mô tả mã nguồn đã sửa đổi, bổ sung giải quyết vấn đề Advanced Scheduler trong Project 1 của Pintos

Bộ lập lịch biểu nâng cao sử dụng các phương trình để tính toán một số giá trị để nó đưa ra quyết định.

Mô tả mục tiêu

Mục tiêu của bộ lập lịch mục đích chung là cân bằng các nhu cầu lậ ịch khác nhau củp l a luồng Các luồng thực hiện nhiều I/O yêu cầu thời gian phản hồi nhanh để giữ cho các thiết bị đầu vào và đầu ra luôn bận rộn nhưng lại cần ít thời gian cho CPU Mặt khác, các luồng liên kết điện toán cần nhận được nhiều thời gian của CPU để hoàn thành công việc nhưng không có yêu cầu về ời gian phản hồi nhanh Các luồng khác nằ ở đâu đó ở giữa, với các th m khoảng thời gian I/O được đánh dấu bằng các khoảng thời gian tính toán và do đó có các yêu cầu thay đổi theo thời gian Một bộ lập lịch được thiết kế tốt thường có thể đáp ứng đồng thời các luồng với t t cả các yêu cầu này ấ

Loại bộ lập lịch này duy trì một số hàng đợi của các luồng sẵn sàng chạy, trong đó mỗi hàng đợi chứa các luồng có mức độ ưu tiên khác nhau Tại b t kấ ỳ ời điểm nào, bộ lập lịth ch chọn một luồng từ hàng đợi không trống có mức độ ưu tiên cao nhất Nếu hàng đợi có mức độ ưu tiên cao nhất chứa nhiều luồng, thì chúng sẽ ạy theo thứ tự "vòng tròn".ch

Nhiều khía cạnh của bộ lập lịch yêu cầu cập nhậ ữ ệu sau mộ ố tích tắt d li t s c hẹn giờ nhất định Trong mọi trường hợp, những cập nhật này sẽ xảy ra trước khi bất kỳ luồng nhân thông

Trang 10

thường nào có cơ hội chạy, do đó, không có khả năng một luồng nhân có thể nhìn thấy giá trị mới tăng timer_ticks()nhưng giá trị dữ liệu cũ của bộ lập lịch

Phương pháp giải quyết

Tính mức độ ưu tiên của luồng được cập nhật trong timer_interrupt trong một khoảng thời gian cố định, ở đây là cập nhật hệ ống load_avg và recent_cpu của tất cả các luồng mỗth i TIMER_FREQ, cập nhật mức độ ưu tiên của luồng cứ sau 4 timer_ticks và thêm một vào recent_cpu của mỗi thread chạy timer_tick, Mặc dù những gì được đề cập ở đây là để duy trì 64 lập lịch hàng đợi ưu tiên, nhưng bản chất của nó vẫn là lập lịch ưu tiên, chúng ta có thể giữ mã lập lịch ưu tiên được viết trước đó và xóa ưu tiên đóng góp

Mỗi luồng có giá trị trong khoảng từ 20 đến 20 trực tiếp dưới sự kiểm soát của Mỗi luồng cũng có một mức độ ưu tiên, từ 0 ( ) đến 63 ( ), được tính toán lại bằng cách sử dụng công thức sau mỗi lần đánh dấu thứ tư:

priority = PRI_MAX - (recent_cpu/ 4) - (nice* 2).

đo lượng thời gian CPU mà một luồng đã nhận được " recently Trên mỗi dấu tích của bộ đếm thời gian, của luồng đang chạy được tăng thêm 1 Mỗi giây một lần, của mọi luồng được cập nhật theo cách này:

recent_cpu= (2*load_avg)/(2*load_avg+ 1) *recent_cpu+ nice

ước tính số luồng trung bình sẵn sàng chạy trong một phút qua Nó được khởi tạo bằng 0 khi khởi động và được tính toán lại một lần mỗi giây như sau:

trong đó là số luồng đang chạy hoặc sẵn sàng chạy tại thời điểm cập nhật bao gồm luồng không hoạt động).

Triển khai mã nguồn

Các hàm cần triển khai cho quá trình sửa đổi mã nguồn nằm trong file thread.c, thread.h

Trang 11

• Thêm hàm thread_update_recent_cpu() và thread_tick_one_second()• Thêm hàm thread_set_nice()

• Thêm hàm thread_get_nice()

• Thêm hàm thread_get_load_avg() để tính toán load_avg

• Thêm hàm thread_get_recent_cpu() để tính toán recent_cpu

• Thêm giá trị biến toàn cục: fixed_t load_avg;

• Khởi tạo : load_avg = 0;

Mô tả mã nguồn đã sửa đổi, bổ sung

➢ Các biến được thêm vào cấu trúc thread trong threads/thread.h:

• Thêm 2 biến int nicefixed_t recent_cpu ➢ Các hàm được thêm vào threads/thread.c:

thread_update_recent_cpu() và thread_tick_one_second(): đầu tiên tính

load_avg giá trị theo kích thước của hàng đợi sẵn sàng, sau đó cập nhật giá trị và giá trị load_avg của tất cả các quy trình theo giá trị của recent_cpu priority

thread_ update_priority_mlfqs() : Cập nhật giá trị của tiến trình hiện tại

Lưu ý đầu tiên của priority mỗi luỗng phải nằm trong khoảng từ 0 -63 (PRI_MIN - PRI_MAX).

thread_set_nice() : Đặt giá trị nice của luồng hiện tại thành NICE.

thread_get_nice(): Trả về giá trị nice của luồng hiện tại

thread_get_load_avg(): Trả về 100 lần mức tải trung bình của h thống.ệ • thread_get_recent_cpu(): Trả về 100 lần giá trị recent_cpu của luồng hiện

➢ Các biến và hàm thêm vào threads/thread.c:

Khi thread được khởi tạo, gán giá trị ban đầu cho 2 biến này để sửa đổi init_thread():

Khởi tạo: nice = 0 recent_cpu = 0

Trang 12

Kết quả

Kết quả sau khi kiểm tra bằng lệnh make check đã pass 9/9 test case

Hình 4: Kết quả sau khi chạy lệnh make check

Trang 13

CHƯƠNG 3 Process Termination Messages

Chương này mô tả mục tiêu, phương pháp, triển khai mã nguồn, mô tả mã nguồn đã

sửa đổi, bổ sung giải quyết vấn đề Process Termination Messages trong Project 2 của Pintos.Đặt vấn đề

Mỗi tiến trình chấm dứt khi nó kết thúc thực hiện câu lệnh cuối cùng và yêu cầu hệ điều hành xóa nó bằng cách sử dụng lệnh gọi exit() trong hệ ống Tại thời điểm đó, tiến trình thcon có thể ả về 1 giá trị ạng thái thường là một số nguyên cho tiến trìnhtr tr mẹ của nó thông qua lệnh gọi wait() h thệ ống

Tất cả các tài nguyên của tiến trình bao gồm cả bộ ớ ảo và bộ nhớ vật lý, mở tệp , bộ nhđêm vào ra I/O đều được hệ điều hành phân bổ.

Chúng ta vừa tìm hiểu về việc chấm dứt tiến trình , bây giờ chúng ta thấy rằng việc chấm dứt 1 tiến trình xảy ra khi câu lệnh cuối cùng của tiến trình đã được thực và tại thời điểm đó đã chấm d t tiứ ến trình đã xảy ra nhưng ngắt cũng có thể xảy ra trong các trường hợp khác.

Một tiến trình có thể gây ra việc chấm dứt tiến trình khác thông qua một cuộc gọi hệ ống ththích hợp Thông thường , một cuộc gọi như vậy chỉ có thể được gọi bởi tiến trình mẹ của tiến trình đó thì tiến trình con sẽ bị hệ điều hành ấm dứt Nếu không ch thì ,người dùng có thể tự ý hủy công việc của nhau Và bây giờ ến trình mẹ có thể ấm dứt tiến trình con vớti ch i nhiều lý do như:

• Tiến trình con đã vượt quá việc sử dụng một số tài nguyên mà nó được phân bổ (để xác định xem điều này đã xảy ra, tiến trình mẹ phải có cơ chế kiểm tra tình trạng của ến trình con)ti

• Nhiệm vụ được giao cho tiến trình con không còn cần thiết nữa

• Tiến trình mẹ đang thoát và hệ điều hành không cho phép một tiến trình con có thể tiếp tục nếu tiến trình mẹ đã kết thúc.

• Một tiến trình mẹ bằng cách sử dụng lệnh gọi hệ ống wait() Cuộc gọi hệ ống th thwait() được truyền một tham số cho phép tiến trình mẹ có được trạng thái thoát của tiến trình con Cuộc gọi hệ thống này cũng trả về định danh quy trình của tiến trình

Trang 14

Hình 5: Tạo tiến trình bằng cách sử dụng fork() system call

Trong project 2 việc khởi chạy chương trình người dùng đồng nghĩa rằng chương trình đó sẽ không được toàn quyền kiểm soát hoàn toàn hệ ống Các chương trình sẽ ạy trên th chkhông gian người dùng và bị giới hạn tài nguyên bởi hệ điều hành Để có thể ạy đượch c chương trình cần được nạp vào file system, các chương trình này sẽ cần truyền tham số xuống, hoặc tác động lên hệ ống thông qua yêu cầu system call Hiện tại Pintos đã xây dựng sẵth n file system nhưng chưa có cơ chế truyền tham số và chưa có system call, vì vậy việc chạy các chương trình trong thư mục src/examples s trẽ ả về lỗi page fault.

Mô tả mục tiêu

Bất cứ khi nào một quy trình người dùng kết thúc, vì nó được gọiexit hoặc vì bất kỳ lý do nào khác, hãy in tên và mã thoát của quy trình, được định dạng như thể được in bởi Tên được in phải là tên đầy đủ được truyền cho , bỏ qua các đối số dòng lệnh Không in các thông báo này khi một luồng hạt nhân không phải là quá trình người dùng kết thúc hoặc khicuộc gọi hệ ống được gọi Thông báo là tùy chọn khi một quá trình không tảth i được printf ("%s: exit(%d)\n", );process_execute()halt

Ngoài điều này, không in bất kỳ tin nhắn nào khác mà Pintos được cung cấp chưa in Bạn có thể tìm thấy các thông báo bổ sung hữu ích trong quá trình gỡ lỗi, nhưng chúng sẽ gây nhầm lẫn cho các tập lệnh chấm điểm và do đó làm giảm điểm của bạn.

Trang 15

Tại file process.c thư mục src/userprog một hàm void start_process (void *file_name) được xây dựng sẵn để load tiến trình người dùng và khởi chạy nó Trong hàm này, một biến success theo dõi trạng thái load của tiến trình, nếu tiến trình fail to load hàm sẽ gọi hàm thread_exit ()

Trường hợp chương trình bị terminate do phát sinh lỗi page fault

Tại file exeption.c thư mục src/userprog hàm void page fault (struct intr_frame *f) được xây dựng để xử lý lỗi page fault hàm sẽ xác định nguyên nhân gây ra lỗi (lỗi not_present hoặc lỗi write hoặc lỗi user) sau đó gọi hàm kill (f) Hàm static void kill (struct intr_frame *f) được xây dưng sẵn để ấm dứt tiến trình lỗi Hàm kill sẽ đọc cờ ngắt f->cs để xác lỗi bắt nguồn chtừ user's code hay kernel’ code, từ đó có thể thêm một hàm printf để in ra thông báo trong trường hợp lỗ ắt nguồn từ user's code i b

Trường hợp tiến trình bị kết thúc do bị gọi exit

Khi thực hiện truyền đối số thành công, các chương trình người dùng sẽ được thực hiện đúng cách và kết thúc bằng cách gọi exit() trong phần process_exit()

Để lấy được tên chương trình cần tạo một hàm phân tích cú pháp chuỗi đối số truyền vào extract_command_name(fn_copy, cmd_name); sau đó chỉnh sửa hàm load() được gọi trong start_process() với tên tệp đã được phân tích cú pháp khi chạy chương trình Do chưa thực hiện process_wait() nên tiến trình mẹ có thể sẽ kết thúc trước mà không đợ ến trình coni ti

Triển khai mã nguồn

Các hàm và các biến được triển khai trong file:• userprog/process.c và process.h

Sửa đổi mã nguồn và bổ sung

Các biến và hàm được thêm vào userprog/process.h:o void process_exit (int status);

o void process_init(void);

Ngày đăng: 29/05/2024, 17:53

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN