Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 57 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
57
Dung lượng
2,88 MB
Nội dung
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN o Tài liệu hướng dẫn thực hành HỆ ĐIỀU HÀNH Biên soạn: ThS Phan Đình Duy ThS Nguyễn Thanh Thiện KS Trần Đại Dương KS Trần Hồng Lộc MỤC LỤC BÀI TIẾN TRÌNH VÀ TIỂU TRÌNH 3.1 Mục tiêu 3.2 Nội dung thực hành 3.3 Sinh viên chuẩn bị 3.4 Hướng dẫn thực hành 20 3.5 Bài tập ôn tập 51 NỘI QUY THỰC HÀNH Sinh viên tham dự đầy đủ buổi thực hành theo quy định giảng viên hướng dẫn (GVHD) (6 buổi với lớp thực hành cách tuần 10 buổi với lớp thực hành liên tục) Sinh viên phải chuẩn bị nội dung phần “Sinh viên viên chuẩn bị” trước đến lớp GVHD kiểm tra chuẩn bị sinh viên 15 phút đầu buổi học (nếu khơng có chuẩn bị sinh viên bị tính vắng buổi thực hành đó) Sinh viên làm tập ôn tập để cộng điểm thực hành, tập ôn tập GVHD kiểm tra sinh viên có yêu cầu buổi học liền sau thực hành Điểm cộng tối đa không điểm cho thực hành Bài TIẾN TRÌNH VÀ TIỂU TRÌNH 3.1 Mục tiêu Sinh viên làm quen với lập trình Hệ điều hành Ubuntu thơng qua trình soạn thảo vim, trình biên dịch gcc trình gỡ lỗi gdb Thực hành với tiến trình Thực hành với tiểu trình thơng qua thư viện pthread Giới thiệu chế truyền thông: signal 3.2 Nội dung thực hành Sử dụng trình soạn thảo vim để soạn thảo mã nguồn Sử dụng trình biên dịch gcc để biên dịch từ tệp tin mã nguồn sang tệp tin thực thi Sử dụng trình gỡ lỗi gdb để gỡ lỗi chương trình Tạo, dừng tiến trình Tạo, dừng, hợp gỡ tiểu trình với thư viện pthread Truyền thơng tiến trình chế signal 3.3 Sinh viên chuẩn bị 3.3.1 Trình soạn thảo văn vim Trình soạn thảo văn túy không sử dụng định dạng văn để trình bày, văn tạo từ trình soạn thảo nhẹ, đọc dễ dàng mà không cần xử lý nhiều Trong thực hành này, vim (Visual Improved) sử dụng làm cơng cụ thực hành Sinh viên cài đặt vim gói liên quan câu lệnh sau: apt-get install vim Sau cài đặt, vim thường đặt /user/bin/vim (sử dụng which vim để biết xác vị trí gcc máy tính) Một chương trình kèm vimtutor tự động cài vào hệ thống, chạy vimtutor hoàn thành hướng dẫn làm quen với vim 3.3.2 Trình biên dịch gcc Trình biên dịch (compiler) phần mềm biên dịch từ mã nguồn (chương trình viết ngơn ngữ lập trình cấp cao) thành chuỗi bit (chương trình thực thi máy tính) Trong thực hành này, gcc (GNU C Compiler) sử dụng làm cơng cụ thực hành Sinh viên cài đặt gcc gói liên quan câu lệnh sau: apt-get install build-essential Sau cài đặt, gcc thường đặt /user/bin/gcc (sử dụng which gcc để biết xác vị trí gcc máy tính) Hình 3-1 trình bày q trình biên dịch chương trình từ mã nguồn thành chương trình thực thi máy tính Hình 3-1 Quá trình biên dịch Quá trình từ tệp mã nguồn tới tệp đối tượng trình bày chi tiết Hình 3-2 Hình 3-2 Quá trình biên dịch chi tiết Bộ tiền xử lý (Preprocessor) lấy tệp mã nguồn (*.c) nằm thư mục project chép nội dung tệp tiêu đề (*.h) nằm /usr/include vào ấy, trở thành chương trình hồn chỉnh mức ngơn ngữ lập trình cấp cao Tiếp theo, trình biên dịch biên dịch thành chương trình mức hợp ngữ (*.asm) theo kiến trúc tập lệnh mà máy tính sử dụng Sau đó, trình biên dịch hợp ngữ (Assembler) thơng dịch chương trình mức hợp ngữ thành tệp đối tượng (*.o) Cuối cùng, trình liên kết (Linker) liên kết tệp đối tượng thư viện (*.a, *.so, *.sa) nằm /usr/lib /lib để tạo thành chương trình mức nhị phân thực thi máy tính: Các tệp mã nguồn (*.c) tệp tin người viết chương trình viết nhằm phục vụ mục đích chun biệt thường cập nhật trình phát triển phần mềm Các tệp tiêu đề (*.h) tệp tin dùng để định nghĩa hàm khai báo cần thiết cho trình biên dịch Dựa vào thơng tin này, trình biên dịch đưa cảnh báo lỗi cú pháp, kiểu liệu, tạo tệp đối tượng (*.o) Các tệp đối tượng (*.o) tệp tin chứa khối mã nhị phân túy Các tệp tin thư viện (lib*.a, lib*.sa, lib*.so) tệp tin thiết yếu để biên dịch chương trình Trên mơi trường Linux có loại thư viện liên kết thư viện liên kết tĩnh thư viện liên kết động: ❖ Thư viện liên kết tĩnh thư viện liên kết trình biên dịch lấy toàn mã thực thi hàm thư viện đưa vào chương trình Chương trình sử dụng thư viện chạy độc lập với thư viện sau biên dịch xong Khi nâng cấp sửa đổi, muốn tận dụng chức thư viện phải biên dịch lại chương trình, ngồi việc sử dụng thư viện liên kết tĩnh dẫn đến tiêu tốn không gian nhớ khó nâng cấp chương trình ❖ Thư viện liên kết động (lib*.so) thư viện không đưa trực tiếp vào chương trình lúc biên dịch liên kết, trình liên kết (linker) lưu thơng tin tham chiếu đến hàm thư viện liên kết động Khi chương trình thực thi, Hệ điều hành nạp chương trình liên kết cần tham chiếu vào nhớ, nhờ đó, nhiều chương trình sử dụng chung hàm thư viện Sử dụng vim để soạn chương trình hello.c sau: /*###################################### # University of Information Technology # # IT007 Operating System # # , # # File: hello.c # ######################################*/ #include int main() { printf("Hello, I am ,\n"); printf("Welcome to IT007!\n"); return 0; } Biên dịch chạy chương trình dòng lệnh sau: if (check != 0){ printf("ERROR!!! I’m Main Thread, can’t create Thread #%ld ", tID); exit(-1); } } sleep(100); /* Last thing that main() should */ pthread_exit(NULL); } Dùng lệnh top/ps để kiểm chứng tiểu trình tạo kết thúc trước tiểu trình main kết thúc (gợi ý: điều chỉnh chương trình để lấy định danh thread để tìm kiếm nhanh hơn) Tiếp tục dùng vim editor để soạn dùng gcc với cờ -pthread để biên dịch chương trình bên dưới: /*###################################### # University of Information Technology # # IT007 Operating System # # , # # File: example_thread_mainexit.c # ######################################*/ 40 #include #include #inlucde #inlcude #define NUM_THREADS void *thread_print(void *threadid) { long tid; tid = (long)threadid; printf("Hello IT007! I’m Thread #%ld ^_^!!!\n", tid); sleep(100); } int main() { pthread_t threads[NUM_THREADS]; int check; long tID; for(tID = 0; tID < NUM_THREADS; tID++){ printf("I’m Main Thread: create Thread: #%ld\n", tID); 41 check = pthread_create( &threads[tID], NULL, thread_print, (void *)tID); if (check != 0){ printf("ERROR!!! I’m Main Thread, I can’t create Thread #%ld ", tID); exit(-1); } } /* Last thing that main() should */ pthread_exit(NULL); } Dùng lệnh top/ps để kiểm chứng tiểu trình main kết thúc tiểu trình tạo chưa kết thúc, sau dùng lệnh kill để hủy tiểu trình tạo 3.4.2.5 Hợp gỡ tiểu trình Để kết hợp pthread, sử dụng hàm pthread_join(threadid, status), pthread_join() ngưng pthread 42 gọi tới threadid kết thúc Khi threaded kết thúc, pthread_join() trả giá trị Để tháo gỡ pthread, sử dụng pthread_detach(threadid) /*###################################### # University of Information Technology # # IT007 Operating System # # , # # File: example_thread_join.c # ######################################*/ #include #include #inlucde #inlcude #define NUM_THREADS void *thread_print(void *threadid) { long tid; tid = (long)threadid; printf("Hello IT007! I’m Thread #%ld ^_^!!!\n", tid); 43 hàm sleep(100); } int main() { pthread_t threads[NUM_THREADS]; int check; long tID; for(tID = 0; tID < NUM_THREADS; tID++){ printf("I’m Main Thread: create Thread: #%ld\n", tID); check = pthread_create( &threads[tID], NULL, thread_print, (void *)tID); if (check != 0){ printf("ERROR!!! I’m Main Thread, I can’t create Thread #%ld ", tID); exit(-1); } //end if pthread_join(threads[tID], NULL); } //end for 44 /* Last thing that main() should */ pthread_exit(NULL); } Khi có thêm pthread_join(), để thực thi tiếp vịng lặp for threads[tID] phải kết thúc trước 3.4.2.6 Truyền liệu cho tiểu trình Đối số cuối hàm pthread_create() trỏ đối số cho thủ tục mà tiểu trình tạo thực thi Trong ví dụ trước, đối số truyền vào đơn kiểu liệu, để truyền nhiều đối số với đa dạng kiểu liệu sử dụng kiểu cấu trúc bên dưới: /*###################################### # University of Information Technology # # IT007 Operating System # # , # # File: example_thread_structure.c # ######################################*/ #include #include #define NUM_THREADS 45 struct struct_print_parms{ char character; int count; }; void* char_print (void* args) { struct struct_print_parms* p = (struct struct_print_parms*) args; int i; for (i=0; I count; i++) printf ("%c\n", p->character); return NULL; } int main () { pthread_t tid; struct struct_print_parms th_args; th_args.character = 'X'; th_args.count = 5; pthread_create(&tid, NULL, &char_print, &th_args); pthread_join (tid, NULL); return 0; } 46 3.4.3 Signal (Truyền thông tiến trình) Tín hiệu thơng điệp khác gởi đến tiến trình nhằm thơng báo cho tiến trình tình Mỗi tín hiệu kết hợp có sẵn xử lý tín hiệu (signal handler) Tín hiệu ngắt ngang q trình xử lý tiến trình, bắt hệ thống chuyển sang gọi xử lý tín hiệu tức khắc Khi kết thúc xử lý tín hiệu, tiến trình lại tiếp tục thực thi Bảng liệt kê signal phổ biến bắt gặp cần sử dụng chương trình: Tên signal Số hiệu Mơ tả signal SIGHUP Trì hỗn việc kiểm tra quản lý terminal dừng quản lý tiến trình SIGINT SIGQUIT SIGFPE Được thông báo người sử dụng gửi tín hiệu ngắt (Ctrl+C) Được thơng báo người sử dụng gửi tín hiệu bỏ (Ctrl+D) Được thông báo hoạt động thuộc tốn khơng hợp pháp thử chạy 47 SIGKILL Nếu tiến trình nhận signal này, phải không thực hoạt động làm SIGALRM 14 SIGTERM 15 Tín hiệu báo số lần thực (Alarm Clock) Tín hiệu kết thúc phần mềm (được gửi sigkill theo mặc định) Để xem toàn loại signal hệ thống, sử dụng lệnh: kill -l Mỗi signal có hoạt động mặc định liên kết với Hoạt động mặc định với signal hoạt động mà script chương trình thực nhận signal Một số hoạt động mặc định là: Kết thúc tiến trình Bỏ qua signal Kết xuất lõi nhớ Nó tạo tệp gọi core (lõi) chứa hình ảnh nhớ tiến trình nhận signal Dừng tiến trình Tiếp tục tiến trình bị dừng 48 Có vài phương thức việc gửi signal tới tiến trình Một phương thức phổ biến cho người sử dụng nhập từ bàn phím: Ctrl+C: gởi tín hiệu INT (SIGINT) đến tiến trình, ngắt tiến trình (interrupt) Ctrl+Z: gởi tín hiệu TSTP (SIGTSTP) đến tiến trình, tạm dừng tiến trình (suspend) Ctrl+\: gởi tín hiệu ABRT (SIGABRT) đến tiến trình, kết thúc tiến trình (abort) Phương thức phổ biến khác để gửi signal sử dụng lệnh kill mà có cú pháp sau: kill -signal pid Ở đây, signal số tên signal để gửi pid ID tiến trình mà signal nên gửi tới Ví dụ: $ kill -1 1001 Có cách để bắt tín hiệu lập trình Nó bị từ chối (khơng phải tất tín hiệu bị từ chối), gửi tới handler mặc định gửi tới handler định trước Để bắt tín hiệu định trước, ta dùng hàm signal (trong thư 49 viện signal.h) để lấy số hiệu địa hàm để bắt tín hiệu Cú pháp hàm signal() sau: signal(int signum, sighandler handler) Trong signum mà loại signal, handler trình trình xử lý signum xảy /*###################################### # University of Information Technology # # IT007 Operating System # # , # # File: example_signal.c # ######################################*/ #include #include int loop_forever = 1; void on_sigint(){ printf("\nCRT+C is pressed!\n"); loop_forever = 0; } 50 int main(){ loop_forever = 1; signal(SIGINT, on_sigint); while(loop_forever){} return 0; } 3.5 Bài tập ôn tập Mối quan hệ cha-con tiến trình a Vẽ quan hệ parent-child tiến trình bên dưới: UID PID 88 86 PPID COMMAND 501 281 86 iTunes 501 282 86 Terminal WindowServer 287 282 login 501 461 293 firefox-bin 501 531 501 726 501 751 293 Aquamacs 501 293 287 -bash 86 Safari 86 Mail 51 b Trình bày cách sử dụng lệnh ps để tìm tiến trình cha một tiến trình dựa vào PID c Tìm hiểu cài đặt lệnh pstree (nếu chưa cài đặt), sau trình bày cách sử dụng lệnh để tìm tiến trình cha tiến trình dựa vào PID Chương trình bên in kết gì? Giải thích sao? /*###################################### # University of Information Technology # # IT007 Operating System # # , # # File: exercise_2.c # ######################################*/ #include int main(){ pid_t pid; int num_coconuts = 17; pid = fork(); if(pid == 0) { num_coconuts = 42; exit(0); } else { 52 wait(NULL); /*wait until the child terminates */ } printf("I see %d coconuts!\n", num_coconuts); exit(0); } Trong phần thực hành, ví dụ sử dụng thuộc tính mặc định pthread, tìm hiểu POSIX thread trình bày tất hàm sử dụng để làm thay đổi thuộc tính pthread, sau viết chương trình minh họa tác động thuộc tính thích đầy đủ cách sử dụng hàm chương trình (Gợi ý hàm liên quan đến thuộc tính pthread bắt đầu bởi: pthread_attr_*) Viết chương trình làm cơng việc sau theo thứ tự: a In dòng chữ: “Welcome to IT007, I am !” b.Mở tệp abcd.txt vim editor c Tắt vim editor người dùng nhấn CRTL+C d.Khi người dùng nhấn CTRL+C in dịng chữ: “You are pressed CTRL+C! Goodbye!” 53 TÀI LIỆU THAM KHẢO Tiến trình Hệ điều hành (Phần 3): https://viblo.asia/p/tien-trinh-trong-he-dieu-hanh-phan-33Q75wg6Q5Wb, truy cập ngày 02/01/2019 54