การจัดการ Process บนระบบ Unix

ผู้เขียน/โดย : เกริก ภิรมย์โสภา (Krerk Piromsopa)
เขียนเมื่อ/ปรับปรุง : 2004-07-12 14:37:11

เอกสารชุดนี้จัดทำขึ้นเพื่ออธิบายโครงสร้างระบบ Process บน Unix และการจัดการเกี่ยวกับการฆ่า Process การแก้ไขค่า Piority และเทคนิคในการ Run Process โดยไม่มีหน้าจอ ทั้งนี้การจัดการต่างๆ จะอาศัยคำสั่งพื้นฐานของ Unix เช่น ps, kill, nice, renice, nohup และ top ในการจัดการเป็นหลัก ทั้งนี้ในปัจจุบันมีโปรแกรมที่ช่วยในการจัดการ Process อีกมากมาย ซึ่งโปรแกรมต่างๆ เหล่านั้นจะอยู่บนพื้นฐานเดียวกันกับคำสั่งที่กล่าวถึงในเอกสารนี้ แต่อาจจะมีวิธีการใช้งานที่ง่ายขึ้นเท่านั้น

ความรู้พื้นฐานเกี่ยวกับระบบ Process บน Unix ที่ควรทราบ

Process หมายถึงโปรแกรมที่อยู่ในหน่วยความจำและพร้อมที่จะถูกประมวลผล ซึ่งหากโปรแกรมยังถูกอยู่ในฮาร์ดไดร์หรือ ยังไม่สามารถประมวลผลโดย CPU ได้โปรแกรมนั้นๆ จะยังไม่เป็น Process แต่จะเป็นเพียงโปรแกรมเท่านั้น (ปกติผู้ใช้มักจะสับสนระหว่างโปรแกรมกับ Process ทั้งนี้ให้ลองคิดว่า 1 โปรแกรมสามารถเป็นได้หลาย Process พร้อมกัน เช่น การ Run โปรแกรมพร้อมกันหลาย Copy จะเป็น 1 โปรแกรม แต่มีกลาย Process) การอ้างอิงถึง Process บนระบบปฏิบัติการต่างๆ นิยมอ้างอิงโดยใช้เลขประจำตัว Process เป็นหลัก หรือ Process ID (PID) ซึ่งเลขดังกล่าวนี้ระบบปฏิบัติการจะเป็นผู้กำหนดให้เมื่อมีการ Execute หรือ สั่ง Run โปรแกรม (สร้าง Process)

ระบบ Process บน Unix จะมีการจัด Scheduling เพื่อเปลี่ยนงานระหว่าง Process ต่างแบบ Multilevel Queue Scheduling กล่าวคือแต่ละ Process จะมีเลข Piority ของตัวเองโดยเลข Piority ที่น้อยแปลว่า Process นั้นมีความสำคัญสูงกว่า และ Process ที่มีความสำคัญสูงดังกล่าวจะมีสิทธิได้ใช้ CPU TIME มากกว่า

เมื่อมีผู้ใช้งานสั่งให้ Process เริ่มทำงาน ระบบปฏิบัติการจะทำการสร้าง Process แล้วส่งเข้าไปสู่ Ready Queue เพื่อรอเข้าประมวลผลภายใน CPU และเมื่อหมดเวลาในการประมวลผล (สำหรับ Preemtive Scheduling)หรือเมื่อ Process ต้องรอการทำงานของ I/O ระบบจะเลือก Process จากสถานะ Ready Queue ตัวถัดไปเข้ามาประมวลผลใน CPU ทั้งนี้การเลือกจะดูที่เลข Piority และลำดับความสำคัญอื่นๆ ประกอบกัน จะวนเวียนเช่นนี้ไปเรื่อยๆ จนกระทั่ง Process ทำงานเสร็จและออกจากระบบไป

Process Queue

การดูสถานะของ Process บนระบบ

การดูสถานะของ Process ต่างบนระบบเราสามารถทำได้โดยเรียกใช้คำสั่ง ps

โครงสร้างคำสั่ง

ps [option]…

โดย option ที่มักใช้กันใน ps คือ

-l แสดงผลลัพธ์เป็น Long Format
-f แสดงผลลัพธ์เป็น Full Format
-a แสดง Proces ทั้งหมดที่มี TTY ตรงกับ TTY ของผู้ใช้งาน
-x แสดง Process ทั้งหมด

ตัวอย่างผลลัพธ์ที่ได้จากคำสั่ง ps

$ ps -al
  F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  STAT TTY        TIME COMMAND
000   500  2293  2292  14   0  2452 1408 wait4  S    ttyp1      0:00 bash
000   500  2677  2293   9   0  1968  876 do_sig T    ttyp1      0:00 vi
000   500  2680  2293  19   0  3020 1152 -      R    ttyp1      0:00 ps al

