Transcript 정적 기억장소 할당
제9장
기억장소 할당
기억장소 할당 기법
프로그래밍 언어의 특성과 관련 큼
설계시 고려 : 가장 중요한 Binding
예) recursion 허용, 배열 크기 변화 등
방식
정적 기억장소 할당
번역 시간
동적 기억장소 할당
실행 시간
기억장소 할당
정적 및 동적 기억장소 할당
정적 기억 장소 할당(static storage allocation)
번역 시간 할당 (적재 시간)
기억장소 크기와 위치가 정적으로 고정
배열 접근코드가 효율적 (크기 고정)
부 프로그램(한번 실행에 필요한 크기의 기억장소) recursion 불가
FORTRAN, COBOL 등
동적 기억 장소 할당(dynamic storage allocation)
실행 시간 할당
변수 제한 완화 (자료형, 크기 등)
인터프리터 구현 - LISP, SNOBOL4, APL
Algol 형태 언어(스택 기반 할당) recursion 허용
기억장소 할당
정적 및 동적 기억장소 할당(계속)
정적+동적 기억장소 할당
ALGOL
own 변수 : 정적 할당
own 이외의 변수 : 동적 할당 (recursion 허용)
실행시 변수 크기는 할당 후 고정(stack based)
PL/I
STATIC : 정적 할당
AUTOMATIC : 동적 할당 (스택 기반)
CONTROLLED, BASED : 동적 할당 (heap 기억 장소 할당)
기억장소 할당
Unit Program
단위 프로그램
지역 변수 선언
단위 활성화(Unit activation)
한 단위 프로그램의 실행시간 상태
구성
코드부(code segment)
명령어들로 구성
고정 크기, 내용 불변
활성 레코드(activation record)
지역변수 등 프로그램 실행시 요구되는 정보들
가변적(크기, 내용)
<단위 활성화>
코드부
활성레코드
기억장소 할당
오프셋(Offset)
활성레코드에서의 상대위치
자료 참조시 주소 대신 사용
참조 환경(referencing environment)
단위 프로그램의 지역 변수 및 사용 가능한 비 지역변수
지역변수 : 현재 단위 프로그램 활성 레코드에 할당
비지역 변수 : 다른 단위 프로그램 활성 레코드 할당
활성 레코드 바인딩
코드부와 해당 활성 레코드의 바인딩
재귀 호출(되부름) : 활성레코드가 재귀적으로 발생 동적 바인딩
재귀 호출 불허용 : 활성 레코드가 1개만 존재 정적 바인딩
기억장소 할당
정적 기억장소 할당(Static Storage Allocation)
대표적 언어
Cobol, Fortran, Basic 등
정적 할당 (예: FORTAN IV)
주프로그램 -1개, 부프로그램 -다수
기억장소 총 용량 -번역시간 확정(실행시간 고정)
부프로그램 -분리 컴파일 가능
활성 레코드 -실행 전에 모두 할당 가능
변수의 수명 =프로그램 실행시간
전역 변수 -COMMON 제공 (시스템 제공 활성 레코드로 간주)
지역 변수 -COMMON 이외의 모든 변수
모든 변수 -오프셋 고정 (주소 대용)
링크시 -유효(effective) 주소 고정
번역시 할당 번역시(적재시) 초기화 가능(DATA 문)
정적 변수(static variable) : 번역 시간에 크기 고정, 번역 시간 할당
기억장소 할당
Fortran 프로그램의 실행 상태
전역변수
지역변수
(COMMON변수)
단위 프로그램 1
단위 프로그램 2
...
단위 프로그램 K
코드부 1
코드부 2
...
코드부 K
활성
레코드 1
활성
레코드 2
...
활성
레코드 K
기억장소 할당
정적 기억 장소 할당 기법
장점
단순, 구현 용이
실행 속도의 효율성
단점
적응성(flexibility) 적음
배열 크기 불변
recursion 불가
활성화되지 않은 활성레코드 상주
모든 프로그램의 활성 레코드 할당(오류 처리 루틴 등) 단순
구현 용이
기억장소 할당
스택 기반 기억장소 할당
동적 기억 장소 할당
Algol 형태 언어 (컴파일러 사용)
ALGOL 60, Pascal, ALGOL 68, PL/I, Ada, C
인터프리터 언어
APL, Lisp, SNOBOL4, Prolog, Smalltalk
ALGOL 형태 언어
블록 개념 도입(영역 단위) : 선언문으로 새로운 환경 정의
단위 프로그램 : 블록, 부프로그램
블록 : 블록 실행시 활성화
부 프로그램 :호출될 때 활성화
할당시 고려 사항 : 변수수명, 단위 프로그램 활성시간, 참조 환경, 변수 크기
활성화 레코드(변수)크기 : 번역 시간, 활성화 시점, 동적변화
기억장소 할당
스택 기반 기억장소 할당 (계속)
활성 레코드 크기 : 정적 바인딩
지역 변수 생성 : 단위프로그램 활성화 시점
변수 오프셋 : 정적 바인딩
활성 레코드 : 매 호출시 할당 되부름 허용
준정적(semi-static) 변수
크기 (오프셋) 번역 시간 고정, 실행 시간 할당(실제 주소 실행 시간 바인딩)
예) Pascal, C(포인터 개념 제외)의 활성 레코드
a : array[0..10] of integer;
크기는 정적 바인딩
활성 레코드 위치(x)는 실행 시점에 결정 (유효 주소 - 동적 바인딩)
즉, loc a[i] = x + a의 offset + i * s
기억장소 할당
활성 레코드 크기 : 정적 바인딩 (계속)
단위 액티베이션 구조
코드부 : 기계어 명령어
활성 레코드 (동적 링크 , 반환주소 포함)
동적링크 : 호출한 단위프로그램의 활성 레코드 주소
동적 체인 구성 동적 내포관계 표현
반환주소 : 반환시 실행 주소 (호출자의 코드부 내)
Unit activation
코드부
(code segment)
(동적 링크)
(반환 주소)
활성 레코드
기억장소 할당
정적 내포 관계 (ALGOL 형태 언어)
단위 프로그램 구조
A unit A
B unit B
정적 내포관계 트리
C unit C
A
D unit D
end D
end C
end B
E unit E
F unit F
end F
C
G unit G
end G
end E
end A
E
B
D
F
G
기억장소 할당
전형적인 액티베이션 상태
호출순서 : A → E → F → G → F → G → F
A unit A
B unit B
A 코드부
C unit C
D unit D
end D
end C
end B
E unit E
F unit F
end F
...
시스템으로
반환
E 코드부
F 코드부
...
...
E 호출
F 호출
G 호출
∧
●
●
●
●
●
...
A 활성
레코드
...
F 호출
...
●
●
●
F 활성
레코드
E 활성
레코드
G 활성
레코드
●
●
end A
...
...
G unit G
end G
end E
G 코드부
F 활성
레코드
Call return 순서 : LIFO
stack
●
●
F 활성
레코드
●
●
●
G 활성
레코드
기억장소 할당
활성레코드 동적 링크 관계
동적 링크
FREE
미사용
CURRENT
(현재 실행 중인
활성 레코드)
F
G
F
활성
레코드
동적 체인
G
F
스택이
증가하는
방향
E
A
부 프로그램 호출반환 순서 : LIFO stack
기억장소 할당
활성 레코드의 크기 : 활성화 시점 바인딩
단위 프로그램의 활성화 시점에서 지역변수 생성
이 때, 지역변수의 기억장소 크기확정
지역변수 오프셋 : 실행시간에 확정
준동적 변수(semi-dynamic variable)
기억장소 크기가 활성화 시점에서 확정되는 변수
동적 배열(dynamic array)
활성화 시점에 배열크기 확정 (준동적 변수)
사용자의 적응성(flexibility) 제공
예) ALGOL68
U:
[1 : n] int a;
[1 : m] real b;
. . .
ALGOL60, ALGOL68, Ada 등에서 허용
활성화 시점에 m, n 값 확정
기억장소 할당
준 동적 변수(동적 배열)의 기억 장소 할당 방식
번역시간
준동적 변수의 명세표 활성레코드에 삽입 (번역 시간)
오프셋의 상수 개념 사용 가능
참고) 명세표 : 차원수 등 정적으로 알려진 정보만 저장, 명세표 크기
실행 시간
활성레코드(준정적 변수, 준동적 변수 명세표) 기억장소 할당
준동적 변수 기억장소 할당(확정시)
준동적 변수 기억장소 주소를 명세표에 배정
준동적 변수의 오프셋도 상수화
기억장소 할당
준동적 변수가 있는 활성 레코드 예
b 배열
a 배열
U의 나머지
준정적 변수
●
(m)
1
b에 대한
명세표
●
(n)
1
U의 일부
준정적 변수
반환 변수
동적 변수
단위프로그램의
활성 레코드
a에 대한
명세표
스택이
증가하는
방향
기억장소 할당
활성 레코드 크기 : 동적 바인딩 (실행시 변화)
프로그램 실행 중에 기억장소 할당 및 해제 가능
동적(dynamic) 변수
실행시 변수 크기가 수시로 변할 수 있는 변수
예) 적응성(flexible) 배열(ALGOL68)
프로그램 실행 중 자료 크기에 맞추어 기억장소 할당
동적 변수 특성
프로그램 실행 중에 생성/해제 가능
동적 변수 생성 프로그램 종료 후에도 기억장소 유지
스택의 활성레코드에 할당 불가
힙(heap) 기억장소에 할당 (명세표는 스택의 활성 레코드에 할당)
∴ 스택 변수 : 준정적, 준동적 변수
힙 변수 : 동적 변수
예) PL/I(controlled, based), Pascal(pointer), Algol68, Ada(access)
기억장소 할당
동적메모리 할당 예 (Pascal, Ada)
Pascal의 동적 할당
new(P);
heap
P
new(P) : P는 레코드 t의 포인터
① t형의 기억장소를 힙에 할당
② 할당된 주소를 P에 배정
③ dispose(P)를 만날 때까지 유지
stack
Ada의 동적 할당
type SEQ is array(INTEGER range <>) of FLOAT;
type SEQREF is access SEQ;
p := new SEQ(1..50);
p : SEQREF ;
① SEQ 형 메모리를 힙에 할당
...
② 시작 주소를 p에 배정
p := new SEQ(1..50);
③ 명시적인 해제문장(free)까지 유지
기억장소 할당
다른 활성레코드에 정의된 변수값 참조
지역 변수 : 지역 환경(local environment)
비지역 변수 : 비지역 환경(nonlocal environment)
Fortran
지역 변수 : 현재 단위프로그램 활성레코드
비지역 변수 : 시스템 제공 활성레코드
ALGOL 형태 언어
지역 변수 : 현재 단위프로그램 활성레코드
비지역 변수 : 정적 내포관계
기억장소 할당
Algol68의 지역/비지역 변수 참조
<활성레코드 실행 상태>
<단위 프로그램 구조>
unit A
x 선언
F의 활성 레코드
unit B
unit C
unit D
end D
end C
end B
unit E x 선언
unit F y 선언
y := x
end F
unit G x 선언
end G
end E
end A
호출순서 : A → E → F → G → F → G → F
정적
링크
current
G의 활성 레코드
정적링크
- 단위프로그램 내포구조 표현
F의 활성 레코드
동적링크
- 단위프로그램 호출 순서 표현
G의 활성 레코드
동적
링크
F의 “y := x”
y : CURRENT + y의 옵셋
F의 활성 레코드
(지역 변수)
x : E 활성레코드 시작 + x의 옵셋
E의 활성 레코드
A의 활성 레코드
(비지역 변수)
스택이
증가하는
방향
기억장소 할당
비지역 변수의 참조 방법
<프로그램 구조>
정적 체인(static chain)
단위 프로그램의 정적 내포관계
비지역 변수 검색 방법
정적 체인을 따라 탐색
A
B
D
실행시간 낭비
간격(distance) 사용
간격 : 정적 내포 구조의 단계 수
예) D에서의 간격 : 지역 변수(D 선언) -0
비지역 변수(B 선언) - 1
비지역 변수(A 선언) - 2 정적
C
변수 주소 : (d, o)로 표현 - [d : 간격, o : 옵셋]
간격 만큼 정적 링크 추적 (간격이 클 때는 실행시간 낭비)
기억장소 할당
프로그램 구조와 정적 링크 예 (그림 9.8)
호출순서 : A → B → C → B → D
<활성레코드 실행 상태>
<프로그램 구조>
A
x 선언 y 선언
B
y 선언
D z 선언
...
실행 중
...
D의 활성 레코드
정적
링크
B의 활성 레코드
current
동적
링크
C의 활성 레코드
B의 활성 레코드
A의 활성 레코드
C
스택이
증가하는
방향
기억장소 할당
비지역 변수의 참조 방법 (계속)
디스플레이(display)
DISPLAY
정적체인 관계를 가변 배열 형태로 표현
방법
(d, o) 개념 사용
current
실행시간 낭비
유효주소 (d, o) = DISPLAY(m - d) + o
m
...
3
m : DISPLAY 사용 활성 레코드 수
2
d : 간격,
1
o : 오프셋
장단점
모든 비지역 변수 참조시간 동일
활성 레코드의 발생, 소멸시 디스플레이 내용 변환
기억장소 할당
Display 사용 예
F의 활성 레코드
G의 활성 레코드
F의 활성 레코드
동적
링크
G의 활성 레코드
F의 활성 레코드
E의 활성 레코드
스택이
증가하는
방향
A의 활성 레코드
디스플레이
3
2
1
배열
첨자값
기억장소 할당
힙 기억장소 할당 (Heap Storage Allocation)
영역 규칙
정적 영역 규칙
주프로그램
번역 기법에서 사용
동적 영역 규칙
인터프리터 기법에서 사용
동적 기억장소 할당 힙 기법 이용
부 프로그램
SUB
APL
주프로그램의 변수
전역변수 정적 영역 규칙
인터프리터 언어
동적 영역 규칙
• 호출 순서
1) 주프로그램 SUB FUN
Y : SUB의 지역변수
2) 주프로그램 FUN
Y : 전역변수(주 프로그램)
함수
부 프로그램
FUN
..
.
Z0
X5
Y7
SUB 2
Z FUN Y
..
.
SUB I; Y
..
.
…X…
…Y…
Z FUN I; X
..
.
R FUN N; X
..
.
…X…
…Y…
..
.
기억장소 할당
APL 프로그램에서 실행 순간의 스택
비 지역변수 : 동적 링크 이용
변수의 자료형과 크기 : 실행중 수시 변화 (스택기반 할당 불가)
실제 자료값 : 힙 기억장소 할당 후 포인터로 연결
X
FUN의
활성 레코드
N
R
CURRENT
SUB의
활성 레코드
Y
I
Y
스택이
증가하는
방향
주 프로그램의
활성 레코드
X
Z
Heap
Programming Languages
- The end of Chapter 9 -
To Be Continue ...
Copyright, 1999 © H. Y. Kwak, Cheju National University.