เชื่อหรือไม่ว่าเครื่องคอมพิวเตอร์บนยาน Apollo 11 หรือ Apollo Guidance Computer (AGC) ที่พามนุษย์กลุ่มแรกเหยียบลงไปบนดวงจันทร์นั้นใช้ RAM แค่เพียง 4 kB และ ROM หรือหน่วยความจำเพียง 72 kB เท่านั้น แต่ปัจจุบัน แค่เราจะลง OS และเปิดใช้งาน Google Chrome แค่เข้าเว็บไซต์กลับต้องใช้ RAM 4 GB และ ROM มากถึง 120 GB วันนี้ SUM UP จะพามาย้อนหาเหตุผลว่าทำไม RAM แค่ 4 kB ถึงพาเราไปดวงจันทร์ได้ ซึ่งเป็นการทำงานประมวลผลที่ค่อนข้างยาก ในขณะแค่จะเข้าดูเว็บไซต์กลับใช้ RAM มากมายมหาศาล มีอะไรซ่อนอยู่เบื้องหลัง เดี๋ยวค่อย ๆ ไปหาคำตอบพร้อม ๆ กัน
คอมพิวเตอร์ต้องทำอะไรได้มากกว่าการพายานลงจอดบนดวงจันทร์
จุดประสงค์ของการใช้งาน AGC คือทำหน้าที่เพียงอย่างเดียว นั่นก็คือการพายานลงจอดบนดวงจันทร์ให้ได้ แต่เครื่องคอมพิวเตอร์ที่เราใช้งานกันอยู่ในทุกวันนี้มันต้องทำได้มากกว่านั้น ตั้งแต่การเปิดเครื่อง แสดงผลหน้าตาแบบกราฟิก (GUI) เพื่อให้เราสามารถใช้เมาส์ลากไปเปิดโปรแกรม และยังต้องรองรับการติดตั้งและจัดการโปรแกรมที่เราติดตั้งลงไปอีก
ด้วยจุดประสงค์ที่มันกว้างมากกว่าเดิม ทำให้นักคอมพิวเตอร์จะต้องออกแบบระบบและโปรแกรมต่าง ๆ เพื่อให้รองรับกับความอเนกประสงค์นั้นได้ เกิดความซับซ้อนในการออกแบบมากขึ้น แน่นอนว่าย่อมทำให้จำเป็นต้องใช้หน่วยความจำในการทำงานมากขึ้นกว่าเดิมอย่างแน่นอน ตัวอย่างเช่น เราออกแบบระบบสำหรับการอ่านค่าจาก Sensor วัดอุณหภูมิ จากเดิม เราอาจจะต้องใช้ RAM สัก 2 kB สำหรับการเปิดระบบขึ้นมาและโหลดโปรแกรมสำหรับการอ่านค่าจาก Sensor เข้ามา รวมไปถึงการเก็บค่าของอุณหภูมิที่อ่านเข้ามา แต่พอเราบอกว่า มันต้องทำได้มากกว่านี้ มันต้องอ่านค่าจาก Sensor แล้วส่งอุณหภูมิที่อ่านได้กลับไปบน Server ด้วย มันก็ต้องมีโปรแกรมเพิ่มเติมสำหรับความต้องการที่เราเพิ่มเข้าไป ทำให้เราก็จะต้องใช้ Memory เพิ่มมากขึ้นนั่นเอง นี่เป็นตัวอย่างที่มีขนาดเล็กมาก ๆ เทียบได้กับจุดเริ่มต้นของเครื่องคอมพิวเตอร์
แต่ในปัจจุบัน เครื่องคอมพิวเตอร์มีความต้องการยิ่งกว่านั้นมาก ๆ จนทำให้เกิดเป็นระบบปฏิบัติการ (OS) ขึ้นมา ทำหน้าที่เป็นคนกลางระหว่าง Hardware และ Software ต่าง ๆ ที่จะเอามารัน จากเดิม ที่เราอาจจะเขียนโปรแกรมสักตัวหนึ่งเพื่อเข้าควบคุม Hardware ต่าง ๆ โดยตรง เราพยายาม Abstract ส่วนของการควบคุม Hardware ออกไปด้วย OS ซึ่งแน่นอนว่า OS เองก็ต้องใช้ RAM ในการทำงานด้วย ทำให้เราก็จะต้องใช้ RAM มากขึ้นในการทำงาน นี่ยังไม่นับว่าจริง ๆ OS สมัยใหม่ก็ไม่ได้ควบคุม Hardware ตรง ๆ ด้วยซ้ำ มันยังมี Software อีกหลาย ๆ ตัวที่อยู่เป็นเบื้องหลังลึกลงไปอีกเยอะแยะมากมาย
ภาษาโปรแกรมสมัยใหม่เน้นความง่ายในการทำงานมากขึ้น
นอกจากนั้น ภาษาโปรแกรมสมัยใหม่ ยังเอื้อให้นักพัฒนาหรือโปรแกรมเมอร์สามารถทำงานได้ง่ายขึ้นกว่าเดิมมาก ๆ แต่แลกมากับการกิน RAM ที่สูงขึ้น ตัวอย่างเช่น ในภาษาโปรแกรมระดับล่าง (Low-Level Language) มาก ๆ เช่น Assembly และ C เวลาที่โปรแกรมเมอร์ต้องการเก็บข้อมูลลงบน RAM จะต้องมีการจองหน่วยความจำ เช่น เราจะใช้ RAM 1 kB ก็จะต้องเขียนบอกไปว่า เราจะใช้ขนาดเท่านี้ ตรงนี้นะ แล้วต้องมานั่งจัดสรรเองว่า ใน 1 kB นี้เราจะเอามาทำอะไรตรงไหนบ้าง เหมือนเราได้เค้กก้อนใหญ่มา แล้วต้องมานั่งแบ่งสัดส่วนกันเอาเอง ใช้งานเสร็จก็ต้องมานั่งคืนกลับไปอีก บอกเลยว่าเป็นงานที่น่าปวดหัวมาก ๆ โดยเฉพาะโปรแกรมสมัยใหม่ที่มีความต้องการมากขึ้น ซึ่งแน่นอนว่าพวกขั้นตอนของการจองหน่วยความจำนี้ก็ยังมีการใช้กันอยู่มาจนถึงปัจจุบัน และแน่นอนอีกว่าก็จะมีเหตุการณ์ที่จองแล้วลืมคืน จนทำให้เกิดอาการที่เรียกว่า Memory Leak ภาพที่จะเห็นก็คือ โปรแกรมสักตัวหนึ่งใช้ RAM เยอะขึ้นเรื่อย ๆ ถึงแม้ว่าเราจะยังไม่ได้ทำอะไรเพิ่มเติมเลย เพียงแค่เปิดโปรแกรมทิ้งเอาไว้เท่านั้น
ด้วยความยุ่งยากในการจัดการหน่วยความจำ ภาษาใหม่ ๆ ที่มีการพัฒนาขึ้นมาอีกหน่อยเลยบอกว่า ในเมื่อปล่อยให้คนจัดการจะมีโอกาสที่จะพลาดได้เยอะมาก งั้นลองทำระบบอีกตัวขึ้นมาเพื่อจัดการให้ดีกว่าไหม เรื่องมันก็เริ่มจะคุ้น ๆ ละ คือ เราจำเป็นต้องมีโปรแกรมหรือส่วนใดส่วนหนึ่งของเครื่องที่มาคอยจัดการให้กับเรา สิ่งที่เขาทำคือ แทนที่จะเอา Memory ก้อน ๆ หนึ่งมาจัดการเอง หน้าที่ของโปรแกรมเมอร์คือ แค่บอกว่าเราจะเก็บข้อมูลอะไร ประเภทไหนลงบน RAM บ้าง ไม่ต้องมานั่งแบ่งเค้กเอง และเมื่อโปรแกรมทำงานจบหรือพ้นส่วนที่กำหนดไว้แล้ว มันก็จะทำการคืน Memory ที่เรากำหนดไว้ภายในโปรแกรมกลับคืนให้เอง
ซึ่งการที่เครื่องจะรู้ว่าใครขอยืมส่วนไหนเพื่อที่จบโปรแกรมจะได้คืนกลับมาได้ ก็ต้องมีสิ่งที่เป็นเหมือนบัญชีหนังสุนัขว่า ใครจองอะไรเอาไว้ โดยบัญชีที่ว่านี้จะเก็บข้อมูลเอาไว้ที่ไหนได้อีกนอกจาก RAM อีกเหมือนเดิม นี่คือตัวอย่างของกลไกที่ภาษาโปรแกรมสมัยใหม่เสริมเข้ามา เพื่อทำให้คุณภาพชีวิตของคนที่เขียนโปรแกรมภาษานั้นสะดวกสบายมากขึ้น และลดข้อผิดพลาดที่อาจจะเกิดขึ้นได้นั่นเอง
คอมพิวเตอร์ต้องปลอดภัยด้วย
AGC อาจจะไม่จำเป็นต้องออกแบบมาเพื่อป้องกันตัวเองจากการโจมตีผ่านเครือข่ายได้แน่นหนามาก แต่กลับกัน เครื่องคอมพิวเตอร์ที่เราใช้งานนั้นจำเป็นต้องออกแบบมาเพื่อให้มีความปลอดภัยจากการถูกโจมตีได้ด้วย ทำให้จำเป็นต้องมีการเขียนระบบต่าง ๆ เพิ่มลงไปเพื่อให้เราปลอดภัยยิ่งกว่าเดิม ตัวอย่างหนึ่งของการเสริมความปลอดภัยที่เกี่ยวข้องกับการเพิ่มปริมาณการใช้ Memory โดยตรงนั่นก็คือ Virtual Address Space (VAS)
เมื่อก่อนโปรแกรมต่าง ๆ เวลาที่มีการจอง RAM สำหรับการเก็บข้อมูล สิ่งที่ OS ตอบกลับมาคือ ที่อยู่จริง ๆ ของส่วนที่ OS จัดสรรมาให้มีการทำงานที่ค่อนข้างตรงไปตรงมา หากโปรแกรมต้องการเขียน แค่บอก OS ว่า ต้องการเขียนค่านี้ลงบน RAM ที่ที่อยู่นี้ ๆ นะ หรือกลับกัน การอ่านก็เหมือนกัน ปัญหาจะไม่เกิดเลยเมื่อโปรแกรมทุกตัวเข้าถึง RAM บริเวณที่ได้รับการจัดสรรเท่านั้น ไม่ได้ไปยุ่งเรื่องชาวบ้าน ใช่แล้ว เพราะก็จะมีโปรแกรมบางตัวที่ออกแบบมาเพื่อให้ไปยุ่งกับโปรแกรมอื่น ๆ ที่กำลังทำงานใน OS ด้วยเช่นกัน ตัวอย่างที่เด็กยุค 90s น่าจะต้องผ่านกันมาเป็นอย่างดีคือ Cheat Engine หรือโปรแกรมโกงสารพัดประโยชน์นั่นเอง วิธีการทำงานของเจ้าโปรแกรมนี้คือ พวกเกม หรือโปรแกรมต่าง ๆ จะต้องเก็บค่า State หรือสถานะเช่นของตัวละครเอาไว้ใน Memory แน่ ๆ งั้นก็อ่านดูสิว่ามันอยู่ตรงไหน พอรู้แล้วว่ามันอยู่บริเวณไหน ก็แค่แก้ค่าในที่อยู่นั้น เมื่อเกมกลับมาอ่านค่าอีกรอบ มันก็จะอ้าว เป็นค่านี้ที่เรากำหนดลงไปเหรอ ได้สิ แล้วก็เปลี่ยนเป็นค่าที่เรากำหนดลงไปเลย
ความพีคคือ เราไม่ได้ใช้ท่านี้กับแค่การโกงเกม เรายังใช้มันเป็นช่องโหว่ในการโจมตี เช่น โปรแกรมหนึ่งต้องมีการยืนยันตัวตนก่อนการเข้าใช้งาน เขาอาจจะมีการเก็บ Flag 1 และ 0 สำหรับสถานะ ยืนยันตัวตนผ่าน และยังไม่ยืนยันตัวตน ตามลำดับ ด้วยการทำงานลักษณะนี้ งั้นเราก็ใช้โปรแกรมเดียวกับที่โกงเกมนี่แหละ หาว่า Flag ที่ว่านี้มันอยู่ตรงไหน หน้าตาเป็นยังไง แล้วก็เปลี่ยนไปเป็นค่าที่เหมือน 1 หรือก็คือยืนยันตัวตนผ่านแล้ว เมื่อเปลี่ยนไป โปรแกรมก็จะเข้าใจว่า อ๋อ ผู้ใช้ยืนยันตัวตนผ่านแล้วนะ ก็จะอนุญาตให้ใช้งานโปรแกรมได้เฉยเลย เรียกว่าเป็นท่าการ Bypass ที่ Hacker ฝึกหัดมักจะได้เรียนกันในบทเรียนแรก ๆ ของการทดสอบการเจาะระบบเลยก็ว่าได้
และเพื่อป้องกันการโจมตีลักษณะนี้ OS สมัยใหม่เลยบอกว่า ในเมื่อแกเล่นอ่านเขียน Memory ของคนอื่นมัวซั่ว รู้ที่อยู่ของโปรแกรมอื่นไปเรื่อยเลย งั้นเอางี้ เราจะไม่บอกที่อยู่จริง ๆ แล้ว เราจะบอกที่อยู่ที่สร้างขึ้นมาใหม่เพื่อลื้อคนเดียวเลย แล้วเดี๋ยวพอโปรแกรมต้องการอ่านเขียนข้อมูลบริเวณนั้น เราจะเอากลับมาแปลงเป็นที่อยู่จริง ๆ แล้วไปจัดการอ่านเขียนให้เองนะ ซึ่งแน่นอนว่า มันก็จะต้องมีตารางสำหรับการเทียบว่า จากโปรแกรมนี้ ที่อยู่จำลองนี้ เทียบกลับไปเป็นที่อยู่จริง ๆ คือที่อยู่อันไหน แล้วตารางนี้จะเก็บลงบนไหนล่ะ จะที่ไหนได้อีกก็ต้อง RAM เหมือนเดิมนั่นเอง แต่เดี๋ยวนี้เทคโนโลยีได้รับการพัฒนาไปมากแล้ว ไม่ได้เก็บทุกตัวลงตารางหรอก โดยมีการแบ่งการเก็บออกมาเป็นระบบมากขึ้น ทำให้ใช้ RAM ในการเก็บน้อยลงเยอะมาก เราเรียกเจ้าตารางนี้ว่า Page Table นี่ยังไม่นับกลไกอื่น ๆ สำหรับการจัดการการเข้าถึงของ Memory ที่ทำให้กิน RAM มากขึ้นไปอีก
สรุป
ทั้งหมดนี้เป็นเพียงหนึ่งในเหตุผลที่ทำให้โปรแกรมและระบบคอมพิวเตอร์สมัยใหม่กิน RAM เยอะมากขึ้นกว่าเดิมมาก ๆ จาก 4 kB ที่พามนุษย์ลงไปเหยียบบนดวงจันทร์ได้ สู่ 4 GB ที่ทำได้เพียงแค่เปิดหน้าเว็บ คอมพิวเตอร์ที่ต้องทำอะไรได้มากขึ้น อเนกประสงค์มากขึ้น ปลอดภัยมากขึ้น ทำงานได้ง่ายมากขึ้น และเร็วมากขึ้น ย่อมแลกมากับการกิน RAM ที่มากขึ้นด้วยเช่นกัน ดูแล้วมีแนวโน้มที่จะต้องการ RAM มากขึ้นไปเรื่อย ๆ จนตอนนี้ในปี 2025 ขนาดของ RAM ขั้นต่ำกลายเป็น 16 GB ไปซะแล้ว ทั้งที่เมื่อสัก 10 ปีที่ก่อนอาจจะต้องการขั้นต่ำอยู่เพียงแค่ 6-8 GB เท่านั้นเอง ก็ต้องรอดูกันต่อไปว่าอีก 10 ปีข้างหน้า เราจะต้องการมันเพิ่มขึ้นเยอะไปอีกสักเท่าไหร่กัน