본문 바로가기
EH 운영체제 강의

3. 컴퓨터 시스템 구조 & Program Execution

by 킹차니 2022. 5. 10.

운영체제를 학습하기 전에 컴퓨터 시스템의 구조를 전반적으로 파악해보자.

 

컴퓨터라 함은 주로 CPU메모리 말한다. 물론 그 외에도 디스크, IO 디바이스가 존재한다.

 

메모리는 CPU의 작업공간이다. 연산은 모두 CPU가 한다.

위 그림을 보면 디스크가 IO디바이스에 묶여있다. 디스크 역시 데이터를 저장하고 불러오는 IO디바이스의 역할을 한다. 키보드는 Input디바이스, 프린터와 모니터는 Output디바이스이다.

 

 

이제 조금 더 자세히 컴퓨터 구조를 살펴보자.

위 그림의 요소들을 하나씩 설명하겠다.

 

 

 

• Registers

CPU는 메모리보다 훨씬 빠른 자신만의 저장소인 레지스터를 가지고 있고 그 종류는 역할에 따라 다양하다. 현재 어디 부분의 코드를 실행해야 하는지, 연산의 결과 값등을 저장하는 다양한 레지스터가 CPU 안에 존재한다.

 

 

 Interrupt line

인터럽트 라인은 IO디바이스의 요청이나 응답을 받는 것이다. 즉 CPU는 너무 바쁘기 때문에 쉴 새 없이 자기가 실행해야 하는 프로세스들을 실행하고 있다가, 인터럽트 라인을 통해 들어온 IO디바이스의 요청이나 응답을 프로세스에 카피하는 것이다. 그런데 이때 인터럽트 라인을 통해서 데이터를 주고 받는 것도 IO디바이스가 직접하는 것이 아니라, device controller가 해주는 것이다.

또한 만약 CPU가 프로세스를 실행하는 중인데, 현재 실행중인 프로세스의 코드가 디스크에 있는 어떤 내용을 불러온 뒤에 확인을 해야 다음의 코드를 실행할 수 있다고 가정해 보자.

이때 CPU는 절대 IO디바이스에 직접 접근하지 못한다.(CPU 자체를 보안상의 이유, 성능상의 이유로 그렇게 만들었음) 해서 CPU는 해당 IO 디바이스의 device controller에게 이를 시킨다. 그러면 device controller는 디스크에 데이터를 읽으러 간 뒤, 읽은 데이터를 다시 interrupt line을 통해 CPU에게 전달하는 것이다.

 

 

DMA Controller(Direct Memory Access)

- 빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용

- CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송

- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴

CPU가 인터럽트를 너무 많이 당하니까 DMA 컨트롤러를 둔다. 그러면 메모리에 CPU 뿐만 아니라 IO 디바이스도 메모리에 접근이 가능해진다. 근데 이렇게 되면 DMA, CPU 둘다 같은 프로그램에 접근할 문제가 있어 메모리 컨트롤러가 이것을 중재하는 역할도 한다.

DMA IO작업 요청이 오면 인터럽트로 CPU 방해하기 전에 자기가 직접 메모리에 값을 복사해주는 역할을 한다. 해서 CPU 효율적이게 된다.

 

 IO Device Controller 

- 해당 IO 장치들을 관리하는 일종의 작은 CPU

- 제어 정보를 위해 control register, status register를 가짐

- local buffer를 가짐 (일종의 data register)

- IO는 실제 디바이스와 local buffer사이에서 일어남

- device controller는 IO가 끝났을 경우 interrupt로 CPU에 그 사실을 알림

 

device driver (장치구동기, 소프트웨어임)

: OS 코드 중 각 장치별 처리 루틴 -> software !

device controller (장치제어기)

: 각 장치를 통제하는 일종의 작은 CPU -> hardware!

 

device controller는 각각의 IO디바이스들에 붙어 이들을 통제하는 역할을 한다. 만약 키보드가 데이터들을 CPU에게 전달해야 한다면 데이터들을 local buffer에 담아두고, device controller가 이를 CPU에게 전달해주는 것이다. 즉 device controller는 IO디바이스들의 cpu라 할 수 있고, local buffer는 IO디바이스의 메모리(작업 공간)라 할 수 있다.

 

 

 

• Timer

- 정해진 시간이 흐른 뒤, 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시킴.

- 타이머는 매 클럭 틱 때마다 1씩 감소

- 타이머 값이 0이 되면 타이머 인터럽트 발생

