CS/Computer Architecture
메모리상의 데이터 배치
정요한
2022. 3. 18. 23:08
- 메모리상의 데이터 배치
static 이란? 정적==프로그램을 작성할 때 얼마나 많은 메모리가 필요한지 알고 있다.
dynamic이란? 동적 == 대부분의 경우 프로그램을 실행하기 전에는 크기를 알 수 없기 때문에 동적이라고 부름.
더 많은 데이터를 저장해야 할 경우 static은 스택, 아래로 자라는 형식으로 저장한다. 반대로 dynamic은 힙으로, 위로 자라나는 구조를 가지고 저장한다. 이 때, 힙과 스택이 서로 충돌하지 않게 하는 것이 중요하다. - 프로그램 실행
프로그래머는 함수를 정의하여 코드를 재사용한다. >> 어떤 함수는 여러 프로그램에서 쓸 만큼 유용할 경우가 있다. >> 이 경우 자주 쓰이는 함수를 한곳에 모아서 사용한다 (라이브러리)
프로그래밍은 한 곳에서 개발을 할 수 도 있지만, 프로그램을 여러 조각으로 나누면 여러 사람이 동시에 개발하기 쉽기 때문에 나누는 편이 더 좋다. 그렇다면 나눈 조각을 하나로 엮거나 연결 할 수 있어야 한다. 이 방법중 하나로 링커라는 프로그램을 통해서 조각들을 모아 실행한다. 그중에 현재 가장 유명한 매개 파일 형식으로 ELF(실행과 링크가 가능한 형식)이 있다.
링크 방식에는 크게 두 가지가 있다.
아래 그림의 왼쪽이 정적링크, 오른쪽이 동적 링크이다.
1.정적 링크
정적 링크란 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하는 방식을 말하며 링커에 의해 이루어진다. 즉, 자신이 작성한 프로그램에서 A라는 외부 함수를 사용했다면, A라는 외부 함수에 대한 정보를 자신이 작성한 프로그램의 실행파일을 만들 때 복사해온다. 따라서 불러오는 속도는 빠르지만, 메모리 효율이 좋지 않다. 또한, 라이브러리를 바꿀때마다 다시 컴파일하여 링크를 해주어야 한다는 단점이 있다.
2.동적 링크
동적 링크란 실행 가능한 목적 파일을 만들 때 프로그램에서 사용하는 모든 라이브러리 모듈을 복사하지 않고 해당 모듈의 주소만을 가지고 있다가, 런타임에 실행 파일과 라이브러리가 메모리에 위치될 때 해당 모듈의 주소로 가서 필요한 것을 들고 오는 방식이다. 런타임에 운영체제에 의하여 이루어진다. 따라서 불러오는 속도는 오버헤드로 인해 정적 링크에 비해 느리지만, 여러군데에서 불러올 경우에도 메모리 낭비가 없고, 주소만을 가르키기 때문에 다시 컴파일 할 필요가 없다.
레퍼런스-
https://dazemonkey.tistory.com/161
https://live-everyday.tistory.com/69
https://medium.com/@dkwok94/the-linking-process-exposed-static-vs-dynamic-libraries-977e92139b5f