책너두 (컴퓨터 밑바닥의 비밀) 30일차 CPU, 스택과 함수 호출, 시스템 호출, 스레드 전환, 인터럽트 처리 통달하기 (2)

  • 함수 호출과 실행 시간 스택
  • 함수를 호출할 때, CPU가 호출된 함수의 첫 번째 기계 명령어로 점프한 이후 함수 실행이 완료되면 다시 원래 위치로 점프해야 함.
    • 함수 상태의 보존과 복원을 포함해야함.
    • 보존해야하는 상태 정보에는 반환 주소 뿐만 아니라 사용한 레지스터 정보도 포함됨.
  • 함수 A가 함수 B를 호출할 때 실행 정보는 함수 A 스택프레임에 저장됨.
    • 함수 B가 실행 완료되면 스택 프레임 정보를 기반으로 함수 A의 실행이 재개됨.
  • 시스템 호출과 커널 상태 스택
  • 디스크 파일을 읽고 쓰거나 새로운 스레드 생성할 때, 누가 파일을 읽고 쓰는 작업을 하는가? 누가 스레드를 생성하는가?
    • 운영체제
  • ex) open 함수 호출 → 운영 체제가 파일을 여는 작업을 진행함.
  • 응용 프로그램은 시스템 호출을 통해 운영 체제에 서비스를 요청함.
    • 운영 체제 역시 내부적으로 요청을 처리하는 함수를 호출해야 함.
    • 이 함수를 호출할 때는 ‘실행 시간 스택’이 필요함.
    • 이 실행 시간 스택은 ‘커널 상태 스택(kernel mode stack)’에 있음.
  • 사용자 상태 스레드는 커널 상태에 대응하는 커널 상태 스택을 가지고 있음.
    • 사용자 스레드가 운영 체제의 서비스를 요청해야 할 경우 시스템 호출을 사용해야 함.
      • 여기서 시스템 호출은 특정 기계 명령어에 대응됨 (ex : 32비트 x86 에서 INT 명령어)
    • CPU가 해당 명령어를 사용할 때 사용자 상태에서 커널 상태로 전환됨.
      • 커널 상태에서 사용자 상태 스레드에 대응하는 커널 상태 스택을 찾아서 여기에서 대응하는 커널 코드를 실행하여 시스템 호출 요청을 처리함.
      • 여기서 사용자 상태 스레드의 레지스터 정보와 같은 ‘실행 상황 정보’는 커널 상태 스택에 저장됨.
      • 시스템 호출이 완료되면 커널 상태 스택에 저장된 사용자 상태 프로그램의 상황 정보에 따라 CPU 상태가 복원됨.
        • 커널 상태에서 사용자 상태로 전환됨.
  • 인터럽트와 인터럽트 함수 스택
  • 컴퓨터가 프로그램을 실행하는 도중에 키보드의 키 입력, 마우스 움직임, 네트워크 수신 작업을 처리할 수 있는 것은 모두 인터럽트 작동 방식을 이용하여 처리되기 때문임
  • 인터럽트는 현재 CPU 실행 흐름을 끊고 특정 인터럽트 처리 함수로 점프함.
    • 인터럽트 처리 함수의 실행이 완료되면 원래 위치로 다시 점프함.
  • 인터럽트 처리 함수 역시 함수이므로 일반 함수와 마찬가지로 ‘실행 시간 스택’이 있어야 함.
    • 인터럽트 처리 함수에 자체적인 실행 시간 스택이 없는 경우, 인터럽트 처리 함수는 커널 상태 스택을 이용하여 인터럽트 처리함.
    • 인터럽트 처리 함수에 인터럽트 처리 함수(interrupt service routine) 스택, 즉 ISR 스택이라는 자체적인 실행 시간 스택이 있는 경우가 있음.
      • 인터럽트 처리는 CPU 이기 때문에 모든 CPU가 자신만의 인터럽트 처리 함수 스택을 가짐.
  • 인터럽트 처리 함수와 시스템 호출은 비교적 유사하지만, 시스템 콜은 사용자 상태 프로그램이 직접 실행하고, 인터럽트 처리는 외부 장치로 실행됨.
    • 인터럽트가 발생하면 프로그램 실행이 일시적으로 중단되고 인터럽트 처리 함수로 점프함.
    • 이후는 시스템 호출과 유사함. (CPU가 사용자 상태 → 커널 상태 전환 → 사용자 상태 스레드에 대응하는 커널 상태 스택 찾음 → …)

댓글

Designed by JB FACTORY