1. Trang chủ
  2. » Tất cả

Uit ce lab hdh lab3

20 37 0

Đ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

Verilog Hardware Description Language TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KỸ THUẬT MÁY TÍNH TÀI LIỆU HƯỚNG DẪN THỰC HÀNH HỆ ĐIỀU HÀNH Nhóm biên soạn ThS Phan Đình Duy ThS Phạm Văn Phước ThS Nguyễn[.]

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN KHOA KỸ THUẬT MÁY TÍNH TÀI LIỆU: HƯỚNG DẪN THỰC HÀNH HỆ ĐIỀU HÀNH Nhóm biên soạn: - ThS Phan Đình Duy - ThS Phạm Văn Phước - ThS Nguyễn Việt Quốc - KS Nguyễn Hữu Nhân - KS Lê Văn La - KS Trần Văn Quang Tháng năm 2015 NỘI DUNG CÁC BÀI THỰC HÀNH Phần 1: Lập trình Linux Bài 1: Hướng dẫn cài đặt Ubuntu lệnh shell Bài 2: Cơ lập trình shell Phần 2: Thực hành hệ điều hành Bài 3: Quản lý tiến trình Bài 4: Định thời CPU Bài 5: Đồng hóa tiến trình, tiểu trình Bài 6: Quản lý nhớ Phần 3: Bài tập lớn CÁC PHẦN MỀM THIẾT BỊ SỬ DỤNG TRONG MÔN THỰC HÀNH - Phần mềm VMware - Hệ điều hành Ubuntu Chương Quản lý tiến trình, tiểu trình Chương Sinh viên thực hành thao tác liên quan tới tiến trình hệ điều hành Mục đích thực hành giới thiệu tiến trình, tiểu trình hệ điều hành linux Cuối sinh viên áp dụng lập trình đa tiều trình (multithreading) nhằm giảm thời gian thực thi song song Bài thực hành bao gồm phần chính: Tìm hiểu tiến trình, tiểu trình Chương 3.1 Tiến trình linux Chương Một tiến trình, linux gọi task, thực thể chương trình chạy linux Chẳng hạn 10 người server sử dụng chương trình, emacs (trình soạn thảo), ta có 10 tiến trình emacs chạy server đó, chúng xuất phát từ chương trình Chương Trong linux, ta dùng lệnh ps –e để hiển thị tất tiến trình chạy hệ thống, hình minh họa Chương Chương Hình Tiến trình linux Chương Trong đó, PID số id tiến trình, TTY cho biết tiến trình thuộc vào terminal CMD tên chương trình chạy Chương ID tiến trình (PID) cho tiến trình hệ thống Hệ điều hành sử dụng biến counter 32-bit để đặt ID cho tiến trình Một tiến trình khởi tạo, biến counter tang lên giá trị trở thành PID tiến trình vừa khởi tạo Chương 10 Để hiển thị nhiều thơng tin tiến trình gắn liền với terminal ta gõ lệnh ps -l Chương 11 Chương 12 Hình Hiển thị thơng tin tiến trình gắn liền với terminal Chương 13 Cột S cột quan trọng nhất, cho biết trạng thái tiến trình Các tiến trình thuộc vào trạng thái bảng sau Chương 14 Chương 15 Name Code Chương 16 Chương 21 Uninteruptible D sleep Chương 17 Chương 22 Runnable (on run R queue) Chương 18 Chương 23 Sleeping S Chương 24 Traced Chương 19 Stopped T Chương 20 Z Chương 26 Chương 25 Defunct (zombie) Chương 27 Nếu ta sử dụng lệnh ps –el, ta nhận thấy hầu hết tiến trình trạng thái ngủ (sleeping – S) Bởi vì, tất đợi input để xử lý Trong Hình 2, ta thấy PPID ps PID bash, ps kích hoạt từ bash, bash gọi tiến trình cha tiến trình ps Như sau khởi tạo tiến trình ps xong, bash chuyển sang trạng thái ngủ Chương 28 Bởi có mối quan hệ cha-con tiến trình, nên linux hỗ trợ lệnh để hiển thị mối quan hệ dạng thông qua lệnh pstree Ta nhận quan hệ bắt nguồn từ init, sau đến tiến trình cha (PPID) daemon (các tiến trình chạy ngầm không tương tác trực tiếp với người dùng) 28.1Signals Chương 29 Trong linux, tín hiệu xem kênh giao tiếp bất đồng với tiến trình Một signal ngắt tiến trình chạy bình thường để chuyển hệ thống sang phục vụ kiện khác Có nhiều loại signal linux, sinh viên tham khảo tài liệu đính kèm Từ terminal, ta dùng kill gửi signal tới tiến trình Ví dụ: Chương 30 Chương 31 Hình Hủy tiến trình lệnh terminal Chương 32 Ví dụ dùng lệnh KILL để gửi tín hiệu SIGKILL tới tiến trình ngủ 300 giây Ta dùng lệnh này để loại bỏ tiến trình khơng mong muốn với lựa chọn SIGKILL SIGTERM Đối với SIGKILL tiến trình bị hủy lập tức, SIGTERM tiến trình có thời gian để xử lý thao tác Chương 33 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ư viện signal.h) để lấy số hiệu địa hàm để bắt tín hiệu Ví dụ bắt kiện CTRL-C (SIGINT – signal interrupt) Chương 34 Chương 35 Hình Bắt tín hiệu SIGINT 35.1Tạo tiến trình 35.1.1Tạo tiến trình từ tiến trình cha Chương 36 Trong linux, tiến trình tạo cách nhân đơi tiến trình bằn lời gọi hệ thống fork Trong C, ta thực lệnh fork(): Chương 37 #include Chương 38 #include Chương 39 Chương 40 pid_t fork(void); Chương 41 Chương 42 Sau tạo tiến trình từ tiến trình cha, tiến trình sử dụng chung code sử dụng stack heap riêng Hàm fork trả giá trị PID, ta sử dụng giá trị để phân biệt process Đối với tiến trình con, hàm fork trả giá trị 0, hàm fork cha trả PID hàm tạo (nếu giá trị trả âm lỗi) Sinh viên chạy ví dụ sau: Chương 43 #include /* Symbolic Constants */ Chương 44 #include /* Primitive System Data Types */ Chương 45 #include /* Input/Output */ Chương 46 #include /* General Utilities */ Chương 47 Chương 48 int main(){ Chương 49 pid_t pid; Chương 50 Chương 51 pid=fork(); Chương 52 Chương 53 if(pid==0) Chương 54 printf("Child process, gia tri pid=%d\n",pid); Chương 55 else Chương 56 printf("Parent Proces, gia tri pid=%d\n",pid); Chương 57 Chương 58 Chương 59 exit(0); } Chương 60 Hàm wait sử dụng để hàm cha đợi hàm kết thúc Ví dụ sau khiến tiến trình cha phải đợi tiến trình hoàn thành trước Chương 61 #include /* Symbolic Constants */ Chương 62 #include /* Primitive System Data Types */ Chương 63 #include /* Input/Output */ Chương 64 #include /* General Utilities */ Chương 65 Chương 66 int main(){ Chương 67 pid_t pid; Chương 68 Chương 69 pid=fork(); Chương 70 Chương 71 if(pid==0) Chương 72 printf("Child process, gia tri pid=%d\n",pid); Chương 73 else { Chương 74 wait(NULL); Chương 75 printf("Parent Proces, gia tri pid=%d\n",pid); Chương 76 } Chương 77 exit(0); Chương 78 } Chương 79 Chương 80 80.1.1Khởi tạo tiến trình từ chương trình có sẵn Chương 81 Hàm fork giúp tạo tiến trình từ tiến trình tại, nhiên, muốn chạy chương trình có sẵn cần thực lời gọi hệ thống Hàm execl thay tiến trình tiến trình gọi từ chương trình Ví dụ: Chương 82 #include Chương 83 #include Chương 84 int main(){ Chương 85 execl("/usr/bin/gedit", "gedit", "foo.c”, NULL); Chương 86 exit(1); Chương 87 } Chương 88 Chương 89 Nếu muốn mở tạo file với tên foo.c, đồng nghĩa với việc ta gõ lệnh gedit foo.c terminal, ta truyền tham số cho hàm execl execl("/usr/bin/gedit", "gedit", "foo.c”, NULL); Chương 90 Trong lập trình ta kết hợp lệnh fork lệnh execl để tiến trình vừa tiếp tục chạy vừa tạo thêm tiến trình từ việc mở thêm chương trình khác Đầu tiên, ta dùng lệnh fork để tạo tiến trình Sau đó, tiến trình ta dùng hàm execl để khởi tạo tiến trình Chương 91 91.1Tiểu trình Chương 92 Ở phần này, sinh viên làm quen với thao tác tiểu trình Tiểu trình linux sử dụng thơng qua gói thư viện chuẩn pthreads Chúng ta cần thêm cờ -pthread biên dịch chương trình để biên dịch chương trình có sử dụng tiểu trình Vì dụ, ta muốn biên dịch file có tên threadprog.c ta sử dụng lệnh sau: Chương 93 $gcc –pthread –o threadprog threadprog.c Chương 94 Ngồi ra, lập trình cần khai báo thư viện pthreads vào cách thêm pthread.h vào header 94.1.1Khởi tạo tiểu trình Chương 95 Một tiểu trình tạo cách gọi hàm pthread_create Hàm pthread_create định nghĩa đầy đủ sau: Chương 96 *attr, void int pthread_create(pthread_t *thread, *(*start_routine)(void *), void *arg); const pthread_attr_t Pthread_create trả số integer, tiểu trình tạo thành cơng trả 0, ngược lại số khác Đối số trỏ tới kiểu cấu trúc có tên pthread_t Cấu trúc giữ thơng tin hữu ích tiểu trình (thread) Vì thế, tạo tiểu trình, ta cần cấp phát nhớ để lưu trữ thông tin Đối số thứ hai trỏ tới cấu trúc pthread_attr_t Cấu trúc chứa thuộc tính tiểu trình số lượng nhớ cần cấp phát cho stack tiểu trình Mặc định nhớ cần thiết 512K Nếu số lượng tiểu trình q nhiều gây tràn nhớ Vì ta cấp phát nhớ cho stack nhỏ Chương 97 #define SMALL_STACK 131072 //128K for stack Chương 98 pthread_attr_t thread_attr; Chương 99 pthread_attr_init(&thread_attr); Chương 100 pthread_attr_setstacksize(&thread_attr, SMALL_STACK); Lưu ý, ta sử dụng lại cấu trúc thuộc tính cho tiểu trình khác Đối số thứ trỏ hàm tới hàm mà tiểu trình thực thi Đối số cuối đối số truyền cho hàm thực thi khai báo đối số thứ Chương 101 101.1.1 Ví dụ tiều trình Chương 102 Dưới ví dụ sử dụng pthread_create Các dịng lệnh tạo tiểu trình thực thi hàm fn Chương 103 #include Chương 104 #include Chương 105 #include Chương 106 Chương 107 #define SMALL_STACK 131072 //128K for stack Chương 108 Chương 109 pthread_attr_t thread_attr; Chương 110 void* fn(void* arg); Chương 111 int main(int argc, char** argv) Chương 112 { Chương 113 pthread_attr_init(&thread_attr); Chương 114 pthread_attr_setstacksize(&thread_attr, SMALL_STACK); Chương 115 pthread_t th; Chương 116 pthread_create(&th, &thread_attr, fn, (void*)14); Chương 117 void* val; Chương 118 thread_join(th, &val); Chương 119 return 0; Chương 120 } Chương 121 void* fn(void* arg){ Chương 122 printf("arg = 0x%x\n", (int)arg); Chương 123 return NULL; Chương 124 } Chương 125 Hàm pthread_join làm cho hàm main đợi tiểu trình kết thúc 125.1 Tổng kết Chương 126 Bài thực hành hướng dẫn sinh viên tìm hiểu tiến trình linux Qua đó, giúp sinh viên nắm cách thức lập trình khởi tạo tiến trình, tiểu trình, bắt kiện lập trình, Chương 127 127.1 Bài tập Vẽ mối quan hệ danh sách tiến trình hình bên Tại nhánh, ghi tên PID tiến trình (nhớ init ln ln có PID 1) Chương 128 Sinh viên viết chương trình có chứa handler kiện SIGHUP, SIGTERM, SIGINT Đối với handler in dòng chữ cho biết chương trình bắt tín hiệu thành cơng Chương 129 Chương 130 Hướng dẫn: sau viết xong chương trình có tên ex- signals Chương 131 Chạy lệnh /ex-signals Chương 132 Sau thực gửi signal tới tiến trình chạy VD: Chương 133 Chương 134 Cho chương trình sau: Chương 135 Chương 136 #include Chương 137 #include kill -SIGHUP pid Chương 138 #include Chương 139 #include Chương 140 Chương 141 int main(){ Chương 142 pid_t pid; Chương 143 int num_coconuts = 17; Chương 144 pid = fork(); Chương 145 Chương 146 if(pid == 0) { Chương 147 num_coconuts = 42; Chương 148 exit(0); Chương 149 } else { wait(NULL); /*wait until the child Chương 150 terminates */ } Chương 151 } Chương 152 Chương 153 printf("I see %d coconuts!\n", num_coconuts); Chương 154 exit(0); } Chương 155 Chương 156 Chương 157 Chương trình in hình? Giải thích Viết chương trình làm công việc sau theo thứ tự: a In dòng chữ “Thuc hanh he dieu hanh” b Mở chương trình gedit c Đợi người dùng nhấn CTRL-C để tắt d Khi người dùng nhấn CTRL-C, in dòng chữ “Ban da nhan CTRL-C” 5 Sinh viên bỏ hàm pthread_join ví dụ mục 1.4.2 Sau biên dịch chạy lại chương trình Chương trình có in hình giống với trước khơng? Giải thích Sinh viên tìm hiểu thêm pthread_create nhằm biết cách truyền nhiều đối số cho hàm thực thi tiểu trình Hãy thực chương trình truyền MSSV Họ Tên cho tiểu trình in hình Chương 158 PHỤ LỤC Chương 159 Chương 160 Chương 161 Chương 162 Chương 163 Chương 164 Chương 165 Chương 166 Chương Quản lý tiến trình, tiểu trình 1.1 .Tiến trình linux 1.2 Signals 1.3 Tạo tiến trình 1.3.1 Tạo tiến trình từ tiến trình cha 1.3.2 Khởi tạo tiến trình từ chương trình có sẵn 1.4 Tiểu trình Chương 167 1.4.1 Khởi tạo tiểu trình Chương 168 1.4.2 Ví dụ tiều trình 10 Chương 169 Chương 170 Chương 171 1.5 Tổng kết 10 1.6 Bài tập .10 TÀI LIỆU THAM KHẢO http://www.ucs.cam.ac.uk/docs/course-notes/unix-courses/Building/ files/signals.pdf http://manpages.ubuntu.com/manpages/lucid/man2/fork.2.html http://manpages.ubuntu.com/manpages/saucy/man3/ pthread_create.3.html http://manpages.ubuntu.com/manpages/saucy/man3/ pthread_join.3.html ... pid=fork(); Chương 52 Chương 53 if(pid==0) Chương 54 printf("Child process, gia tri pid=%d\n",pid); Chương 55 else Chương 56 printf("Parent Proces, gia tri pid=%d\n",pid); Chương 57 Chương 58 Chương 59... Chương 71 if(pid==0) Chương 72 printf("Child process, gia tri pid=%d\n",pid); Chương 73 else { Chương 74 wait(NULL); Chương 75 printf("Parent Proces, gia tri pid=%d\n",pid); Chương 76 } Chương... sleep Chương 17 Chương 22 Runnable (on run R queue) Chương 18 Chương 23 Sleeping S Chương 24 Traced Chương 19 Stopped T Chương 20 Z Chương 26 Chương 25 Defunct (zombie) Chương 27 Nếu ta sử dụng

Ngày đăng: 25/02/2023, 17:58

Xem thêm:

w