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

  • 컴퓨터 시스템에는 함수 호출, 시스템 호출, 프로세스 전환, 스레드 전환, 인터럽트 처리와 같은 구조들이 있음.
    • 함수 호출을 통해 프로그래머는 코드 재사용성을 개선할 수 있음.
    • 시스템 호출로 프로그래머는 운영체제에 요청을 보낼 수 있음.
    • 프로세스와 스레드 전환으로 다중 작업이 가능함
    • 인터럽트 처리로 운영 체제가 외부 장치를 관리하게 할 수 있음.
      • 이러한 구조는 컴퓨터 시스템의 기반이 됨.
  • 레지스터
  • 레지스터를 사용하는 이유는 바로 속도 때문임.
    • CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도의 대략 100분의 1정도임.
  • 사실 레지스터와 메모리는 본질적 차이가 없음. 둘 다 정보를 저장하는데 사용함.
    • 단지 레지스터의 읽기 쓰기 속도가 훨씬 빠르고 제조 비용도 훨씬 비싸기에 용량에 한계가 있을 뿐임.
  • 스택 포인터 (스택 레지스터)
  • 실행되는 모든 함수는 스택 프레임을 가짐.
  • 스택의 가장 중요한 정보는 스택 상단(stack top)임
    • 스택 상단 점보는 스택 하단(stack bottom)으로 함수 호출 스택의 추적이 가능함.
  • 함수 실행 시 함수에 정의된 로컬 변수와 전달된 매개변수 등을 저장하는 독립적인 메모리 공간이 있음
    • 이 독립적인 메모리 공간을 스택 프레임(stack frame)이라고 함.
    • 함수 호출 단계가 깊어질수록 스택 프레임 수도 증가하며 함수 호출이 완료되면 함수 호출의 반대 순서로 스택 프레임 수가 줄어듬.
  • 함수 실행 시간 스택은 프로그램 실행 상태 중 가장 중요한 정보에 해당함.
    • 이외에도 ‘지금 어떤 명령어가 실행하고 있는지’ 에 대한 정보도 매우 중요함 → 명령어 주소 레지스터가 가지고 있음.
  • 명령어 주소 레지스터
  • 프로그램 카운터(program counter) 줄여서 PC 라고 부르기도 함.
  • x86 에서는 명령어 포인터 (instruction pointer) 줄여서 IP라고 부르기도 함.
  • 프로그래머가 고급 언어로 프로그램을 작성하면 컴파일러는 일련의 기계 명령어를 생성함.
  • CPU는 메모리에 기계 명령어로 가득찬 부분중 어떤 명령어를 실행하는 지 어떻게 하는가?
    • 프로그램이 실행되면 첫 번째로 실행할 기계 명령어의 주소가 PC 레지스터에 저장됨.
    • CPU는 이 PC 레지스터에 저장되어 있는 주소에 따라 메모리에서 명령어를 가져와서 실행함.
  • 일반적으로 명령어는 순차적으로 실행함.
    • 제어 이전(if 문과 같은 분기 점프, 함수 호출 반환)과 관련된 일부 기계 명령어는 새로운 PC 레지스터에 저장함.
  • 상태 레지스터
  • x86 구조에서 이를 FLAGS 레지스터라고 함
  • ARM 구조에서는 응용 프로그램 상태 레지스터라고 함.
  • ex) 산술 연산 시 자리 올림수가 발생하거나 오버플로가 발생할 때 이런 정보를 상태 레지스터에 저장함.

댓글

Designed by JB FACTORY