ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [OS] 프로세스 메모리 구조 (코드, 데이터, 스텍, 힙)
    OS 2021. 7. 19. 07:57

     

     

    프로세스 메모리 구조 (코드, 데이터, 스텍, 힙)


     

     

    프로그램의 실행


     

    프로그램의 실행은 두가지 중요한 의미를 가진다.

    1. 파일 시스템에 존재하던 실행파일이 메모리에 적재된다는 의미
    2. 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태

     파일 시스템에 있는 실행 파일이 메모리에 적재될 때, 실행파일 전체가 메모리에 올라가지 않는다. 일부분만 메모리에 올라가고 나머지는 디스크의 특정영역인 스왑 영역에 존재한다.

     

     

     

    프로세스 메모리 영역


    프로세스의 주소 공간은 코드(code), 데이터(data), 스택(stack), 힙(heap) 영역으로 구성된다.

     

    이러한 주소 공간을 우리는 가상 메모리 (또는 논리적 메모리: logical memory)라고 부른다.

     

    code 영역

    사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 공간

     컴파일(compile) 타임에 결정되고 중간에 코드를 바꿀 수 없게 Read-Only 로 되어있다.

     

    data 영역

    전역 변수 또는 static 변수 등 프로그램이 사용하는 데이터를 저장하는 공간

     전역 변수또는static 값을 참조한 코드는 컴파일이 완료되면 data 영역의 주소값을 가르키도록 바뀐다. 전역변수가 변경 될 수도 있어 Read-Write로 되어있다.

     

    stack 영역

    호출된 함수의 수행을 마치고 복귀할 주소데이터(지역변수, 매개변수, 리턴값 등)를 임시로 저장하는 공간

     이 영역은 함수 호출시 기록하고 함수의 수행이 완료되면 사라진다. 메커니즘은 자료구조(stack)에서 배운 LIFO(Last In First Out) 방법을 따른다. 컴파일 시 stack 영역의 크기가 결정되기 때문에 무한정 할당 할 수 없다. 따라서 재귀함수가 반복해서 호출되거나 함수가 지역변수를 메모리를 초과할 정도로 너무 많이 가지고 있다면stack overflow가 발생한다.

     

    heap 영역

    프로그래머가 필요할 때마다 사용하는 메모리 영역

    heap 영역은 런타임에 결정된다. 자바에서는 객체가 heap영역에 생성되고 GC에 의해 정리된다.

     

     

     

     

    커널 주소 공간의 내용


    운영체제도 하나의 프로세스이기 때문에 커널 역시 동일한 주소 공간인 code, data, stack 영역을 갖는다.

     

    code 영역

    • 시스템 콜, 인터럽트 처리 코드
    • CPU, 메모리 등 자원 관리를 위한 코드
    • 편리한 인터페이스 제공을 위한 코드

     

    data 영역

    • PCB(Process Controll Block) : 현재 수행 중인 프로세스의 상태, CPU 사용 정보 등을 유지하기 위한 자료구조
    • CPU, Memory 등 하드웨어 자원을 관리하기 위한 자료구조가 저장

     

    stack 영역

    • 각 Process의 커널 스택을 저장
      • 프로세스는 함수 호출시 자신의 복귀 주소를 저장하지만, 커널은 커널 내의 주소가 된다.
      • 각각의 프로세스마다 별도의 스택을 두어 관리한다.

     

     

    커널은 힙메모리가 없는건가요?

    먼저 커널이 무엇인지 정확하게 짚고 넘어가야 할 것 같습니다. 커널(kernel)Linux 운영 체제(OS)의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스 입니다. 그리고 두가지 관리 리소스에서 최대한 효과적으로 통신합니다.

    '커널 == 운영체제'가 아니라, 커널은 운영체제의 주요 구성 요소입니다. 리눅스로 예를들어 설명하면, 커널은 메모리 관리, 프로세스 관리, 하드웨어와 프로세스 사이에서 인터프리터 역할을 수행하거나 시스템의 호출이나 보안등의 기능을 수행합니다. 즉, 리눅스에서(다른 OS는 다를 수 있음) 커널은 하나의 프로세스가 아니라 컴퓨터 하드웨어와 프로세스를 잇는 인터페이스로 보아야 합니다.

    커널은 힙메모리를 사용하지 않는다. 커널은 운영체제(리눅스)에서 동적메모리 할당을 위해 필요한 기능들을 커널이 제공하는데, 운영체제는 커널에서 제공하는 기능을 사용해서 메모리 풀(memory pool)을 관리한다.

     

     

     

    Post


    •  

    References


    • 운영체제와 정보기술의 원리

     

     


    잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)

     

     

    'OS' 카테고리의 다른 글

    [OS] 프로그램 VS 프로세스 VS 스레드  (0) 2021.07.21
    [OS] 프로세스 관리, 프로세스 문맥(context)  (0) 2021.07.20
    [OS] 인터럽트(Interrupt)  (0) 2021.07.18
    [OS] 컴퓨터 시스템의 동작 원리  (2) 2021.07.17
    [OS] 운영체제  (0) 2021.07.15

    댓글