ประมวลภาพ

ตอนนี้เราได้เห็นวิธีรับข้อมูลพื้นฐานของกระบวนการและกระบวนการหลักแล้วก็ถึงเวลาพิจารณารายละเอียดของข้อมูลกระบวนการ / โปรแกรม

ภาพกระบวนการคืออะไร? ภาพกระบวนการเป็นไฟล์ปฏิบัติการที่จำเป็นในขณะเรียกใช้โปรแกรม ภาพนี้มักจะมีส่วนต่อไปนี้ -

  • ส่วนรหัสหรือส่วนข้อความ
  • ส่วนข้อมูล
  • กลุ่มกอง
  • ฮีปเซ็กเมนต์

ต่อไปนี้คือการแสดงภาพของภาพกระบวนการ

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