프로그램이 보는 주소 공간은 항상 가상입니다. (적어도 모든 최신 OS에서.)
OS API를 호출하여 메모리를 할당합니다 (또는 코드에서 변수를 정의 할 때 컴파일러가 대신 사용합니다).
할당 된 메모리에 대해 리턴 된 주소 (또는 프로그래밍 언어가 호출하는 포인터)는 프로그램의 컨텍스트에서 유효합니다.
자신에게 할당 한 메모리의 경우 OS로 반환해야 할 책임이 있습니다. 컴파일러가 당신 대신에 일을했다면 컴파일러는 필요한 정리 작업을 포함하게됩니다.
프로그램이 종료되면 OS도 정리를 수행합니다.
실제 프로그램 데이터가 컴퓨터의 실제 RAM에있는 곳은 완전히 학문적입니다. OS는 프로그램이 보는 가상 주소 공간을 실제 RAM 및 / 또는 스왑 공간에 매핑합니다. 당신은 자신이 어떤 주어진 시간에 그것이 어떻게 행해졌는지 간단히 알 수 없습니다.
장치 드라이버 나 커널 구성 요소를 프로그래밍하는 것이 중요 할 수 있지만 분명히 운영 체제 및 프로그래밍에 대한 지식은 필요하지 않습니다. 귀하의 질문에서 그 정도는 분명합니다.
이러한 소프트웨어는 다른 수준에서 작동하며 실제 실제 RAM과 상호 작용해야 할 수 있습니다. 이를 처리 할 수있는 특별한 방법과 API가 있지만 일반적인 사용자 작성 프로그램에서 이러한 메소드와 마주 치지 않을 것입니다.
또 다른 가능성은 가상 RAM과 물리적 RAM간에이 추상화 계층을 제공하는 OS가없는 임베디드 장치에서 저수준 프로그래밍을 수행 할 때입니다. 다시 : 이것은 전문가를위한 것입니다.
이것은 프로그래밍 언어의 규칙에 따라 올바른 프로그램을 작성하는 경우 걱정할 필요가없는 것입니다.
물론 : 프로그램이 올바르지 않은 경우 (예 : 할당되지 않은 메모리에 액세스하는 경우) OS가 프로그램이 오작동하고 있음을 발견하면 프로그램 자체가 충돌하거나 OS 자체에서 종료됩니다. 무엇이 잘못되었는지 알아 내고 프로그램의 문제를 수정하는 것은 프로그래밍의 중요한 측면입니다. 이를 디버깅이라고합니다.