ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 운영체제 4: 프로세스 (Process)의 구조
    CS기초/OS,HW 2021. 12. 28. 00:31
    728x90
    반응형

    프로세스의 구조

    • text: 컴파일 된 코드 저장
    • data: 전역 변수 또는 초기화된 데이터 저장
    • bss: 초기값이 없는 변수 저장
    • stack: 함수 호출로 생성된 데이터, 로컬 변수 등 임시 데이터 저장
    • heap: 코드에서 동적으로 만들어지는 데이터 저장

    Stack & Heap

     stack과 heap은 자료구조이다. Heap은 동적으로 메모리를 할당하는데, 사실 파이썬은 알아서 메모리를 관리하기 때문에 파이썬 이용자들에게는 어떤 의미인지 잘 안 와닿을 수 있다. C언어의 경우 사용자가 메모리를 직접 관리하는데, C에서 사용하는 malloc, free 함수가 동적 메모리 할당 및 해제에 관련된 함수다. 예를들어, C에서 다음과 같은 코드를 사용했을 때

    int main()
    {
    	int *data;
        data = (int *) malloc(sizeof(int));
        *data = 1;
        
        return 0;
    }
    1. 컴파일 된 코드가 실행되면 main함수의 return값의 주소값이 stack에 쌓인다.
    2. 첫번째 줄에서 main이라는 함수를 호출한다
    3. 세 번째 줄에서 data라는 이름으로 정수를 가르키는 포인터 변수가 정의된다 = stack에 data라는 변수가 저장된다
    4. 네 번째 줄에서 data라는 변수에 Int의 사이즈의 동적 메모리를 할당해준다 (보통 32bit - int32, int64를 생각해보면 된다). 여기서 data의 역할은 할당된 32bit짜리 메모리의 주소를 가리키는(point하는) 것이다. 이 메모리 공간은 동적이기 때문에 stack이 아닌 heap에 쌓이게 되고, stack에 쌓여있던 Int *data는 heap에 저장된 data를 위한 32bit의 메모리 공간의 주소를 가르키게 된다.
      • 네 번째 줄 실행 전:
        stack에 저장되어 있는 자료 - main()의 리턴값의 주소, int *data
        heap에 저장되어 있는 자료 - 없음
      • 네 번째 줄 실행 후:
        stack에 저장되어 있는 자료 - main()의 리턴값의 주소, data = 0001h
        heap에 저장되어 있는 자료 - 빈 공간 (주소값 : 0001h (예시))
    5. 다섯 번째 줄에서 data가 가리키고 있는 메모리에 1이라는 숫자를 넣어준다
      • 다섯 번째 줄 실행 후:
        stack에 저장되어 있는 자료 - main()의 리턴값의 주소, data = 0001h
        heap에 저장되어 있는 자료 - 1(주소값 : 0001h (예시))

     지역 변수에 동적인 메모리 공간을 할당하는 이유는 함수가 끝나기 전까지 얼만큼의 메모리가 필요할 지 컴파일러가 알 수 없기 때문이다.

     

    Data & BSS

     데이터가 저장되는 공간 역시 초기화에 따라 BSS와 Data 두 가지로 나눠진다. 초기화란 처음에 변수가 정의될 당시 값이 정해져있느냐 아니냐의 차이이다. 전역변수나 static 변수를 선언할 때 초기값이 있으면 Data영역에 할당되고, 초기값이 없으면 BSS영역에 할당된다. 예를 들어

    int global_data1;
    int global_data2 = 1;

    라는 코드를 작성했을 때, global_data1은 값이 없으므로 BSS영역에 저장되고, global_data2는 초기값이 있으므로(1) Data영역에 저장된다. BSS영역에 변수를 저장하는 것과 Data영역에 저장하는 것의 차이는 다음 웹문서를 참고하면 좋을 것 같다.

     

    PC는 program counter로 코드를 한 줄씩 가리키는 것이고, SP는 stack pointer로 프로세스 최상단의 주소를 가리킨다. EBP는 가장 최근에 실행된 함수의 return address를 가리킨다. 따라서 EBP는 여러 함수가 연결된 코드에서 오류가 났을 때, 어느 함수에서 생긴 문제인지를 빠르게 파악하기 위해 제공된다.

    728x90
    반응형

    댓글