4 프로그램의 구조와 실행

3 minute read

4 프로그램의 구조와 실행

1 프로그램의 구조와 인터럽트

  • 프로그램의 주소 영역
    • 코드(code): 작성한 프로그래미 함수들의 코드가 CPU에서 수행할 수 있는 기계어(machine instruction) 형태로 변환되어 저장
    • 데이터(data): 전역변수(global variable)등 프로그램이 사용하는 데이터를 저장
    • 스택(stack): 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장
  • 인터럽트 동작 원리
    • 인터럽트 발생시 수행중 명령의 위치 PCB에 저장 → 운영체제 내부 코드인 인터럽트 처리루틴으로 넘어가 인터럽트 처리 → 다시 돌아와 이전 작업 지점부터 수행 재개

2 컴퓨터 시스템의 작동 개요

  • 프로그램 카운터(Program Counter: PC): CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터
  • 컴퓨터 시스템 구성
    • 하드웨어: CPU, 메모리
    • 입출력 장치와 이를 전담하는 작은 CPU(입출력 컨트롤러)와 메모리(로컬 버퍼)
  • 커널모드(kernel mode): 프로그램 카운터가 메모리 주소 중 운영체제가 존재하는 부분을 가리키고 있는 경우 (운영체제의 코드를 수행)
  • 사용자 모드(user mode): 프로그램 카운터가 사용자 프로그램이 존재하는 메모리 위치를 가리키고 있는 경우 (사용자 프로그램 수행)
  • 일반명령
    • 메모리에서 자료를 읽어와 CPU에서 계산하고 결과를 메모리에 쓰는 일련의 명령들
    • 모든 프로그램이 수행 가능
  • 특권명령
    • 보안이 필요한 명령
    • 입출력장치, 타이머 등 각종 장치에 접근하는 명령
    • 운영체제만 수행 가능하도록 제한(모드비트 확인)
  • 시스템 콜(system call)
    • 사용자 프로그램이 특권명령을 수행하기 위해 운영체제에게 하는 요청

시스탬의 작동 개요

3 프로그램의 실행

  • 의미 1) 디스크에 존재하던 실행파일이 메모리에 적재된다.

    2) 프로그램이 CPU를 할당받고 명령(instruction)을 수행하고 있는 상태

  • 가상메모리(virtual memory) 또는 논리적 메모리(logical memeory)

    • 각각의 프로그램마다 독자적으로 가지고 있는 코드, 데이터, 스택 등의 공간
    • 실제 물리적 메모리 주소와 독립적으로 각 프로그램마다 독자적인 주소 공간을 가진다.

프로그램의 실행

  • 커널의 코드, 데이터, 스택

    • 코드
      • CPU, 메모리 등의 자원을 관리하기 위한 코드
      • 사용자에게 편리한 인터페이스를 제공하기 위한 코드
      • 시스템 콜, 인터럽트 처리 코드
    • 데이터
      • 각종 자원을 관리하기 위한 자료구조
      • 현재 수행중인 프로그램을 관리하기 위한 자료구조
      • PCB: 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조
    • 스택
      • 함수 호출시의 복귀 주소를 저장하기 위한 용도
      • 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리
        • 프로세스가 특권명령을 수행하려고 커널에 정의된 시스템 콜을 호출하고, 시스템 콜 내부에서 다른 함수를 호출하는 경우 → 복귀 주소는 커널 내의 주소 → 사용자 프로그램의 스택과는 별도의 저장공간이 필요
        • 커널은 일종의 공유 코드 → 모든 사용자 프로그램이 시스템 콜을 통해 커널의 함수를 접근 가능 → 일관성 유지를 위해 각 프로세스마다 커널 내에 별도의 스택을 둠
    • 정리
      • 시스템 콜 또는 인터럽트 발생으로 CPU 수행주체가 운영체제로 변경 → 직전 수행 되던 프로그램의 복귀 정보를 스택이 아닌 PCB에 저장 (프로그램 내의 스택은 할당받은 메모리중 프로그램 내에서 사용) 메모리 구조 참조
      • 커널 코드 수행 중 함수호출 → 커널 스택 사용
      • 커널 스택은 프로세스마다 별도 → 커널 내에서 이루어 지는 함수 호출은 직전 CPU를 가지고 있던 프로세스의 커널 스택을 사용

운영체제의 공간 주소

4 사용자 프로그램이 사용하는 함수

  • 사용자 정의 함수
    • 프로그래머 본인이 직접 작성한 함수
  • 라이브러리 함수
    • 이미 누군가 작성해놓은 함수를 호출만 하여 사용하는 경우

      • 사용자 정의함수, 라이브러리 함수: 프로그램의 코드 영역에 기계어 명령 형태
      • 프로세스 주소 공간에 포함, 호출 시에도 자신의 주소 공간에 있는 스택 사용
  • 커널 함수

    • 운영체제 커널의 코드에 정의된 함수
    • 시스템콜 함수: 사용자 프로그램이 운영체제의 서비스를 요청하기 위해 호출 (ex_) read(), write()
    • 인터럽트 처리 함수: 각종 하드웨어 및 소프트웨어가 CPU의 서비스를 요청하기 위해 발생
    • 운영체제의 내의 함수를 사용자 프로그램이 호출해서 사용

5 인터럽트

  • 타이머에 의한 인터럽트
  • CPU는 다음 명령 수행 전 인터럽트 라인 세팅 여부를 확인 → 인터럽트 발생시 운영체제의 인터럽트 처리루틴으로 CPU 이동 → 인터럽트 처리 후 발생 직전 프로세스에 CPU제어권 이동
  • 인터럽트 처리 중 다른 인터럽트의 발생
    • 데이터의 일관성 유지 문제로 원칙적으로는 허용 X
    • 예외적으로 더 급한 인터럽트 발생시 허용

6 시스템 콜

  • 자신의 주소공간을 거스르는 영역에 존재하는 함수를 호출하는 것(커널함수 호출)
  • 프로그램이 스스로 인터럽트 라인에 인터럽트를 세팅

7. 프로세스의 두가지 실행 상태

  • 사용자모드에서의 실행 상태(user mode running)
    • 자신의 주소공간에 정의된 코드를 실행
  • 커널모드에서의 실행 상태(kernel mode running)
    • 커널의 시스템 콜 함수를 실행
  • 프로세스 A가 시스템 콜을 요청한 경우 시스템 콜이 수행되는 동안은 프로세스 A가 실행상태에 있다 한다
    • 커널이 실행상태에 있다고 하지 않음! → ‘프로세스 A가 커널모드에서 실행 중’

Leave a comment