4장 - 프로그램의 구조와 실행

HelloWorld·2022년 11월 10일
0

운영체제

목록 보기
3/3

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

프로그램이 CPU에서 명령을 수행하려면 해당 명령을 담은 프로그램의 주소 영역이 메모리에 올라가 있어야 함

프로그램의 주소 영역 = 코드(code) 영역 / 데이터(data) 영역 / 스택(stack) 영역

코드 영역 : 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어 명령 형태로 변환되어 저장 됨

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

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

프로그램 내에서 발생되는 함수호출에 필요한 복귀 주소는 각 프로그램의 주소 공간 중 스택 영역에 보관

인터럽트 때문에 CPU를 빼앗긴 위치는 운영체제가 관리하는 프로세스 제어블록에 저장

(인터럽트가 발생한 시점에서 그 프로그램의 어느 부분까지 수행했는지를 저장)

인터럽트 처리 후 프로세스 제어블록에 저장된 주소를 복원 → 수행하던 일 재개

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

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

CPU는 매번 프로그램 카운터가 가리키는 메모리 위치의 명령 처리

CPU에서 명령 수행 + 컴퓨터 외부장치와 입출력 이루어짐

하드웨어(CPU와 메모리) + 입출력 장치별(입출력 컨트롤러와 버퍼)

✔️ 커널모드, 운영자 모드, 특권 명령

3장 - 컴퓨터 시스템의 동작원리

시스템 콜(system call) : 운영체제에게 특권명령의 대행을 요청

사용자 프로그램이 시스템 콜을 할 시, 운영체제는 사용자 프로그램의 코드가 아닌 커널 영역에 정의된 시스템 콜 처리 코드를 사용하게 됨

인터럽트를 사용해 CPU에게 서비스를 요청하기 때문에 주변 장치는 인터럽트 라인(interrupt line)을 세팅하고 CPU는 매번 명령을 수행한 후 인터럽트 라인을 체크해 서비스 요청이 들어왔는지 확인

3. 프로그램의 실행

프로그램의 실행

1) 디스크에 존재하던 실행 파일이 메모리에 적재

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

프로그램의 주소 공간 중 당장 CPU에 필요한 부분은 메모리에 올려둠

그렇지 않은 부분은 스왑 영역에 내려놓음

✅ 스왑 영역 : 디스크 중 메모리의 연장 공간

커널 역시 코드, 데이터, 스택의 주소 공간 구성 가짐

데이터 : 각종 자원을 관리하기 위한 자료구조 저장

하드웨어 자원을 관리하는 자료구조 + 현재 수행 중인 프로그램(프로세스:process)을 관리하기 위한 자료구조

각 프로세스의 상태, CPU 사용 정보, 메모리 사용 정보 등을 유지하기 위한 자료구조(PCB) 두고 있음

스택 : 함수호출 시의 복귀 주소를 저장하기 위한 용도로 사용

❗현재 수행 중인 프로세스마다 별도의 스택을 두어 관리

→ 프로세스가 특권 명령을 수행하려고 커널에 정의된 시스템 콜을 호출하고 시스템 콜 내부에서 다른 함수를 호출하는 경우 그 복귀 주소는 커널 내의 주소가 되어 사용자 프로그램의 스택과는 별도의 저장공간이 필요하게 되기 때문

→ 커널은 일종의 공유 코드이기 때문에, 일관성 유지를 위해 각 프로세스마다 커널 내에 별도의 스택을 둠

⇒ 자기 자신의 코드 내에서 함수호출 및 복귀 주소를 유지하기 위해서는 자기 주소 공간 내의 스택을 사용, 시스템 콜이나 인터럽트 등으로 운영체제의 코드가 실행되는 중에 함수호출이 발생할 경우 커널 스택을 사용하게 됨

❗CPU의 수행주체가 운영체제로 바뀌는 순간에는 직전에 수행되는 프로그램의 복귀 정보를 스택이 아닌 PCB에 저장함

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

1) 사용자 정의 함수 : 프로그래머 본인이 직접 작성한 함수

2) 라이브러리 함수 : 누군가 작성해놓은 함수를 호출만 하여 사용하는 함수

⇒ 두 함수 모두 그 프로그램의 코드 영역에 기계어 명령 형태로 존재함

3) 커널함수 : 운영체제 커널의 코드에 정의된 함수

1️⃣ 시스템 콜 함수 : 사용자 프로그램이 운영체제의 서비스를 요청하기 위해 호출하는 함수

2️⃣ 인터럽트 처리 함수 : 각종 하드웨어 및 소프트웨어가 CPU를 요청하기 위해 발생시키는 함수

⇒ 운영체제 내에 있는 함수를 사용자 프로그램이 호출해서 사용하는 것

5. 인터럽트

현재 수행 중인 프로세스로부터 CPU를 회수해 CPU가 다른 일을 수행하도록 하기 위해서는 인터럽트 메커니즘이 필요

❓인터럽트 처리 중에 또 다른 인터럽트가 발생하는 경우

원칙적으로는 데이터 일관성 유지 문제 때문에 인터럽트 처리 중에 또 다른 인터럽트가 발생하는 것을 허용하지 X

그러나, 인터럽트의 중요도에 따라 이를 허용하기도 함

6. 시스템 콜

함수 호출이긴하지만 자신의 주소 공간을 거스르는 영역에 존재하는 함수를 호출하는 것

= 커널의 주소공간에 존재하는 함수를 호출하는 것

✏️ 프로그램이 CPU를 할당받고 명령 수행 중 CPU를 빼앗기는 경우

1) 타이머에 의해 인터럽트 발생

타이머 : 특정 프로그램에 의해 CPU가 독점되는 것을 방지하기 위한 하드웨어

CPU 할당 시간이 완료되면 인터럽트 발생

시분할 시스템 구현을 위한 필수적인 요소

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

시간이 오래 걸리는 입출력 작업이 완료되기 전까지 CPU를 다른 프로세스에 이양

입출력이 완료된 후 컨트롤러가 인터럽트를 발생시킨 후부터 다시 CPU를 얻을 수 있는 자격 부여 받음

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

1) 사용자 모드에서의 실행상태(user mode runnning)

사용자 정의함수나 라이브러리 함수 호출 시

2) 커널모드에서의 실행 상테(kenel mode running)

커널모드로 진입해 커널의 주소 공간에 정의된 함수를 실행하는 경우

❗️시스템 콜을 통해 실행되는 것이 프로세스 A의 코드가 아닌 운영체제 커널의 코드이지만, 시스템 콜이 수행되는 동안 프로세스 A가 실행상태에 있다고 말함

→ 사실상 커널이 프로세스 A가 해야할 일을 대행하고 있는 것이기 때문

0개의 댓글