💾 Process memory model และ Memory Allocation เบื้องต้น

Ton Tosirikul
2 min readJul 5, 2021

--

บทความนี้เราจะมามองภาพกว้างของ Process memory model และประเภทของการ Allocate memory ก่อนจะไปลงลึกเรื่อง Stack และ Heap กันครับ

Process memory model

โปรแกรมที่เราใช้ๆกันอยู่ทุกวันนี้จะถูกกำหนดหน่วยความจำเสมือนของตนเองโดย OS ของคอมเรา พื้นที่ที่อยู่ในนี้ถูกจัดเรียงเป็นเส้นตรงโดยมีการจัดเก็บข้อมูลเป็น block ในแต่ละ address นอกจากนี้ยังถูกแบ่งออกเป็นหลายพื้นที่แตกต่างกัน ตามรูปด้านล่าง

นึกภาพว่าเป็นพื้นที่ memory ที่เรามี และเรามีหน้าที่จัดสรรให้เพียงพอ

โดยโปรแกรมเมอร์แบบเรานั้นไม่สามารถเข้าถึง memory ได้ทั้งหมด เพราะว่าจะมีหลายบล็อกที่ถูกจองไว้ เช่นในส่วนของบนสุด OS Kernel Space ที่ถูกควบคุมและจัดการโดย OS ของคอมเราซึ่งทำหน้าที่เป็นตัวเชื่อมระหว่าง code กับตัว OS และส่วนล่างสุด Text จะเก็บโปรแกรมที่ถูกสร้างโดย compiler และ linker

มาดูตัวที่เหลือกันว่าทำหน้าที่อะไรบ้าง

Stack

เป็น memory ที่ถูกจัดการแบบอัติโนมัติ พูดง่ายๆคือ compiler จัดการให้เราเอง จะมีขนาด maximum ที่ถูกกำหนดไว้ และโปรแกรมจะ crash เมื่อใช้เกินขนาด หน้าที่ของเจ้า Stack ก็คือจัดเก็บตัวแปรจำพวก Local variable และ Function parameter ตัวแปรเหล่านี้ถูกสร้างขึ้นมาเวลาเราเรียกใช้ Function โดยอัติโนมัติ และเจ้า Stack นี่แหละที่มีหน้าที่คอยดูแลจัดการ

Heap

เป็น memory อิสระในภาษา C++ ซึ่งเป็นที่เก็บที่หยืดหยุ่นและปรับเปลี่ยนขนาดได้ แต่ข้อเสียคือจะทำงานช้ากว่าเจ้า stack และเราต้องเป็นคนจัดการดูแลเอง พูดง่ายๆก็คือ ถ้าเราจัดสรร memory (allocate) บน Heap เราต้องรับผิดชอบในการปล่อย memory (deallocate) เมื่อเราไม่ต้องการใช้แล้วนั่นเอง อารมณ์แบบยืมของแล้วต้องดูแลและนำมาคืนด้วย

The BSS (Block Started by Symbol )

ใช้สำหรับเก็บตัวแปรประเภท global และ static variable ที่ไม่ได้กำหนดค่าไว้ข้างใน (Uninitialized data)

The Data segment

ทำงานเหมือนเหมือนกับเจ้า BSS เลย แต่ตัวแปรถูกกำหนดค่าไว้ตั้งแต่ตอนประกาศ (Initialized data)

การ Allocate memory ในภาษา C++

หลายๆคนอาจจะงงว่า allocate คืออะไร คำง่ายของมันก็คือ จัดสรรพื้นที่ของ memory ให้ตัวแปร (variable) เพื่อใช้เก็บค่า (value) ของมันนั่นเอง

ส่วนคำตรงข้ามกับ allocate ก็คือ deallocate ตามชื่อเลยครับ de แปลว่าไม่ อธิบายง่ายๆก็เอาพื้นที่ memory ที่เราแบ่งตัวแปรกลับคืนไป บางที่เราต้องคืนเอง แต่ในหลายๆกรณีคอมพิวเตอร์จะเรียกใช้ deallocate เอง

โดยทั่วไปแล้วจะมีการ allocate memory อยู่ 3 แบบ ได้แก่

  1. Static memory allocation เกี่ยวข้องกับเจ้า BSS และ Data segment ซึ่งจะถูก allocate เมื่อเรารันโปรแกรมและก็จะอยู่แบบนั้นไปเรื่อยๆกับโปรแกรมของเรา จนคอมระเบิดหรือปิดโปรแกรม
  2. Automatic memory allocation พูดถึง Auto ให้นึกถึง Stack เลยครับ การ allocate จะเกิดขึ้นเมื่อเราเรียกเราเข้า scope ของ function และจะถูก deallocate เมื่อจบ scope แล้ว
  3. Dynamic memory allocation มีไว้ให้โปรแกรมเมอร์แบบเราเนี่ยเรียกใช้ memory จาก OS ซึ่งการ allocate แบบนี้จะเกิดขึ้นใน Heap โดยจะต่างจากสองอันบนตรงที่เราต้องกำหนดบอกขนาด memory ที่ต้องการด้วย

สรุป

Automatic memory allocationให้นึก Stack Stack จัดการเอง ส่วน Dynamic memory allocation ให้นึกภาพตัวเองกำลัง Deal งานกับ Heap

--

--

Ton Tosirikul
Ton Tosirikul

Written by Ton Tosirikul

Backend Developer at EMIT | Software Development graduate at the University of Glasgow

No responses yet