1. Trang chủ
  2. » Công Nghệ Thông Tin

Chương 7: Xử lý tiến trình trong Linux

56 2,3K 7

Đ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

Thông tin cơ bản

Định dạng
Số trang 56
Dung lượng 0,95 MB

Nội dung

1 Chương 7: Chương 7: Xử tiến trình trong Linux Xử tiến trình trong Linux CITD - VNUHCM Bao g m các ph n sau:ồ ầ 1. Khái quát v ti n trình trong 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ến trình trong Linux 7.1. Khái quát về tiến trình trong Linux - 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ến trì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ương trì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ến trình kết hợp với nhau. 3 - Các tiến trì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ến trì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ến trình IPC (Inter- Process Communications) - Chúng ta sẽ biết cách tạo, hủy, tạm dừng tiến trình trong 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ến trì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ến trình phải trong trạng thái sẵn sàng nhường quyền xử CPU cho các tiến trình khác ở bất kỳ thời điểm nào. - Tiến trì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ến trình đang chạy. 5 - Nhiều tiến trì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ến trì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ến trình có thể hoạt động tách biệt khác) - Hai tiến trì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ến trì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ến trình 7.2. Cách hoạt động của tiến trình - Trong môi trường HĐH Linux, một tiến trình có các trạng thái sau: Running (Đang chạy): Tiến trình chiếm quyền xử CPU Waiting (Chờ): Tiến trình bị HĐH “tước” quyền xử CPU Suspend (Tạm dừng): HĐH tạm dừng tiến trình  Sleeping - Tại dòng lệnh, có thể bấm Ctrl-Z để tạm ngừng tiến trì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ến trình mới. - Hàm exec() dùng thay thế tiến trình hiện hành. 7 7.3. Cấu trúc tiến trình 7.3. Cấu trúc tiến trình - Cách thức quản tiến trình của Linux:  Hai user neil và rick cùng đăng nhập và chạy chương trình grep đồng thời  HĐH lúc này sẽ quản và nạp mã truy cập chương trì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ương trình grep tìm chuỗi “abc” trong tập tin treck.txt còn người dùng rick chạy chương trình grep tìm chuỗi “cde” trong tập tin somefile.doc Hình 7.1 Tiến trình quản 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ến trìnhLinux đ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ến trình trên hệ thống 9 - Mỗi tiến trì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ến trình init được gọi và chạy ngay khi ta khởi động HĐH. Đây là tiến trình quản và tạo ra mọi tiến trình con khác  Có PID là 1 - Cách thức gán PID: Khi một tiến trì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ến trình đang chạy nào chiếm giữ) và cấp phát cho tiến trình này. Khi tiến trình chấm dứt, HĐH sẽ thu lại số PID để cấp phát cho tiến trì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ến trình đang chạy. - Theo quy ước, mỗi tiến trì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ến trì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ến trình (Process Table). - Bảng tiến trình quản 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ến trình đang chạy. - Bảng tiến trì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ến trì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ến trình là không giới hạn chỉ phụ thuộc vào bộ nhớ sẵn có. [...]... của tiến trình execlp() - Ví dụ 7 -7: system2.c 22 7.4.7 Bỏ rơi tiến trình con - Là tình huống khi cả hai tiến trình cha và con cùng hoạt động độc lập nhưng tiến trình cha kết thúc trước tiến trình con và đến khi tiến trình con kết thúc thì sẽ không còn điểm trở về để liên hệ với tiến trình cha đã sinh ra nó trước đó  Tiến trì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ến trình bằng fork() Gọi fork() Trả về PID của tiến trình con Trả về trị 0 Mã lệnh kế tiếp của tiến trình ban đầu (tiến trình cha) Mã lệnh thực thi tiến trình mới (tiến trình con) Hình 7.2 Cơ chế nhân bản tiến trì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ến trình vào chạy • TIME: Khoảng thời gian chiếm dụng CPU của tiến trình • CMD: Toàn bộ dòng lệnh triệu gọi tiến trình • TTY: Chỉ ra màn hình Terminal ảo nơi gọi thực thi tiến trình 11 7.3.3 Các tiến trình hệ thống - Sử dụng lệnh ps với tham số là “-ax” để xem các tiến trình của hệ thống - Xét tiến trình ở dòng đầu: Các tiến trình hệ thống (ở đây là init) không... khác hoặc toàn bộ tiến trì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ến trình - Nếu như một tiến trì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ến trình khác - Tiến trì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ến trình - Việc sử dụng luồng hay tiến trình là tùy thuộc... (Thread) là một phần của tiến trì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ến trình - Trong mỗi tiến trình  có thể tạo ra nhiều luồng hoạt động song song với nhau (như cách tiến trì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ến trình 29 - Tập hợp nhóm các luồng  chia sẻ chung vùng nhớ của một tiến trình và có thể sử dụng... 24 7.5 Đọc thông tin về các tiến trì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ến trì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ến trình và sẽ tự động loại bỏ thư mục này khỏi /proc khi tiến trình trên kết thúc: /proc 1 1062 1123 1234  tiến trì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ến trình cha và con hoạt động độc lập với nhau - Đôi khi tiến trình cha phải đợi tiến trình con thực thi xong tác vụ thì mới được... TTY của tiến trình init  sẽ có giá trị là “?” - Tiến trì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ến trì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ến trình - Các HĐH đa nhiệm, đa tiến trì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ến trình -... thực thi trả về - Ví dụ 7-1: system.c 16 7.4.2 Thay thế tiến trình hiện hành với hàm exec() - Hàm exec() sẽ thay thế toàn bộ ảnh của tiến trì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ến trình khác {tiến trình B} - Việc thay thế này chỉ giữ lại số PID của tiến trình A - Hàm thay thế ảnh của tiến trì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ến trình với hàm fork() - Việc thay thế tiến trình đôi khi cũng bất lợi do tiến trình mới tạo ra chiếm toàn bộ không gian của tiến trình cũ và không còn khả năng kiểm soát tiến trình cũ nữa - Sử dụng hàm fork() để nhân bản tiến trì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ến trình - Cách thức khai báo: chính #include

Ngày đăng: 08/05/2014, 14:53

TỪ KHÓA LIÊN QUAN

w