Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 56 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
56
Dung lượng
0,95 MB
Nội dung
1 Chương7:Chương7:XửlýtiếntrìnhtrongLinuxXửlýtiếntrìnhtrongLinux CITD - VNUHCM Bao g m các ph n sau:ồ ầ 1. Khái quát v ti n trìnhtrong Linuxề ế 2. Cách ho t đ ng c a ti n trìnhạ ộ ủ ế 3. C u trúc ti n trìnhấ ế 4. T o l p ti n trìnhạ ậ ế 5. Đ c thông tin v các ti n trìnhọ ề ế 2 7.1. Khái quát về tiếntrìnhtrongLinux 7.1. Khái quát về tiếntrìnhtrongLinux - Mục tiêu: Nắm vững cơ chế hoạt động của các HĐH đa nhiệm thông qua khái niệm tiếntrình (Process) - Điểm nổi bật của các HĐH tựa Unix là khả năng chạy đồng thời nhiều chươngtrình (Multi-Programming). - HĐH xem mỗi đơn thể mã lệnh mà nó điều khiển là Tiến trình. - Một ứng dụng có thể bao gồm nhiều tiếntrình kết hợp với nhau. 3 - Các tiếntrình cùng hoạt động chia sẻ thời gian CPU, có thể dùng chung vùng nhớ và các tài nguyên hệ thống khác. - Các lệnh của Linux thực tế là những tiếntrình riêng lẻ, có khả năng kết hợp và truyền dữ liệu cho nhau thông qua cơ chế giao tiếp liên tiếntrình IPC (Inter- Process Communications) - Chúng ta sẽ biết cách tạo, hủy, tạm dừng tiếntrìnhtrong Linux. Đồng thời, tìm hiểu sâu cơ chế đồng bộ hóa và giao tiếp giữa các tiến trình. 4 - Không như môi trường đơn nhiệm chỉ có một tiếntrình hoạt động, môi trường đa nhiệm có tài nguyên rất hạn hẹp. - Khi hệ thống yêu cầu, tiếntrình phải trong trạng thái sẵn sàng nhường quyền xửlý CPU cho các tiếntrình khác ở bất kỳ thời điểm nào. - Tiếntrình được định nghĩa: Là một thực thể điều khiển đoạn mã lệnh có riêng một không gian địa chỉ, có ngăn xếp riêng, có bảng chứa các mô tả tập tin đang mở và đặc biệt là có một định danh PID (Process Identifier) duy nhất trong toàn bộ hệ thống vào thời điểm tiếntrình đang chạy. 5 - Nhiều tiếntrình có thể thực thi trên cùng một máy với cùng một HĐH, cùng một người dùng (hoặc nhiều người dùng đăng nhập khác nhau). Ví dụ: Shell Bash là một tiếntrình có thể thực thi lệnh ls hay cp (trong khi bản thân hai lệnh trên là những tiếntrình có thể hoạt động tách biệt khác) - Hai tiếntrình khác nhau không thể xâm phạm vùng nhớ của nhau Tuy nhiên, để chia sẻ dữ liệu giữa hai tiếntrình có thể sử dụng vùng không gian địa chỉ chung. 6 7.2. Cách hoạt động của tiếntrình 7.2. Cách hoạt động của tiếntrình - Trong môi trường HĐH Linux, một tiếntrình có các trạng thái sau: Running (Đang chạy): Tiếntrình chiếm quyền xửlý CPU Waiting (Chờ): Tiếntrình bị HĐH “tước” quyền xửlý CPU Suspend (Tạm dừng): HĐH tạm dừng tiếntrình Sleeping - Tại dòng lệnh, có thể bấm Ctrl-Z để tạm ngừng tiếntrình sau đó dùng lệnh bg để đưa nó vào hậu trường để sau đó dùng fg chuyển lên mặt trước. - Hàm fork() để nhân bản một tiến trình. - Hàm system() để tạo lập tiếntrình mới. - Hàm exec() dùng thay thế tiếntrình hiện hành. 7 7.3. Cấu trúc tiếntrình 7.3. Cấu trúc tiếntrình - Cách thức quản lýtiếntrình của Linux: Hai user neil và rick cùng đăng nhập và chạy chươngtrình grep đồng thời HĐH lúc này sẽ quản lý và nạp mã truy cập chươngtrình grep vào hai vùng nhớ khác nhau và gọi mỗi phân vùng như là một tiến trình. Hình 7.1 người dùng neil chạy chươngtrình grep tìm chuỗi “abc” trong tập tin treck.txt còn người dùng rick chạy chươngtrình grep tìm chuỗi “cde” trong tập tin somefile.doc Hình 7.1 Tiếntrình quản lý bởi HĐH neil $grep abc treck.txt PID 101 Code Data S=abc Library filedes Mã lệnh grep Thư viện C rick $grep cde somefile.doc PID 102 Code Data S=cde Library filedes treck.txt somefile.doc Không gian của Hệ điều hành 8 - Dùng lệnh ps cho phép xem thông tin về các tiếntrình mà Linux đang kiểm soát (có thể sử dụng thêm tham số “-af” để liệt kê chi tiết thông tin về các tiến trình): Hình 7.1.a Liệt kê thông tin về các tiếntrình trên hệ thống 9 - Mỗi tiếntrình được gán cho một định danh gọi là PID (Process Identifier) - PID là một số nguyên dương có giá trị từ 2 – 32768 - Tiếntrình init được gọi và chạy ngay khi ta khởi động HĐH. Đây là tiếntrình quản lý và tạo ra mọi tiếntrình con khác Có PID là 1 - Cách thức gán PID: Khi một tiếntrình mới yêu cầu khởi động, HĐH sẽ chọn lấy một giá trị số nguyên trong khoảng 2 – 32768 (số nguyên này chưa bị tiếntrình đang chạy nào chiếm giữ) và cấp phát cho tiếntrình này. Khi tiếntrình chấm dứt, HĐH sẽ thu lại số PID để cấp phát cho tiếntrình khác trong lần sau. - Trên Unix/Linux, thư mục /proc chứa các file lưu trữ thông tin về những tiếntrình đang chạy. - Theo quy ước, mỗi tiếntrình hoạt động trong không gian địa chỉ ảo độc lập do hệ thống cấp phát 4GB (có liên quan đến phân vùng SWAP đã được đề cập ở Chương 1) 10 7.3.1. Bảng thông tin tiếntrình - HĐH lưu trữ một cấu trúc danh sách bên trong hệ thống gọi là bảng tiếntrình (Process Table). - Bảng tiếntrình quản lý tất cả các PID của hệ thống cùng với thông tin chi tiết về các tiếntrình đang chạy. - Bảng tiếntrình tựa như bảng của CSDL lưu các record là thông tin về tiến trình. Trong đó, số PID thường được sử dụng làm khóa chính và đánh chỉ mục để truy xuất thông tin. - Trong các phiên bản Unix/Linux cũ, giới hạn không được có hơn 256 tiếntrình chạy đồng thời. Tuy nhiên, trên các hệ Unix/Linux có phiên bản mới hiện nay số tiếntrình là không giới hạn chỉ phụ thuộc vào bộ nhớ sẵn có. [...]... của tiếntrình execlp() - Ví dụ 7 -7: system2.c 22 7.4.7 Bỏ rơi tiếntrình con - Là tình huống khi cả hai tiếntrình cha và con cùng hoạt động độc lập nhưng tiếntrình cha kết thúc trước tiếntrình con và đến khi tiếntrình con kết thúc thì sẽ không còn điểm trở về để liên hệ với tiếntrình cha đã sinh ra nó trước đó Tiếntrình con ở trạng thái zombie (bỏ rơi) - Linux sẽ tự động gán PPID của tiến trình. .. 7.2 minh họa cách nhân bản tiếntrình bằng fork() Gọi fork() Trả về PID của tiếntrình con Trả về trị 0 Mã lệnh kế tiếp của tiếntrình ban đầu (tiến trình cha) Mã lệnh thực thi tiếntrình mới (tiến trình con) Hình 7.2 Cơ chế nhân bản tiếntrình của fork() 18 - Đoạn mã điều khiển và sử dụng hàm fork() thường có dạng chuẩn sau: pid_t new_pid; new_pid=fork(); /*Nhân bản tiến trình* / switch (new_pid) {... là 1) • STIME: Thời điểm bắt đầu đưa tiếntrình vào chạy • TIME: Khoảng thời gian chiếm dụng CPU của tiếntrình • CMD: Toàn bộ dòng lệnh triệu gọi tiếntrình • TTY: Chỉ ra màn hình Terminal ảo nơi gọi thực thi tiếntrình 11 7.3.3 Các tiếntrình hệ thống - Sử dụng lệnh ps với tham số là “-ax” để xem các tiếntrình của hệ thống - Xét tiếntrình ở dòng đầu: Các tiếntrình hệ thống (ở đây là init) không... khác hoặc toàn bộ tiếntrình đang hoạt động Nguyên nhân là luồng dùng chung vùng nhớ và không gian địa chỉ của tiếntrình - Nếu như một tiếntrình có vấn đề, nó sẽ bị HĐH cô lập hoàn toàn mà không ảnh hưởng đến các tiếntrình khác - Tiếntrình có thể chạy được trên nhiều máy khác nhau trong khi luồng chỉ thực hiện được trên một máy và trong một tiếntrình - Việc sử dụng luồng hay tiếntrình là tùy thuộc... (Thread) là một phần của tiếntrình sở hữu riêng ngăn xếp (stack) và thực thi độc lập ngay trong mã lệnh của tiếntrình - Trong mỗi tiếntrình có thể tạo ra nhiều luồng hoạt động song song với nhau (như cách tiếntrình hoạt động song song) - Ưu điểm của luồng là hoạt động trong cùng không gian địa chỉ của tiếntrình 29 - Tập hợp nhóm các luồng chia sẻ chung vùng nhớ của một tiếntrình và có thể sử dụng... 24 7.5 Đọc thông tin về các tiếntrình - Tất cả các thông tin mà lệnh ps trả về được lấy trong thư mục /proc - Khi một tiếntrình mới được tạo thì hệ thống sẽ tạo một thư mục con bên trong thư mục /proc với tên là số PID của tiếntrình và sẽ tự động loại bỏ thư mục này khỏi /proc khi tiếntrình trên kết thúc: /proc 1 1062 1123 1234 tiếntrình init tiến trình khác -Trong từng thư mục con sẽ thấy... printf(“This is child process”); /*Mã lệnh dành cho tiến trình con*/ break; default: printf(“This is parent process”); /* Mã lệnh dành cho tiến trình cha*/ break; } - Ví dụ 7-3: fork_demo.c 19 7.4.4 Kiểm soát và đợi tiến trình con - Hàm fork() nhân bản tiến trình hiện hành thành hai tiếntrình cha và con hoạt động độc lập với nhau - Đôi khi tiếntrình cha phải đợi tiếntrình con thực thi xong tác vụ thì mới được... TTY của tiếntrình init sẽ có giá trị là “?” - Tiếntrình cuối cùng khi mà init gọi trước khi chuyển giao quyền điều khiển cho Shell đó là tiếntrình getty (Trình yêu cầu nhập username / password lúc đăng nhập) 12 7.3.4 Điều phối tiếntrình - Các HĐH đa nhiệm, đa tiếntrình như Unix /Linux (hay cả MS Windows NT/2000/XP/2003,…) điều có trách nhiệm điều phối sự hoạt động đồng bộ của các tiếntrình -... thực thi trả về - Ví dụ 7-1: system.c 16 7.4.2 Thay thế tiếntrình hiện hành với hàm exec() - Hàm exec() sẽ thay thế toàn bộ ảnh của tiếntrình hiện tại {tiến trình A} (bao gồm mã lệnh, dữ liệu, bảng mô tả file) bằng ảnh của một tiếntrình khác {tiến trình B} - Việc thay thế này chỉ giữ lại số PID của tiếntrình A - Hàm thay thế ảnh của tiếntrình bao gồm tập các hàm sau: #include int execl(const... - Ví dụ 7-2: pexec.c 17 7.4.3 Nhân bản tiếntrình với hàm fork() - Việc thay thế tiếntrình đôi khi cũng bất lợi do tiếntrình mới tạo ra chiếm toàn bộ không gian của tiếntrình cũ và không còn khả năng kiểm soát tiếntrình cũ nữa - Sử dụng hàm fork() để nhân bản tiếntrình - Hàm fork() sẽ quay về nơi gọi hai lần với hai giá trị trả về khác nhau Khởi tạo tiếntrình - Cách thức khai báo: chính #include