ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 디버깅
    개발 관련/개념 2021. 5. 9. 21:36

     

     

    프로그램 실행컴파일, 링크에 의해 작성된 실행 파일을 주기억장치에 복사

    주기억장치에 기계 명령어, 데이터 저장 = 주기억장치에 프로그램의 암호화된 명령어와 데이터 로드(Load)

     

    어떻게 실행 / 저장 / 관리 되는 것일까?

     

    주기억장치가 관리되는 방식은 제한된 크기의 주기억장치를 효율적으로 사용하기 위해 매우 중요한 개념

    프로그래밍 작업을 할 때 특정 프로그래밍 언어에 따른 기억장소 관리 방식을 이해하는 것은 필수적인 작업

     

    메모리 맵 = 프로그램의 명령어와 데이터 등이 주기억장치에 저장되어 있는 상태를 나타내는 그림이나 도표

     

    프로그래밍 언어로 작성된 프로그램은 기억장치에 저장

    기억장치에 저장된 프로그램의 명령어데이터가 읽히기 위해서는 기억장소를 식별하기 위한 도구 필요

    0과 1을 표현할 수 있는 비트를 8개 묶은 바이트 단위로 매겨진 정수형 값 (=주소) 을 이용 (16진 표현의 정수형 값)

    메모리 모델 = 특정 언어마다 그 언어로 작성되는 프로그램에서 사용되는 명령어나 데이터를 저장하는 기억장소의 '주소'를 지정하는 방식

     


     

    C 프로그램의 메모리 모델

    Java 처럼 명확하게 정해져 있지 않음

    운영체제에 따라 다양한 메모리 모델 제공 → 메모리 관리에 대해 프로그래머가 책임

    일정한 크기(64KB)의 논리적 단위(세그먼트)로 나누어서 할당과 할당 해제로 관리 → 주기억장치를 효율적으로 운영

    세그먼트 = 데이터를 저장하는 데이터 세그먼트 & 명령어를 저장하는 코드 세그먼트

    데이터 세그먼트 = 기억장소의 할당 방법에 따라 스택 세그먼트, 힙 세그먼트(동적 할당에 의해 관리) & 정적 세그먼트(정적 할당에 의해 관리)

    변수 = 데이터 세그먼트에 데이터를 저장하기 위해서 할당되어진 기억장소

    변수 명칭은 저장된 값을 의미, 배열 명칭은 주소를 의미

     

    주기억장치만 관리하는 것이 아닌 중앙처리장치의 레지스터도 관리!

     

    세그먼트

    = 운영체제에 의해 일정한 크기로 할당되는 기억장치 영역

     

    코드 세그먼트

    프로그램의 명령어가 저장되는 주기억장치 영역

    프로그램이 시작할 때 할당, 끝날 때 할당 해제

    정적 관리 영역

    함수 하나 당 한 개의 코드 세그먼트 할당

     

    정적 데이터 세그먼트

    프로그램 시작부터 끝까지 사용되어야 하는 데이터들을 관리하는 영역

    프로그램이 시작할 때 할당, 끝날 때 할당 해제

    1개의 세그먼트로만 구성

    코드 세그먼트 바로 다음에 할당되는 영역

    문자열 리터럴, 문자열 상수, 전역 변수, 정적 변수가 저장되는 영역

     

    스택 데이터 세그먼트

    프로그램이 실행하고 있는 동안에 일시적으로 보존하고자 하는 데이터를 차례로 쌓아서 저장해두는 영역

    C 언어의 논리적 모듈인 함수 하나가 실행될 때 할당, 함수가 끝날 때 할당 해제

    사용자에 의해서 관리되는 사용자 데이터 관리 X

    사용자에 의해서 데이터를 관리하는데 필요한 연산들을 수행할 때 필요한 데이터들을 관리

    C 프로그램에서 가장 빈번하고 중요하게 관리되는 기억장소 영역

     

    힙 데이터 세그먼트

    프로그램 실행 중에 소스코드에 의해 동적으로 할당되고 할당 해제되는 영역

    사용자에 의해서 관리되는 사용자 데이터 관리

    프로그래머에 의해 필요할 때 할당과 할당 해제가 결정

    힙을 사용하기 위해서는 힙 영역을 관리하는데 필요한 라이브러리 함수들을 이용해야 함

     

    중앙처리장치(CPU) 레지스터

    중앙처리장치가 데이터를 처리하는 동안 사용할 값이나 연산의 중간 결과를 일시적으로 저장해 두기 위해 사용되는 고속 처리 기억장치

     


     

    주기억장치는 여러 프로그램에 의해 사용되며, 다른 프로그램이 사용하고 있으면 사용할 수 없음 (운영체제가 관리)

    할당 = 운영체제에게 주기억장치 사용에 대한 허가를 받는 작업

    할당 해제 = 사용하지 않을 시 허가권 반환

     

    정적 할당

    프로그램이 실행될 때 기억장소 할당, 할당 해제될 때까지 그대로 유지되는 기억장치 관리 방식

     

    동적 할당

    프로그램 실행 중에 필요할 때마다 기억장소 할당, 필요치 않으면 할당 해제

    시스템에 의해 (스택) 또는 소스코드로 제어 (힙) 하는 기억장소 관리 방식

    스택 동적 할당 = 함수가 실행될 때마다 시스템에 의해 필요한 기억 장소 할당, 함수 실행 끝날 때 할당 해제 (기억장소 운영 효율성 ↑)

    힙 동적 할당 = 여분의 기억장소 공간을 라이브러리 내장 함수로 제공되는 할당과 할당 해제 함수를 이용하여 프로그래머가 주소에 의한 접근으로 기억장소를 관리하는 방식 (힙 데이터 세그먼트 관리)

     

     

    일정한 크기의 기억장소들 할당

    관련된 명령어들을 한꺼번에 복사하여 저장하는 방식으로 기억장소 관리

    → 세그먼트 방식 (C언어에서 사용), 페이지 방식

     

     

    정적 관리

    프로그램이 시작할 때 할당, 프로그램이 끝날 때 할당 해제되는 기억장치 관리 방식

    코드 세그먼트, 정적 데이터 세그먼트

     

    동적 관리

    필요할 때 할당, 할당해제되는 기억장치 관리 방식

    스택 세그먼트, 힙 세그먼트

     


    메모리맵 작도법

     

    코드 세그먼트 → 메모리 맵에 먼저 작성 (최소 1개 이상)

    main 함수코드 세그먼트들 중에서 가장 먼저 그려지는 함수

    C 언어로 작성된 실행 가능한 프로그램이 주기억장치에 복사되기 위해서는 반드시 main 함수 작성! (= Entry Point)

    main 함수에 코드 세그먼트 할당 → 함수 정의할 때 기술된 명령어들과 상수들이 복사돼서 저장

    코드 세그먼트 = 읽기만 할 수 있는 영역, 프로그램 실행 중에는 더이상 명령어나 데이터 쓸 수 없음

    코드 세그먼트에 저장된 데이터의 값을 바꿀 수 없음 (= 상수)

    호출 순서대로 함수 코드 세그먼트 작도 (호출된 함수 중복 할당 X)

     

     

    정적 관리 데이터 세그먼트 할당 (1개만)

    데이터 세그먼트에 문자열 리터럴 저장 (PASS, FAIL, %s, %d, ...)

     

     

    동적 관리 세그먼트 할당

    정적으로 관리되는 세그먼트들이 할당되었다면, 운영체제에 의해 main 함수 호출

    main 함수가 실행될 때 필요한 데이터들을 저장하는 데이터 세그먼트(스택 세그먼트) 할당 필요

    → main 함수의 스택 세그먼트 할당

    스택 세그먼트는 끝 주소로부터 아래쪽으로 할당

    할당된 스택 세그먼트에 데이터(main 함수 정의 매개변수, 자동변수) 저장

    포인터 변수 = 주소를 저장할 수 있는 변수

     

     

    라이브러리 함수에 대해서는 코드 세그먼트, 스택 세그먼트 그릴 필요 X

     

    함수 스택 세그먼트를 그리고 지우는 방법

    함수 호출 문장을 만나면,

    1. 호출되는 함수에 대해 스택 세그먼트의 아래쪽으로 스택 세그먼트를 그린다

    2. 스택 세그먼트에 변수들(작은 사각형)을 그리고, 사각형 바깥쪽에 변수 명칭을 적는다

    3. 함수 호출식과 자동 변수 선언문을 참고하여 저장되는 값을 적는다

    함수 블록이 끝날 때,

    4. 스택 세그먼트 영역을 지운다 (할당 해제되어야 하기 때문에)

     

     

     

     

     

    출처: 이렇게 하면 나도 프로그램을 잘 만들 수 있다

     

     

     

    '개발 관련 > 개념' 카테고리의 다른 글

    모듈  (0) 2021.05.09
    도메인 주도 설계 (DDD)  (0) 2021.04.11
    소프트웨어 개발 환경  (0) 2021.02.17
    점진적 개발 모델 Vs 반복적 개발 모델  (0) 2021.01.29
    소프트웨어 개발 수명 주기(SDLC) 모델  (0) 2020.09.30
Designed by Tistory.