ความหมายของแต่ละ Field คือ

  • F (Flag) ไม่ขอกล่าวถึงในที่นี้
  • UID เลขประจำตัวของผู้ใช้งาน Process ดังกล่าว(User ID)
  • PID หมายเลข Process (Process ID)
  • PPID หมายเลขของ Process ที่เป็นผู้สร้าง (Parent PID)
  • PRI ค่า Prority
  • NI ค่า Prority ที่มีการเปลี่ยนแปลง (Nice)
  • VSZ ประมาณหน่วยความจำเสมือนที่ถูกใช้งาน (Virtual SIZE)
  • RSS ปริมาณหน่วยความจำที่คงค้างอยู่ (Resident Set Site)
  • WCHAIN ไม่ขอกล่าวถึงในที่นี้
  • STAT แสดงสถานะของ Process (Status)
    • D รอการทำงานของ I/O (uninterruptible sleep)
    • R อยู่ระหว่างการประมวลผลใน CPU (Run)
    • S รออยู่ใน Ready Queue (sleeping)
    • T อยู่ระหว่างหยุดประมวลผล (traced or stopped)
    • Z defunct หรือค้าอยู่ในระบบ เกิดจาก Parent Process ตายไปก่อนที่ Child Procees จะทำงานเสร็จ (“zombie”)
  • TTY หน้าจอที่ใช้สำหรับการประมวลผลของ Process นั้นๆ (Tele-type)
  • TIME เวลาที่ Process ใช้ทำงาน
  • COMMAND คำสั่งหรือ ชื่อโปรแกรม

(Option เละความหมายบางอย่างอาจแตกต่างกัน ขึ้นอยู่กับว่าเป็น BSD-Style หรือ SYSV-Style)

แหล่งข้อมูลเพิ่มเติม : man ps

การ kill process

ในการ kill process เราสามารถกระทำได้โดยใช้คำสั่ง kill โดยในการ kill ตามปกติ process จะถูก kill ด้วยสัญญาณ SIGTERM (15)หรือสัญญาณที่บอกให้ process จบการทำงาน ทั้งนี้บ้าง process อาจจะมีการดักจักสัญญาณ kill ดังกล่าวไว้เพื่อไม่ให้ถูก kill ดังนั้นในหลายกรณี เราจึงต้อง kill process ด้วยสัญญาณ SIGKILL (9) จึงจะสามารถ kill process ได้จริง

โครงสร้างคำสั่ง

kill [ -s signal ] pid …
kill -l [ signal ]

โดย option ที่มักใช้กันใน kill คือ

pid … ใช้เพื่อระบุหมายเลข Process ที่ต้องการ kill

-l แสดงชื่อสัญญาณ kill ทั้งหมด

-s ระบุสัญญาณที่จะใช้ kill

เพื่อความสะดวกต่อการใช้งาน ในบางระบบบจึงได้มีการพัฒนาโปรแกรม killall เพื่อช่วยในการ kill process ทุกอันที่มีชื่อของ command ตรงกับชื่อที่ระบุ

โครงสร้างคำสั่ง

killall [ -egiqvw ] [ -signal ] name …
killall -l
killall -V

โดย option ที่มักใช้กันใน kill คือ

-e ชื่อ Command ของ Process จะต้องตรงกับที่ระบุ
-g kill กลุ่ม process แทนการ kill process
-i ยืนยันก่อนทำการ kill
-l แสดงสัญญาณการ kill ทั้งหมด
-q quiet; ไม่แสดงผลลัพธ์ใดๆ
-signal ระบุสัญญาณ kill อื่นๆที่ต้องการ
-v แสดงผลถ้า process kll เป็นผลสำเร็จ
-w รอจนกว่า Process จะตาย

ตัวอย่างการใช้งานคำสั่ง kill และ killall

$ kill -s SIGKILL 2288
  $ killall netscape-communicator

แหล่งข้อมูลเพิ่มเติม : man kill, man killall

การกำหนด/เปลี่ยน Priority ให้กับ Process

โดยปกติแล้ว Process ต่างๆ บน Unix จะถูกสร้างขึ้นโดยมีเลข Priority เดียวกันกับ Parent Process ซึ่งเราจะทราบหมายเลข Priority ดังกล่าวได้โดยการเรียกคำสั่ง nice แบบไม่ระบุ Parameter ซึ่งหากผู้ใช้ต้องการ Run Process ด้วยค่า Priority ที่สูงหรือต่ำกว่าค่าปกติแล้ว ผู้ใช้จะต้อง Run Process ผ่านคำสั่ง nice เสมอ (โดยปกติผู้ใช้ทั่วไปจะทำได้เพียงการ Run Process ด้วย Priority ที่ตำกว่าปกติเท่านั้น)

โครงสร้างคำสั่ง

nice [option]…

โดย option ที่มักใช้กันใน nice คือ

-n priority

อย่างไรก็ตามในหลายๆ กรณ๊ผู้ใช้อาจจะต้องการเปลี่ยนแปลงค่า Priopity หลังจากที่เรียกใช้งาน Process แล้ว การกระททำในลักษณะดังกล่าวสามารถทำได้โดยใช้คำสั่ง renice

โครงสร้างคำสั่ง

renice [option]…

โดย option ที่มักใช้กันใน renice คือ

-g ใช้เพื่อระบุว่ากลุ่ม Process

