운영체제

3. 프로그램의 구조와 실행

YJH3968 2021. 4. 23. 14:54
728x90

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

  • 프로그램이 CPU에서 명령을 수행하려면 해당 명령을 담은 프로그램의 주소 영역이 메모리에 올라가 있어야 한다.
  • 프로그램의 주소 영역은 크게 코드, 데이터, 스택 영역으로 구분된다.
    • 코드(code) : 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령어 형태로 변환되어 저장되는 부분
    • 데이터(data) : 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분
    • 스택(stack) : 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소와 데이터를 임시로 저장하는 데 사용되는 공간
  • 프로그램은 제일 처음 메인함수에서 실행을 시작해 메인함수가 다른 함수를 호출하면 스택에 메인함수의 현재 실행 시점을 저장하고 다른 함수의 코드로 점프해 그 함수를 실행한다. 이후 실행이 완료되면 스택에 저장된 위치로 복귀해 메인함수를 다시 실행한다.

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

  • 프로그램 카운터(Program Counter: PC) : CPU가 수행해야 할 메모리 주소를 담고 있는 레지스터
  • CPU는 PC가 가리키는 메모리 위치의 명령을 처리하고, PC는 주소 이동이 없는 이상 항상 바로 다음 명령을 가리켜서 코드의 순차적인 수행이 이루어진다.

3. 프로그램의 실행

  • 프로그램이 실행되고 있다는 것은 컴퓨터 시스템 차원에서 크게 두 가지 중요한 의미를 가진다. 
    • 첫 번째는 디스크에 존재하던 실행파일이 메모리에 적재된다는 의미이다.
    • 두 번째는 프로그램이 CPU를 할당받고 명령을 수행하고 있는 상태라는 의미이다.
  • 실행파일이 메모리에 적재될 때 보통 당장 CPU의 수행이 필요한 부분만 메모리에 올려두고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓는다.
  • 가상 메모리(논리적 메모리) : 프로그램마다 독자적으로 존재하는 코드, 데이터, 스택 등으로 구성된 주소 공간
  • 운영체제도 하나의 프로그램이므로 운영체제 커널 역시 코드, 데이터, 스택의 주소 공간 구성을 가지고 있다.
    • 커널의 코드는 CPU, 메모리 등의 자원을 관리하기 위한 부분과 사용자에게 편리한 인터페이스를 제공하기 위한 부분이 주를 이루고 있고, 이에 더해 시스템 콜인터럽트를 처리하기 위한 부분을 포함한다. 
    • 커널의 데이터 영역에는 하드웨어와 소프트웨어를 포함하는 시스템 내의 모든 자원을 관리하기 위한 자료구조가 저장되어 있다. 각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조인 PCB를 두고 있다.
    • 프로세스(Process) : 현재 수행 중인 프로그램
    • 커널의 스택 영역에는 프로세스마다 별도의 스택을 두어 관리한다. 이는 프로세스가 특권명령을 수행하기 위해 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출하는 경우 그 복귀 주소는 커널 내의 주소가 되어 사용자 프로그램의 스택과는 별도의 저장공간이 필요하기 때문이다.
    • 단, CPU의 수행 주체가 운영체제로 바뀌는 순간에는 직전에 수행되던 프로그램의 복귀 정보를 스택이 아닌 PCB에 저장함을 유의한다.

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

  • 프로그램이 사용하는 함수는 크게 사용자 정의 함수와 라이브러리 함수, 그리고 커널 함수로 나눌 수 있다.
    • 사용자 정의 함수 : 프로그래머가 직접 작성한 함수
    • 라이브러리 함수 : 누군가 작성해놓은 함수를 호출만 하여 사용하는 함수
    • 사용자 정의 함수와 라이브러리 함수는 모두 그 프로그램의 코드 영역에 기계어 명령 형태로 존재하기 때문에 프로그램이 실행될 때 해당 프로세스의 주소 공간에 포함되고, 함수호출 시에도 자신의 주소 공간에 있는 스택을 사용한다.
    • 커널 함수 : 운영체제 커널의 코드에 정의된 함수. 시스템 콜 함수와 인터럽트 처리 함수가 있다. 시스템 콜 함수로는 read() 함수와 write() 함수가 있고, 이 두 함수는 각각 입력과 출력을 필요로 할 때 호출하는 함수이다.
    • 커널 함수는 운영체제 커널의 주소 공간에 코드가 정의된다. 그래서 실행하려면 CPU를 운영체제에 넘겨야 하고, 이를 위해 인터럽트 라인을 세팅해야 한다.

5. 인터럽트

  • 인터럽트 처리 중 또 다른 인터럽트가 발생하는 경우 운영체제 커널의 데이터의 일관성이 유지되지 않는 위험성이 있어 원칙적으로는 허용하지 않는다.
  • 그러나 인터럽트마다 중요도가 다르기 때문에 인터럽트 처리 도중 중요도가 더 높은 인터럽트 발생 시 현재 수행 중이던 인터럽트 코드의 수행 지점을 저장하고 우선순위가 높은 인터럽트를 처리한다. 그 후 인터럽트 처리가 끝나면 저장된 주소로 복귀해 이전에 수행하던 인터럽트 처리 코드를 마저 수행한다.

6. 시스템 콜

  • 프로그램이 CPU를 할당받고 명령을 수행하다가 중간에 CPU를 빼앗기는 경우는 크게 두 가지가 있다.
    • 타이머에 의해 인터럽트가 발생하는 경우. 이는 시분할 시스템의 구현을 위한 필수적인 요소이다.
    • 입출력 요청을 위해 시스템 콜을 하는 경우. 입출력 요청은 시간이 오래 걸리므로 CPU를 다른 프로세스에게 이양한다.

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

  • 프로세스가 CPU에서 실행되는 경우 실행 상태를 크게 두 가지로 나눌 수 있다.
    • 사용자모드에서의 실행 상태(user mode running) : 자신의 주소 공간에 정의된 코드를 실행한다.
    • 커널모드에서의 실행 상태(kernel mode running) : 커널의 시스템 콜 함수를 실행한다.
    • 시스템 콜을 통해 실행하는 것이 운영체제 커널의 코드이지만, 사실상 프로세스가 해야 하는 일을 대행하는 것이기 때문에 시스템 콜이 실행 중일 때도 프로세스가 실행 상태에 있다고 간주한다. 이러한 상태를 '프로세스가 커널 모드에서 실행 중'이라고 이야기한다.

 

출처 : 운영체제와 정보기술의 원리

728x90

'운영체제' 카테고리의 다른 글

6. 메모리 관리  (0) 2021.04.27
5. CPU 스케쥴링  (0) 2021.04.25
4. 프로세스 관리  (0) 2021.04.24
2. 컴퓨터 시스템의 동작 원리  (0) 2021.04.22
1. 운영체제 개요  (0) 2021.04.20