29 November 2013

เพิ่มประสิทธิภาพโปรแกรมด้วย Background Process

การใช้ GUI สมัยใหม่คงทำให้หลายคนลืมการใช้หน้าต่าง Command Line Interface (CLI) กันไปหมดแล้ว เพราะการใช้ GUI ที่มีการพัฒนาจากทุกๆระบบปฏิบัติการตลอดระยะเวลาหลายสิบปี เดี๋ยวนี้จนถึงระดับ Touch screen กับจอภาพที่บ้านแล้ว ซึ่งระบบปฏิบัติการแต่ละอันก็ทำหน้าที่บริหารการทำงานของโปรแกรมที่ต้องการการประมวลผลผ่าน CPU ดังนั้น ยิ่ง CPU เร็วเท่าไหร่ก็ย่อมจะดีไปมากเท่านั้น แต่ทุกวันนี้เราใช้ CPU ได้คุ้มหรือเปล่า

สำหรับการเขียนโปรแกรมแบบบ้านๆที่สร้างขึ้นคงไม่ได้มีความสามารถในการใช้ CPU ได้เต็มเม็ดเต็มหน่วยนัก เพราะ application พื้นฐานส่วนมากจะทำงานอยู่เพียง process เดียว ถ้าเป็น Windows ก็คงจะเป็นเรื่องง่ายหน่อย แค่ double click โปรแกรมขึ้นมาหลายๆหน้าจอเราก็จะได้โปรแกรมที่มีหลาย Process และสามารถใช้ CPU ได้มีประสิทธิภาพมากขึ้น

มีมิตรสหายร่วมชั้นเรียนท่านหนึ่งก็ได้สอบถามมาในประเด็นนี้ โดยโปรแกรมที่สร้างขึ้นมามีทั้งเขียนด้วย C++ และการใช้ Shell script บนระบบปฏิบัติการ Linux ซึ่งการทำงานในการ run แต่ละครั้งใช้เวลาเกือบ 30 นาที และ CPU ก็ใช้ได้ไม่เต็มที่ ก็เลยอยากทราบว่าจะใช้เครื่องมืออะไรที่จะทำให้ Process ทำงานได้แบบหลายๆ Core หรือทำงานพร้อมๆกันได้?

คำตอบผมคือไม่มีน่ะครับ เพราะการเขียนเพื่อให้โปรแกรมทำงานแบบหลาย Core ก็คงต้องออกแบบให้ตัว Application ทำงานเป็นหลาย Process ได้ (การ spawn thread ของตัวเอง) ซึงการเขียนก็คงไม่ง่ายนัก ดังนั้นการแก้ไขก็ประยุกต์แบบที่เรารู้จักการทำแบบระบบปฏิบัติการ Windows นั่นแหละ คือ หาวิธีเปิด Running process ให้ได้พร้อมๆกัน เลยแนะนำทางเลือกต่อไปนี้สำหรับผู้ใช้ Linux

1) Push to Background
การผลัก Running process ผม Command line ก็ใช้ปุ่ม ^Z (Ctrl + Z) ซึ่งตัว Shell จะผลักโปรแกรมไปเป็น background และหยุด execution เอาไว้ จากนั้นให้พิมพ์คำสั่ง "bg" เพื่อให้โปรแกรมที่พักไว้ทำงานในรูปแบบ background

2) Run as background
การสั่งให้ command ทำงานเป็น background ตั้งแต่แรก ทำง่ายๆแค่พิมพ์ & ตามหลังเข้าไปบนคำสั่งที่เรียก ระบบจะผลักไปเป็น background และทำการ execution ทันที
ตัวอย่างที่ผมชอบใช้คือตั้งเวลา reboot เครื่องเป็นครั้งคราวในอีก 10 นาทีข้างหน้า ก็แค่พิมพ์ (sleep 10m; shutdown -r 10)&

3) เปิด Terminal หลายๆอัน
สำหรับคนที่ควบคุมด้วย command ยาก การ remote เข้าไปที่เครื่องและเปิดหน้าจอ terminal ไว้หลายๆอัน ซึ่งแต่ละอันก็ run ไปคนละงาน แบบนี้ก็ใช้ได้เหมือนกัน

4) ใช้ Terminal ผ่าน Screen
การใช้ screen command เป็นการสร้าง terminal เสมือนอยู่บน shell เดิมที่ทำงานอยู่ การทำงานจะเหมือนกับเปิด terminal เยอะ แต่ไม่ต้องเปลี่ยน tty ในการทำงาน และเราจะกระโดดเข้าๆออกๆหน้าจอที่ทำด้วย screen มากเท่าไหร่ก็ได้
การเข้า screen พิมพ์คำสั่ง "screen" ธรรมดา
ออกจาก screen ใช้ ^AD
เข้าไปคืนใน screen ใช้คำสั่ง "screen -r <เลข pid ของ screen ที่ต้องการ>"
แสดงรายชื่อ screen ใช้คำสั่ง screen -list
แต่ข้อจำกัดของการทำ Background ถ้างานที่เกี่ยวกับ Disk access เป็นเรื่องที่ต้องระมัดระวัง เพราะถ้าทำงานเกี่ยวกับ Disk แล้ว การอ่านเขียนมากๆ จากหลาย Process จะเป็นการลดประสิทธิภาพเพราะเป็นการเพิ่ม Seek time ซึ่งอาจจะส่งผลเลวร้ายต่อระบบมากกว่าจะเป็นผลดี

ท้ายสุดนั่นเป็นเพราะความเร็วของ CPU มีข้อจำกัด การทำงานแบบ background process อาจจะทำให้งานแต่ต่อชิ้นใช้เวลาในการทำงานเสร็จช้าลงไปเล็กน้อย แต่เป็นการเพิ่มปริมาณผลลัพธ์ที่ออกมาพร้อมๆกันในหน่วยเวลาที่เท่าเดิม สิ่งที่ต้องเป็นห่วงก็มีแค่ระมัดระวังเรื่อง input และ output ในการเขียนข้อมูลผลลัพธ์บนไฟล์เท่านั้นเอง

Written by Tiwakorn Laophulsuk

No comments:

Post a Comment

Give a comment ...