Frinee의 코드저장소

프로그램의 구조와 실행

by Frinee
이 글은 반효경 저 - "운영체제와 정보기술의 원리"를 공부하고 정리하여 작성하였습니다.

 

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

  • 프로그램이 CPU에서 명령을 수행하기 위해선 해당 명령을 담은 프로그램의 주소 영역이 메모리에 올라가 있어야 함.
  • 프로그램의 주소 영역은 코드(code), 데이터(data), 스택(stack) 영역으로 구분됨.
    • 코드 영역: 사용자가 작성한 프로그램 함수의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장되는 부분
    • 데이터 영역: 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분
    • 스택 영역: 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 부분

ex) X 함수를 수행하는 중에 Y 함수를 호출

더보기
  1. X 함수에서 Y 함수를 호출한 지점을 스택에 저장
  2. Y 함수가 수행된 후 스택에 저장된 주소 위치(복귀주소)로 돌아와 코드를 계속 수행
  • 인터럽트 동작 원리도 함수의 호출과 비슷함
    • 인터럽트 시에는 CPU를 빼앗긴 위치는 운영체제가 관리하는 PCB에 저장함.

 

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

  • CPU는 계산 능력은 빠르지만 어떠한 작업을 수행하는지에 대한 결정은 하진 못한다.
  • CPU는 매 시점 메모리의 특정 주소에 존재하는 명령을 실행하고 이때 메모리 주소를 담고 있는 레지스터를 프로그램 카운터(Program Counter)라 부름.
  • 컴퓨터 시스템 구성 하드웨어 

  • 메모리에는 사용자 프로그램들과 운영체제가 같이 올라가 수행
  • CPU는 프로그램 카운터가 가르키는 메모리 위치의 프로그램 수행
    • 운영체제 부분을 가리키는 경우, 커널모드에서 수행 중
    • 사용자 프로그램 위치를 가리키는 경우, 사용자모드에서 수행 중
  • CPU가 수행 중인 명령
    • 일반명령
      • 메모리에서 자료를 읽어와 CPU 에서 계산하고 결과를 메모리에 쓰는 일련의 명령
      • 모든 프로그램이 수행할 수 있는 명령
    • 특권명령
      • 보안이 필요한 명령으로 입출력 장치, 타이머 등 각종 장치에 접근하는 명령
      • 항상 운영체제만이 수행할 수 있도록 제한
  • 사용자 프로그램이 실행할 수 없는 특권명령을 필요로 하여 운영체제에게 대행을 요청하는 것을 시스템 콜(System call)이라 한다.
  • 시스템 콜을 하게 되면 운영체제는 커널 영역에 정의된 시스템 콜 처리 코드를 수행함.

ex) 디스크 파일 접근

더보기
  1. CPU가 디스크 컨트롤러에게 데이터를 읽어오라는 명령을 내림
  2. 디스크 컨트롤러는 데이터를 읽고 저장한 후 인터럽트를 발생
  3. CPU는 인터럽트를 인지하고 인터럽트 처리루틴을 수행
  • CPU는 주변장치의 상태를 지속적으로 파악할 수 없기 때문에 주변장치가 인터럽트를 사용해 CPU에게 서비스를 요청함
  • 인터럽트를 발생시키기 위해 주변장치는 인터럽트 라인을 세팅하고 CPU는 명령 수행한 직후 인터럽트 라인을 체크하여 확인

 

3. 프로그램의 실행

  • 프로그램 실행의 의미
    1. 디스크에 존재하던 실행파일이 메모리에 적재됨
    2. 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태

  • 실행파일은 일부분만 메모리에 올라가고 나머지는 디스크 특정 영역으로 내려가 있다.
  • 프로그램의 주소 공간 중 CPU 수행에 필요한 부분만 메모리에 올리고 다른 부분은 스왑 영역에 내려놓는 방식으로 운영
  • 각각 프로그램마다 프로세스의 주소 공간을 별도로 갖고 이 공간을 가상메모리 혹은 논리적 메모리라 부름

3.1. 운영체제에서의 프로세스

  • 커널의 코드 영역
    • CPU, 메모리 등의 자원을 관리하기 위한 부분
    • 사용자에게 편리한 인터페이스를 제공하기 위한 부분
    • 시스템 콜 및 인터럽트를 처리하기 위한 부분
  • 커널의 데이터 영역
    • 각종 자원을 관리하기 위한 자료구조가 저장됨
    • CPU나 메모리를 위한 자료구조 뿐만 아니라 현재 수행 중인 프로그램을 관리하기 위한 자료구조도 저장됨
    • 현재 수행 중인 프로그램을 프로세스라 부르며, 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조인 PCB를 두고 있음
    • 시스템 내의 모든 자원을 관리하기 위한 자료구조를 유지하고 있음
  • 커널의 스택 영역
    • 함수 호출 시의 복귀 주소를 저장하기 위한 용도
    • 일반 사용자 프로그램과 달리 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리
      1. 특권명령 수행 시 저장하는 복귀주소가 커널 내 주소이기 때문에 별도의 저장공간이 필요하기 때문
      2. 커널은 일종의 공유 코드기 때문에 일관성 유지를 위해 별도의 스택을 둠

