# data[].attributes.body
การจัดการหน่วยความจำหลัก💕

หน่วยความจำหลัก คือ หน่วยความจำที่ติดต่อกับหน่วยประมวลผลกลาง โดย CPU ทำงานคู่กับ Ram ซึ่งมีการเก็บข้อมูลลงในหน่วยความจำ มีหน่วยเป็นไบต์ (Byte) และแต่ละตำแหน่งจะมีAddress เป็นของตัวเอง

หน่วยความจำแบ่งเป็น 3 ส่วน

1.ระบบปฏิบัติการOS

2.สำหรับผู้ใช้งาน (User)

3.ส่วนที่เหลือจากการใช้งาน

การจัดสรรพื้นที่แบบเดี่ยว

-โปรแกรมต้องมีขนาดน้อยกว่าหรือเท่ากับขนาดของหน่วยความจำ

-ทำงานได้เพียงครั้งละ 1 งาน เท่านั้น

# data[].attributes.body
หน่วยความจำหลัก คือ ? 🤔🤔

หน่วยความจำหลักติดต่อไปยังหน่วยประมวลผลกลาง นั้นก็คือ RAM และ CPU ทั้งสองอย่างนี้จะทำงานควบคู่กัน เพื่อจัดเก็บข้อมูลต่างๆ มีหน่วยเป็นไบต์ (Byte) โดยแต่ละตำแหน่งนั้นจะมี Address บอกไว้อยู่  ในการใช้งานของหน่วยความจำสามารถทำได้คือ การเขียนและการอ่านข้อมูล ซึ่งแบ่งออกเป็น 2 ส่วน คือ 1.ผู้ใช้งาน(User) 2.ระบบปฏิบัติการหรือ OS  การจัดสรรพื้นที่แบบเดี่ยวนั้นจะต้องมีขนาดเล็กกว่าในส่วนที่จัดเก็บไว้ เมื่อเราต้องการอ้างตำแหน่งที่เสมือนขึ้น มันจะนำค่าเสมือนไปเทียบกับค่ารีจิสเตอร์ฐาน ถ้าค่ารีจิสเตอร์นี้มีค่ามากกว่า จะทำให้เกิดข้อผิดพลาดในการหาตำแหน่ง แต่ถ้าค่ารีจิสเตอร์นั้นมีค่าน้อยกว่า จะทำให้เราได้ค่าตำแหน่งที่แท้จริง

# data[].attributes.body
การจัดสรรพื้นที่แบบพหุ
เริ่มต้นพื้นที่จะว่างทั้งหมด เมื่อมีกระบวนการเข้ามา จะทำการจัดหาพื้นที่ว่าง สำหรับกระบวนการนั้นเพียงเท่าที้ต้องการ ส่วนพื้นที่ว่างที่เหลือจะถูกจัดสรรในครั้งต่อไป
ถ้าพื้นที่ว่างนั้นใหญ่เกินกว่าที่process ต้องการก็จะถูกแบ่งเป็น2ส่วน คือ ส่วน1สำหรับกระบวนการ และส้วนที้2สำหรับที่ว่าง
การจัดสรรในหน่วยความจำจะมี3 ประเภท
1. first fit การจัดลงตัวครั้งแรก คือการเลือกพื้นที่แรกที่มีขนาดใหญ่กว่าตามกว่าขนาดที่ต้องการ
2. best fit การจัดแล้วพอดีที่สุด คือการเลือกพื้นที่ที่มีขนาดใกล้เคียงและเหมาะสมกับขนาดที่สุด
3. worst fit กาจัดสรรแล้วเหลือพื้นที่มากที่สุด คือการเลือกพื้นที่ว่างที่ใหญ่กว่าพื้นที่ที่ต้องการมากที่สุด ในระบบจะมีการคำนวณและใช้เวลาในการประมวณผลนานมาก และข้อดีคือจะมีพื้นที่ว่างมากสุดใช้ไว้เก้บข้อมูลต่อไป
การสูญเปล่าพื้นย่อยภายนอกและภายใน
จะมีปัญหาเกิดขึ้นตามมาคือจะมีที่ว่างเป็นช่วงๆแต่ละพื้นที่จะมีขนาดเล็กเกินไปสำหรับกระบวนการใหญ่ที่เข้ามาซึ่งพื้นที่ว่างส่วนที่จะเรียกว่า "การสูญเปล่าพื้นที่ย่อยภายนอก" ปัญหาอีกอย่างคือถ้ามีกระบวนการเข้ามาแล้วเหลือพื้นที่เล็กน้อย จะจัดสรรพื้นที่นี้ให้กับกระบวนการที่ร้องขอ เรียกว่า "การสูญเปล่าพื้นที่ย่อยภายนอก"

