2012-10-17 4 views
6

이 질문은 프로세스 스케줄링을 공부할 때 제 머리 속으로 왔습니다.OS는 어떻게 컴파일 된 바이너리 파일을 실행합니까?

OS가 바이너리 및 컴파일 된 파일의 실행을 어떻게 제어하고 제어합니까? 아마 OS가 바이너리의 일부를 메모리 위치로 복사하고, 거기서 점프하고, 블록을 실행 한 후 다시 돌아와서 다음 블록을 실행한다고 생각했습니다. 그러나 프로그램을 제어 할 수는 없습니다 (예 : 프로그램이 어디서나 점프 할 수 있고 돌아 오지 않을 수도 있음).

JVM의 경우에는 VM이 ​​각 명령어를 해석하는 것이 좋습니다. 하지만 바이너리 파일의 경우 지침은 실제 CPU 실행 가능 명령어이므로 OS가 VM처럼 작동하지 않는다고 생각합니다.

+0

CPU가 CPU 명령어를 실행하는 방법을 알고 있습니까? – sll

+0

네, 작년에 Verilog를 사용하여 대학에서 좀 더 복잡한 RISC 디자인을하고 슈퍼 간단한 CPU (하나의 범용 레지스트리, 명령어와 PC를 저장하는 레지스트리, 아마도 5 개의 명령어)를 설계했습니다. – Gediminas

답변

4

정확히 같습니다. 어떤 순서로 운영 체제,

  • 은 프로세스 메모리
  • 포인트 처리 명령의 프로세스
  • 로드 프로그램 코드를 가상 메모리 공간을 생성하는 프로세스 테이블에 항목을 만듭니다 프로세스 진입 점의 포인터
  • 은 스케줄러에 항목을 만들고 프로세스 스레드를 실행할 준비가 된 상태로 설정합니다.

동시 처리는 프로그램을 블록으로 분할하여 처리하지 않습니다. 작업 간 전환은 인터럽트를 통해 수행됩니다. 프로세스에 CPU가 주어지기 전에 타이머가 설정됩니다. 타이머가 끝나면 CPU는 인터럽트를 등록하고 명령 포인터를 스택에 푸시하고 운영 체제에서 정의한 인터럽트 처리기로 점프합니다. 이 핸들러는 CPU 상태를 메모리에 저장하고 가상 메모리 테이블을 스왑하며 실행 준비가 된 다른 스레드를 복원합니다. 스레드가 다른 이유로 (사용자/디스크/네트워크를 기다리는 중 ...) 또는 수율을 위해 일시 ​​중지해야하는 경우에도 동일한 스왑이 발생합니다. CPU가 가능하지만, 신뢰성이 산출 처리에 의존하는
http://en.wikipedia.org/wiki/Multitasking#Cooperative_multitasking.2Ftime-sharing

보안 보호 모드로 CPU를 전환하여 처리 (프로세스가 실행되는 다른 처리를 방지 수득되지 않을 수도) 있다는
http://en.wikipedia.org/wiki/Multitasking#Preemptive_multitasking.2Ftime-sharing

참고 여기서 응용 프로그램 코드는 몇 가지 지침을 실행할 수 없습니다 (따라서 임의로 점프하는 것은 거의 무해합니다). the link provided by @SkPhilipp

현대 JVM은 각 명령을 해석하지 않는다는 점에 유의하십시오 (속도가 느림). 대신 네이티브 코드로 컴파일하고 코드를 실행하거나 (Just-In-Time 컴파일의 경우) 처음에는 해석하지만 "자주 발생하는 코드"(충분히 자주 실행되는 코드)를 컴파일합니다.

관련 문제