Chapter 8 : 기억 장소 할당

Download Report

Transcript Chapter 8 : 기억 장소 할당

1
Chapter 8 – 기억 장소 할당
Outline
8.1
8.2
8.3
8.4
8.5
정적 및 동적 기억 장소 할당
단위 프로그램
정적 기억 장소 할당
스택 기반 기억 장소 할당
힙 기억 장소 할당
2
8. 기억장소 할당(Storage Allocation)
• 기억 장소 할당 기법
– 프로그래밍 언어의 일부 특징들과 매우 밀접하게 관련
– 프로그래밍 언어를 설계하고 구현하고자 할 때,
우선 고려할 사항 중 하나
예 ) recursion 허용, 배열 크기 변화 등
• 방식
– 정적 기억장소 할당
• 번역 시간
– 동적기억장소 할당
• 실행 시간
3
8.1 정적 및 동적 기억 장소 할당
• 정적 기억 장소 할당
–
–
–
–
번역 시간 할당 (적재 시간)
기억장소 크기와 위치가 정적으로 고정
배열 접근코드가 효율적 (크기 고정)
기본조건
• 사용된 모든 배열은 확정된 고정 크기로 선언
• 부프로그램은 되부름(recursion) 불가
– Fortran, Cobol, Basic 등에서 사용
• 동적 기억 장소 할당
–
–
–
–
실행 시간 할당
변수 제한 완화 (자료형, 크기 등)
인터프리터 언어 - LISP, SNOBOL4, APL
Algol 형태 언어 - recursion 허용
4
8.1 정적 및 동적 기억 장소 할당
•
정적, 동적 기억 장소 할당을 함께 수행하는 언어 예
– ALGOL
• own 변수 : 정적 할당
• own 이외의 변수 : 동적 할당 (recursion 허용)
• 변수 크기가 실행 시, 할당 후 고정(stack based)
– PL/I
• STATIC : 정적 할당
• AUTOMATIC : 동적 할당 (스택 기반)
• CONTROLLED, BASED : 동적 할당 (힙 기억 장소 할당)
– C, C++, (Java?)
• static : 정적 할당
• auto : 동적 할당 (스택 기반), default임
• 힙 기억장소 할당 – C(malloc,free), C++(new, delete),Java(new)
5
8.2 단위 프로그램
• 모듈 (module) [단위 프로그램 (program unit)]
• 새로운 환경 설정(new environment)
• 선언가능 - 지역 식별자 도입
• 지역 변수 (local variable)
– 단위 프로그램에서 선언하여 사용하는 변수
• 활성화 상태(activated state)
– 한 단위 프로그램의 실행 시작부터 종료까지
• 블록도 단위 프로그램 임
6
8.2 단위 프로그램
• 단위 활성화(Unit activation)
– 실행 시간에 한 단위 프로그램이 표현된 상태
– 구성
• 코드부(code segment)
<단위 활성화>
– 명령어들로 구성
코드부
– 고정 크기
활성레코드
– 내용 불변
• 활성 레코드(activation record)
– 지역변수 등 프로그램 실행시 요구되는 정보들
– 가변적(크기, 내용)
7
8.2 단위 프로그램
• 오프셋(Offset)
– 활성레코드에서의 상대위치
– 참조 시 주소 대신 사용
• 참조 환경(referencing environment)
– 단위 프로그램의 지역 변수 및 사용 가능한 비 지역변수
– 지역변수 : 현 단위 프로그램 활성 레코드에 할당
– 비지역 변수 : 다른 단위 프로그램 활성 레코드에 할당
• 활성 레코드 바인딩
– 코드부와 활성 레코드의 바인딩
– 재귀 호출(되부름) : 활성레코드 재귀적으로 발생 => 동적 바인딩
– 재귀 호출 불허용 : 활성 레코드 하나만 존재 => 정적 바인딩 가능
8
8.3 정적 기억 장소 할당(Static Storage Allocation)
• 정적 할당의 대표적 언어
–
Cobol, Fortran, Basic 등
• 정적 할당을 수행하는 Fortran 77 특징
–
하나의 주 프로그램과 몇 개의 부 프로그램으로 구성
–
기억장소 총 용량 – 번역시간에 계산(실행시간에 변하지 않음)
–
부프로그램 - 분리 컴파일 가능
–
활성 레코드 - 실행 전에 할당하여 실행 종료 시까지 유지
– 정적 변수(static variable) : 번역 시간에 크기 고정, 번역 시간 할당
–
변수의 수명 = 프로그램 실행 시간 전체
–
Fortran 77에서의 변수의 영역 – 변수가 선언된 단위 프로그램에 국한
–
전역 변수 - COMMON 제공 (시스템 제공 활성 레코드로 간주)
–
지역 변수 - COMMON 이외의 모든 변수
–
모든 변수 - 오프셋 고정 (주소 대용)
–
링크 시 - 유효(effective) 주소 확정
–
프로그램 실행 전에 지역 변수들에 대한 초기값 한정 가능( DATA문)
9
8.3 정적 기억 장소 할당
그림8.1 한 Fortran 프로그램의 실행 상태
단위프로그램1
(주 프로그램)
코드부 1
활성
레코드 1
단위프로그램2
...
단위프로그램K
코드부 2
...
코드부 K
활성
레코드 2
전역 변수
(COMMON)변수
...
활성
레코드 K
10
8.3 정적 기억 장소 할당
• 장점
– 구현용이, 간결함
– 효율적인 프로그램 실행
• 단점
– 유연성(flexibility) 적음
• 배열 크기 불변
• recursion 불가
• 활성화되지 않은 활성레코드 상주 (오류 처리 루틴 등)
정적 변수(static variable)
번역 시간에 크기 고정( 크기- 정적 바인딩)
번역 시간 할당( 정적 할당)
11
8.4 스택 기반 기억 장소 할당
• 동적 기억 장소 할당 기법
– 스택 할당( for automatic allocation)
– 힙 할당(for dynamic alloc)
– 대부분의 컴파일러언어에서 사용
(블록 중심 언어)
• Algol 60, Pascal, Algol 68, PL/I, Ada, C, C++, Java등
– 인터프리터 언어 모두 사용
• APL, Lisp, SNOBOL4, PROLOG, Smalltalk
12
8.4 스택 기반 기억 장소 할당
• ALGOL 유사 언어(Algol-like language)
– Algol 60의 영향을 크게 받아 설계된 언어
– 블록 개념을 도입(영역 단위) - 선언으로 새로운 환경 정의
– 단위 프로그램 : 블록, 부 프로그램
• 블록 : 정상적인 프로그램 실행 과정에서 차례가 되었을 때 활성화
• 부프로그램 :호출문에 의하여 호출되었을 때 활성화
– 기억장소 할당 시 고려 사항
• 변수수명
• 단위 프로그램 활성시간
• 참조 환경, 생성에 관한 규칙들
– 활성 레코드 크기 바인딩시간 - 번역 시간, 활성화 시점, 동적변화
13
•단위 프로그램 구조
A
•정적 내포 관계 트리
unit A
A
unit B
B
C
unit C
D
B
E
unit D
end D
end C
C
end B
E
unit E
unit F
F
end F
G
unit G
end G
end E
end A
F
G
D
그림 8.2
Algol 유사 언어의
정적 내포 관계 예
14
8.4 스택 기반 기억 장소 할당
• 활성 레코드 크기 : 정적 바인딩
– 지역 변수 생성 : 단위프로그램 활성화 시점( automatic )
– 기억 장소 크기 : 번역시간에 확정
– 변수 오프셋 : 정적 바인딩
– 활성 레코드 : 매 호출시 할당 => 되부름 허용
– 준정적(semi-static) 변수
•
크기 (오프셋) 번역 시간 고정 : 크기 정적 바인딩
•
실행 시간 할당(실제 주소 실행 시간 바인딩) : 기억장소 동적 할당
• 예) Pascal (포인터 개념 제외), C(heap할당 제외)의 활성 레코드
a : array[0..10] of integer; [C의 경우, int a[11];]
=> 크기는 정적 바인딩
활성레코드 위치(x)는 실행 시점에 결정 (유효 주소 - 동적 바인딩)
즉, loc a[i] = x + a의 offset + i * s
15
8.4 스택 기반 기억 장소 할당
• 활성레코드 크기 : 정적 바인딩
• 단위 엑티베이션 구조
코드부
(code segment)
• 코드부 : 기계어 명령어
• 활성 레코드
– 지역 변수, 형식 매개 변수
•
•
정적 링크
동적 링크
•
활성 레코드
반환 주소
동적링크
– 반환주소
– 호출한 단위프로그램의 활성 레코드 주소
– 동적 체인 구성 => 동적 내포관계 표현
• 반환주소
– 반환 시 실행 주소
– 호출자의 코드
동적 링크
나머지 내용
(지역변수,
매개변수,
정적링크등)
16
현재 호출된 상태
그림 8.4
한 전형적인 활성화 상태
단위 프로그램 A
시스템으로
반환
A →E →F →G →F →G →F
단위 프로그램 E
E 코드부
...
F 호출
...
A 코드부
...
E 호출
...
•
•
•
•
A
•
A 에 대한
활성
레코드
E에 대한
활성
레코드
A
B
C
D
G
단위 프로그램 G
G 코드부
...
F 호출
...
•
•
•
F에 대한
활성
레코드
•
•
F에 대한
활성
레코드
E
F
단위 프로그램 F
F 코드부
...
G 호출
...
•
•
F에 대한
활성
레코드
G에 대한
활성
레코드
•
•
•
G에 대한
활성
레코드
17
그림 8.5
실행 중 스택에서 활성 레코드들의
동적 링크 관계
FREE
미사용
CURRENT
(현재 실행중인
활성 레코드)
활성
레코드
동적 체인
스택이 증가
하는 방향
18
현재 호출된 상태
A →E →F →G →F →G →F
A
F 의 활성 레코드
A코드부
...
E호출
시스템으로 . . .
CURRENT
•
•
•
G 의 활성 레코드
•
A
동적 링크
•
A
활성
레코드
F 의 활성 레코드
E 의 활성 레코드
A 의 활성 레코드
•
E코드부
...
F호출
...
F코드부
...
G호출
...
•
•
•
•
G
G코드부
...
F호출
...
E
활성
레코드
스택이
증가하는
방향
•
•
•
F
활성
레코드
•
•
F
활성
레코드
•
•
F
반환
G 의 활성 레코드
F 의 활성 레코드
E
•
•
F
활성
레코드
G
활성
레코드
•
•
•
G
활성
레코드
19
8.4 스택 기반 기억 장소 할당
• 활성 레코드 크기 : 활성화 시점 바인딩
– 단위 프로그램의 활성화 시점에서 지역변수 생성
=> 이때 지역변수의 기억장소 크기확정
∴ 지역변수 오프셋 : 실행시간에 확정
– 준동적 변수(semidynamic variable)
• 기억장소 크기 : 활성화 시점 바인딩(동적)
• 기억장소 할당 : 동적 할동( 스택 할당)
• 동적 배열(dynamic array) : 준동적 변수
활성화 시점에 크기가 확정되는 배열
=> 사용자의 유연성(flexibility) 제공
• 대조) 유연 배열(flexible array) : 동적 변수
• Algol60, Algol68, Ada 등에서 허용
20
8.4 스택 기반 기억 장소 할당
– 준동적 변수(semidynamic variable) 사용 예 (Ada)
준동적 변수( 동적 배열) 선언 예
get (M, N)
declare
A : array(1..N) of INTEGER;
B : array(1..M) of FLOAT;
begin
…
end
21
8.4 스택 기반 기억 장소 할당(6)
• 준 동적 변수(동적 배열)의 기억 장소 할당 방식
1) 번역시간
① 준동적 변수의 명세표 활성레코드에 삽입
모든 오프셋 : 상수 취급 가능(번역 시간)
참고) 명세표
– 차원수 등 정적으로 알려진 정보만 저장
– 명세표 크기 고정
2) 실행시간
① 활성레코드(준정적변수, 준동적 변수 명세표) 기억장소 할당
② 준동적 변수 기억장소 할당(확정시)
③ 준동적 변수 기억장소 주소를 명세표에 배정
준동적 변수의 오프셋도 상수화
22
그림 8.7
준동적 변수가 있는
전형적인 활성 레코드
B 배열
A 배열
U의 나머지
준정적 변수
•
(M)
1
•
(N)
B에 대한
명세표
단위 프로그램의 활성 레코드
A에 대한
명세표
1
U 의 일부
준정적 변수
동적 링크
반환 주소
스택이
증가하는
방향
23
8.4 스택 기반 기억 장소 할당
• 활성레코드 크기 : 동적 바인딩 (실행 시 변화)
•
프로그램 실행 중에자료가 생성되고 회수되어 활성 레코드의 크기가 변하는 경우
• 동적(dynamic) 변수
• 실행 시 변수 크기가 수시로 변할 수 있는 변수
예) Algol68, Ada, Fortran90, C, C++, Java등에서 제공
힙 동적 배열 (heap dynamic array)
유연성 배열 (flexible array)
• 프로그램이 실행 중에 할당되는 자료들에 맞추어서 크기를
조절할 수 있는 배열
예) 프로그램에서 변수 생성 시점을 정해주는 변수들
new – Pascal, C++, Ada, Algol68, Java 등
malloc - C
24
8.4 스택 기반 기억 장소 할당
• 활성레코드 크기 : 동적 바인딩 (실행 시 변화)
– 동적 변수 특성
•
프로그램 실행 중에 생성/해제 가능
=> 동적 변수 생성 프로그램 종료 후에도 기억장소 유지
=> 스택의 활성레코드에 할당 불가
=> 힙(heap) 기억장소에 할당
명세표는 스택의 활성 레코드에 할당
스택 변수 : 준정적, 준동적 변수
힙 변수 : 동적변수
예) PL/I(controlled, based), Pascal(pointer), Algol68, Ada(access)
25
8.4 스택 기반 기억 장소 할당
• 동적메모리 할당 예 (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 : SEQREF ;
...
p := new SEQ(1..50);
• p := new SEQ(1..50);
① SEQ 형 메모리를 힙에 할당
② 시작 주소를 p에 배정
③ 명시적인 해제문장(free)까지 유지
26
B
CURRENT
(?)
C
P
A
M
그림 8.8 동적 변수를 스택에 할당 못하는 이유
27
8.4 스택 기반 기억 장소 할당
• 비지역 변수의 참조
- 다른 활성레코드의 변수 참조
① 지역변수 : 지역환경(local environment)
② 비지역변수 : 비지역환경(nonlocal environment)
• Fortran
① 지역 변수 - 현재 단위프로그램 활성레코드
② 전역 변수 - 시스템 제공 활성레코드
• ALGOL 유사 언어
① 지역 변수 - 현재 단위프로그램 활성레코드
② 비지역 변수 - 정적 내포관계
28
8.4 스택 기반 기억 장소 할당(10)
•
Algol68의 지역/비지역 변수 참조
<활성레코드 실행 상태>
<단위 프로그램 구조>
x 선언
unit A
F 의 활성
호출순서 : A →E →F →G →F →G →F
CURRENT
레코드
unit B
unit C
unit D
end D
정적링크
G 의 활성 레코드
•정적링크
- 단위프로그램 내포구조 표현
F 의 활성
레코드
• 동적링크
- 단위프로그램 호출 순서 표현
G 의 활성
레코드
end C
end B
동적
F의활레 C
정 F의GF의G의활활활레레레동링
A의E의활활레레 방증스
U
성코
적 성성성코코코적크
성성코코 향가택
R
드 R
링 드드드
드드 하이
E
크
N
링크
• F의 “y := x”
y : CURRENT + y의 옵셋
(지역변수)
x : E 활성레코드 시작 + x의 옵셋
(비지역변수)
T
는
unit E x 선언
unit F y 선언
y := x
end F
unit G x 선언
end G
end E
end A
F 의 활성
레코드
E 의 활성
레코드
A 의 활성
레코드
스택이
증가하는
방향
29
8.4 스택 기반 기억 장소 할당
• 비지역 변수의 참조 방법
(1)정적 체인(Static Chain )
A
x 선언
B
C
- 단위프로그램의 정적 내포관계
–
D
비지역 변수 검색방법
• 정적 체인을 따라 탐색
- 실행시간 낭비
• 간격(distance) 사용
- 간격 : 정적 내포 구조의 단계 수
예) D에서의 간격 : 지역변수(D 선언) -0
비지역변수(C 선언) - 1
비지역변수(B 선언) – 2
비지역변수(A 선언) - 3
=> 변수 주소 : (d,o)로 표현
d : 간격, o : 옵셋
- 간격 만큼 정적 링크 추적 (간격이 클때는 실행시간 낭비)
E
x 선언
F y선언…
y := x ;
…
G x 선언
30
F의 활성 레코드
CURRENT
그림 8.10
정적 링크가 첨가된
그림 8.7의 예
G의 활성 레코드
정적링크
F의 활성 레코드
G의 활성 레코드
동적 링크
F의 활성 레코드
E의 활성 레코드
A의 활성 레코드
스택이
증가하는
방향
31
그림 8.11
프로그램 구조와
활성 레코드 상태
A X선언
y선언
D의 활성 레코드
B y선언
D
•
. . .
. . .
•
B의 활성 레코드
Z선언
실행중
CURRENT
•
정적
링크
•
C의 활성 레코드
•
•
B의 활성 레코드
•
C
A의 활성 레코드
•
(a) 한 프로그램 구조 예
•
•
(b) (a)에서 ABCD 순으로
호출 실행 상태에서 있는
활성 레코드들의 스택 상태
32
8.4 스택 기반 기억 장소 할당(12)
• 비지역 변수의 참조 방법
• (2) 디스플레이
정적 체인 관계를 가변배열 형태로 표현
current
DISPLAY
m
– 방법
• (d, o) 개념 사용
• 유효주소(d, o) = DISPLAY(m-d) + o
m : DISPLAY 사용 활성레코드 수
d : 간격, o : 오프셋
장단점
• 모든 비지역 변수 참조시간 동일
• 활성레코드의 발생, 소멸 시 디스플레이 내용 변환
...
3
2
1
33
F의 활성레코드
그림 8.12
그림 8.10의 예에 대한
디스플레이 사용
G의활성레코드
F의 활성레코드
디스플레이
동적링크
G의활성레코드
레코드
3
2
F의활성레코드
E의 활성레코드
스택이
증가하는
방향
A의 활성레코드
1
배열
첨자값
34
8.5 힙 기억 장소 할당(Heap Storage Allocation)
• 영역 규칙
1) 정적 영역 규칙
- 번역기법에서 사용
주프로그램
2) 동적 영역 규칙
- 인터프리터 기법에서 사용
동적 기억 장소 할당 => 힙기법 이용
• APL 예
– 주프로그램의 변수 => 전역변수
– 인터프리터 언어
– 동적영역 규칙 사용
• 호출순서
1) 주프로그램 →SUB →FUN
Y는 SUB의 변수
2) 주프로그램 →FUN
Y는 주프로그램의 변수
Z ←0
X ←5
Y ←7
SUB 2
Z ←FUN Y
부프로그램 ▽ SUB 1 : Y
SUB
...
...X...
...Y...
Z ← FUN 1
...
▽
함수
FUN
▽ R ← FUN N:X
...
...X...
...Y...
▽
35
8.5 힙 기억 장소 할당
• 프로그램에서 실행 순간의 스택
APL - 비 지역변수 : 동적 링크 이용
APL 변수의 자료형과 크기 : 실행중 수시 변화
스택기반 할당 불가
실제 자료값 : 힙 기억장소 할당 후 포인터로 연결
36
주프로그램
Z ←0
X ←5
Y ←7
SUB 2
Z ←FUN Y
부프로그램 ▽ SUB 1 : Y
SUB
...
...X...
...Y...
Z ← FUN 1
...
▽
함수
FUN
X
CURRENT
N
R
Y
의
SUB
활성
레코드
▽ R ← FUN N:X
...
...X...
...Y...
▽
그림 8.14
한 실행 순간의 실행 스택
FUN
의
활성
레코드
I
Y
주프로그램의
활성
스택이 레코드
증가하는
방향
X
Z
Heap
슬라이드 쇼가 끝났습니다.
37
38
용 어 정리
39
모듈 (module)
용어 국제 표준 규격 15.06.01
module
program unit
모듈
단위 프로그램
A part of a program developed to be discrete or identifiable with respect to actions
such as compilation, binding, or execution, and that may interact with other programs
or parts of programs.
<NOTE> The concept referred to by the term "module" may vary according to the
different programming languages.
컴파일, 바인딩, 또는 실행과 같은 행위와 관련해서 분리되거나 식별이 가능하도록
개발된 프로그램의 일부분으로서 다른 프로그램이나 그 프로그램의 부분과
상호작용할 수 있다.
<주> 모듈”이라는 용어로 언급된 개념은 다양한 프로그래밍 언어들에 따라 차이가
있을 수 있다.