BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH Đề tài: Alarm clock and Process termination message MỤC LỤC LỜI MỞ ĐẦU i DANH MỤC HÌNH VẼ ii CHƯƠNG 1. GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS 1 1.1 Tổng quan về Pintos 1 1.2 Cây thư mục nguồn 1 1.3 Tổng quan về threads 2 CHƯƠNG 2. ALARM CLOCK 4 2.1 Mục tiêu 4 2.1.1 Vấn đề 4 2.1.2 Mục tiêu 5 2.2 Phương án giải quyết 5 2.3 Triển khai sửa đổi mã nguồn 5 2.3.1 Cấu trúc dữ liệu 5 2.3.2 Thuật toán 6 2.3.3 Đồng bộ hóa 7 2.4 Kết quả 7 CHƯƠNG 3. PROCESS TERMINATION MESSAGE 9 3.1 Mục tiêu 9 3.1.1 Vấn đề 9 3.1.2 Mục tiêu 9 3.2 Thuật toán 10 3.3 Kết quả 11 KẾT LUẬN 14 Kết luận chung 14 Hướng phát triển 14 Kiến nghị và đề xuất 14 TÀI LIỆU THAM KHẢO 15
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
BÁO CÁO BÀI TẬP LỚN HỆ ĐIỀU HÀNH
Giảng viên hướng dẫn: TS Phạm Văn Tiến
Trang 2Hà Nội, 12-2021
Trang 3LỜI MỞ ĐẦU
Hiện nay, khoa học kĩ thuật trên thế giới ngày càng phát triển mạnh mẽ Khoa học kĩ thuật đóng vai trò không thể thiếu trong đời sống hiện đại ngày nay củ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ệc học tập và đạo tạo, kế thừa và phát triển những thành tựu khoa học cho thế hệ mớingà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ệ điều hành do thầy Phạm Văn Tiến giảng dạy chúng em đã đượ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, chúng em đã cơ bản hoàn thành việc lập trình
để hiểu hơn về hệ điều hành Pintos, giải quyết được một vấn đề trong hệ điều hành này Trong bài báo cáo này, chúng em sẽ đi trình bày cụ thể những gì đã làm được trong những tuần vừa qua thông qua 3 chương sau:
Chương 1: Giới thiệu hệ điều hành Pintos
Chương 2: Alarm clock
Chương 3: Process termination message
Trang 4Phân chia công việc
Tên sinh viên thực hiện Công việc
Chu Thế Hải -Thực hiện phần in ra Termination message trong trường
hợp fail to load và bị terminate bởi kernel
-Chỉnh sửa lại thread_wakeup()
Lê Thị Vân -Xác định thuật toán trong Alarm clock và
thực hiện code thread_sleep(), sửa hàm timer_sleep().-Thực hiện code cơ chế truyền tham số trong phầnTermination message
Nguyễn Duy Tuân -Thực hiện code thread_wakeup()
-Làm báo cáo, slide
Trang 5MỤC LỤC
LỜI MỞ ĐẦU i
DANH MỤC HÌNH VẼ ii
CHƯƠNG 1 GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS 1
1.1 Tổng quan về Pintos 1
1.2 Cây thư mục nguồn 1
1.3 Tổng quan về threads 2
CHƯƠNG 2 ALARM CLOCK 4
2.1 Mục tiêu 4
2.1.1 Vấn đề 4
2.1.2 Mục tiêu 5
2.2 Phương án giải quyết 5
2.3 Triển khai sửa đổi mã nguồn 5
2.3.1 Cấu trúc dữ liệu 5
2.3.2 Thuật toán 6
2.3.3 Đồng bộ hóa 7
2.4 Kết quả 7
CHƯƠNG 3 PROCESS TERMINATION MESSAGE 9
3.1 Mục tiêu 9
3.1.1 Vấn đề 9
3.1.2 Mục tiêu 9
3.2 Thuật toán 10
3.3 Kết quả 11
KẾT LUẬN 14
Kết luận chung 14
Hướng phát triển 14
Trang 6Kiến nghị và đề xuất 14
TÀI LIỆU THAM KHẢO 15
Trang 7DANH MỤC HÌNH VẼ
Hình 1 Sơ đồ luồng threads trong Pintos 3
Hình 2 Phương pháp giải quyết “busy wait” 5
Hình 3 Kết quả khi run alarm-zero và alarm-negative 8
Hình 4 Kết quả khi make check 8
Hình 5 Kết quả khi chưa load chương trình echo vào filesys.dsk 12
Hình 6 Kết quả khi đã load echo vào filesys.dsk nhưng chạy không thành công 13
i
Trang 8CHƯƠ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
Stanford đưa ra 4 Project dựa trên hệ điều hành Pintos:
Project 1: Threads – Luồng
Project 2: User Programs – Chương trình người dùng
Project 3: Virtual Memory – Bộ nhớ ảo
Project 4: File Systems – Hệ thống file
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 độnghiệ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 giancủa máy tính Trong báo cáo sẽ sử dụng QEMU là trình mô phỏng
1.2 Cây thư mục nguồn
Trong mã nguồn Pintos là cấu trúc thư mục trong “…/pintos-anon-master/src”
Trang 10Hình 1 Sơ đồ luồng threads trong Pintos.
Trong Pintos, các trạng thái của luồng được khai báo bởi cấu trúc “enumthread_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ụclà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ấ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
3
Trang 11 struct list_elem allelem: List element for all threads list
struct list_elem elem: List element
unit32_t *pagedir: Page directory
usigned magic: Detects stack overflow
CHƯƠNG 2 ALARM CLOCK
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 đến Alarm Clock trong Project 1 của Pintos
Vòng lặp gây ra “busy waiting”
while (timer_elapsed (start) < ticks)
thread_yield ();
Vòng lặp này sẽ được thực hiện liên tục cho đến khi số ticks trong timer_sleep()lớn hơn số ticks yêu cầu được trả về từ timer_elapsed (start) Nó chỉ thực hiện duynhất một việc kiểm tra điều kiện và gọi hàm thread_yield()
Chức năng của thread_yield() trong “threads/thread.c”, sau khi gọi hàm, luồngđang chạy được đưa về trạng thái THREAD_READY Cụ thể, hàm này sẽ kiểm traluồng hiện tại có phải “idle_thread” không Nếu không, luồng sẽ được thêm vào cuối
4
Trang 12hàng đợi “ready list” Sau đó, luồng được đưa về trạng thái THREAD_READY vànhường CPU cho schedule()
2.1.2 Mục tiêu
Sửa đổi mã nguồn để tránh "busy wait" và tiết kiệm tài nguyên hơn
2.2 Phương án giải quyết
Thay vì sử dụng vòng lặp và thread_yield() ta có thể sử dụng thread_sleep() đểblock hoàn toàn thread(đưa thread vào trạng thái BLOCK) trong một khoảng thời gian
x ticks Sau mỗi ticks một hàm thread_wakeup() sẽ được gọi để kiểm tra và đưa nhữngthread đã hết thời gian chờ về trạng thái READY
Hình 2 Phương pháp giải quyết “busy wait”.
2.3 Triển khai sửa đổi mã nguồn
2.3.1 Cấu trúc dữ liệu
Tại file threads/thread.h:
- Một biến uint64_t sleep_ticks được thêm vào struct thread để quản lý thời gianthread nắm trong trạng thái BLOCK
- Một biến struct list_elem sleep_elem thêm vào struct thread để có thể đưathread vào sleep_list
5
Trang 13 Tại file threads/thread.c:
- Một struct list sleep_list được khai báo để tạo một danh sách quản lý các thread
bị block trong thời gian x timer ticks
- void thread_wakeup (void) có chức năng đánh thức thread
- Hàm thực hiện điều đó bằng cách duyệt danh sách sleep_list, cật nhật thread->sleep_tick giảm sau mỗi lần duyệt, nếu thread->sleep_ticks = 0 thì gọi hàmthread_unblock () và đưa thread ra khỏi danh sách
Sửa đổi các hàm được xây dụng sẵn:
- void thread_init (void):
- thêm dòng lệnh khởi tạo danh sách sleep_list
- void timer_sleep (int64_t ticks):
- tắt ngắt, gọi thread_sleep (ticks) và bật lại ngắt
- void timer_interupt (void):
- gọi thêm hàm thread_wakeup ()
Mô tả thuật toán:
- void thread_init (void):
- thêm dòng lệnh khởi tạo danh sách sleep_list
- void timer_sleep (int64_t ticks):
- tắt ngắt, gọi thread_sleep (ticks) và bật lại ngắt
- void timer_interupt (void):
- gọi thêm hàm thread_wakeup ()
6
Trang 142.3.3 Đồng bộ hóa
Mọi vấn đề đồng bộ hóa có thể được giải quyết dễ dàng bằng cách tắt ngắt: trongkhi tắt ngắt nghĩa là tạm thời ngăn CPU phản hồi với các ngắt, khi đó sẽ không cóluồng nào khác xen vào luồng đang chạy, bởi vì quyền ưu tiên của luồng được điềukhiển bởi ngắt bộ định thời, nếu ngắt được bật thì luồng đăng chạy có thể được ưu tiênbởi luồng khác bất kì lúc nào
2.4 Kết quả
Pintos đã xây dựng sẵn các bài test để kiểm tra kết quả:
- alarm-zero: gọi hàm timer_sleep (0)
- alarm-negative: gọi hàm timer_sleep (-100) với yêu cầu đặt ra là chương trình
sẽ không bị treo
- alarm-single: tạo 5 threads, mỗi threads sẽ ngủ 1 lần với thời gian cố định, thờigian ngủ của mỗi thread là khác nhau Ghi lại thứ tự wake-up và xác định đúngsai
- alarm-multiple: tạo 5 threads, mỗi threads sẽ ngủ 7 lần với thời gian cố định,thời gian ngủ của mỗi thread là khác nhau Ghi lại thứ tự wake-up và xác địnhđúng sai
- alarm- simultaneous: tạo 3 threads, mỗi threads sẽ ngủ 5 lần với thời gian cốđịnh, thời gian ngủ của mỗi thread là khác nhau Ghi lại thứ tự wake-up và xácđịnh đúng sai
Kết quả sau khi sửa đổi mã nguồn và recompile: các bài test zero, negative, alarm-single, alarm-multiple, alarm-simultanetaneous cho ra kết quả PASS
alarm-7
Trang 15Hình 3 Kết quả khi run alarm-zero và alarm-negative
Hình 4 Kết quả khi make check
8
Trang 16CHƯƠNG 3 PROCESS TERMINATION MESSAGE
Chương này mô tả mục tiêu, phương pháp và những vấn đề khi triển khai mãnguồn, mô tả mã nguồn đã sửa đổi, bổ sung giải quyết vấn đến Process terminationmessage trong Project 2 của Pintos
3.1 Mục tiêu
3.1.1 Vấn đề
Trong project 2 việc khởi chạy chương trình người dùng đồng nghĩa rằng chươngtrình đó sẽ không được toàn quyền kiểm soát hoàn toàn hệ thống Các chương trình sẽchạy trên khô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ểchạy được chương trình cần được nạp vào file system, các chương trình này sẽ cầntruyền tham số xuống, hoặc tác động lên hệ thống thông qua yêu cầu system call Hiệntại Pintos đã xây dựng sẵ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
3.1.2 Mục tiêu
Yêu cầu đề bài:
Mỗi khi có tiến trình người dùng bị chấm dứt vì bất kì lý do nào đó, in ra màn hìnhthông báo tên đầy đủ và exit code của tiến trình đó theo format “printf ("%s: exit(%d)\n", );” Tên của tiến trình phải giống như tên được truyền cho hàm process_execute()
và bỏ đi phần tham số Không in thông báo khi kernel thread bị chấm dứt hoặc lời gọi
hệ thống halt được gọi Có thể in ra thông báo khi tiến trình được load không thànhcông
Mục tiêu thực hiện:
Hiện tại nhóm em chưa thể chạy các chương trình người dùng trong thư mụcsrc/examples Các chương trình thường fail to load hoặc bị terminate bởi kernel dopage fault nên nhóm em mới chỉ có thể in ra cho các trường hợp này Ngoài ra, nhóm
9
Trang 17chúng em đã cố gắng thực hiện thêm phần truyền đối số để chạy được các chươngtrình người dùng nhưng chưa thành công.
3.2 Thuật toán
Trường hợp chương trình fail to load
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ó Tronghà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 toload hàm sẽ gọi hàm thread_exit () Từ đó có thể thêm hàm printf để in ra thông báomỗi khi biến success này trả về giá trị false và tiến trình failed to load
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ỗinot_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 để chấ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 từ user's code hay kernel’ code, từ đó có thể thêm mộthàm printf để in ra thông báo trong trường hợp lỗi bắt nguồn từ user's code
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ựchiện đúng cách và kết thúc bằng cách gọi exit() trong phần syscall_handler() Hiện tại,Pintos chưa hỗ trợ truyền đối số cho các quy trình mới, để thực hiện chức năng nàycần mở rộng hàm process_execute() để thay vì chỉ lấy tên tệp chương trình làm đối số,
nó chia chuỗi truyền vào thành các từ tại các khoảng trắng, với từ đầu tiên là tênchương trình, các từ tiếp theo là đối số truyền vào
Để 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 parse_filename(char *src, char *dest), sao chép chuỗi nguồn đầu vào sangmột chuỗi đích mới với độ dài bằng độ dài chuỗi nguồn cộng thêm một đơn vị, sau đó
sử dụng vòng lặp để ngắt chuỗi đích tại khoảng trắng đầu tiên là tên chương trình sau
10
Trang 18đó 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 cha cóthể sẽ kết thúc trước mà không đợi tiến trình con, vì vậy nhóm chúng em đưa ra mộtbiện pháp tạm thời là thêm một vòng for chaỵ một tỉ lần để tiến trình cha không kếtthúc trước khi tiến trình con hoàn thành
Tuy nhiên chương trình người dùng gặp phải page fault khi cố gắng đoc argv rakhỏi ngăn xếp, do vậy cần tạo thêm hàm construct_esp(char* file_name, void **esp)
để tính toán số lượng tham số truyền vào, lưu lần lượt các giá trị argv[argc-1] đếnargv[0], word align, NULL, địa chỉ argv[argc-1] đến argv[0], địa chỉ argv, giá trị argc,địa chỉ trả về theo chiều tăng ngăn xếp xuống dưới
Sau khi đã thực hiện xây dựng ngăn xếp người dùng, chúng em đã mở rộng hàmprocess_execute() để bắt đầu một luồng mới cho chương trình người dùng được load
Kết quả khi chưa xây dựng hệ thống truyền tham số:
11
Trang 19Hình 5 Kết quả khi chưa load chương trình echo vào filesys.dsk
12
Trang 20Hình 6 Kết quả khi đã load echo vào filesys.dsk nhưng chạy không thành công.
Việc xây dựng cơ chế truyền tham số không thành công, không thể tạo ra kernel vàhiện tại nhóm chưa có cách giải quyết
13
Trang 21KẾT LUẬN
Kết luận chung
Nhóm đã chạy Pass các bài test cho project 1 Alarm clock Còn về project 2, nhómmới chạy được cho trường hợp fail to load và terminate by kernel, nhóm chưa thể xâydựng được cơ chế truyền tham số và các hàm system call
Link github của nhóm: anon-master.git
https://github.com/Hai2478Van2881Tuan2853/pintos-14
Trang 22TÀI LIỆU THAM KHẢO
[1] https://github.com/dillstead/pintos
[2] https://github.com/NicoleMayer/pintos_project2
15
Trang 23Nhận xét của giảng viên
Ngày: … / … / 20…
Người nhận xét
(Ký và ghi rõ họ tên)