시스템 메모리의 기본 구조

어떤 프로그램을 동작시키면 메모리에 프로그램이 동작하기 위한 가상의 메모리 공간이 생성된다. 그리고 그 메모리 공간은 다시 목적에 따라 상위 메모리와 하위 메모리로 나뉜다. 이때 상위 메모리에는 스택(Stack)이라는 메모리 공간이 형성되고, 하위 메모리에는 힙(Heap)이 생성된다.

스택 영역과 힙 영역

간단히 말해 스택 영역은 프로그램 로직이 동작하기 위한 인자(Argument)와 프로세스 상태를 저장하는 데 사용되고, 힙 영역은 프로그램이 동작할 때 필요한 데이터 정보를 임시로 저장하는 데 사용된다.

스택 영역은 레지스터의 임시 저장 장소, 서브루틴 사용 시 복귀 주소(Return Address) 저장, 서브루틴에 인자(Argument) 전달 등에 사용된다. 스택은 메모리의 상위 주소에서 하위 주소 방향으로 사용하며, 후입선출(LIFO: Last In First Out) 원칙에 따라 나중에 저장된 값을 먼저 사용한다.

스택의 동작은 프로그램 실행 구조를 다룰 때 자세히 살펴볼 텐데, 스택의 동작을 이해하려면 CPU의 임시 메모리인 레지스터에 대해서도 알아야 한다.

힙 영역은 프로그램이 실행될 때까지 알 수 없는 가변적인 양의 데이터를 저장하기 위해 프로그램의 프로세스가 사용할 수 있도록 미리 예약되어 있는 메인 메모리의 영역으로, 프로그램들에 의해 할당되었다가 회수되는 작용이 되풀이된다. 스택 영역이 엄격하게 후입선출(LIFO) 방식으로 운영되는데 반해, 힙 영역은 프로그램들이 요구하는 블록의 크기나 요구/횟수 순서에 일정한 규칙이 없다.

힙의 기억 장소는 대개 포인터 변수를 통해 동적으로 할당받고 돌려주며, 이는 연결 목록이나 나무, 그래프 등의 동적인 데이터 구조를 만드는 데 반드시 필요하다. 만약 프로그램 실행 중 해당 힙 영역이 없어지면 메모리 부족으로 이상 종료를 하게 된다.

(정보 보안 개론, 2013. 6. 28., 양대일)

Floating Point 부동소수점, Heap, Stack, Overflow :: bpDev (tistory.com)

 

Floating Point 부동소수점, Heap, Stack, Overflow

부동소수점 컴퓨터에서 실수를 표시하는 방법으로, 소수점의 위치를 고정시키지 않으며 가수와 지수를 사용하여 실수를 표현한다. 가수는 유효숫자를 나타내며 지수는 소수점의 위치를 나타낸

bpdev.tistory.com

 


 

 

객체 복사

객체 지향 프로그래밍에서 객체 복사(object copying)는 객체 지향 프로그램에서 말하는 데이터 단위인 기존의 객체의 사본을 생성하는 것이다. 그 결과로 나오는 객체를 "객체 사본"(object copy) 또는 간단히 "사본"(copy)이라고 부른다. 복사는 기초적이지만 예민성이 있어서 상당한 부하를 일으킬 수 있다. 객체 복사에는 여러 방법이 있으며 그 중 가장 흔한 것이 복사 생성자나 복제를 통한 것이다. 사본은 수정이나 이동이 가능하며 현재 값을 보존할 수 있다. 이 중 어느 것도 불필요하다면 복사가 발생되지 않는 방식으로 원본 데이터의 참조만으로 충분하며 더 효율적이다.

객체는 일반적으로 컴포지트 데이터를 저장한다. 단순한 경우 복사는 새로운, 초기화되지 않은 객체를 할당하여 원본 객체의 모든 필드 속성을 복사함으로써 이루어지지만 복잡한 경우 이는 원하는 동작대로 결과가 나오지 않게 된다.

복사 방식

객체들 대부분의 설계적 목표는 하나의 획일적인 블록으로 만들어진 것과 유사한 것을 제공하는 것이다. 객체는 여러 부분으로 구성되므로 복사는 사소한 일이 아니다. 이 문제를 처리하기 위해 여러 전략이 존재한다.

xi 필드를 포함하는 객체 A가 있다고 가정하자. (구체적으로 말해, A가 문자열이고 xi가 문자 배열임). 여기서 A의 사본을 만들기 위한 각기 다른 전략으로 얕은 복사(shallow copy)와 깊은 복사(deep copy)가 있다. 수많은 언어는 하나의 "복사" 조작을 정의하여, 또는 개개의 "얕은 복사"와 "깊은 복사" 조작을 정의하여 이루어지는 총체적인 복사를 허용한다.[1]

얕은 복사, 깊은 복사라는 용어는 스몰토크-80으로 거슬러 올라간다.[2]

얕은 복사

객체를 복사하는 한 방식으로 얕은 복사가 있다. 이 경우 새 객체 B가 생성되며 A의 필드 값들은 B로 복사된다.[3][4][5][6] 이를 필드-바이-필드 카피(field-by-field copy)라고 부르며,[7][8][9] 필드-포-필드 카피(field-for-field copy), 필드 복사(field copy)라고도 한다.[10] 필드 값이 객체 참조인 경우(예: 메모리 참조) 참조를 복사하므로 A가 참조하는 것과 동일한 객체를 참조하며 필드 값이 원시 자료형인 경우 원시 자료형의 값을 복사한다. 원시 자료형이 없는 언어(모든 것이 객체)의 경우 사본 B의 모든 필드는 원본 A 필드와 동일한 객체의 참조가 된다. 이렇게 참조된 객체는 공유되므로 이 객체들 중 하나가 수정되면(A 또는 B로부터) 다른 쪽에서도 변경 사항이 보이게 된다. 얕은 복사는 단순하고 일반적으로 비용이 적으므로 단순히 비트를 정확히 복사함으로써 구현할 수 있는 것이 보통이다.

깊은 복사

얕은 복사의 대안으로 깊은 복사가 있다. 이는 필드가 역참조됨을 의미한다. 즉, 복사되는 객체에 대한 참조 대신, 참조가 되는 모든 객체를 위한 새 사본의 객체가 만들어진다. 사본 B에 의해 참조되는 객체들이 A에 의해 참조되는 것과 구별되어 독립적이라는 점에서 깊은 복사의 결과는 얕은 복사의 결과와 구별이 된다. 깊은 복사는 추가 객체의 생성이 필요하기 때문에 비용이 더 많으며, 참조가 잠재적으로 복잡한 그래프를 형성할 수 있기 때문에 상당히 더 복잡하다.

(위키백과)

진행 중인 깊은 복사

 

 

https://zzang9ha.tistory.com/372

 

[Java] - 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)

📎 Java 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy) 안녕하세요! 이번에 정리할 내용은 자바에서의 깊은 복사와 얕은 복사 입니다. 깊은 복사와 얕은 복사라는 개념은 평소에 접한적이 꽤 있었습

zzang9ha.tistory.com

https://velog.io/@ellyheetov/Shallow-Copy-VS-Deep-Copy

 

깊은 복사 VS 얕은 복사

이를 해결하기 위한 방법이 Copy on write이다. 처음 복사를 했을 시, 단지 메모리의 주소를 복사하기만 한다. 즉, 얕은 복사가 이뤄지는 것이다. 이후에 변화가 발생하면 실제 깊은 복사는 뒤늦게

velog.io

 

+ Recent posts