ส่วนข้อมูล

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

ส่วนข้อมูลเป็นแบบอ่าน/เขียน เนื่องจากค่าของตัวแปรสามารถเปลี่ยนแปลงได้ในขณะรันไทม์ ซึ่งตรงกันข้ามกับส่วนข้อมูลแบบอ่านอย่างเดียว (ส่วน rodataหรือ.rodata) ซึ่งมีค่าคงที่คงที่มากกว่าตัวแปร นอกจากนี้ยังตรงกันข้ามกับส่วนของโค้ดหรือที่เรียกว่าส่วนของข้อความ ซึ่งอ่านได้อย่างเดียวในสถาปัตยกรรมหลายๆ แบบ ข้อมูลที่ไม่ได้กำหนดค่าเริ่มต้น ทั้งตัวแปรและค่าคงที่จะอยู่ในเซ็กเมนต์ BSS

ในอดีต เพื่อให้สามารถรองรับพื้นที่ที่อยู่หน่วยความจำที่มีขนาดใหญ่กว่าขนาดดั้งเดิมของการลงทะเบียนที่อยู่ภายในได้ CPU ยุคแรกจึงใช้ระบบการแบ่งส่วนโดยจะจัดเก็บชุดดัชนีขนาดเล็กเพื่อใช้เป็นออฟเซ็ตในบางพื้นที่ CPU ตระกูล Intel 8086มีสี่ส่วน: ส่วนรหัส, ส่วนข้อมูล, ส่วนสแต็ก และส่วนพิเศษ แต่ละเซ็กเมนต์ถูกวางไว้ในตำแหน่งเฉพาะในหน่วยความจำโดยซอฟต์แวร์ที่กำลังดำเนินการ และคำแนะนำทั้งหมดที่ดำเนินการกับข้อมูลภายในเซ็กเมนต์เหล่านั้นได้รับการดำเนินการโดยสัมพันธ์กับจุดเริ่มต้นของเซ็กเมนต์นั้น ซึ่งอนุญาตให้มีการลงทะเบียนที่อยู่ 16 บิต ซึ่งโดยปกติจะสามารถเข้าถึงพื้นที่หน่วยความจำ 64 KB เพื่อเข้าถึงพื้นที่หน่วยความจำ 1 MB

การแบ่งส่วนพื้นที่หน่วยความจำออกเป็นบล็อกแยกกันโดยมีงานเฉพาะที่ส่งต่อไปยังภาษาการเขียนโปรแกรมในแต่ละวัน และแนวคิดนี้ยังคงใช้กันอย่างแพร่หลายในภาษาโปรแกรมสมัยใหม่

หน่วยความจำโปรแกรม

หน่วยความจำโปรแกรมคอมพิวเตอร์สามารถแบ่งส่วนใหญ่ได้เป็นสองส่วน: อ่านอย่างเดียวและอ่าน/เขียน ความแตกต่างนี้เติบโตจากระบบในยุคแรกๆ ที่ถือโปรแกรมหลักไว้ในหน่วยความจำแบบอ่านอย่างเดียวเช่นMask ROM , EPROM , PROMหรือEEPROMเมื่อระบบมีความซับซ้อนมากขึ้นและโปรแกรมถูกโหลดจากสื่ออื่นไปยัง RAM แทนที่จะดำเนินการจาก ROM แนวคิดที่ว่าไม่ควรแก้ไขหน่วยความจำบางส่วนของโปรแกรมจึงยังคงอยู่ สิ่งเหล่านี้กลายเป็นส่วน.textและ. rodata ของโปรแกรม และส่วนที่เหลือสามารถเขียนเพื่อแบ่งออกเป็นส่วนอื่นๆ สำหรับงานเฉพาะต่างๆ ได้

รหัส

ส่วนของโค้ดหรือที่เรียกว่าส่วนของข้อความมี โค้ด ที่ปฏิบัติการได้และโดยทั่วไปแล้วจะเป็นแบบอ่านอย่างเดียวและมีขนาดคงที่

ข้อมูล

นี่จะแสดงโครงร่างทั่วไปของหน่วยความจำโปรแกรมของคอมพิวเตอร์ธรรมดาพร้อมข้อความ ข้อมูลต่างๆ และส่วนสแต็กและฮีป

ส่วนข้อมูลประกอบด้วยตัวแปรคงที่ที่เตรียมใช้งานแล้ว เช่น ตัวแปรส่วนกลางและตัวแปรคงที่เฉพาะที่ซึ่งมีค่าที่กำหนดไว้และสามารถแก้ไขได้ ตัวอย่างในภาษา C ได้แก่:

int i = 3 ; ถ่าน[] = "สวัสดีชาวโลก" ; คงที่ int b = 2023 ; // เริ่มต้นตัวแปรส่วนกลางแบบคงที่เป็นโมฆะfoo ( เป็นโมฆะ) { คงที่int c = 2023 ; // เริ่มต้นตัวแปรท้องถิ่นแบบคงที่}   
   
        
   
       

บีเอสเอส

เซ็กเมนต์BSSประกอบด้วยข้อมูลคงที่ที่ไม่ได้เตรียมใช้งาน ทั้งตัวแปรและค่าคงที่ เช่น ตัวแปรส่วนกลางและตัวแปรคงที่เฉพาะที่ซึ่งกำหนดค่าเริ่มต้นเป็นศูนย์หรือไม่มีการกำหนดค่าเริ่มต้นอย่างชัดเจนในซอร์สโค้ด ตัวอย่างในภาษา C ได้แก่:

