메모리에 프로그램 로드 및 실행 [닫기]

메모리에 프로그램 로드 및 실행 [닫기]

링크 로더와 링크 편집기를 비교하면서 알게 된 한 가지 사실은 링크 로더의 경우 링크 및 재배치가 프로그램이 실행될 때마다 발생하고(로드 시 발생함) 아래 링크 편집기의 경우 링크가 한 번만 발생하고 프로그램을 여러 번 로드하고 사용할 수 있습니다. 이는 프로그램이 실행 제어를 받은 경우에만(또는 운영 체제가 해당 프로그램을 다음 실행 프로그램으로 결정한 경우에만) 주 메모리에 로드된다는 의미입니까?구체적으로, 프로그램을 주 메모리에 로드하면 즉각적인 실행 슬롯이 보장됩니까?

답변1

여기서 몇 가지 사항을 명확히 해야 합니다.

  1. 프로그램이 하드 드라이브에 있든 메모리에 있든 사실상 차이가 없습니다. 커널이 이미 메모리에 매핑된 파일을 찾지 못하면 mmap해당 지점부터 프로그램의 가상 메모리에 매핑된 메모리 페이지를 통해 파일에 액세스합니다. 전체 메커니즘은 투명하지만 백그라운드에서 많은 일이 발생합니다. 파일이 이전 사용에서 캐시되었을 수 있고 공간이 부족하면 실제 메모리가 디스크로 스왑되었을 수 있습니다.
  2. 동적링크 라이브러리에 실행파일이 많이 연결되어 있어도 동적링크 라이브러리는 한번만 로드됩니다. 마찬가지로 페이지는 해당 페이지가 필요한 프로세스의 가상 메모리에 매핑됩니다.
  3. 실행 파일의 내용을 메모리에 로드하는 것은 실행 중인 코드와 아무 관련이 없습니다. (포크를 통해) 새로운 프로세스가 생성될 때마다 자체 가상 메모리 레이아웃을 갖게 되며 페이지가 어디에 저장되어 있는지, 누가 사용하는지 상관하지 않습니다. 호출 되면 exec( execve일반적으로) 바이너리(및 아마도 elf형식)가 구문 분석되고, 다른 내용이 다른 페이지(프로그램 코드, 정적 데이터, 스택 할당 등)에 매핑되고, 링커는 코드에서 해결되지 않은 기호를 찾고 이 단계에서는 가상 주소 공간에도 매핑되는 동적 연결 가능 라이브러리의 주소에 매핑됩니다. 그런 다음 실행은 실행 프로그램의 코드 진입점으로 전달됩니다.

특정 프로그램의 각 실행은 고유한 새로운 프로세스이며 코드의 출처는 실제로 신경 쓰지 않습니다. 코드는 이미 RAM에 있을 수도 있고 그렇지 않을 수도 있습니다. 메모리 관리는 매우 동적입니다. 코드를 포함하는 동일한 물리적 메모리 페이지가 여러 프로세스의 주소 공간에 매핑되고 동적 링크 라이브러리가 확실히 동일한 공유 페이지를 사용하는 것도 가능하지만 그게 전부입니다.

일반적으로 사용되는 라이브러리는 시작 시 미리 로드될 수 있으므로 프로세스가 더 빠르게 실행됩니다. 그러나 이는 링커가 이미 RAM에 로드된 페이지를 찾았으므로 하드 드라이브에서 해당 페이지를 읽을 필요가 없음을 의미합니다. 이것은 다시 캐싱 방법이며 커널이 원하는 방식으로 페이지를 섞는다는 사실의 부작용일 뿐이며 사용자가 보는 것은 가상 주소 공간뿐입니다.

기존 프로세스를 재사용하기 위해 명령을 호출하는 경우를 말하는 경우에는 완전히 다릅니다. 아마도 기존 인스턴스를 찾고 수행할 작업을 알려주는 통신 프로토콜이 있을 것입니다. 또는 할 일이 더 있을 때 잠에서 깨어나는 수면 과정이 있을 수도 있습니다. 그러나 이러한 경우에는 실제로 새 프로세스를 실행하지 않습니다.

귀하의 질문이 무엇인지 잘 모르겠지만 이것이 귀하의 질문에 적어도 부분적으로 답변이 되기를 바랍니다.

답변2

귀하의 질문은 이해하기 어렵고 일부 오해가 있을 수 있습니다.

이는 프로그램이 실행 제어를 받은 경우에만(또는 운영 체제가 해당 프로그램을 실행할 다음 프로그램으로 결정한 경우에만) 주 메모리에 로드된다는 의미입니까?

execve()UNIX에서는 시스템 호출(및 그 변형)을 통해 제어가 다음 프로그램으로 이전됩니다. 이 시스템 호출은 실행될 프로그램의 파일 이름을 인수로 사용합니다. 따라서 프로그램을 로드하고 실행하라는 요청과 같습니다. 프로그램이 아직 사전 로드되지 않았습니다. 그런 의미에서 귀하의 질문에 대한 대답은 "예"입니다.

이전에 프로그램 코드를 읽거나 실행한 적이 있으면 여전히 물리적 메모리에 캐시되어 있을 수 있다는 사실을 무시합니다. 이것은 최적화입니다.

커널이 가장 먼저 하는 일은 문제의 파일을 로드하는 것입니다.

동적으로 링크된 실행 파일인 경우 프로그램에서 런타임 링크를 수행하는 도우미 프로그램인 동적 링커도 로드합니다. 이 도우미는 일반적으로 다른 코드 조각(공유 라이브러리)을 로드하는 작업을 수행합니다.

동적 연결이 완료되면(또는 프로그램이 동적으로 연결되지 않아 동적 연결이 완료되지 않은 경우) 적절한 프로그램 코드로 제어가 전달됩니다.

프로그램을 주 메모리에 로드하면 슬롯이 즉시 실행되는 것이 보장됩니까?

"즉시 슬롯 실행"이 이해가 안 됩니다.

파일(프로그램 포함)을 메모리에 로드하는 데는 실행, 복사, 편집 등 여러 가지 이유가 있을 수 있습니다.

관련 정보