- เพจคือหน่วยขั้นต่ำที่ระบบปฏิบัติการใช้จัดการหน่วยความจำ
- CPU ส่วนใหญ่รองรับขนาดเพจ 4 KB และ Android OS กับแอปพลิเคชันต่าง ๆ ก็ถูกปรับแต่งให้เหมาะกับขนาดเพจ 4 KB
- CPU ของ ARM รองรับขนาดเพจ 16 KB และเมื่อ Android ใช้ขนาดนี้ ประสิทธิภาพจะดีขึ้น 5-10% ขณะที่การใช้หน่วยความจำเพิ่มขึ้นราว 9%
- เพื่อปรับปรุงประสิทธิภาพของระบบปฏิบัติการโดยรวม และเปิดให้ผู้ผลิตอุปกรณ์เลือก trade-off นี้ได้ Android 15 จึงสามารถทำงานด้วยขนาดเพจ 4 KB หรือ 16 KB ได้
- ระบบ Android ชุดแรกที่รองรับขนาดเพจ 16 KB จะเปิดให้ใช้งานผ่านตัวเลือกนักพัฒนาบนอุปกรณ์บางรุ่น
รายละเอียดทางเทคนิคของขนาดเพจ 16KB
- CPU ส่วนใหญ่มีฮาร์ดแวร์เฉพาะที่เรียกว่า memory management unit (MMU) สำหรับแปลงที่อยู่ที่โปรแกรมกำลังใช้งานให้เป็นตำแหน่งจริงในหน่วยความจำ
- การแปลงนี้ทำเป็นหน่วยตามขนาดเพจ
- ทุกครั้งที่โปรแกรมต้องการหน่วยความจำเพิ่ม ระบบปฏิบัติการต้องเข้ามาเติมรายการใน "page table" และจัดสรรชิ้นส่วนหน่วยความจำนั้นให้กับโปรเซส
- เมื่อขนาดเพจใหญ่ขึ้น 4 เท่า งานดูแลตารางเหล่านี้ก็ลดลง 4 เท่า
- ดังนั้นระบบจึงสามารถใช้เวลากับการทำให้วิดีโอดูดี เล่นเกมได้ลื่น และรันแอปได้ราบรื่นมากขึ้น ขณะที่ใช้เวลากับงานเอกสารระดับล่างของระบบปฏิบัติการน้อยลง
- ขนาดเพจไม่ใช่ Application Binary Interface (ABI)
- นั่นหมายความว่า หากแก้ไขแอปพลิเคชันให้ไม่ยึดติดกับขนาดเพจ แอปไบนารีตัวเดียวกันก็สามารถรันได้ทั้งบนอุปกรณ์ 4KB และ 16KB
- ใน Android 15 มีการรีแฟกเตอร์ Android ใหม่ตั้งแต่ต้นให้สามารถทำงานได้กับหลายขนาดเพจ และไม่ผูกติดกับขนาดเพจอีกต่อไป
การเปลี่ยนแปลงหลักใน OS
- อุปกรณ์ที่ใช้ Android 15:
- มาโคร
PAGE_SIZE ที่กำหนดตอนคอมไพล์ถูกแทนที่ด้วย getpagesize(2) ที่เรียกตอนรันไทม์
- ไบนารีทั้งหมดของ OS ถูกจัดแนวเป็น 16 KB (แอปพลิเคชัน/ไลบรารีจากบุคคลที่สามอาจไม่ได้จัดแนว 16KB)
- ไบนารีทั้งหมดของ OS ถูกสร้างให้มีเซกเมนต์ที่โหลดได้แยกต่างหาก เพื่อให้อ่านพื้นที่หน่วยความจำทั้งหมดที่แมปเข้ากับโปรเซสได้ ซึ่งบางแอปพลิเคชันพึ่งพาพฤติกรรมนี้
- มีการเขียนคอมโพเนนต์หลายส่วนของ OS ใหม่ เพื่อไม่ให้สมมติขนาดเพจตายตัวและให้เหมาะกับขนาดเพจที่ใหญ่ขึ้น
ระบบไฟล์
- เพื่อให้ได้ประสิทธิภาพที่ดี ขนาดบล็อกของระบบไฟล์ควรตรงกับขนาดเพจ โดยระบบไฟล์ EROFS และ F2FS รวมถึงชั้นสตอเรจ UFS รองรับ 16KB แล้ว
- บนระบบ 4KB ขนาดไฟล์ปฏิบัติการ ELF จะเพิ่มขึ้นเพราะ padding ที่เพิ่มมาเพื่อให้จัดแนว 16KB แต่มีการปรับแต่งหลายอย่างเพื่อลดต้นทุนนี้
- ระบบไฟล์แบบ sparse และอ่านอย่างเดียวทำให้หน้า 0 ที่ถูกสร้างขึ้นเพื่อรองรับ padding เพิ่มเติมสำหรับการจัดแนว 16KB ไม่ถูกเขียนลงดิสก์
- ระบบไฟล์ที่อ่าน/เขียนได้จะจัดการหน้า 0 เป็นกรณี ๆ ไป
การจัดการหน่วยความจำ
- มีการปรับ Linux page cache เพื่อไม่ให้ pre-read พื้นที่ padding ส่วนเกินเหล่านี้ ช่วยประหยัดการโหลดหน่วยความจำที่ไม่จำเป็น
- เพจเหล่านี้เป็น padding ว่าง และโปรแกรมจะไม่อ่านมันเลย เป็นเพียงพื้นที่ที่อยู่ระหว่างส่วนที่ใช้งานได้ของโปรแกรมเพื่อจุดประสงค์ด้านการจัดแนวเท่านั้น
Linux kernel
- Linux kernel ผูกกับขนาดเพจที่เลือกไว้อย่างลึกซึ้ง ดังนั้นตอน build kernel จึงต้องเลือกขนาดเพจที่จะใช้ ส่วนที่เหลือของระบบปฏิบัติการยังคงเหมือนเดิม
แอปพลิเคชัน Android
- แอปพลิเคชันใดก็ตามที่มี native code หรือมี dependency ที่เกี่ยวข้อง จะต้องคอมไพล์ใหม่เพื่อให้เข้ากันได้กับอุปกรณ์ที่ใช้ขนาดเพจ 16KB
- เนื่องจาก native code ในแอป Android และ SDK ส่วนใหญ่ถูก build โดยคำนึงถึงขนาดเพจ 4KB จึงต้องจัดแนวใหม่เป็น 16KB เพื่อให้ไบนารีใช้งานได้ทั้งบนอุปกรณ์ 4KB และ 16KB
- สำหรับแอปและ SDK ส่วนใหญ่ กระบวนการนี้มี 2 ขั้นตอน:
- build native code ใหม่โดยจัดแนวเป็น 16KB
- หากมีการสมมติค่าขนาดเพจแบบฮาร์ดโค้ด ให้ทดสอบบนอุปกรณ์/อีมูเลเตอร์ 16KB และแก้ไข
การพัฒนาอุปกรณ์ 16 KB
- อุปกรณ์ Android ที่วางจำหน่ายอยู่ในปัจจุบันยังไม่รองรับขนาดเพจ 16 KB
- เพื่อแก้ปัญหานี้ Google กำลังทำงานร่วมกับพาร์ตเนอร์เพื่อเปิดให้ใช้งานตัวเลือกนักพัฒนาบนอุปกรณ์ที่มีอยู่แล้ว
- จะมีการเปิดรองรับขนาดเพจ 16 KB ผ่านตัวเลือกนักพัฒนา
- สามารถใช้ target อีมูเลเตอร์ 16 KB ใน Android Studio ได้
ตัวเลือกนักพัฒนา 16 KB
- ใน Android 15 มีการเพิ่มตัวเลือกนักพัฒนาที่สลับระหว่างขนาดเพจ 16 KB และ 4 KB ได้
- ใช้งานได้บน Pixel 8 และ Pixel 8 Pro และมีแผนรองรับอุปกรณ์เพิ่มเติม
- หากต้องการใช้ตัวเลือกนักพัฒนา ต้องรีเซ็ตอุปกรณ์และปลดล็อก bootloader
16 KB บนเดสก์ท็อป x86_64
- สามารถจำลองขนาดเพจ 16 KB ได้บน อีมูเลเตอร์ x86_64
- ดาวน์โหลดและรันอีมูเลเตอร์เพจ 16 KB ได้จาก Android Studio SDK Manager
อนาคต
- Android 15 และ AOSP รองรับเพจ 16 KB แล้ว และสามารถเปิดใช้งานได้ผ่านตัวเลือกนักพัฒนา
- คาดหวังว่านักพัฒนาแอปและ SDK จะใช้ตัวเลือกนี้เพื่อเตรียมความพร้อมสำหรับอุปกรณ์ Android ที่มีประสิทธิภาพและความคุ้มค่าสูงขึ้น
ความเห็นของ GN⁺
- การเปลี่ยนไปใช้ขนาดเพจ 16KB เป็นการเปลี่ยนแปลงสำคัญเพื่อยกระดับประสิทธิภาพและความคุ้มค่าของอุปกรณ์ Android
- การใช้ขนาดเพจที่ใหญ่ขึ้นช่วยลด overhead ของการจัดการหน่วยความจำ และอาจช่วยให้ประสิทธิภาพโดยรวมของระบบดีขึ้น
- อย่างไรก็ตาม การเปลี่ยนแปลงนี้อาจก่อให้เกิดปัญหาความเข้ากันได้ โดยเฉพาะกับแอปและ SDK ที่พึ่งพา native code ดังนั้นนักพัฒนาจึงควรอัปเดตซอฟต์แวร์โดยคำนึงถึงขนาดเพจ 16KB
- Google กำลังมอบเครื่องมือให้นักพัฒนาทดสอบและเตรียมพร้อมสำหรับการเปลี่ยนผ่านนี้ ผ่านตัวเลือกนักพัฒนา 16KB และการรองรับอีมูเลเตอร์
- ปัจจุบันเพจ 16KB ใช้กับอุปกรณ์ Android ที่ใช้ ARM เท่านั้น แต่ในอนาคตมีโอกาสขยายไปยังแพลตฟอร์มฮาร์ดแวร์อื่นได้
- นอกเหนือจากการปรับแอปและ SDK ให้เข้ากับขนาดเพจ 16KB แล้ว นักพัฒนายังควรคำนึงถึงผลกระทบของขนาดเพจที่ใหญ่ขึ้นต่อการใช้หน่วยความจำ และทำ memory optimization หากจำเป็น
- การเปลี่ยนผ่านสู่เพจ 16KB เป็นความพยายามสำคัญที่ต้องอาศัยความร่วมมือจากทั้งระบบนิเวศ Android แต่ท้ายที่สุดจะมอบประสิทธิภาพและความคุ้มค่าที่ดีกว่าให้ผู้ใช้
2 ความคิดเห็น
ความเห็นจาก Hacker News
เมื่อไม่นานมานี้ Debian kernel ได้เริ่มงานคอมไพล์ ARM64 kernel ด้วยขนาดเพจ 16KiB
ระบบ Android ตัวแรกที่รองรับ 16KB จะเปิดให้ใช้บนอุปกรณ์บางรุ่นผ่านตัวเลือกสำหรับนักพัฒนา
สงสัยว่าเมื่อใดที่แอปพลิเคชันจะไม่เป็นอิสระจากขนาดเพจ
การใช้ค่าเริ่มต้นเป็น 16KB โดยไม่รองรับโปรเซส 4KB และ 16KB พร้อมกันเป็นปัญหา
iOS ใช้เพจ 16KB มาตั้งแต่เปลี่ยนผ่านไปสู่ 64 บิต
RHEL เคยลองใช้เพจ 64KB บน AARCH64 ในอดีต แต่สุดท้ายต้องย้อนกลับเพราะบั๊กจำนวนมาก
สงสัยว่า Asahi ได้ช่วยงานฝั่งเคอร์เนลและอีโคซิสเต็มสำหรับการเปิดใช้เพจ 16KB มากแค่ไหน
iOS ใช้เพจ 16K มานานแล้ว
สงสัยว่าการเพิ่มขนาดเพจจะส่งผลลบต่อประสิทธิภาพ I/O หรืออายุการใช้งานแฟลชหรือไม่
มีการวัดพบว่าประสิทธิภาพดีขึ้น
การเพิ่มประสิทธิภาพ 5-10% ดูเป็นตัวเลขที่มาก