- CPU를 특정 프로그램이 독점하는 것으로부터 보호

- 타이머는 time sharing을 구현하기 위해 널리 이용됨

- 타이머는 현재 시간을 계산하기 위해서도 사용

 

타이머는 특정 프로그램이 CPU를 독점하는 것을 막기 위해 존재한다.

만약 for문을 짜서 어떤 프로그램이 계속 실행되어야 한다면 다른 프로그램들이 실행되지 못하고 for문을 가진 프로그램이 CPU를 독점하게 될 것이다. 해서 맨 처음에 운영체제가 타이머의 값을 설정하고 그 시간이 지나면 다음 프로그램으로 넘어가게 하는 것이다. 

타이머 알림도 인터럽트 라인을 통해 인터럽트를 발생시키는 것이다. 만약 CPU에 타이머의 인터럽트가 발생하면 CPU는 하던 일을 멈추고 운영체제가 CPU의 주도권을 가지게 된다.

 + 위와 같은 경우가 거의 유일하게 운영체제가 CPU에 대한 주도권을 가지게 되는 순간이다. 또 하나 더 있는데, 만약 어떤 프로그램이 IO디바이스의 입출력을 필요로 한다면 이때 프로그램은 자발적으로 CPU 주도권을 운영체제에게 넘긴다. 왜냐하면 현재 Mode bit이 1이기 때문에 CPU가 IO디바이스에 접근할 수 없기 때문이다. 즉 반드시 운영체제를 거쳐서만 IO디바이스에 접근할 수 있다. 해서 이때 프로그램은 CPU에 인터럽트를 발생시켜 주도권을 운영체제에게 주고 운영체제가 IO디바이스 입출력 명령을 내린다.

 

 

 

• Mode Bit

- 사용자가 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치

- Mode Bit을 통해 하드웨어적으로 두 가지 모드의 operation 지원

1  : 사용자 모드. 즉 사용자의 프로그램이 수행 중

0 : 커널(모니터) 모드. OS의 코드가 수행 중

- 보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한 '특권 명령'으로 규정

- interrupt나 Exception 발생 시 하드웨어가 mode bit를 0으로 바꿈

- 사용자 프로그램에게 CPU를 넘기기 전에 mode bit를 1로 셋팅

만약 CPU가 어떤 사용자 프로그램을 실행 중에 IO 디바이스에 접근하려고 하면, 이때 mode bit가 1이므로 IO디바이스에 접근하는 것을 막아버린다. 이는 사용자 프로그램은 나쁜 일을 할 수 있어서 보안을 위함이다.

 

 

 

• 입출력(IO)의 수행

- 모든 입출력 명령은 특권 명령

- 사용자 프로그램은 어떻게 IO를 하는가?

----- 시스템 콜 :  사용자 프로그램은 운영체제에게 IO 요청

----- trap을 사용하여 인터럽트 벡터의 특정 위치로 이동

----- 제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동

----- 올바른 IO 요청인지 확인 후 IO수행

----- IO 완료 시 제어권을 시스템콜 다음 명령으로 옮김

 

프로그램이 IO요청을 할때도 인터럽트를 발생시킨다 하였다. 즉 소프트웨어 인터럽트. (trap이라고도 한다.)

IO가 인터럽트를 발생시키는 것은 하드웨어 인터럽트

 

 

 

• 시스템 콜(System call)

- 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것.

 

 

 


이제 컴퓨터의 구조와 함께 프로그램을 실행하는 과정을 간단하게 살펴보자.

 

 

위에서 살펴봤듯이 컴퓨터 시스템의 구조는 아래와 같다.

Computer를 host라고도 한다.

CPU는 0과 1로된 4바이트 길이의 기계어를 실행시킨다. 이때 multi process들을 돌아가면서 실행시키므로 특정 프로세스를 어디서부터 실행시켜야하는지를 PC(레지스터)에 저장한다. 그리고 하나의 명령어를 실행시키고 인터럽트를 확인한다.

그런데 이때 만약 인터럽트에 뭔가가 들어왔다면 운영체제에게 CPU의 주도권이 넘어가게 되고, 운영체제는 어떤 인터럽트를 어떻게 해결해야 하는지를 인터럽트 벡터에 담고 있어 그에 맞게 실행시킨다.

 

그런데 위와 같이 인터럽트. 즉 I/O 작업을 하는 방식에는 아래와 같이 동기식, 비동기식 두가지 방법이 존재한다.

 

 