คงที่ int ฉัน; ถ่านคงที่[ 12 ];  
  

กอง

เซ็กเมนต์ฮีปประกอบด้วยหน่วยความจำที่จัดสรรแบบไดนามิก โดยทั่วไปจะเริ่มต้นที่ส่วนท้ายของเซ็กเมนต์ BSS และขยายไปยังที่อยู่ที่มีขนาดใหญ่ขึ้นจากตรงนั้น ได้รับการจัดการโดยmalloc , calloc, realloc และฟรี ซึ่งอาจใช้ การเรียกระบบ brkและsbrkเพื่อปรับขนาด (โปรดทราบว่าการใช้ brk/sbrk และเซ็กเมนต์ฮีปเดียวไม่จำเป็นต้องปฏิบัติตามสัญญาของ malloc/ calloc/realloc/free; นอกจากนี้ยังอาจนำไปใช้งานโดยใช้mmap /munmap เพื่อจอง/ไม่จองพื้นที่ที่อาจไม่ต่อเนื่องกันของหน่วยความจำเสมือนลงในพื้นที่ที่อยู่เสมือน ของกระบวนการ ) เซ็กเมนต์ฮีปถูกใช้ร่วมกันโดยเธรดทั้งหมด ไลบรารีแบบแบ่งใช้ และโมดูลที่โหลดแบบไดนามิกในกระบวนการ

ซ้อนกัน

ส่วนสแต็กประกอบด้วยcall stackซึ่งเป็น โครงสร้าง LIFOซึ่งโดยทั่วไปจะอยู่ในส่วนที่สูงกว่าของหน่วยความจำ การลงทะเบียน "ตัวชี้สแต็ก" ติดตามด้านบนของสแต็ก จะถูกปรับทุกครั้งที่มีการ "ผลัก" ค่าลงบนสแต็ก ชุดของค่าที่ส่งสำหรับการเรียกใช้ฟังก์ชันหนึ่งครั้งเรียกว่า "สแต็กเฟรม" สแต็กเฟรมประกอบด้วยที่อยู่ผู้ส่งอย่างน้อยที่สุดตัวแปรอัตโนมัติจะถูกจัดสรรบนสแต็กด้วย

ส่วนสแต็กตามธรรมเนียมจะติดกับส่วนฮีปและขยายเข้าหากัน เมื่อตัวชี้สแต็กตรงกับตัวชี้ฮีป หน่วยความจำที่ว่างก็หมดลง ด้วยพื้นที่ที่อยู่ขนาดใหญ่และเทคนิคหน่วยความจำเสมือน พวกเขามักจะวางได้อย่างอิสระมากขึ้น แต่โดยทั่วไปแล้วยังคงเติบโตไปในทิศทางที่บรรจบกัน บนสถาปัตยกรรมพีซีมาตรฐานx86สแตกจะขยายไปสู่ที่อยู่ศูนย์ ซึ่งหมายความว่ารายการล่าสุดที่อยู่ลึกลงไปในสายโซ่การโทรจะอยู่ที่ที่อยู่ต่ำกว่าเป็นตัวเลขและใกล้กับฮีปมากขึ้น สำหรับสถาปัตยกรรมอื่นๆ บางสถาปัตยกรรมจะมีการเติบโตในทิศทางตรงกันข้าม

ภาษาที่ตีความ

ภาษาที่ตีความบางภาษามีสิ่งอำนวยความสะดวกที่คล้ายกันกับส่วนของข้อมูล โดยเฉพาะPerl [ 1]และRuby [2]ในภาษาเหล่านี้ รวมถึงบรรทัด__DATA__(Perl) หรือ__END__(Ruby, Perl เก่า) เป็นจุดสิ้นสุดของส่วนของโค้ดและเป็นจุดเริ่มต้นของส่วนของข้อมูล เฉพาะเนื้อหาที่อยู่ก่อนหน้าบรรทัดนี้เท่านั้นที่จะถูกดำเนินการ และเนื้อหาของไฟล์ต้นฉบับหลังจากบรรทัดนี้จะพร้อมใช้งานเป็นออบเจ็กต์ไฟล์: PACKAGE::DATAใน Perl (เช่นmain::DATA) และDATAใน Ruby นี่ถือได้ว่าเป็นรูปแบบของเอกสารที่นี่ (ไฟล์ตามตัวอักษร)

ดูสิ่งนี้ด้วย

อ้างอิง

  1. perldata: อักษรพิเศษ
  2. ทับทิม: วัตถุ: __END__

ลิงค์ภายนอก

  • "การเริ่มต้น C" Bravegnu.org
  • "mem_sequence.c - แสดงรายการขอบเขตหน่วยความจำในกระบวนการตามลำดับ" เก็บถาวรจากต้นฉบับเมื่อ 2009-02-02
  • ฟาน เดอร์ ลินเดน, ปีเตอร์ (1997) การเขียนโปรแกรม C ผู้เชี่ยวชาญ: ความลับ C ลึก(PDF ) ศิษย์ฮอลล์. หน้า 119ff.
ดึงข้อมูลจาก "https://en.wikipedia.org/w/index.php?title=Data_segment&oldid=1156086691"