books/OS

[OS] 프로그램의 구조와 실행

836586697769 2024. 2. 6. 13:35

@notion

<운영체제와 정보기술의 원리> 반효경 저

 

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

프로그램이 CPU에서 명령을 수행하려면 해당 명령을 담은 프로그램의 주소 영역이 메모리에 올라가 있어야 한다. 주소 영역은 크게 코드, 데이터, 스택 영역으로 구분된다.

  • 코드 영역: 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장
  • 데이터 영역: 전역 변수 등 프로그램이 사용하는 데이터를 저장
  • 스택 영역: 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장

인터럽트의 동작 원리도 함수의 호출과 비슷하다. 프로그램이 CPU를 할당받고 명령을 수행하고 있는데 인터럽트가 발생하면 프로그램은 현재 수행 중인 명령의 위치를 저장해놓는다. 그 후 CPU는 운영체제 내부 코드인 인터럽트 처리루틴으로 넘어가서 인터럽트 처리를 하고 다시 돌아와 프로그램의 이전 작업 지점부터 수행을 계속 이어나간다. 인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 프로세스 제어블록에 저장된다.

 

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

CPU는 매 시점 프로그램 카운터가 가리키는 메모리 위치의 명령을 하나씩 읽어와 실행한다.

  • 프로그램 카운터(Program Counter, PC): CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터

메모리에는 사용자 프로그램들과 운영체제가 같이 올라가 수행된다. 프로그램 카운터가 메모리 주소 중 운영체제가 존재하는 부분을 가리키고 있다면 CPU가 커널모드에서 운영체제의 코드를 수행 중이라는 뜻이며, 사용자 프로그램이 존재하는 메모리 위치를 가리키고 있다면 사용자모드에서 CPU가 수행되고 있는 것이다.

 

3. 프로그램의 실행

프로그램의 실행(program execution)은 첫 번째로 디스크에 존재하던 실행파일이 메모리에 적재된다는 의미와, 두 번째는 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태라는 의미를 가진다.

프로세스의 주소 공간은 코드, 데이터, 스택 등으로 구성된다.

  • 프로세스: 현재 수행 중인 프로그램

운영체제도 하나의 프로그램이므로 운영체제 커널 역시 이러한 주소 공간 구성을 가진다. 코드 영역은 시스템 콜 및 인터럽트를 처리하는 부분이며 데이터 영역은 현재 수행 중인 프로그램을 관리하기 위한 자료구조(e.g. PCB)를 저장한다.

스택 영역은 좀 다르다. 일반 사용자 프로그램의 스택과 달리 현재 수행 중인 프로세스마다 별도의 스택을 두어 관리한다. 프로그램이 자기 자신의 코드 내에서 함수호출 및 복귀 주소를 유지하기 위해서는 자기 주소 공간 내의 스택을 사용하고, 시스템 콜이나 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수호출이 발생할 경우 커널 스택을 사용하게 되는 것이다.

 

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

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

사용자 정의함수와 라이브러리 함수 모두 그 프로그램의 코드 영역에 기계어 명령 형태로 존재한다. 따라서 이 두 함수는 프로그램이 실행될 때에 해당 프로세스의 주소 공간에 포함되며, 함수호출 시에도 자신의 주소 공간에 있는 스택을 사용하게 된다.

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

운영체제 내에 있는 커널함수를 사용자 프로그램이 호출해서 사용한다. (운영체제에 CPU를 넘겨서 실행)

 

5. 인터럽트

원칙적으로는 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용하지 않는다. 인터럽트를 처리하는 중에 운영체제 커널에 정의된 데이터를 변경하고 있는데, 다른 인터럽트가 발생해 앞선 인터럽트에서 변경 중이던 데이터를 또다시 변경하게 되면 두 인터럽트에 의해 데이터가 원래 의도하지 않았던 결괏값으로 변경될 수 있기 때문이다.

그러나 인터럽트마다 중요도가 다르기 때문에 예외적으로 현재 처리 중인 인터럽트보다 더 높은 우선순위의 인터럽트가 발생한다면 현재 처리 중이던 인터럽트 코드의 수행 지점을 저장하고 우선순위가 높은 인터럽트를 처리 후 복귀한다.

 

6. 시스템 콜

시스템 콜은 함수호출이기는 하지만 자신의 주소 공간이 아닌, 커널이라는 다른 프로그램의 주소 공간에 존재하는 함수를 호출하는 것이다. 이는 프로그램 자신이 인터럽트 라인에 인터럽트를 세팅하는 명령을 통해 이루어진다.

프로그램이 CPU를 할당받고 명령을 수행하다가 중간에 CPU를 빼앗기는 경우는 크게 두 가지가 있다. 하나는 타이머에 의해 인터럽트가 발생하는 경우이고, 다른 하나는 입출력 요청을 위해 시스템 콜을 하는 경우이다.

 

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

하나의 프로세스가 시작되어 수행을 완료하기까지는 프로세스 자신의 주소 공간에 있는 코드만 실행되는 것이 아니라 커널의 주소 공간에 있는 코드도 실행된다. 이는 프로그램이 사용자 정의함수나 라이브러리 함수뿐 아니라 입출력 시스템 콜 등을 통해 운영체제 커널의 함수도 호출하여 실행하기 때문이다.

예를 들어 프로세스 A가 CPU에서 실행되고 있다고 하면, 이는 자신의 주소 공간에 정의된 코드를 실행하는 것과 커널의 시스템 콜 함수를 실행하는 것으로 나누어볼 수 있다.

  • 전자는 사용자모드에서의 실행 상태(user mode running), 후자는 커널모드에서의 실행 상태(kernel mode running)

시스템 콜을 통해 실행되는 것이 프로세스 A의 코드가 아닌 운영체제 커널의 코드이지만, 그동안 커널이 아닌 프로세스 A가 (커널모드에서) 실행 중이라고 말한다.

시스템 콜의 실행이 끝나면 다시 사용자모드로 복귀해서 시스템 콜 이후의 명령들을 계속 실행한다. 프로그램의 실행이 끝날 때에는 커널모드로 진입해 프로그램을 종료한다.

 

'books > OS' 카테고리의 다른 글

[OS] 디스크 관리  (1) 2024.06.11
[OS] 가상메모리  (2) 2024.06.11
[OS] CPU 스케줄링  (1) 2024.03.26
[OS] 프로세스 관리  (1) 2024.03.24
[OS] 컴퓨터 시스템의 동작 원리  (0) 2024.02.05