Wednesday, February 16, 2011

double fork magic

เริ่มที่ zombie process

zombie process คืออะไร
zombie process คือ process ที่ทำงานจบแล้วแต่ตัวมันยังอยู่ใน process table ของ OS เพื่อรอให้ parent process มาอ่านค่า exit status ของมัน แต่ก็ไม่มาอ่านซักที

แล้วเมื่อไหร่ parent process จะมาอ่าน exit status
เป็นไปได้สองทาง
  1. ในโค้ดเรียก function wait ( pid_t wait(int *stat_loc) ) แล้วโปรแกรมจะหยุดรอจนกว่า process ลูกจะทำงานเสร็จ
  2. เขียน signal handling ให้จัดการ SIGCHLD (SIGCHLD เป็น signal ที่ส่งมาบอกว่า process ลูกทำงานเสร็จแล้ว ให้ parent process ไปจัดการต่อด้วย)

double fork คืออะไร
double fork เป็นรูปแบบการเขียนโค้ดแบบหนึ่งที่ไว้ป้องกันการเกิด zombie process การเขียนโค้ดแบบ double fork นี้ใช้ประโยชน์จากการที่เมื่อ parent process จบการทำงานในขณะที่ child process ยังทำงานไม่เสร็จ โดย child process นั้นจะกลายเป็น process ลูกของ init process แทน ซึ่งจะคอยกำจัด child process พวกนี้ภายหลัง (init process คืออะไรอะเหรอ โอ๊ย เรื่องมันยาว)

แล้วตกลงมันทำงานยังไงหละว้อย
ยกตัวอย่างเปรียบเทียบให้เห็นภาพเลยละกัน
  1. ตัวอย่างแรกของการเกิด zombie สมมติว่ามี process A fork ลูกออกมาเป็น process B และเมื่อ B ทำงานเสร็จ A ไม่มาจัดการ SIGCHLD ที่ส่งมาทำให้ B กลายเป็น zombie
  2. ตัวอย่างการทำ double fork แทนที่ process A จะ fork B ออกมาเลย เราเขียนโค้ดให้ A fork process X ออกมาก่อน โดยหน้าที่อย่างเดียวของ X คือ fork B เมื่อ fork B เสร็จก็ให้ X จบการทำงาน ซึ่งเมื่อมาถึงขั้นนี้ B จะกลายเป็น orphan process และจะกลายเป็น process ลูกของ init เมื่อ B ทำงานเสร็จ init ก็จะมาจัดการเคลียร์ B ออกจาก process table ให้
ทีนี้ก็จะไม่มี zombie process อีกต่อไป

4 comments:

tanakorn said...

python ก็เขียนวิธีนี้ได้นะครับ
เอ๊ะ จะโพสต์ทำไม

Unknown said...

I like nerd blog!!

You guys are doing quite complex things.

Anonymous said...

Is it game call Zombie Farm or Zombie Cafe kha? I just downloaded in my iphone kha. >-< Try It!! >> Seeeee I know sth about computer engineer na. haha

tanakorn said...

Oh!!! You know a lot of thing about computer system. I can't believe that you are arts student.