CS

메모리상의 데이터 배치, 프로그램 실행

mrban 2022. 2. 5. 00:14

1. 메모리상의 데이터 배치

  • 메모리에는 명령어와 데이터가 존재한다.
  • 데이터는 정적 데이터와 동적 데이터로 구분할 수 있다.
  • 정적데이터는 프로그램 만들 때 크기를 알 수 있는 데이터들이고 동적 데이터는 프로그램 실행 전까지는 크기를 알 수 없는 데이터이다.

크기 고정

  • text: 실행 코드(명령어들)
  • data: 전역변수(정적 데이터들)

동적으로 크기 변경

  • heap: 프로그램 실행중 동적으로 할당되는 메모리(동적 데이터)
  • stack: 함수를 호출할 때 임시 데이터 저장 장소(함수 매개변수, 복귀 주소 및 지역 변수)
  • 힙과 스택을 서로 충돌하지 않게 하는 것이 중요하다.

 

2. 프로그램 실행

  • 어떤 함수는 여러 프로그램에서 쓸 만큼 유용한 경우가 존재한다.
  • 이런 함수를 프로그램 만들 때마다 매번 새로 작성하기 보다는 관련 함수를 한데 모아서 라이브러리로 만들면 프로그램 작성시 편하다.
  • 또한 프로그램을 전부 한 파일에 저장하기 보다는 여러 파일로 나누는 것이 동시개발을 가능하게 해줘 편하다.
  • 링커: 여러 조각으로 나눠진 프로그램 조각들을 하나로 엮는 프로그램.
  • 정적 링크: 라이브러리를 파일로 간주하여 프로그램에서 함수를 사용할때마다 각자 직접 연결해 실행파일을 만드는 링크방식.
  • 이러한 정적링크 방식은 같은 라이브러리 코드가 여러 실행 파일(프로그램)에 반복적으로 들어가서 귀중한 메모리를 낭비한다는 단점이 존재한다.
  • 동적 링크: 공유 라이브러리를 사용하는 링크방식으로 MMU(메모리 관리 장치)가 여러 프로그램이 같은 라이브러리를 공유할 수 있도록 한다.

  • 진입점: 프로그램의 첫 번째 명령어가 위치한 주소.
  • 런타임 라이브러리: 메모리 설정을 책임지는 라이브러리로 프로그램의 스택과 힙영역을 설정하고 정적 데이터의 초깃값도 설정한다. 프로그램 메모리의 여러가지 환경설정을 하는 라이브러리로 이해하면 된다. 프로그램이 하나로 합쳐질때 자동으로 추가된다.
  • 실제 프로그램이 실행될 때는 가장 먼저 실행되는 명령어가 런타임 라이브러리의 명령어이고 그 다음으로 진입점의 명령어가 실행된다.

3. 메모리 전력 소비

  • 데이터를 메모리에서 이리저리 옮기려면 전력이 소비된다.
  • 전력 소비와 성능 사이의 균형을 잡는 일은 아주 어렵지만 중요한 작업이다.

4. 출처: https://blog.yevgnenll.me/os/process-concepts-process-state-and-managed-in-memory