ประมวลภาพ
ตอนนี้เราได้เห็นวิธีรับข้อมูลพื้นฐานของกระบวนการและกระบวนการหลักแล้วก็ถึงเวลาพิจารณารายละเอียดของข้อมูลกระบวนการ / โปรแกรม
ภาพกระบวนการคืออะไร? ภาพกระบวนการเป็นไฟล์ปฏิบัติการที่จำเป็นในขณะเรียกใช้โปรแกรม ภาพนี้มักจะมีส่วนต่อไปนี้ -
- ส่วนรหัสหรือส่วนข้อความ
- ส่วนข้อมูล
- กลุ่มกอง
- ฮีปเซ็กเมนต์
ต่อไปนี้คือการแสดงภาพของภาพกระบวนการ
Code segmentเป็นส่วนหนึ่งของอ็อบเจ็กต์ไฟล์หรือพื้นที่แอดเดรสเสมือนของโปรแกรมที่ประกอบด้วยคำสั่งปฏิบัติการ โดยปกติจะเป็นส่วนข้อมูลแบบอ่านอย่างเดียวและมีขนาดคงที่
กลุ่มข้อมูลมีสองประเภท
- Initialized
- Un-initialized
Initialized data segment เป็นส่วนหนึ่งของไฟล์ออบเจ็กต์หรือพื้นที่ที่อยู่เสมือนของโปรแกรมที่ประกอบด้วยตัวแปรคงที่และตัวแปรส่วนกลาง
Un-initialized data segmentเป็นส่วนหนึ่งของไฟล์ออบเจ็กต์หรือพื้นที่ที่อยู่เสมือนของโปรแกรมที่ประกอบด้วยตัวแปรคงที่และตัวแปรส่วนกลางที่ไม่ได้กำหนดค่าเริ่มต้น ส่วนข้อมูลที่ไม่ได้เตรียมใช้งานเรียกอีกอย่างว่าเซ็กเมนต์ BSS (Block Started by Symbol)
Data segmentคืออ่าน - เขียนเนื่องจากค่าของตัวแปรสามารถเปลี่ยนแปลงได้ในระหว่างเวลาทำงาน ส่วนนี้ยังมีขนาดคงที่
Stack segmentเป็นพื้นที่หน่วยความจำที่กำหนดไว้สำหรับตัวแปรอัตโนมัติและพารามิเตอร์ฟังก์ชัน นอกจากนี้ยังจัดเก็บที่อยู่สำหรับส่งคืนขณะเรียกใช้ฟังก์ชัน Stack ใช้กลไก LIFO (Last-In-First-Out) ในการจัดเก็บตัวแปรภายในหรืออัตโนมัติพารามิเตอร์ฟังก์ชันและจัดเก็บที่อยู่ถัดไปหรือที่อยู่ผู้ส่งคืน ที่อยู่สำหรับส่งคืนหมายถึงที่อยู่ที่จะส่งคืนหลังจากเสร็จสิ้นการเรียกใช้ฟังก์ชัน ขนาดเซ็กเมนต์นี้เป็นตัวแปรตามตัวแปรโลคัลพารามิเตอร์ฟังก์ชันและการเรียกใช้ฟังก์ชัน กลุ่มนี้เติบโตจากที่อยู่ที่สูงกว่าไปสู่ที่อยู่ที่ต่ำกว่า
Heap segmentเป็นพื้นที่ของหน่วยความจำที่จัดสรรไว้สำหรับหน่วยความจำแบบไดนามิกเช่นการเรียก malloc () และ calloc () ขนาดเซ็กเมนต์นี้ยังแปรผันตามการจัดสรรของผู้ใช้ กลุ่มนี้เติบโตจากที่อยู่ที่ต่ำกว่าไปสู่ที่อยู่ที่สูงขึ้น
ตอนนี้ให้เราตรวจสอบว่าขนาดเซ็กเมนต์ (ข้อมูลและกลุ่ม bss) แตกต่างกันอย่างไรด้วยโปรแกรมตัวอย่างบางโปรแกรม ทราบขนาดเซ็กเมนต์โดยการดำเนินการคำสั่ง "ขนาด"
โปรแกรมเริ่มต้น
ไฟล์: segment_size1.c
#include<stdio.h>
int main() {
printf("Hello World\n");
return 0;
}
ในโปรแกรมต่อไปนี้จะมีการเพิ่มตัวแปรคงที่ที่ไม่ได้กำหนดค่าเริ่มต้น ซึ่งหมายความว่าขนาดเซ็กเมนต์ที่ไม่ได้เริ่มต้น (BSS) จะเพิ่มขึ้น 4 ไบต์Note- ในระบบปฏิบัติการ Linux ขนาดของ int คือ 4 ไบต์ ขนาดของชนิดข้อมูลจำนวนเต็มขึ้นอยู่กับการสนับสนุนคอมไพเลอร์และระบบปฏิบัติการ
ไฟล์: segment_size2.c
#include<stdio.h>
int main() {
static int mystaticint1;
printf("Hello World\n");
return 0;
}
ในโปรแกรมต่อไปนี้จะมีการเพิ่มตัวแปรคงที่เริ่มต้น ซึ่งหมายความว่าขนาดเซ็กเมนต์เริ่มต้น (DATA) จะเพิ่มขึ้น 4 ไบต์
ไฟล์: segment_size3.c
#include<stdio.h>
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
ในโปรแกรมต่อไปนี้จะมีการเพิ่มตัวแปรโกลบอลที่กำหนดค่าเริ่มต้น ซึ่งหมายความว่าขนาดเซ็กเมนต์เริ่มต้น (DATA) จะเพิ่มขึ้น 4 ไบต์
ไฟล์: segment_size4.c
#include<stdio.h>
int myglobalint1 = 500;
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
ในโปรแกรมต่อไปนี้จะมีการเพิ่มตัวแปรส่วนกลางที่ไม่ได้เริ่มต้น ซึ่งหมายความว่าขนาดเซ็กเมนต์ที่ไม่ได้เริ่มต้น (BSS) จะเพิ่มขึ้น 4 ไบต์
ไฟล์: segment_size5.c
#include<stdio.h>
int myglobalint1 = 500;
int myglobalint2;
int main() {
static int mystaticint1;
static int mystaticint2 = 100;
printf("Hello World\n");
return 0;
}
ขั้นตอนการดำเนินการ
การรวบรวม
babukrishnam $ gcc segment_size1.c -o segment_size1
babukrishnam $ gcc segment_size2.c -o segment_size2
babukrishnam $ gcc segment_size3.c -o segment_size3
babukrishnam $ gcc segment_size4.c -o segment_size4
babukrishnam $ gcc segment_size5.c -o segment_size5
การดำเนินการ / เอาต์พุต
babukrishnam size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
text data bss dec hex filename
878 252 8 1138 472 segment_size1
878 252 12 1142 476 segment_size2
878 256 12 1146 47a segment_size3
878 260 12 1150 47e segment_size4
878 260 16 1154 482 segment_size5
babukrishnam