정적 기억장소 할당

Download Report

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
..
.
Z0
X5
Y7
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.