สบรค
brkและ sbrk เป็นการ เรียกใช้ระบบจัดการหน่วยความจำพื้นฐานที่ใช้ใน ระบบปฏิบัติการ Unixและ ระบบปฏิบัติการ ที่คล้าย Unixเพื่อควบคุมปริมาณหน่วยความจำที่จัดสรรให้กับส่วนฮีปของกระบวนการ [ 1 ] โดยทั่วไปฟังก์ชันเหล่านี้จะถูกเรียกจากฟังก์ชันไลบรารีการจัดการหน่วยความจำระดับสูงกว่า เช่น mallocในระบบ Unix ดั้งเดิมและเป็นวิธีเดียวที่แอปพลิเคชันจะได้รับพื้นที่ฮีปเพิ่มเติม เวอร์ชันต่อมาอนุญาตให้ทำเช่นนี้ได้โดยใช้การเรียก mmap [ 2 ] [ 3 ]พบได้ในส่วนหัว <unistd.h>ในไลบรารี C POSIXbrk()sbrk()
คำอธิบาย
การเรียก brk และ sbrk จะเปลี่ยนปริมาณพื้นที่ที่จัดสรรให้กับเซ็กเมนต์ฮีปของกระบวนการที่เรียกแบบไดนามิก การเปลี่ยนแปลงนี้ทำได้โดยการรีเซ็ตตัวแบ่งโปรแกรมของกระบวนการ ซึ่งจะกำหนดพื้นที่สูงสุดที่สามารถจัดสรรได้ ตัวแบ่งโปรแกรมคือที่อยู่ของตำแหน่งแรกที่อยู่เลยจุดสิ้นสุดปัจจุบันของพื้นที่ข้อมูล ปริมาณพื้นที่ว่างจะเพิ่มขึ้นเมื่อค่าตัวแบ่งเพิ่มขึ้น พื้นที่ว่างจะเริ่มต้นด้วยค่าศูนย์ เว้นแต่ว่าค่าตัวแบ่งจะถูกลดลงแล้วเพิ่มขึ้นอีกครั้ง เนื่องจากอาจนำหน้าเดียวกันกลับมาใช้ใหม่ในลักษณะที่ไม่ระบุ ค่าตัวแบ่งสามารถปัดขึ้นโดยอัตโนมัติให้มีขนาดที่เหมาะสมกับสถาปัตยกรรมการจัดการหน่วยความจำ[ 4 ]
sbrkและbrkถือว่าเป็นระบบเก่าแม้กระทั่งตามมาตรฐานปี 1997 ( Single UNIX Specification v2 หรือ POSIX.1-1998) [ 5 ]ระบบเหล่านี้ถูกลบออกใน POSIX.1-2001 [ 6 ]
ลายเซ็นฟังก์ชันและพฤติกรรม
int brk ( void * end_data_segment ); void * sbrk ( intptr_t increment );sbrkใช้สำหรับปรับค่าการหยุดโปรแกรมโดยการเพิ่มขนาดที่อาจเป็นค่าลบ ในขณะที่brkใช้สำหรับกำหนดค่าการหยุดให้เท่ากับค่าของตัวชี้ ตั้งincrementค่าพารามิเตอร์เป็นศูนย์เพื่อดึงค่าปัจจุบันของการหยุดโปรแกรม
เมื่อดำเนินการสำเร็จbrkซับรูทีนจะส่งคืนค่า 0 และ ซับรูทีนจะส่งคืนค่าก่อนหน้าของการหยุดโปรแกรม (หากพื้นที่ว่างเพิ่มขึ้น ค่าก่อนหน้านี้จะชี้ไปยังจุดเริ่มต้นของพื้นที่ใหม่ด้วย) หากซับรูทีนใดซับรูทีนหนึ่งไม่สำเร็จ จะส่งคืนsbrkค่า และ ตัวแปรส่วนกลางerrnoจะถูกตั้งค่าเพื่อระบุข้อผิดพลาด[ 5 ]−1
ไม่ใช่ทุกระบบที่คล้าย Unix ที่จะยอมรับแนวคิดของการให้ผู้ใช้ควบคุมส่วนข้อมูลการใช้งานMac OS Xsbrkเป็นการจำลองและมีการจัดสรรสูงสุด 4 เมกะไบต์ ในการเรียกใช้ครั้งแรก พื้นที่ขนาดนี้จะถูกจัดสรรเพื่อเก็บส่วนจำลอง เมื่อถึงขีดจำกัดนี้ จะส่งคืนค่า −1 และerrnoตั้งค่าเป็นENOMEM. brkมักจะเกิดข้อผิดพลาด[ 7 ]
รหัสข้อผิดพลาด
ข้อผิดพลาดENOMEMจะถูกตั้งค่าและพื้นที่ที่จัดสรรไว้จะไม่เปลี่ยนแปลง หากเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้เป็นจริง:
- การเปลี่ยนแปลงที่ร้องขอจะจัดสรรพื้นที่มากกว่าที่ระบบกำหนดไว้สูงสุด
- การเปลี่ยนแปลงที่ร้องขอจะกำหนดค่าการหยุดให้มีค่ามากกว่าหรือเท่ากับที่อยู่เริ่มต้นของส่วนหน่วยความจำที่ใช้ร่วมกันที่ เชื่อมต่ออยู่