Tin học
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.

Thảo luận về hàm fork() thầy giáo dạy 4/3/09

Go down

Thảo luận về hàm fork() thầy giáo dạy 4/3/09 Empty Thảo luận về hàm fork() thầy giáo dạy 4/3/09

Bài gửi  nvhung_107H1040 4/3/2009, 21:59

Hàm fork() là hàm chỉ có trong HĐH Unix mà trong Windows không có . Fork tạo ra một process con (child process) là copy (nhân bản) của chính process tạo ra nó (parent process) (làm mình nhớ đến clone() để tạo copy một object trong OOP). Để phân biệt giữa parent process và child process chính là giá trị trả về của hàm fork. Ở parent process thì hàm fork sẽ trả về chính là processID của tiến trình con, còn ở child process thì fork sẽ trả về 0. Fork sẽ trả về 2 lần ở tiến trình cha và tiến trình con.

#include <sys/types.h>
#include <unistd.h>
pid_t fork(void);

Ngay khi hàm fork được gọi thì ngay lập tức phải suy nghĩ song song 2 process. Tất cả những instruction tiếp theo sau lệnh fork đều được thực hiện ở cả hai process (parent and child). Nghĩa là mã lệnh thực thi của cả 2 tiến trình là giống nhau. Hai tiến trình này có không gian địa chỉ riêng rẽ (virtual memory 4G bộ nhớ), stack riêng rẽ, vùng dữ liệu riêng mà. Ở tiến trình con thì sẽ có thêm PPID (parent processID) chính là processID của tiến trình cha.
pid_t childpid;
childpid = fork();
switch (childpid) {
case -1: // Can not fork new process
break;
case 0: // Child process
break;
default: // Parent process
break;
}
Thế nếu muốn nhân bản nhiều child process thì làm thế nào. Khi ấy sẽ không thể suy nghĩ rằng hãy đặt các lệnh fork liên tiếp( fork(); fork() ). Vì ngay sau khi thực hiện lệnh fork thì tiến trình cha đã được nhân bản và tiến trình con cũng sẽ thực hiện lệnh fork tiếp và nhân bản chính tiến trình con đó. Khi ấy ta sẽ có một cây nhị phân tăng theo cấp số nhân 2. Thay vì đó ta hãy đặt lệnh fork tạo process con tiếp theo ở đoạn mã của tiến trình cha.

switch (childpid) {
. . .
default: // Parent process
newchildpid = fork(); // Tạo new child process của tiến trình cha ở đây
switch ( newchildpid )
. . .
break;
}
Tạo các con theo cùng bậc thì chúng ta lại code theo “chiều dọc” (các đoạn switch lồng nhau).

Phần tiếp theo về các vấn đề liên quan đến fork() như khi nào cần sử dụng fork, hay việc chờ đợi tiến trình con hay IPC (inter process communication) và multi-process programming sẽ được đề cập khi nào có dịp.
Đây là mình tìm hiểu trên Net và nghe thầy giáo giảng trên lớp. Mong nhận được những ý kiến đóng góp của các bạn về hàm này. Còn đoạn mã code của thày giáo về hàm này mình sẽ post lên sau
nvhung_107H1040
nvhung_107H1040

Tổng số bài gửi : 136
Join date : 04/03/2009

Về Đầu Trang Go down

Về Đầu Trang

- Similar topics

 
Permissions in this forum:
Bạn không có quyền trả lời bài viết