-u ใช้เพื่อระบบ Username

-p ใช้เพื่อระบุเลข Process (หากไม่ระบุจะถือว่าเป็น เลข Process เสมอ)

ตัวอย่างการใช้งานคำสั่ง nice และ renice

  $ nice -n +10 ls -al
  $ renice +1 987 -u daemon root -p 32

จากตัวอย่าง nice จะทำให้คำสั่ง ls -al จะทำงานโดยมี priority ตำลงกว่าปกติ 10 และ renice จะทำให้ Process ที่มี PID เป็น 987, 32 , และ Process ที่เป็นของ User daemon และ root มี Proity ต่ำลงกว่าเดิมอีก 1 ขั้น

แหล่งข้อมูลเพิ่มเติม : man nice และ man renice

การ Run Process แบบไม่ต้องมีหน้าจอด้วย nohup

โดยปกติหากผู้ใช้เรียกใช้งานโปรแกรมใดๆ ก็ตามหาก Process นั้นยังคงทำงานค้างอยู่ แต่ผู้ใช้ Logout จากระบบก่อนที่ Process จะประมวลผลเสร็จ Process ที่ทำงานค้างอยู่นั้นจะถูก kill โดยอัตโนมัติ เพราะระบบจะไม่ยอมให้ Process ทั่วไปทำงานได้โดยไม่มีหน้าจอ ด้วยเหตุนี้จึงมีการพัฒนาวิธีการที่จะ run process ที่มีความทนทานต่อการ hangup หรือสามารถทำงานต่อไปได้แม้ว่าผู้ใช้จะออกจากระบบไปแล้ว ซึ่งเราะจะเรียกการใช้งาน Process ในลักษณะนี้ว่า NOHUP

อย่างไรก็ตามโปรแกรมที่ Run แบบ NOHUP จะทำมีค่าความสำคัญ (Priority) ต่ำกว่าปกติอยู่ 5 เสมอ

โครงสร้างคำสั่ง

nohup COMMAND [ARG]…

ทั้งนี้หากไม่มีการ Redirection ผลลัพธ์แล้ว ผลลัพธ์จะแสดงออกมายังfile ชื่อ “nohup.out”

ตัวอย่างการใช้งานคำสั่ง nohup

  $ nohup sort mydata.txt > output.txt &

การจัดการ Process ด้วยโปรแกรม top

จากตัวอย่างการจัดการ Process ไม่ว่าจะเป็นการสร้าง , การเปลี่ยนค่า Priority และการ kill Process ที่กล่าวมา จะสังเกตได้ว่าการทำงานแต่อย่าง จะมีโปรแกรมที่แยกกันเป็นพิเศษเสมอ ด้วยเหตุนี้บางระบบจึงได้มีการพัฒนาโปรแกรมชื่อ top เพื่อเป็นตัวจัดการ Process ที่รวบรวมขุ้นอนย่อยทุกอย่างไว้ด้วยกัน

โครงสร้างคำสั่ง

top

โดยคำสั่งที่มักใช้กันใน top คือ

h – help

k – kill

r – renice

q – quit

หน้าจอของโปรแกรม top จะแสดงรายละเอียดต่างๆของ Process ซึ่งผู้ใช้สามารถที่จะเลือกรูปแบบการดูได้ และ สามารถจะ kill หรือ renice ได้ทันท ทั้งนี้รายละเอียดเพิ่มเติมให้กด h และดูจาก help ของโปรแกรม top ได้

เอกสารอ้างอิง

  • R. Thomas and J. Yates, “A USER GUIDE TO THE UNIX SYSTEM”, OSBORNE/McGRAW-HILL,2nd Edition,1987.
  • A. Silberschatz and P. Galvin, “Operating System Concepts” , 5th Edition , Addiso-Wesley Longman Inc., 1998
  • Unix man pages Document.

 

Comment1
สุดยอดดดด
From:ปิ๊กก้าดิว <pikadew< at >hotmail.com> Date: 2006-08-01 20:43:08

 

Comment2
Oh! very good idea
From:suwaphat <suwaphat_tar< at >hotmail.com> Date: 2006-12-03 05:02:01

 

Comment3
ถ้าเราต้องการ Protect process จากการ kill หรือ ต้องยืนยันก่อนมีการ kill จะสามารถทำอย่างไรได้บ้างครับ
From:พีพี <> Date: 2007-11-01 07:33:19

 

Comment4
หลงมาเจอจาก google ครับอาจารย์ – -” พอดีหาเรื่อง process อ่านทวนอยู่ ตอนนี้ฝึกงานอยู่ Throughwave ครับ ขอบคุณมากคร้าบบบบ
From:vinCP33 <> Date: 2009-03-18 09:48:31

 

Comment5
ผมคิดว่า โปรแกรมเราต้องมีการดักจับ signal นะครับ ถ้าเจอ kill signal ก็ให้ทำไรก็ว่าไป
From:chch <> Date: 2009-07-09 16:44:37

 

Leave a Reply

Your email address will not be published. Required fields are marked *

Connect with Facebook

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>