본문 바로가기

Python 파이썬

프로그램의 구성, 힙(heap)영역, 스텍(stack)영역, LEGB 규칙

728x90

프로그램의 구성과 영역을 알아보자!

처음 보는 단어들도 있고 뭔가 익숙한 단어들도 있었다.

데이터의 영역이 어디에 형성되고 어기서 불러오는지 알기위해

다음 정리 내용을 천천히 읽어보자. 다 이해할려고 하지말고

이런것이 있구나 하면서 천천히 친해져보자.

 

'프로그램의 실행'

1.  사용자가 프로그램을 실행한다 -> OS에게 요청
2.  프로그램의 정보를 읽어 메모리(RAM)에 로드한다. -> 보조기억장치(SDD,HDD)에 정보를 읽어 RAM에 로드한다.
3.  CPU는 프로그램의코드를 가져다 메모리를 관리하고 명령문을 실행한다.
4.  동적메모리가 할당되면 FreeStore 영역을 사용한다.(아래쪽로 이동)

'프로그램의 실행' -> 운영체제(OS)가 프로그램의 정보(보조기억장치 안에 있는)를 RAM(주기억장치)에
                                 로드 해야 한다.

 

https://all-young.tistory.com/17 메모리


OS에게 할당(로드)받은 RAM 공간은 대표적으로

코드(code)영역,  데이터(data)영역, 힙(heap)영역, 스텍(stack)영역이 있다.

https://all-young.tistory.com/17 영역


'코드(code)영역' -> 실행할 프로그램의 코드가 저장되는 영역이다.
                  텍스트(Text) 영역이라고 부르기도 한다.
                  CPU는 코드영역에 저장된 명령을 하나씩 가져가서 처리한다.
                  [프로그램이 시작하고 종료 할때까지 메모리에 계속 남아있다.]

'데이터(data)영역' -> 전역변수와 정적(static) 변수가 저장되는 영역.
                    [프로그램의 시작과 함께 할당되며 프로그램이 종료되면 소멸한다.]

'힙(heap)영역' -> 힙 영역은 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간이다.(객체가 저장되는 공간)
                힙 영역에서 malloc() 또는 new 연산자를 통해 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.
                [힙 영역은 선입선출(FIFO, First-In First-Out)의 방식으로, 가장 먼저 들어온 데이터가 가장 먼저 인출 된다.]   
                이는 힙 영역이 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 떄문이다.
                위의 그림으로 설명하면, 위(낮은 주소)부터 차곡차곡 아래(높은 주소) 방향으로 데이터가 쌓인다고 생각하면 된다.

'스텍(stack)' -> 스택 영역은 프로그램이 자동으로 사용하는 임시 메모리 영역이다.(함수가 저장되는 공간)
               [함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역이고, 함수 호출이 완료되면 사라진다.]
               이때 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame) 이라고 한다.
               스택 영역에서 푸시(push) 로 데이터를 저장하고, 팝(pop) 으로 데이터를 인출한다.
               [스택 영역은 후입 선출(LIFO, Last-In First-Out) 의 방식으로, 가장 나중에 들어온 데이터가 가장 먼저 인출 된다.]
               이는 스택 영역이 메모리의 높은 주소에서 낮은 주소의 방향으로 할당 되기 때문이다.
               위의 그림으로 설명하면, 가장 아래(높은 주소)부터 차곡차곡 위(낮은 주소)의 방향으로 데이터가 쌓인다고 생각하면 된다.

'heap' -> 동적이며, 파이썬의 객체(클래스 인스턴스, 리스트,딕셔너리 등)가 저장되는 영역. 
                   파이썬은 가비지컬랙터가 관리.
'stack' -> (함수가 호출될때마다 쌓이며 저장되는 공간) 함수 호출에 사용되는 영역으로 LIFO구조를 가짐.
                    (호출 시 함수와 관련된 지역변수, 변환 주소 등이 저장됨)
'constant and literals' -> 상수영역(직접 적은 값들)
'global space' -> 모듈수준에서 정의된 전역 변수, 함수가 저장되는 영역(모듈 외부 접근시 import 필요)
                                  전역영역(코드의 첫째칸부터 시작되는 코드들)
'code space' -> 파이썬코드가 올라가는 영역(프로그램 실행 중 수정되지 않음.)
'cache' -> 일부 불변객체(정수, 문자열등)을 캐시하여 메모리 사용을 최적화(캐시는 단기 기억)


파이썬의 변수 SCOPE  ->  코드의 구조와 모듈화를 지원하며 변수명의 충돌을 방지하기위해 사용

 sum = 10                         GLOBAL SCOPE  

 def my_sum(a,b):        LOCAL SCOPE  
     sum =  a + b           
     print(sum)

 

위 sum 은 변수명이 같지만 참조 값이 다른 영역에 있기 때문에 서로의 관계가 없다! (색으로 구분)

글로벌 영역에 sum 을 함수 내에서도 사용하고 싶다면 다음의 예처럼 할 수 있다.

 

sum = 10                          GLOBAL SCOPE  

def my_sum(a,b):        LOCAL SCOPE   
    global sum                 global 을 이용해 sum을 선언하면 글로벌영역의 sum을 어디서나 시용가능.
    sum =  a + b
    print(sum)
 
my_sum(2, 3)            함수 값을 넣고 실행해보자.   
print(sum)                  실행결과  ->  5

최초 sum은 10이 였지만 global sum 을 선언해 함수 내에서 글로벌 영역에 접근을 했다.그 결과 함수 내에 있는 sum수식이 적용되어 결과 값이 5 로 바뀐것을 볼 수 있다. (색으로 구분)


'LEGB 규칙'

L->E->G->B 순서로 변수를 찾음.


LOCAL SCOPE            -> 함수 내에서 정의된 변수
ENCLOSING SCOPE -> 중첩함수에서 외부함수의 로컬변수에 접근한수 있는 영역
GLOBAL SCOPE         -> 모듈수준에서 정의된 변수들과 함수들이 저장되는 영역. 모듈내에서 어디서든 접근가능.
BUILT-IN SCOPE       -> 파이썬 인터프리터에 의해 기본적으로 제공되는 내장함수와 객체들이 저장되는 영역.

 

 

사진이나 모르는 것은

https://all-young.tistory.com/17 의 블로그를 참고하여 공부 했습니다.. 감사합니다..!

728x90

'Python 파이썬' 카테고리의 다른 글

리스트(list)  (0) 2023.10.16
람다(lamda)함수  (0) 2023.10.16
가변인자  (0) 2023.10.16
함수(def)_2, 구구단 만들기  (0) 2023.10.16
함수(def)_1  (0) 2023.10.16