รีวิว : Multitasking บน iPhone 4.0

by khajochi
2 May 2010 - 09:23

หลังจากที่แอปเปิลได้เปิดตัว iPhone OS4 เมื่อเดือนที่ผ่านมา ความสามารถใหม่ที่โดดเด่นที่สุดและเป็นสิ่งที่ผู้ใช้ไอโฟนรอคอยมานาน นั่นก็คือการทำ Multitasking นั่นเอง ซึ่งแอปเปิลได้คุยไว้ว่า วิธีการทำ Multitasking ในแบบไอโฟนนั้น ทั้งประหยัดแบตเตอรี่และไม่ทำให้เครื่องช้าลงแต่อย่างใด

หลังจากที่ผมได้ทำการศึกษา Multitasking ในแบบของแอปเปิลโดยละเอียดมากขึ้น ก็พบว่าแนวทางและวิธีการที่แอปเปิลเลือกใช้นั้น นอกจากจะมีเรื่องราวของที่มาที่ไป การแก้ปัญหาต่างๆ แล้ว ยังมีความน่าสนใจในเชิง Software Engineer อีกหลายๆ ด้านอีกด้วย

คำเตือน : บทความนี้เป็นบทความในเชิงเทคนิค

iPhone OS 1 - 3
ในปัจจุบัน เป็นที่รู้กันว่า โปรแกรมในไอโฟนนั้นไม่สามารถทำงานหลายตัวพร้อมกันได้ หากเราต้องการเปิดโปรแกรมหนึ่ง จะต้องทำการปิดอีกโปรแกรมหนึ่ง (ไม่นับโปรแกรมที่แอปเปิลเขียนเอง อย่างการเล่นเพลง หรือการรับสายโทรศัพท์)

  • โปรแกรมมีเพียง 2 State คือ Active กับ Not Running (เปิดกับปิด)
  • เมื่อเรากดเปิดโปรแกรม ข้อมูลทุกอย่างจะถูกเก็บอยู่ในแรม (Ram, Memory) เช่นเดียวกับโปรแกรมในคอมพิวเตอร์
  • หลังจากที่เรากดปุ่ม home โปรแกรมที่ถูกปิดจะมีเวลา 5 วินาที ในการเก็บข้อมูลต่างๆ ก่อนที่จะถูกโยนทิ้งออกไปจากแรม
  • ซึ่งโปรแกรมส่วนใหญ่ก็จะใช้เวลา 5 วินาทีนั้น save ข้อมูลที่จำเป็น เช่น เล่นเกมส์ถึงด่านไหนแล้ว หน้าจอตอนนี้อยู่ที่หน้าไหน หรือเราพิมพ์อะไรค้างไว้ล่าสุด
  • 5 วินาที นั้นเร็วมาก ดังนั้นไม่มีทางเลยที่จะเก็บข้่อมูลไปลง server เช่นถ้าเรา upload รูปใน flickr อยู่แล้วกดปิดโปรแกรม ระบบทุกอย่างก็จะปิดไปเลย
  • ถ้ากดเปิดโปรแกรมขึ้นมาใหม่ มันจะเริ่มโหลดโปรแกรมทุกอย่างตั้งแต่ต้น เพราะโปรแกรมถูกเอาออกจากแรมไปแล้ว
  • โปรแกรมที่เปิดเสร็จ ก็จะใช้ข้อมูลใน local database เพื่อจำว่าเราเล่นเกมส์มาถึงไหนแล้ว, พิมพ์อะไรค้างไว้รึเปล่า, ไฟล์ที่ upload เมื่อกี้ไม่สำเร็จนะ จะทำการ upload ใหม่หรือไม่

ตัวอย่างการจัดเก็บโปรแกรมในแรมของ iPhone OS 1-3

เนื่องจากระบบมี state ให้เพียงแค่ เปิดและปิด ทำให้เราสามารถใช้งานโปรแกรมได้เพียงแค่ 1 โปรแกรมเท่านั้น จึงเป็นจุดอ่อนสำคัญของไอโฟน เพราะนอกจากทำงานได้ทีละโปรแกรมแล้ว การเปิด-ปิดโปรแกรมใหม่ต้องใช้เวลาในการโหลดทุกอย่างตั้งแต่เริ่มต้นใหม่ทุกครั้ง ทำให้เสียเวลา

ปัจจุบันนักพัฒนาต้องเก็บข้อมูลบางส่วนใน local database

iPhone OS 4

Multitasking คือการที่เราสามารถใช้งานโปรแกรมหลายโปรแกรม ในเวลาเดียวกันได้ แต่มีข้อเสียหลายอย่าง คือมันจะทำให้เครื่องทำงานช้าลง และกินแบตเตอรี่ โดยปกติแล้วเราไม่ค่อยเจอปัญหานี้เวลาใช้คอมพิวเตอร์เพราะเสียบปลั๊กไฟไว้ตลอดเวลา แต่บนโทรศัพท์มือถือที่แบตเตอรี่น้อย นี่คือปัญหาใหญ่

