[운영체제] 프로세스 구조 - (1)
지금까지 내용을 학습하면서 프로세스와 연관된 내용들이 많았는데 그렇다면 프로세스 구조가 어떻게 구성되어 있는지 알아보자.
-
일반적인 프로세스의 구성
- text(CODE): 코드
- data: 변수/초기화된 데이터
- stack: 임시 데이터(함수 호출, 로컬 변수 등)
- heap: 코드에서 동적으로 만들어지는 데이터
-
예
- stack
- 함수를 위한 공간
- 함수의 return adress(:함수 관련 code 1행에 대한 주소)를 저장
- 함수의 인자를 저장
Return Address: 0050h a= 1 b= 2
-
heap
- 동적 공간(C. malloc)
-
data
- 프로그램의 변수 선언 : fixed
- 전역에 선언된 변수만 저장
- 함수 안에서 선언된 변수는 저장되지 않음
c= 0
- code
def func(a, b): print(a+b) c = 0 c = func(1, 2) print(c)
- program
def func(a, b): print(a + b) c = 0 c = func(1, 2) print(c) #005h
- stack
EAX 레지스터
- 함수의 반환 값을 저장하는 레지스터
EBP 레지스터
- 함수가 문제가 있을 때, 해당 문제를 빠르게 트래킹하는 레지스터
- 코드에서 문제 발생 시, 해당 스택 포인터 최상단에 기록하고 EBP라는 레지스터에 기록
heap
- 함수가 문제가 있을 때, 해당 문제를 빠르게 트래킹하는 레지스터
- 코드에서 문제 발생 시, 해당 스택 포인터 최상단에 기록하고 EBP라는 레지스터에 기록
heap
힙은 동적으로 생성되는 메모리 공간이다.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *data; // 포인터 변수
data = (int *) malloc(sizeof(int));
*data = 1;
printf("%d\n", *data);
return 0;
}
heap을 이해하기 위해서 다음 코드를 살펴보자.
malloc
이라는 함수는 동적으로 메모리를 생성하는 함수이며 정수 타입의 사이즈를 메모리 공간에 할당한다.
int
에 포인터 변수를 만들어주면 malloc(할당)
의 리턴값은 동적으로 만든 메모리의 주소를 반환한다.
이렇게 반환된 변수를 data라는 변수에 할당해주면 동적 메모리에 접근할 수 있는 변수가 된다.
동적 메모리를 free(해제)
시키는 함수도 존재한다.
- 왜 힙이라는 공간이 필요한가
- 실행 코드 안에서 어떻게 실행이될지 모르는 코드에 대해서 정해져 있는 값이 없기 때문에 동적으로 데이터의 크기를 파악하는 공간이 필요
data
데이터 메모리 공간은 BSS와 DATA 두 가지의 공간으로 나뉜다.
int global_data1;
int global_data2 = 1;
int main()
{
int *data; // 지역변수는 stack에 저장
data = (int*) malloc(sizeof(int));
*data = 1;
printf("%d₩n", *data);
return 0;
}
-
BSS: 초기화 되지 않은 전역 변수
- global_data1
-
DATA: 초기값이 있는 전역 변수
- global_data2
Author And Source
이 문제에 관하여([운영체제] 프로세스 구조 - (1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@zero_mountain/운영체제-프로세스-구조-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)