변수 동적 할당 원리가 무엇인가요?
글쓴이: rlj1202 / 작성시간: 수, 2016/09/21 - 5:17오후
뭐 당연히 사용하고 있지 않는 주소 공간을 찾아서 할당을 해 주는거겠지만, 어떻게 컴퓨터에서 사용하지 않는 주소공간을 구별하여 찾아낼 수 있나요?
목록으로 사용하고 있는 변수들의 주소와 크기를 적어두고 매번 동적 할당 시 마다 검색할리는 없고...
그리고 지역 변수는 한번 사용하고 사라진다고 하는데, 이 말이 동적 할당을 얘기하고 있는건가요? 아니면 데이터의 보존성을 보장해 주지 않는다는 말 인가요?
그리고 이런 변수의 할당은 소프트웨어 단위에서 하나요, 운영체제 단위에서 하나요, 혹은 더 아래에서 하나요?
Forums:
XIP 가 아닌 한, 운영체제 수준에선 모든
XIP 가 아닌 한, 운영체제 수준에선 모든 프로그램의 모든 메모리(코드,데이타,스택,힙)은 동적할당입니다.
> 뭐 당연히 사용하고 있지 않는 주소 공간을 찾아서 할당을 해 주는거겠지만, 어떻게 컴퓨터에서 사용하지 않는 주소공간을 구별하여 찾아낼 수 있나요?
> 목록으로 사용하고 있는 변수들의 주소와 크기를 적어두고 매번 동적 할당 시 마다 검색할리는 없고...
>
그렇습니다.
머리 좋은 사람들이 모여서 서로 멱살을 잡으며 온갖 괴기스러운 방법을 있는대로 다 동원해서 만듭니다.
그 중의 가장 기초적인 것은 https://ko.wikipedia.org/wiki/버디_메모리_할당
> 그리고 지역 변수는 한번 사용하고 사라진다고 하는데, 이 말이 동적 할당을 얘기하고 있는건가요? 아니면 데이터의 보존성을 보장해 주지 않는다는 말 인가요?
>
데이터의 보존성에 대한 얘기입니다.
지역 변수가 메모리에 어떻게 보관되는지 더 알고 싶으시면 https://ko.wikipedia.org/wiki/스택_버퍼_오버플로
> 그리고 이런 변수의 할당은 소프트웨어 단위에서 하나요, 운영체제 단위에서 하나요, 혹은 더 아래에서 하나요?
>
보통은 어플리케이션이 요청을 하고 운영 체제가 할당합니다.
https://ko.wikipedia.org/wiki/동적_메모리_할당 과 https://ko.wikipedia.org/wiki/정적_메모리_할당 을 읽어보시고요.
앞서 말씀드린 머리 좋은 사람들의 멱살잡이는 운영체제 수준의 메모리 관리 뿐만 아니라 어플리케이션 수준의 메모리 관리에서도 일어납니다.
왜냐하면 c++ 처럼 수십~수백 바이트 정도의 메모리 할당이 엄청나게 발생하는 상황에선 그 횟수가 큰 문제가 되기 때문에
운영 체제에게 뭔가를 요청한다는 것 자체가 부담이므로 어플리케이션 수준에서 해결해야 합니다.
보통은 C library 수준에서 해결합니다.
좀 더 위로 올라가서 일반 어플리케이션의 특정 기능을 구현할 때도 빈번한 alloc/free 가 예상되는 시나리오라면,
프로그래머가 스스로 자기 어플리케이션 안에 뭔가를 구현하는게 일반적입니다.
이게 귀찮으면 https://ko.wikipedia.org/wiki/쓰레기_수집_(컴퓨터_과학) 을 알아봐야하고요.
질문 하나하나 자세히 설명해 주셔서 감사합니다!
질문 하나하나 자세히 설명해 주셔서 감사합니다! 메모리 할당 알고리즘에 관해서 더 궁금한 점이 있는데요, 변수할당 방법을 보려면 태초의 언어로 거슬러 올라가 그 내용을 보면 알 수 있지 않을까 해서 본적이 있는데, 어샘블리도 생각했던것 보다 디테일 하게 변수를 선언하는것 같지 않았습니다. 그냥 변수 형이 없다는것 정도...?
int i = 0;
mov dword ptr [i], 0Ah
많은것이 간략되어 있다는 느낌이 들었는데, 어샘블리도 고급화가 된건가요?
지역변수라는 것 자체는 사람이 직관적으로 이해할 수
지역변수라는 것 자체는 사람이 직관적으로 이해할 수 있는 수준의 레이블일 뿐입니다.
C 컴파일러는 지역 변수 크기의 총 합만큼 스택 포인터를 옮기는 코드를 함수 첫머리에 집어넣고,
각 변수의 레이블들을 스택 포인터에 대한 오프셋으로 번역해서 어셈블리 코드를 내놓습니다.
이것이 소위 "정적 할당"이라 부를 수 있는 것이고,
운영체제에 의해 "동적 할당"된 스택 메모리를 이용하는 어플리케이션 수준의 "정적 할당" 의 대표적인 예 입니다.
프로그램을 실행하면 OS에서 프로세스를 만드는데 이때
프로그램을 실행하면 OS에서 그 프로그램을 실행하는 프로세스를 만드는데 이때 기본적으로 코드와 스택을 만듭니다.
코드는 실행할 프로그램을 저장할 메모리 공간이고, 할당한 뒤에는 실행파일을 로드하고요
스택은 프로시저 루틴(함수)의 실행과 반환을 위해 사용되는 공간인데 각 프로시저 단위로는 LIFO 방식으로만 씁니다. 그래서 지역변수가 여기에 생깁니다.
이 둘은 프로세스 만들어질때 기본적으로 만들어지고, 그 외에 힙이라고 하는 동적 메모리 할당 공간이 있는데 이건 처음에 만들지 않고, 프로그램이 요청 할때에만 만들어 줍니다.
MMU 없는 옛날 프로세서(즉 프로그램이 실제 메모리 주소 사용하는 경우)들은 OS에서 동적 할당했지만 요즘은 그렇게 안할껄요. 실행된 프로그램이 사용하는 메모리 주소는 컴퓨터의 실 메모리 주소와 상관없는 가상주소고 OS에서는 주소 매핑만 하면 끝입니다. 전문용어로 페이징기법이라고 하는데, 원리는 컴퓨터 구조론 좀 봐야 됩니다.
Written By the Black Knight of Destruction