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
TRƯỜ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 Đề tài: Alarm clock and Process termination message Giảng viên hướng dẫn: TS Phạm Văn Tiến Nhóm sinh viên thực hiện: Mã số sinh viên: Chu Thế Hải 20182478 Lê Thị Vân 20182881 Nguyễn Duy Tuân 20182853 Hà Nội, 12-2021 LỜI MỞ ĐẦU Hiện nay, khoa học kĩ thuật giới ngày phát triển mạnh mẽ Khoa học kĩ thuật đóng vai trị khơng thể thiếu đời sống đại ngày diện sản phẩm, vật dụng mà sử dụng hàng ngày Vì việc học tập đạo tạo, kế thừa phát triển thành tựu khoa học cho hệ ngày vô quan trọng đặc biệt hệ sinh viên Việc tiếp cận cần phải tiếp cận mặt lí thuyết lẫn thực hành, việc học tập đào tạo đạt hiệu tốt nhất, đáp ứng cho xã hội nguồn nhân lực khoa học kĩ thuật chất lượng cao Trong trình học tập học phần Hệ điều hành thầy Phạm Văn Tiến giảng dạy chúng em hướng dẫn, trợ giáo để hoàn thành việc thực hành dự án khóa học hệ điều hành Pintos Sau trải qua khoảng thời gian, chúng em hoàn thành việc lập trình để hiểu hệ điều hành Pintos, giải vấn đề hệ điều hành Trong báo cáo này, chúng em trình bày cụ thể làm tuần vừa qua thông qua 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 Phân chia công việc Tên sinh viên thực Công việc Chu Thế Hải -Thực phần in Termination message trường hợp fail to load bị terminate kernel -Chỉnh sửa lại thread_wakeup() Lê Thị Vân -Xác định thuật toán Alarm clock thực code thread_sleep(), sửa hàm timer_sleep() -Thực code chế truyền tham số phần Termination message Nguyễn Duy Tuân -Thực code thread_wakeup() -Làm báo cáo, slide MỤC LỤC LỜI MỞ ĐẦU i DANH MỤC HÌNH VẼ ii CHƯƠNG GIỚI THIỆU HỆ ĐIỀU HÀNH PINTOS .1 1.1 Tổng quan Pintos .1 1.2 Cây thư mục nguồn 1.3 Tổng quan threads CHƯƠNG ALARM CLOCK .4 2.1 Mục tiêu 2.1.1 Vấn đề .4 2.1.2 Mục tiêu 2.2 Phương án giải 2.3 Triển khai sửa đổi mã nguồn .5 2.3.1 Cấu trúc liệu 2.3.2 Thuật toán .6 2.3.3 Đồng hóa 2.4 Kết CHƯƠNG PROCESS TERMINATION MESSAGE 3.1 Mục tiêu 3.1.1 Vấn đề .9 3.1.2 Mục tiêu 3.2 Thuật toán 10 3.3 Kết 11 KẾT LUẬN 14 Kết luận chung 14 Hướng phát triển 14 Kiến nghị đề xuất 14 TÀI LIỆU THAM KHẢO 15 DANH MỤC HÌNH VẼ Hình Sơ đồ luồng threads Pintos Hình Phương pháp giải “busy wait” .5 Hình Kết run alarm-zero alarm-negative Hình Kết make check Hình Kết chưa load chương trình echo vào filesys.dsk .12 Hình Kết load echo vào filesys.dsk chạy không thành công .13 i CHƯƠNG 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 1.1 Tổng quan Pintos Pintos khung hệ điều hành đơn giản cho kiến trúc 80x86 Nó hỗ trợ kernel threads, loading running user programs file system, thực tất điều cách đơn giản Các chế cịn có nhiều vấn đề cần khắc phục để hệ điều hành chạy cách tối ưu Stanford đưa Project dựa 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 Stanford đưa CS140 Problem Set 0: Synchronization – Đồng hóa để sinh viên làm quen với mã nguồn Pintos Khi người dùng triển khai thành công (PASS TEST) nội dung đề này, hệ điều hành Pintos hoạt động hiệu quả, hiệu suất cao, tiết kiêm tài nguyên nhớ, lượng thời gian máy tính Trong báo cáo sử dụng QEMU trình mơ 1.2 Cây thư mục nguồn Trong mã nguồn Pintos cấu trúc thư mục “…/pintos-anon-master/src” “threads/” : Mã nguồn sở kernel, mà bạn thay đổi từ Project “userprog/” Mã nguồn cho trình tải chương trình người dùng, mà bạn sửa đổi từ Project “vm/” Một thư mục gần trống rỗng Bạn triển khai nhớ ảo Project “filesys/” Mã nguồn cho hệ thống tệp Bạn sử dụng tệp bắt đầu với Project 2, bạn khơng sửa đổi Project “devices/” Mã nguồn cho giao tiếp thiết bị I/O: bàn phím, đếm thời gian, đĩa, … Bạn sửa đổi việc triển khai hẹn Project “lib/” Đây tập thư viện C chuẩn, biên dịch vào kernel chương trình người dùng chạy nó, Project Tiêu đề thư mục đưa vào #include “lib/kernel/” Các phần thư viện C có kernel Pintos Bao gồm số kiểu liệu: bitmap, linked list, hash table “lib/user/” Các phần thư viện C có chương trình người dùng “tests/” Các test cho dự án Bạn sửa đổi mã giúp bạn kiểm tra nội dung mình, chúng tơi thay mã gốc trước test thử nghiệm “examples/” Ví dụ cho chương trình người dùng sử dụng Project “misc/” “utils/” Những files hữu ích bạn định thử làm việc với Pintos máy tính riêng Nếu khơng bỏ qua chúng 1.3 Tổng quan threads Các trạng thái của tiến trình được mơ tả ở hình dưới. Hình Sơ đồ luồng threads Pintos Trong Pintos, trạng thái luồng khai báo cấu trúc “enum thread_status” THREAD_RUNNING: Luồng chiếm CPU làm việc CPU THREAD_READY: Luồng sẵn sàng làm việc chưa đưa vào CPU, đặt hàng đợi ready queue chờ đến lượt THREAD_BLOCKED: Luồng chờ kiện xảy tiếp tục làm việc Khi luồng đưa vào trạng thái THREAD_BLOCKED để nhường CPU cho luồng khác ready queue làm việc THREAD_DYING: Luồng thực xong việc TERMINATED Nó tiêu hủy Cấu trúc luồng khai báo “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 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 unit32_t *pagedir: Page directory usigned magic: Detects stack overflow CHƯƠNG ALARM CLOCK Chương 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 vấn đến Alarm Clock Project Pintos 2.1 Mục tiêu 2.1.1 Vấn đề Hàm timer_sleep(), đặt “devices/timer.c”, xây dựng sẵn theo chế “busy wait”, tức thực vịng lặp liên tục để kiểm tra thời gian gọi thread_yield() đủ thời gian trôi qua Việc chiếm dụng CPU gây lãng phí tài nguyên Chức void timer_sleep (int64_t ticks) : tạm dừng thực chuỗi gọi thời gian trôi qua x ticks timer Vịng lặp gây “busy waiting” while (timer_elapsed (start) < ticks) thread_yield (); Vòng lặp thực liên tục số ticks timer_sleep() lớn số ticks yêu cầu trả từ timer_elapsed (start) Nó thực việc kiểm tra điều kiện gọi hàm thread_yield() Chức thread_yield() “threads/thread.c”, sau gọi hàm, luồng chạy đưa trạng thái THREAD_READY Cụ thể, hàm kiểm tra luồng có phải “idle_thread” khơng Nếu khơng, luồng thêm vào cuối hàng đợi “ready list” Sau đó, luồng đưa trạng thái THREAD_READY nhường CPU cho schedule() 2.1.2 Mục tiêu Sửa đổi mã nguồn để tránh "busy wait" tiết kiệm tài nguyên 2.2 Phương án giải Thay sử dụng vịng lặp thread_yield() ta sử dụng thread_sleep() để block hoàn toàn thread(đưa thread vào trạng thái BLOCK) khoảng thời gian x ticks Sau ticks hàm thread_wakeup() gọi để kiểm tra đưa thread hết thời gian chờ trạng thái READY Hình Phương pháp giải “busy wait” 2.3 Triển khai sửa đổi mã nguồn 2.3.1 Cấu trúc liệu Tại file threads/thread.h: - Một biến uint64_t sleep_ticks thêm vào struct thread để quản lý thời gian thread nắm trạng thái BLOCK - Một biến struct list_elem sleep_elem thêm vào struct thread để đưa thread vào sleep_list Tại file threads/thread.c: - Một struct list sleep_list khai báo để tạo danh sách quản lý thread bị block thời gian x timer ticks 2.3.2 Thuật toán Các hàm tạo mới: - void thread_sleep (uint64_t ticks) có chức để thread ngủ vòng ‘ticks' timer ticks - Hàm thực điều cách kiểm tra ngắt, kiểm tra ticks > đưa thread vào sleep_list gọi thread_block () - void thread_wakeup (void) có chức đánh thức thread - Hàm thực điều cách duyệt danh sách sleep_list, cật nhật thread-> sleep_tick giảm sau lần duyệt, thread->sleep_ticks = gọi hàm thread_unblock () đưa thread khỏi danh sách Sửa đổi hàm 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) bật lại ngắt - void timer_interupt (void): - gọi thêm hàm thread_wakeup () Mơ tả thuật tố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) bật lại ngắt - void timer_interupt (void): - gọi thêm hàm thread_wakeup () 2.3.3 Đồng hóa Mọi vấn đề đồng hóa giải dễ dàng cách tắt ngắt: tắt ngắt nghĩa tạm thời ngăn CPU phản hồi với ngắt, khơng có luồng khác xen vào luồng chạy, quyền ưu tiên luồng điều khiển ngắt định thời, ngắt bật luồng đăng chạy ưu tiên luồng khác lúc 2.4 Kết Pintos xây dựng sẵn 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 chương trình khơng bị treo - alarm-single: tạo threads, threads ngủ lần với thời gian cố định, thời gian ngủ thread khác Ghi lại thứ tự wake-up xác định sai - alarm-multiple: tạo threads, threads ngủ lần với thời gian cố định, thời gian ngủ thread khác Ghi lại thứ tự wake-up xác định sai - alarm- simultaneous: tạo threads, threads ngủ lần với thời gian cố định, thời gian ngủ thread khác Ghi lại thứ tự wake-up xác định sai Kết sau sửa đổi mã nguồn recompile: test alarm-zero, alarmnegative, alarm-single, alarm-multiple, alarm-simultanetaneous cho kết PASS Hình Kết run alarm-zero alarm-negative Hình Kết make check CHƯƠNG PROCESS TERMINATION MESSAGE Chương mô tả mục tiêu, phương pháp vấn đề triển khai mã nguồn, mô tả mã nguồn sửa đổi, bổ sung giải vấn đến Process termination message Project Pintos 3.1 Mục tiêu 3.1.1 Vấn đề Trong project việc khởi chạy chương trình người dùng đồng nghĩa chương trình khơng tồn quyền kiểm sốt hồn tồn hệ thống Các chương trình chạy khơng gian người dùng bị giới hạn tài nguyên hệ điều hành Để chạy chương trình cần nạp vào file system, chương trình cần truyền tham số xuống, tác động lên hệ thống thông qua yêu cầu system call Hiện Pintos xây dựng sẵn file system chưa có chế truyền tham số chưa có system call, việc chạy chương trình thư mục src/examples trả lỗi page fault 3.1.2 Mục tiêu Yêu cầu đề bài: Mỗi có tiến trình người dùng bị chấm dứt lý đó, in hình thơng báo tên đầy đủ exit code tiến trình theo format “printf ("%s: exit(%d)\ n", );” Tên tiến trình phải giống tên truyền cho hàm process_execute() bỏ phần tham số Không in thông báo kernel thread bị chấm dứt lời gọi hệ thống halt gọi Có thể in thơng báo tiến trình load không thành công Mục tiêu thực hiện: Hiện nhóm em chưa thể chạy chương trình người dùng thư mục src/examples Các chương trình thường fail to load bị terminate kernel page fault nên nhóm em in cho trường hợp Ngồi ra, nhóm chúng em cố gắng thực thêm phần truyền đối số để chạy chương trình người dùng chưa thành cơng 3.2 Thuật tốn Trường hợp chương trình fail to load Tại file process.c thư mục src/userprog hàm void start_process (void *file_name) xây dựng sẵn để load tiến trình người dùng khởi chạy Trong hàm này, biến success theo dõi trạng thái load tiến trình, tiến trình fail to load hàm gọi hàm thread_exit () Từ thêm hàm printf để in thông báo biến success trả giá trị false tiến trình failed to load Trường hợp chương trình bị terminate 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) xây dựng để xử lý lỗi page fault hàm xác định nguyên nhân gây lỗi (lỗi not_present lỗi write lỗi user) sau gọi hàm kill (f) Hàm static void kill (struct intr_frame *f) xây dưng sẵn để chấm dứt tiến trình lỗi Hàm kill đọc cờ ngắt f->cs để xác lỗi bắt nguồn từ user's code hay kernel’ code, từ thêm hàm printf để in thông báo 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 bị gọi exit Khi thực truyền đối số thành cơng, chương trình người dùng thực cách kết thúc cách gọi exit() phần syscall_handler() Hiện tại, Pintos chưa hỗ trợ truyền đối số cho quy trình mới, để thực chức cần mở rộng hàm process_execute() để thay lấy tên tệp chương trình làm đối số, chia chuỗi truyền vào thành từ khoảng trắng, với từ tên chương trình, từ đối số truyền vào Để lấy tên chương trình cần tạo hàm phân tích cú pháp chuỗi đối số truyền vào parse_filename(char *src, char *dest), chép chuỗi nguồn đầu vào sang chuỗi đích với độ dài độ dài chuỗi nguồn cộng thêm đơn vị, sau sử dụng vịng lặp để ngắt chuỗi đích khoảng trắng tên chương trình sau 10 chỉnh sửa hàm load() gọi start_process() với tên tệp phân tích cú pháp chạy chương trình Do chưa thực process_wait() nên tiến trình cha kết thúc trước mà khơng đợi tiến trình con, nhóm chúng em đưa biện pháp tạm thời thêm vòng for chaỵ tỉ lần để tiến trình cha khơng kết thúc trước tiến trình hồn thành Tuy nhiên chương trình người dùng gặp phải page fault cố gắng đoc argv khỏi ngăn xếp, cần tạo thêm hàm construct_esp(char* file_name, void **esp) để tính tốn số lượng tham số truyền vào, lưu giá trị argv[argc-1] đến argv[0], word align, NULL, địa argv[argc-1] đến argv[0], địa argv, giá trị argc, địa trả theo chiều tăng ngăn xếp xuống Sau thực xây dựng ngăn xếp người dùng, chúng em mở rộng hàm process_execute() để bắt đầu luồng cho chương trình người dùng load từ tên tệp phân tích cú pháp Cuối cùng, để kết thúc tiến trình người dùng, cần bổ sung hàm exit(int status) hàm syscall_handler file syscall.c để in thơng báo kết thúc quy trình 3.3 Kết Trong thư mục src/example có chương trình xây dựng sẵn, ta cần tạo file filesys.dsk để trở thành file system cho pintos Sau nạp chương trình từ src/example vào filesys.dsk khởi chạy Kết chưa xây dựng hệ thống truyền tham số: 11 Hình Kết chưa load chương trình echo vào filesys.dsk 12 Hình Kết load echo vào filesys.dsk chạy không thành công Việc xây dựng chế truyền tham số không thành cơng, khơng thể tạo kernel nhóm chưa có cách giải 13 ... hoàn thành việc lập trình để hiểu hệ điều hành Pintos, giải vấn đề hệ điều hành Trong báo cáo này, chúng em trình bày cụ thể làm tuần vừa qua thông qua chương sau: Chương 1: Giới thiệu hệ điều hành. .. filesys.dsk chạy không thành công .13 i CHƯƠNG 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 1.1 Tổng... recompile: test alarm- zero, alarmnegative, alarm- single, alarm- multiple, alarm- simultanetaneous cho kết PASS Hình Kết run alarm- zero alarm- negative Hình Kết make check CHƯƠNG PROCESS TERMINATION MESSAGE