What the Fork( ) ฉบับพรุ่งนี้จะสอบ…
Fork ไม่ใช่ส้อมแต่เป็นฟังก์ชั่นที่ใช้เรียก System call ของระบบปฏิบัติการที่ใช้ในการสร้าง process โดย process นั้นจะถูกเรียกว่า child process และทั้ง 2 process จะทำงานต่อเมื่อสร้างขึ้นมาสำเร็จ,โดยฟังก์ชั่น fork ไม่ต้องการอาร์กิวเมนต์และจะให้ค่า process ID (PID) คืนกลับมา
ลูกคืออะไร พ่อแม่คือยังไง
ในการ fork ให้คิดว่า process เป็นคนและการ fork เป็นการร่ายคาถาแยกร่างออกไปได้เป็น process อีกหนึ่งคนโดยตัวจริงจะถูกเรียกว่า parent process และร่างแยกจะถูกเรียกว่า child process โดยร่างแยกนั้นจะมีคุณสมบัติเหมือนร่างจริงทุกประการ
เมื่อได้ child process มันก็จะทำงานตามคำสั่งของมันเมื่อทำงานเสร็จก็จะตายจากไป ในส่วนของ parent process เมื่อสร้างลูกเสร็จมันก็จะทำงานตามคำสั่งต่อไปแยกกันทำกับลูกเหมือนกับแม่ทำกับข้าวแล้วให้ลูกไปซื้อน้ำปลาหน้าปากซอยแต่มีข้อควรระวังคือ เมื่อทำงานแบบนี้สมมุติว่า parent process ทำงานไป child process ทำงานไป ปรากฎว่า parent process ทำงานเสร็จตามปกติแล้วเมื่อโปรแกรมทำงานเสร็จก็จะตายจากระบบไปแต่ child process ยังทำงานไม่เสร็จ child process ก็ยังคงอยู่ภายในระบบและกินทรัพยากรเท่ากับ parent process ด้วย เราจะเรียก child process พวกนี้ว่า zombie process คอยแอบกินทรัพยากรของเราทั้ง RAM CPU เป็นหน้าที่ของผู้ใช้ต้องไปสั่ง kill process พวกนี้สะ แน่นอนเมื่อเกิดปัญหาก็ต้องมีวิธีแก้ โดยการสั่งให้ parent process ทำการรอ (wait()) จนกว่า child จะทำงานเสร็จและตายไปก่อน parent จึงจะสามารถทำงานเสร็จได้ หรืออีกวิธีคือเมื่อ parent ทำงานเสร็จแล้วให้ส่งสัญญาณไปให้ child เพื่อให้ child ทำการฆ่าตัวตายเพื่อไม่ให้เกิด zombie ได้
พวกเรา FORK กันไปทำไม
สมมุติว่าเรากำลังใช้ google chrome อยู่แล้วต้องการจะดาวน์โหลดไปพร้อมๆ กับการเล่น facebook ถ้าไม่ fork เราจะทำได้แค่อย่างใดอย่างหนึ่ง ซึ่งเป็นเรื่องที่ไม่ดีแน่ๆ fork จึงเข้าไปช่วยแก้ไขปัญหานี้
Fork ยังไง
fork จะให้ค่าคืนเป็น pid_t ซึ่งถูกประกาศอยู่ภายใน sys/types.h
และในการ fork มีด้วยกันอยู่ 3 กรณี
- fork ให้ค่าคืนกลับมาน้อยกว่า 0 : การ fork ไม่สำเร็จ
- fork ให้ค่าคืนกลับมาเท่ากับ 0 : ทำการสร้าง child process
- fork ให้ค่าคืนกลับมามากกว่า 0 : process นี้เป็น parent process โดยค่า pid ที่ได้รับมาเป็นของ child และสามารถใช้ getpid() เพื่อทราบ pid ของตัวเอง
จาก code เมื่อ fork ค่า pid ที่ได้มาจะมี 2 ค่า มาดูทีละตัวกัน
- pid : 6689 เป็น pid ของ child ก็จะเข้ากรณีที่ว่า fork return ค่ากลับมามากกว่า 0 ทำให้ process นี้เป็น parent และ parent process id = 6688
- pid : 0 แสดงว่า process นี้เป็น child process เมื่อลอง getpid มาจะได้ค่า 6689 ซึ่งเป็นค่า pid ของ child ที่สร้างมาจาก parent process 6688 นั้นเอง
จากนั้น child process ก็จะทำตามกรณีของมัน parent process ก็เช่นกันจากนั้น parent จะรอจนกว่า child จะทำงานเสร็จแล้ว parent ก็จะทำ process ต่อไปจนจบโปรแกรม