Hướng dẫn dùng fork process trong PHP

  • Hướng dẫn dùng fork process trong PHP
  • Diễn đàn
  • LẬP TRÌNH C++ | LẬP TRÌNH C | LẬP TRÌNH C++0X
  • Thắc mắc lập trình C/C++/C++0x
  • Ý nghĩa hàm Fork() trên Linux

  1. Ý nghĩa hàm Fork() trên Linux

    Tôi đang học môn HĐH và trong CT học có nói đến tiến trình sử dụng hàm Fork() trong Linux, nhưng tôi chưa hiểu ý nghĩa của hàm này, nhờ các thành viên của diễn đàn giúp đỡ.


  2. Tìm được trên Google; không biết có giúp ích gì cho cậu không? Tuy nhiên cái này tôi cũng không dùng (hệ điều hành mà sử dụng fork(), tôi dùng Windows):

    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.

    PHP Code:

    #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.

    PHP Code:

    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.

    PHP Code:

    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).

    Tuy nhiên nếu khi dùng có phần nào không hiểu thì cậu cũng nên đưa phần đó lên để người khác trao đổi tìm phương án giúp; chứ đừng hỏi chung chung!


  3. fork dùng để tách tiến trình mới, cũng có cách khác là dùng pthread
    xem header của nó thì bạn biết


  4. Cho mình hỏi việc nhân bản 1 tiến trình con từ tiến trình cha có tác dụng gì vậy? Nếu không có hàm fork() thì có vấn đề gì xảy ra?

    PS: mình là newbie nên còn nhiều điều không biết, mong các bạn chỉ bảo thêm.


  5. không có fork thì làm sao tách được tiến trình
    ngoài ra Linux còn có hàm vfork
    mình chưa xài hàm này và rất ít xài fork vì không có điều kiện code server


  6. Ý nghĩa hàm Fork() trên Linux

    Nếu xài pthread thì cũng có thể tạo tiến trình được mừ. Khi nào dùng pthread và khi nào dùng fork?


  7. Thread và Process là hai khái niệm khác nhau, do đó người ta mới có hai hàm khác nhau pthread để tạo thread và fork để tạo process. Về căn bản, các thread và process đều là những cách để chương trình có thể thực hiện song song nhiều tiến trình với nhau. Nhưng thread thì sử dụng chung bộ nhớ, sử dụng chung process state, trong khi process thì hoàn toàn độc lập với process khác (ngoại trừ việc chung code segment).

    Hàm fork chủ yếu được dùng khi viết shell (giống như cmd.exe hoặc PowerShell trong Windows, bash trong linux). Sau khi người dùng gõ lệnh vào, shell sẽ dùng lệnh fork lên chính nó rồi sử dụng hàm exec() để gọi chương trình mong muốn. Nếu như dùng pthread mà ko dùng fork, thì phần stack segment, data segment,... của shell sẽ bị user program xóa mất và người dùng sẽ không bao giờ quay trở về shell sau khi chương trình kết thúc được. Trong khi dùng process thì hai tiến trình có segment riêng nên không ai ảnh hưởng đến ai cả.

    Đã được chỉnh sửa lần cuối bởi free_wind89 : 22-05-2010 lúc 05:04 PM.


  8. Ý nghĩa hàm Fork() trên Linux

    em mới học cái hàm fork mà vẫn chưa hiểu lắm. làm sao để phân bố công việc cho tiến trình...
    vd: cụ thể bằng ngôn ngữ C dùm e... e cảm ơn nhiều lắm


  9. Hướng dẫn dùng fork process trong PHP
    Nguyên bản được gửi bởi squall016
    Hướng dẫn dùng fork process trong PHP

    em mới học cái hàm fork mà vẫn chưa hiểu lắm. làm sao để phân bố công việc cho tiến trình...
    vd: cụ thể bằng ngôn ngữ C dùm e... e cảm ơn nhiều lắm

    THì sử dụng các tham số để thể hiện "công việc" cho từng tiến trình thôi, tham số thế nào thì tùy ngữ cảnh.
    Chú ý là các tiến trình không chia sẻ chung vùng nhớ nên việc chia sẽ chỉ có thể thực hiện qua các cơ chế truyền thông liên tiến trình (IPC) hoặc qua tham số dòng lệnh.

    TB: có từ nào không hiểu thì google trước khi hỏi.


  10. Quá trình cha chạy xong mơi quá trinh con

    Em có một đề tài nội dung như sau:
    Viết chương trình tạo ra một quá trình con. Quá trình cha sẽ nhận chuỗi số
    nguyên từ bàn phím do người dùng nhập và ghi vào file tên input. Quá trình con sẽ
    đọc dữ liệu từ file này, sắp xếp chúng theo thứ tự tăng dần và ghi vào một file khác
    tên là sorted.
    các anh chi ai đã từng làm cau này xin giúp em


Các đề tài tương tự

  1. Trả lời: 7

    Bài viết cuối: 06-01-2012, 07:58 AM

  2. Trả lời: 11

    Bài viết cuối: 24-11-2010, 05:51 AM

  3. Trả lời: 12

    Bài viết cuối: 22-11-2010, 03:48 PM

  4. Trả lời: 5

    Bài viết cuối: 30-05-2009, 11:38 AM

  5. Trả lời: 4

    Bài viết cuối: 02-10-2007, 11:33 PM

Hướng dẫn dùng fork process trong PHP
Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn
  • Tìm hiểu luật lệ tham gia diễn đàn

  • BB code: On
  • Mặt cười: On
  • [IMG] code: On
  • [VIDEO] code is On
  • HTML code: Off