동기식 입출력과 비동기식 입출력

동기식 입출력 (synchronous I/O)

I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감

구현방법1

--- I/O가 끝날 때까지 CPU를 낭비시킴

--- 매시점 하나의 I/O만 일어날 수 있음

• 구현방법2

••• I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음

••• I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움

••• 다른 프로그램에게 CPU를 줌

 

비동기식 입출력 (asynchronous I/O)

• I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감

 

* 두 경우 모두 I/O의 완료는 인터럽트로 알려줌

 

synchronous는 동기식 방법으로 입출력이 끝날때까지 기다리는 것이다. 이는 CPU, IO 모두의 낭비로 이어질 수 있다.

 

CPU는 IO에 대한 명령어를 가지고 있는데, IO명령어를 메모리 명령어와 따로 가지고 있는지, 아니면 메모리의 주소를 연장선으로 IO에도 주소를 맥여 같은 명령어를 사용하는지에 따라 나눌 수 있다.

오른쪽은 Memory mapped I/O라함

왼쪽이 명령어를 따로 저장하는 일반적인 경우이고, 오른쪽이 주소를 연장으로 사용하여 같은 명령어를 사용하는 경우이다.

왼쪽(일반적인 경우): CPU에는 메모리에 접근하는 명령어(LDA, STA)와 IO디바이스에 접근하는 명령어가 별개로 있다.

오른쪽 ( 메모리 맵드 아이오. IO디바이스를 메모리 주소의 연장으로 설정한 경우) : 이렇게 하면 별도의 명령어를 정의하지 않고 주소만을 확장하여 사용할 있다.

 

 

 

저장장치 계층 구조

저장장치들은 위와 같은 계층구조를 가진다. 위로 갈수록 비싸고, 빠르고, 용량이 적고, 휘발성이다.

 

 

 

프로그램의 실행(메모리 load)

 

프로그램은 파일로써 디스크에 저장되어 있고 특정 프로그램이 실행되기 위해서는 해당 프로그램이 프로세스가 되어 메모리에 올라와야 한다.

그리고 위의 이미지에서 보이듯이 커널영역은 항상 언제나 메모리에 상주해 있다.

그리고 프로그램의 모든 코드들이 메모리에 올라가 있는 것이 아니라 필요한 부분만 올라가게된다.

해서 virtual memory라는 이름이 붙는 것이다. 가상적으로 메모리에 올라왔다고 가정한 뒤, 주소를 부여하여 필요한 부분에 접근한다. (stack, data, code 부분은 이글 참고)

즉 실제로는 Swap area(fake RAM)라는 하드디스크에 존재하는 부분에 프로세스들을 올려두고, 필요한 부분만 메모리에 올라가게 되는 것이다.)

 

 

커널 주소 공간의 내용

커널은 운영체제의 필수적인 소프트웨어로, 이 역시 코드이다. 이들은 사용자 프로그램이 프로세스로 하나씩 올라올 때마다 이들을 관리하기 위한 자료구조를 하나씩 만드는 데, 이것을 PCB라고 한다. 또한 위 그림을 보면 CPU, MEM, DISK를 관리하기 위한 자료구조들도 가지고 있는 것을 볼 수 있다.

 

PCB :
프로세스 제어 블록(Process Control Block)의 약자로, CPU에 의해 실행 중인 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조이다. 운영 체제 차원에서 관리해주며, 이게 없다면 프로세스를 효율적으로 관리해줄 정보가 없어 사용자가 컴퓨터를 통한 원하는 기능을 제대로 이용할 수 없을 것이다. 작업 제어 블록(Task Control Block) 또는 작업 구조, 영문 이니셜로 TCB라고도 한다.  출처:나무위키

 

함수 정의하고 가기

당연히 사용자 프로그램에는 커널 함수가 없다!

 

프로그램의 실행은 아래와 같이 A프로그램 -> 커널 프로그램의 순으로 돌아가며 반복된다.

 

 

 

 

 

출처 : 이화대학교 반효경 교수님의 운영체제 강의
http://www.kocw.net/home/search/kemView.do?kemId=1046323

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

CPU 스케쥴링  (0) 2022.07.01
5. 프로세스 - 스레드  (0) 2022.06.21
4. 프로세스  (0) 2022.05.20
2. 운영체제의 분류, 예시, 구조  (0) 2022.05.10
1. 운영체제란? 운영체제의 목표  (0) 2022.05.09