기록하는 습관을 들이자

[ 운영체제 정리 ] 4장 프로그램의 구조와 실행 - 운영체제와 정보기술의 원리 본문

운영체제

[ 운영체제 정리 ] 4장 프로그램의 구조와 실행 - 운영체제와 정보기술의 원리

myeongmy 2020. 9. 4. 00:44
반응형

 

※ 해당 포스팅은 이화여대 반효경 교수님 저서 [운영체제와 정보기술의 원리] 책 내용을 기반으로 작성되었습니다.

 

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

 

우리가 사용하는 컴퓨터 프로그램의 내부 구조는 함수들로 구성된다.

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

 

※ 코드 영역 : 프로그래머가 작성한 프로그램 함수들의 코드가 기계어 형태로 변환되어 저장되는 부분

   데이터 영역 : 전역 변수 등 프로그램이 사용하는 데이터를 저장하는 부분

   스택 영역 : 함수가 호출될 때 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시 저장하는 부분

 

일반적으로 프로그램 내에서 발생하는 함수호출에 필요한 복귀 주소는 각 프로그램의 주소 공간 중 스택 영역에 보관된다. -> 인터럽트와의 차이!

인터럽트는 인터럽트가 발생하면 운영체제에게 CPU 제어권이 넘어가게 되고 인터럽트 처리 루틴을 실행하기 전에 CPU에서 처리하고 있던 명령을 저장하기 위해 운영체제 커널의 PCB에 복귀 주소, 레지스터 값 등을 저장한다.

 

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

 

CPU는 흔히 '컴퓨터의 두뇌'라고 불리지만,

어떤 작업을 수행해야 하는지 스스로 결정하는 능력은 갖추고 있지 못하다. (이는 운영체제가 하는 일)

CPU는 단순히 PC(program counter: 다음에 수행해야할 명령이 저장된 주소를 저장하고 있는 CPU 내의 레지스터) 값을 보고 해당 명령을 수행하는 하드웨어일 뿐이다.

 

CPU가 수행하는 명령에는 일반 명령과 특권 명령이 있다.일반 명령: 메모리에서 자료를 읽어와 CPU에서 계산하고 결과를 메모리에 쓰는 일련의 명령들 -> 모든 사용자 프로그램이 수행 가능특권 명령: 입출력 명령이나 타이머 접근 명령 등 보안이 필요한 명령 -> 항상 운영체제만이 수행할 수 있는 명령들

 

3. 프로그램의 실행

 

"프로그램이 실행되고 있다"의 두 가지 의미1. 디스크에 존재하던 실행파일이 메모리에 적재되어 있다는 의미2. CPU를 할당 받아 명령을 수행하고 있다는 의미

 

운영체제 커널도 일종의 프로그램이기에 주소 공간을 가지고, 역시 코드, 데이터, 스택 영역으로 구성된다.코드: 하드웨어와 소프트웨어 등 자원 관리를 위한 코드, 인터럽트나 시스템 콜을 처리하기 위한 코드 등데이터: CPU, 메모리 등 하드웨어 사용 정보를 관리하기 위한 자료구조와 PCB스택: 일반 사용자 프로그램의 스택과 달리 현재 수행중인 프로세스마다 별도로 커널 스택을 두어 관리한다. -> why? 이는 일반 사용자 프로그램이 자기 주소 영역 내부의 함수를 호출하면 자신의 스택에 복귀 주소를 저장하지만, 프로세스가 특권명령을 수행하려고 커널에 정의된 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출하는 경우에는 복귀 조소가 그 커널 내의 주소가 되므로 커널의 스택 영역에 저장되어야 하며, 커널은 일종의 공유 코드로서 모든 사용자 프로그램이 접근가능하기에 일관성 유지를 위해 프로세스마다 별도의 스택을 두게 된다.

 

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

 

프로그램이 사용하는 함수는 크게 사용자가 정의한 함수, 라이브러리 함수, 커널 함수 세 가지다.

사용자 정의 함수와 라이브러리 함수가 실행될 때에는 해당 프로세스의 주소 공간에 해당 함수가 정의되어 있기에, 자신의 주소 공간에 있는 스택을 사용하게 된다.

한편, 커널 함수는 운영체제 커널의 코드에 정의된 함수이기에 시스템 콜을 이용해 운영체제에게 CPU를 이양하여 수행한다.

 

5. 인터럽트

 

인터럽트는 앞부분에서 충분히 다루었기에 간단히 설명하고 넘어간다.

CPU는 특별한 일이 없으면 현재 수행 중인 프로세스의 다음 명령을 순차적으로 수행한 뒤, 인터럽트(하드웨어나 소프트웨어에 의해)가 걸려오면 해당 인터럽트 처리 루틴을 수행하는 방식으로 진행된다.

 

Q) 그렇다면 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 경우는?

인터럽트 처리 중에 중요도가 더 높은 인터럽트가 발생한다면 현재 처리 중이던 인터럽트 코드의 수행 지점을 저장하고 우선순위가 더 높은 인터럽트를 처리하고, 처리가 끝나면 저장된 주소로 복귀에 이전에 수행하던 인터럽트 처리 코드를 마저 수행한다.

 

6. 시스템 콜

 

시스템 콜은 함수 호출이기는 하나 자신의 주소 공간을 거스르는 영역에 존재하는 함수를 호출하는 것을 의미한다. 즉, 운영체제 커널 안에 존재하는 함수를 호출하고 싶을 때 사용자 프로세스는 시스템 콜을 사용한다.

 

즉, 프로그램이 CPU를 할당받고 명령을 수행하다가 중간에 CPU를 빼앗기는 경우는 크게 2가지이다.

1. 타이머에 의한 인터럽트 발생

2. 입출력 요청을 위해 시스템 콜을 하는 경우

 

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

 

ex> 프로세스 A가 CPU에서 실행되고 있다고 가정하자. 이는 자신의 주소 공간에 정의된 코드를 실행하는 것과 커널의 시스템 콜 함수를 실행하는 것으로 나누어 볼 수 있다. 전자를 사용자모드(user mode)에서의 실행 상태, 후자를 커널 모드(kernel mode)에서의 실행 상태라고 한다. 여기서 주의할 점은!

시스템 콜에 의해 실행되는 것이 A의 코드가 아닌 커널의 코드라 할지라도 현재 실행되고 있는 프로세스는 커널이 아닌 A이다!! 프로세스A가 커널 모드에서 실행 중이다!!라고 표현한다.

 

반응형
Comments