# data[].attributes.body
การจัดสรรพื้นที่ว่างในหน่อยความจำ มี 3 วิธี
1. First Fit คือ พื้นที่แรกที่พบที่ว่างก่อน แล้วมีขนาดใหญ่เพียงพอกับโปรเซสที่สามารถนำเข้าไปได้
2.Best Fit คือ การสแกนหาพื้นที่ว่างทั้งหมด และคำนวนที่มีขนาดใกล้เคียงที่สุด
3.Worst Fit คือ การสแกนหาพื้นที่ว่างทั้งหมด และคำนวนหาพื้นที่ ที่มีขนาดพื้นที่มากที่สุด

Internal Fragmentation คือ
เกิดจากการแบ่งหน่วยจำที่เสร็จแล้วแแล้วขนาดไม่เท่ากันแล้วเหลือพื้นที่ ที่เหลือๆอยู่
External Fragmentation คือ
การเหลือพื้นที่หลังจากการใส่โปรเซส ที่มีขนาดเล็กๆ ทำให้พื้นที่ขนาดใหญ่ๆไม่สามารถเข้าไปได้ นั้นคือ external

# data[].attributes.body
การแบ่งเป็นหน้า จะช่วยให้กระบวนการอยู่ในความจำโดยไม่สูญเปล่าจะทำการจัดแบ่งออกเป็นหน้าในขนาดเท่าๆกัน จะแบ่งออกได้เป็น 2 คือ หน้าจริงหรือเฟรม และหน้าเทียมหรือเพจ

ระบบแบ่งหน้าจำเป็นต้องใช้ระบบของฮาร์ดแวร์ช่วย ก่อนอื่นต้องแบ่งโปรเซสออกเป็นเพจก่อนแล้วจึงส่งไปยังเฟรมโดยใช้ตาราง (Page Table) เข้ามาช่วยในการทำงาน โดยแต่ละเพจของโปรเซสนั้นไม่จำเป็นต้องอยู่ในหน่วยความจำติดกัน

Segment

เมื่อ CPU ต้องการข้อมูลจะทำการสร้าง เซกเมนต์ แต่ละส่วนของโปรแกรมที่ไปเท่ากันกับก็จะแบ่งการทำงาน ถ้าส่วนไหนที่สำคัญก็จะทำงานในเซกเมนต์อยู่ตลอด ถ้าหากส่วนไหนไม่ค่อยสำคัญจะผลัดกันทำงาน

# data[].attributes.body
การแบ่งเป็นหนัา
กระบวนการที่อยู่ในหน่วยความจำ ไม่จำเป็นต้องอยู่ต่อเนี่องกัน สามารถใช้พื่นที่ย่อยๆ ให้เกิดประโยชน์ได้ ต้องมึฮาร์ดแวร๋ช่วย
หน่วยความจำกายภาพ เรียก frame หน้าจริง แบ่งออกเป็นส่วนๆเท่ากัน7ส่วน
หน่วยความจำทางตรรกะ page หนัาเทียม ถูกแบ่งเช่นเดียยกันขนาดเท่ากับหน่วยความจำจริง. แต่ละsegment มีชื่อและขนาด เพื่อความสะดวกมักใช้ตัวเลขเป็นชื่อ เรียก ตัวเลขsegment.  แบ่งเป็นสัดส่วยไม่เท่ากัน งานสำคัญจะทำงานในsegmentตลอดเวลา ส่วนงานรองจะสลับผลัดกันทำงาน