เนื่องจากแอปเปิลเป็นบริษัทที่ออกจะยึดติดกับประสบการณ์ของผู้ใช้มากเป็นพิเศษ (อะไรก็ตามที่สตีฟ จ๊อบส์ใช้แล้วรู้สึกหงุดหงิด จะต้องปรับปรุงด่วน) แอปเปิลจึงเลี่ยงวิธีทำ multitasking แบบทั่วไปที่ให้โปรแกรมทำงานได้เต็มที่ทั้งหมด 100% มาเป็นจำกัดให้โปรแกรมทำงานได้แค่บางอย่างเท่านั้น

โปรแกรมแช่แข็ง

จะขออธิบายการทำงานแบบใหม่ของ iPhone OS4 อย่างง่ายดังนี้

  • เมื่อผู้ใช้ปิดโปรแกรม ข้อมูลทั้งหมดของโปรแกรมจะยังคงเก็บเอาไว้ในแรม ไม่ลบออกทั้งหมดแบบแต่ก่อน
  • โปรแกรมที่ถูกเก็บอยู่ในแรม จะไม่สามารถทำงานอะไรได้เลย เรียกอีกอย่างว่าถูกแช่แข็ง
  • ทีนี้ถ้าเรากดเปิดโปรแกรมอีกครั้ง โปรแกรมก็จะทำงานต่อได้เลย เพราะโปรแกรมยังอยู่ในแรม ทำให้ไม่ต้องเสียเวลาโหลดทุกอย่างเข้ามาในแรมตอนเปิดโปรแกรมเหมือนสมัยก่อน
  • แน่นอนว่าแรมมีจำนวนจำกัด เพราะงั้นเมื่อแรมที่มีอยู่ใกล้จะเต็ม โปรแกรมที่อยู่ในแรมมานานที่สุดจะถูกโยนออกจากแรมโดยอัตโนมัติ (ลักษณะคล้ายกับ Garbage Collection ในจาวา)
  • ถ้าเราเปิดโปรแกรมที่ถูกโยนออกไปจากแรมแล้ว โปรแกรมนั้นจะต้องโหลดใหม่ตั้งแต่แรกเหมือนสมัยก่อน
  • โปรแกรมที่ถูกแช่แข็ง แอปเปิลจะยอมให้ทำงานได้แค่ 7 อย่างที่แอปเปิลกำหนดไว้เท่านั้น
  • เมื่อทำงานที่กำหนดไว้เสร็จ โปรแกรมก็จะถูกแช่แข็งโดยสมบูรณ์ ไม่สามารถทำงานอะไรได้อีก

วิธีแช่แข็งโปรแกรมนี้ ทำให้การทำงานของ cpu และการใช้แบตเตอรี่แทบจะเป็นศูนย์ ซึ่งการจะทำวิธีแบบนี้ได้นั้นจะต้องมีอุปกรณ์ที่มีขนาดของแรมมากพอ จึงเป็นสาเหตุที่แอปเปิลต้องยอมตัด multitasking ออกจากไอโฟน 3G (ไอโฟนรุ่น 3G มีแรม 128 MB ส่วนรุ่น 3GS มีแรม 256 MB)

Multitasking

เรามาดูรายละเอียดที่ลึกขึ้นจากเดิม ว่าการทำงาน Multitasking แบบไอโฟนนั้นทำงานอย่างไร

  • จากเดิมที่โปรแกรมมี State เพียงแค่เปิดกับปิด
  • เพิ่ม State ใหม่เข้ามา 2 ตัว คือ Background และ Suspended
  • Background คือโปรแกรมยังอยู่ในแรม ทำงานได้เพียงบริการบางอย่างที่แอปเปิลกำหนด
  • Suspended คือโปรแกรมยังอยู่ในแรม แต่ไม่สามารถทำงานใดๆ ได้อีก (ถูกแช่แข็ง)
  • ถ้าไล่ State จากการกดปิดโปรแกรมที่ทำงานอยู่ จะมี State ดังนี้ : Active -> Background -> Suspended -> Not Running
  • ขั้นแรก เมื่อผู้ใช้ทำการปิดโปรแกรม (กดปุ่ม home) โปรแกรมจะย้ายจาก Active ไปอยู่ใน Background State
  • ใน Background State จะมีบริการให้ใช้อยู่ 7 อย่าง เช่น เล่นเพลง, คุยโทรศัพท์ผ่าน VoIP, เรียกขอที่อยู่ในปัจจุบัน (GPS), ทำงานย่อยอย่าง save ไฟล์ หรือ upload รูปให้เสร็จ
  • เมื่อโปรแกรมทำงานเหล่านี้จนเสร็จแล้ว โปรแกรมจะถูกย้ายไปอยู่ใน Suspended State
  • โปรแกรมที่อยู่ใน Suspended State นั้น พร้อมที่จะถูกเปิดอยู่ตลอดเวลา
  • โปรแกรมจะอยู่ใน Suspended State ไปจนกว่าระบบจะเข้ามาลบไปเอง เช่น แรมใกล้เต็ม หรือโปรแกรมนี้ถูกปิดมานานมากแล้ว
  • ที่เก๋คือ เวลาเรากดปิดโปรแกรม ระบบจะ Capture หน้าจอโปรแกรมของเราไว้ เพื่อเวลาเราเปิดโปรแกรมขึ้นมาอีกครั้ง ระบบจะแสดงรูปดังกล่าวเพื่อหลอกตาผู้ใช้ชั่วคราวระหว่างที่รอการประมวลผลเบื้องหลัง หรืออาจจะทำเป็นหน้าจอนับถอยหลัง 3 2 1 แบบเกมส์ Tap Tap Revenge ที่จ๊อบส์เดโมก็ได้ครับ

