프로그램의 구성과 영역을 알아보자!
처음 보는 단어들도 있고 뭔가 익숙한 단어들도 있었다.
데이터의 영역이 어디에 형성되고 어기서 불러오는지 알기위해
다음 정리 내용을 천천히 읽어보자. 다 이해할려고 하지말고
이런것이 있구나 하면서 천천히 친해져보자.
'프로그램의 실행'
1. 사용자가 프로그램을 실행한다 -> OS에게 요청
2. 프로그램의 정보를 읽어 메모리(RAM)에 로드한다. -> 보조기억장치(SDD,HDD)에 정보를 읽어 RAM에 로드한다.
3. CPU는 프로그램의코드를 가져다 메모리를 관리하고 명령문을 실행한다.
4. 동적메모리가 할당되면 FreeStore 영역을 사용한다.(아래쪽로 이동)
'프로그램의 실행' -> 운영체제(OS)가 프로그램의 정보(보조기억장치 안에 있는)를 RAM(주기억장치)에
로드 해야 한다.
OS에게 할당(로드)받은 RAM 공간은 대표적으로
코드(code)영역, 데이터(data)영역, 힙(heap)영역, 스텍(stack)영역이 있다.
'코드(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 은 변수명이 같지만 참조 값이 다른 영역에 있기 때문에 서로의 관계가 없다! (색으로 구분)
글로벌 영역에 sum 을 함수 내에서도 사용하고 싶다면 다음의 예처럼 할 수 있다.
최초 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 의 블로그를 참고하여 공부 했습니다.. 감사합니다..!
'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 |