3.2. 정리

  1. 프로그램이 자기 자신의 코드 내에서 함수호출 및 복귀주소를 유지하기 위해 자기 주소 공간 내의 스택을 사용
  2. 시스템 콜이나 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수가 발생한 경우, 커널 스택을 사용
    • CPU 수행 주체가 운영체제로 바뀔 땐, 프로그램 복귀 정보를 PCB에 저장

 

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

  1. 사용자 정의함수
    1. 프로그래머 본인이 직접 작성한 함수
    2. 프로그램의 코드 영역에 기계어 명령 형태로 존재
  2. 라이브러리 함수
    1. 이미 누군가 작성해 놓은 함수를 호출하여 사용하는 함수 ex) sin(), printf()
    2. 프로그램의 코드 영역에 기계어 명령 형태로 존재
  3. 커널함수
    1. 운영체제 커널의 코드에 정의된 함수
    2. 시스템 콜 함수 ex) read(), write()
    3. 인터럽트 처리 함수
    4. 운영체제 커널의 주소 공간에 코드가 정의

 

5. 인터럽트

  • CPU는 매번 프로그램 카운터가 가리키고 있는 지점의 명령을 수행
  • 다음 명령 수행 직전에 인터럽트 라인이 세팅되었는지 확인
  • 인터럽트가 발생한 경우 CPU는 현재 수행하던 프로세스를 멈추고 운영체제의 인터럽트 처리루틴으로 이동하여 인터럽트 처리 수행
  • 만약 인터럽트 처리 중 인터럽트가 다시 발생한다면?
더보기
  • 원칙적으로 데이터의 일관성 유지를 위해 허용하지 않음
  • 하지만 더 우선순위가 높거나 CPU를 당장 사용해야 하는 일이 발생할 경우, 예외를 둔다.

 

6. 시스템 콜

  • 자신의 주소 공간을 거스르는 영역에 존재하는 함수를 호출하는 것을 말함. (해줘)
  • 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것
  • 주소 공간 자체가 이동하기 때문에 일반 함수호출과는 다른 방법을 사용

6.1.  (예시) 사용자 프로그램이 CPU에서 명령을 수행하던 중 디스크 파일을 읽어야 할 때

  1. 사용자 프로그램이 시스템 콜로 커널의 함수를 호출
  2. 인터럽트 라인을 세팅하는 명령
  3. CPU는 인터럽트가 발생했는지 점검
  4. 인터럽트가 발생한 것을 인지하고 프로그램을 멈춘 후 CPU의 제어권을 운영체제에게 넘김
  5. 설정된 인터럽트 라인에 의해 입출력을 요청하는 인터럽트임을 알고 서비스루틴으로 이동해 입출력 작업 수행
  6. 디스크를 읽어오는 작업은 많은 시간이 소요되기 때문에 운영체제는 입출력을 요청한 후 CPU의 제어권을 다른 프로세스로 이양함.
  7. 입출력 과정이 완료되면 디스크 컨트롤러가 CPU에게 인터럽트를 발생시켜 완료를 알림
  8. CPU는 사용자 프로세스 수행을 멈추고 인터럽트 처리루틴으로 그 제어권이 넘어감
    • 이때의 인터럽트는 하드웨어 인터럽트에 해당
    • 로컬버퍼로 읽어온 내용을 컴퓨터 내 메모리로 복사한 후 디스크 입출력을 요청했던 프로세스에게 다시 CPU 권한을 주는 것
  9. 해당 프로세스는 CPU를 기다리는 큐에 삽입되고 CPU는 다시 인터럽트를 당한 프로세스로 넘어가하던 작업을 계속 진행

정리

  • 프로그램이 CPU를 할당받고 명령을 수행하다가 중간에 CPU를 뺏기는 경우
    1. 타이머에 의해 인터럽트 발생: CPU 할당시간 만료 시 발생
    2. 입출력 요청을 위해 시스템 콜 발생
      • 입출력 작업이 시간이 오래 걸리기 때문에 입출력 작업이 완료되기까지 CPU를 다른 프로세스에 이양함.
      • 입출력 프로세스는 입출력 요청이 완료되어 인터럽트를 발생시킨 이후 CPU를 얻을 자격을 갖춤

 

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

  1. 사용자모드에서의 실행 상태: 자신의 주소 공간에 정의된 코드를 실행하는 것
  2. 커널모드에서의 실행 상태: 커널의 시스템 콜 함수를 실행하는 것
프로세스의 코드가 시스템 콜이 수행되는 동안 커널이 실행 상태에 있다고 하지 않고
“프로세스가 실행 상태에 있다”라고 말한다.
커널 입장에서는 프로세스가 해야 할 일을 대행하는 것뿐이기 때문에 프로세스가 실행된다고 간주함.

 

 

 

 


자료

  • 운영체제와 정보기술의 원리 (반효경 저, 2020.5)

'[컴퓨터 과학자 스터디] > 운영체제' 카테고리의 다른 글

CPU 스케줄링  (0) 2024.10.27
프로세스 관리  (0) 2024.10.22
컴퓨터 시스템의 동작 원리  (0) 2024.10.15
운영체제 개요  (1) 2024.10.11
컴퓨터 및 정보기술의 역사  (1) 2024.10.11

블로그의 정보

프리니의 코드저장소

Frinee

활동하기