ตัวอย่าง State และข้อมูลในแรมของ iPhone OS 4

เพื่อให้เห็นภาพมากขึ้น ขอยกตัวอย่างโปรแกรมฟังเพลงบนอินเทอร์เน็ตอย่าง Pandora เมื่อเราเปิดฟังเพลงอยู่แล้วกดปิดโปรแกรมลง ระบบจะเปลี่ยนสถานะเข้าไปอยู่ใน Background State และร้องขอใช้บริการ Background Audio Service ทำให้โปรแกรมยังคงเล่นเพลงได้ต่อไป แต่จะไม่สามารถทำงานอย่างอื่นได้เลย เช่นถ้าเพลงเปลี่ยนไป จะไม่มีการเปลี่ยนรูปอัลบั้ม

เมื่อเรากดหยุดเล่นเพลง หรือเพลงเล่นจนหมด playlist โปรแกรมจะถูกย้ายไปอยู่ Suspended State ซึ่งจะโดนแช่แข็งไปอย่างงั้น จนกว่าระบบจะเข้ามาเคลียร์ออกจากแรมเอง

ข้อควรรู้

  • เราไม่สามารถสั่งปิดโปรแกรมที่อยู่ใน Suspended State เองได้ ถ้าจะให้เรียกง่ายๆ ก็คือไม่มี task manager ในไอโฟนนั่นเอง
  • การที่แอปเปิลไม่อนุญาตให้โปรแกรมที่ถูกแช่แข็งทำงานอะไรได้เลย ทำให้มีปัญหาอีกร้อยแปดตามมา เช่น ถ้าเราปิดโปรแกรมตอนเครื่องวางในแนวตั้ง แต่เปิดโปรแกรมอีกครั้งในแนวนอน ระบบควรแสดงผลอย่างไร ? หรือถ้าเราเข้าไปเปลี่ยนภาษาของเครื่อง, แก้ setting บางอย่างของโปรแกรม เราจะจัดการกับเรื่องนี้อย่างไร ?
  • แอปเปิลแก้ปัญหาเหล่านี้ ด้วยการที่ระบบจะจำสภาพแวดล้อมต่างๆ ในจังหวะที่โปรแกรมถูกปิด และจะส่งเข้ามาให้ตอนโปรแกรมถูกเปิด เช่น วางเครื่องแนวตั้ง แนวนอน, ภาษา, วันเวลา รวมถึงค่า setting ต่างๆ
  • โปรแกรมที่ไปอยู่ใน Background State แล้วดันเขียนโค้ดเพื่อไปเรียกสิ่งที่ไม่ควรเรียก อย่างเช่น สั่งแสดงภาพ 3 มิติด้วย OpenGL โปรแกรมนั้นจะถูกระบบสั่งปิดแบบถาวรโดยอัตโนมัติ
  • โปรแกรมที่ทำงานแบบ Background State นานเกินไป ก็จะถูกปิดแบบถาวรโดยอัตโนมัติเช่นกัน

โดยสรุปแล้ว คนที่จะเหนื่อยที่สุดคือโปรแกรมเมอร์ทั้งหลาย ที่จะต้องคำนึงถึงเรื่องสถานะการเปิดปิดของโปรแกรมเพิ่มเติม แต่ถ้าโปรแกรมไหนที่ไม่ต้องการใช้ Background Service เหล่านี้ ก็สามารถเขียนโปรแกรมให้มีแค่เปิด-ปิดแบบดั้งเดิมได้ โดยไม่ต้องแก้โค้ดเดิมแต่อย่างใด

สรุป

ส่วนตัวแล้วผมรู้สึกชื่นชมกับการเลือกเส้นทางนี้ของแอปเปิลมาก ที่ยอมให้คนเขียนโปรแกรมเหนื่อยเพิ่ม แต่ผู้ใช้ได้ประโยชน์ไปเต็มๆ สิ่งที่น่าห่วงคือแอปเปิลจะต้องทำงานอย่างหนักในการทำความเข้าใจกับนักพัฒนา และต้องดูแลการจัดการโปรแกรมที่ไม่ใช้ทั้งหลายให้ดี เชื่อว่าแอปเปิลคงจะต้องเพิ่มขนาดของแรมในไอโฟนให้มากขึ้น และเพิ่มจำนวน background service ในอนาคต

คงต้องใช้เวลาสักพักเพื่อพิสูจน์ว่า แนวทาง Multitasking แบบแอปเปิล กับผู้ผลิตโทรศัพท์มือถือรายอื่นๆ ใครจะเป็นผู้ชนะที่แท้จริง

ที่มา - Khajochi's Blog

Blognone Jobs Premium