CS 전공/OS

[운영체제] 2. 컴퓨터 아키텍쳐와 운영체제

Easyho.log 2024. 4. 16. 09:31

 2번째는 컴퓨터 아키텍처와 운영체제이다. 컴퓨터 아키텍쳐는 뭐... 컴퓨터 구조이다... 2학년 2학기 때 컴퓨터 구조라는 과목을 배웠는데..

컴퓨터적 사고를 상당히 요구하는 과목이였다... 예전에 수업을 들었을 때 컴퓨터 구조와 나중에 배울 운영체제와 관련이 많다는 이야기를 교수님께 들은 적이 있었다. 그래서 교수님께서 다시 기억을 되돌리자는 마음으로 컴퓨터 아키텍쳐를 자세하게 다루셨다.

짚고 가야할 부분 4가지

- 컴퓨터 아키텍쳐
- 컴퓨터 시스템/프로그램 작동 원리
- 인터럽트의 개념과 처리 과정
- 병렬 처리

1. 컴퓨터 아키텍쳐

1. 컴퓨터의 계층 구조

컴퓨터의 계층 구조

 

 운영체제는 응용 프로그램과 하드웨어 사이의 인터페이스 역할을 해주는 소프트웨어이다. 사용자는 응용 프로그램을 통해 컴퓨터를 사용한다. 또한, 사용자는 응용 프로그램의 하드웨어에 대해 직접적으로 접근할 수 없다. 반드시 운영체제를 통해서만 접근이 가능하다. 근데 왜 이렇게 만들었지? 이유는 추상화이다!

 

2. 컴퓨터 하드웨어 구성

1) 필수 장치 : CPU, MEM 

- CPU : 명령어를 해석하여 실행하는 장치

- 메모리 : 명령어들을 저장하고, 필요한 데이터들을 저장하는 곳

 

2) 나머지 주변 장치 : I/O 장치, 저장장치

 

=> 컴퓨터에 연결되는 모든 장치들은 최종적으로 메인보드와 연결된다!

 

3) Bus*

- 버스 : 메인보드에 연결된 각 장치들이 통신하는 길이다. 데이터 버스, 주소 버스, I/O 버스가 있다.

 

3. 폰 노이만 구조

폰 노이만 구조?

 

폰 노이만 구조는 CPU와 메모리만으로도 컴퓨터를 구성할 수 있다는 구조이다. 폰 노이만 구조의 원리는 CPU가 프로그램을 실행시키려면 프로그램이 메모리에 적재되어 있어야 한다. 하지만 CPU의 속도에 비해 메모리에 적재되는 속도가 느려 task가 쌓이다 보면 병목 현상이 발생하게 된다.

 

 CPU가 버스를 거쳐 메모리에서 데이터를 읽고 쓰는 과정

 

- 제어 버스로 'Read/Write' 등을 결정함

- 주소 버스에 메모리에 릭고 쓰고자 하는 위치의 주소를 적어둠

- 다음 클럭 사이클에 데이터 버스로 해당 데이터가 입출력 됨

 

 병목 현상을 줄이는 방법?

 

- 물리적 설계에서 병목 현상 줄이기

1. CPU와 가까이 두기 -> 데이터의 이동 시간을 줄일 수 있다.
2. 듀얼 채널 -> 병렬화를 통해 한번에 더 많은 데이터를 접근한다.
3. 메모리의 클럭을 높인다 -> DDR (Double Data Rate) : 클럭이 2배!

 

- 구조적 설계에서 병목 현상 줄이기

1. 버퍼 도입
* 버퍼(buffer) : 데이터 전달 간 임시 저장하는 장치나 장소
2. 스풀 도입 : 버퍼의 소프트웨어 구현 형태 (ex. 프린터)

2. 컴퓨터 시스템, 프로그램의 작동 원리

1. CPU의 구성 요소

1) CPU의 구성 요소

: ALU (산술 논리 연산 장치), CU (제어 장치), 레지스터

=> 클럭 하나 당 명령어를 가져와 제어 장치에서 읽고 ALU에서 연산을 한 뒤 해독하고 실행한다. (연산, 작업은 모두 레지스터를 거친다)

 

2) 명령어 (Instruction)

 명령어란, CPU가 해석하고 실행할 수 있는 기계 명령이다. 이 기계어가 모두 메모리에 적재되어야 하며, CPU가 순차적으로 읽어가며 지정된 동작을 수행한다.

2. 명령어 처리 과정

Fetch (인출) -> Decode (해독) -> Execute (실행)

1. 기계어 코드를 Program Counter를 통해 순차적으로 읽는다.

2. 현재 실행해야 할 명령어가 무엇인지 해석한다.

3. 명령어를 수행한다. (ALU에서)

 

3. 메모리 보호 기법

1) 메모리 보호가 왜 필요한가?

전 챕터에서 다룬 내용 중에 현대의 운영체제는 다중 프로그래밍 방식을 이용한다. 다중 프로그래밍 방식은 시분할 방식을 통해 여러 프로그램을 동시에 실행된다. 동시에 실행되다보면 다른 작업이 현재 작업에 침범을 한다. 그렇다면, 다른 작업이 현재 작업을 침범하면 계속 해서 작업끼리 간섭이 일어난다. 간섭이 일어나다 보면 메모리에 적재된 운영체제에도 침범을 당해 제대로 작동이 되지 않는다는 것이다..! 

 


3. 폴링과 인터럽트 그리고 DMA

1. CPU가 작업을 실행 하던 도중 외부에서 들어오는 작업 요청을 처리하는 방법

아래와 같은 방식으로 처리한다.

1) 폴링

2) 인터럽트

 

폴링?

 

폴링이란, CPU가 직접 입출력장치에서 데이터를 가져오거나 내보내는 방식이다.

CPU가 외부 상태를 주기적으로 검사하여 요청이 있으면 처리

-> 메시지는 CPU가 poll을 할 때까지 기다려야 함

폴링 주기 : 검사 주기이다. 높을 수록 메시지 응답률이 높다. -> 작업 속도에 영향을 주는 요인이다.

 

인터럽트?

 

 인터럽트란, 각 자원들이 능동적으로 자신의 상태 변화를 CPU에서 알리는 방식이다. 앞서 폴링은 CPU가 자발적으로 자신의 상태 파악하여 입력을 가져온다. 인터럽트가 발생하면 CPU는 필요할 때만 외부 장치와 통신하고 남는 시간동안 다른 작업을 처리한다. 외부 장치가 CPU를 사용할 때 IRQ를 전송한다.

 

이러한 인터럽트는 CPU의 활용률을 높일 수 있지만, 너무 많은 인터럽트는 오히려 프로그램 진행이 더뎌지는 사태가 일어날 수 있다.

 

인터럽트의 종류는 다음과 같다.

 1. 하드웨어 인터럽트 : CPU 외부의 디스크 컨트롤러나 주변장치로부터 요구
2. 소프트웨어 인터럽트 : CPU 내부에서 자신이 실행한 명령이나 명령 실행에 관련된 모듈에 이상

2. DMA

- DMA : CPU에 개입 없이 메모리와 하드웨어 장치 간 데이터 전송

 

- 동작 방식

1) CPU가 DMA에 데이터의 메모리, 주소, 크기, 대상 장치들을 DMA 컨트롤러에 지시 (CPU가 해야할 일 끝~)

2) 나머지 데이터 I/O는 DMA 컨트롤러를 통해 이루어짐 -> 그동안 CPU는 다른 작업을 처리할 수 있다.

3) DMA 동작이 끝나고 나면 DMA 컨트롤러가 인터럽트를 발생시켜 작업 완료를 알림

 

- 동작 모드

1) 사이클 스틸링

2) 버스트 모드

3) Demand Transfer Mode 가 있다.


4. 병렬 처리

 병렬 처리는 동시에 여러 개의 명령을 처리하여 작업의 능률을 올리는 방식이다. 이 방식은 실제로 동시에 여러 작업이 처리되며, 멀티 코어세서 멀티 쓰레드를 동작시키는 방식이다.

 

파이프라이닝이란?

 

CPU에서 명령어가 실행되는 과정으로 다음과 같은 단계를 보이고 있다.

1) 명령어 패치

2) 명령어 해석

3) 명령어 실행

4) 쓰기

 

그렇다면, 파이프라인이란 무엇인가. 명령어를 겹쳐서 실행하는 방법으로 하나의 코어에 여러 개의 쓰레드를 실행하는 방식이다. 명령어를 여러 개의 단계로 분할한 후 각 단계를 동시에 처리하는 하드웨어를 독립적으로 구성한다.

 

병렬 처리 시 고려 사항

 

첫 번째로, 상호 의존성이 없어야 한다. 그 말은 즉, 각 명령이 서로 독립적이고 앞의 결과가 뒤의 명령에 영향을 미치지 않아야 한다.

두 번째로, 각 단계별 처리 시간이 일정해야 한다. 오랜 시간이 걸리는 작업 때문에 전반적으로 밀려서 작업시간이 늘어나면 병목 현상이 발생한다.

마지막으로, 전체 작업 시간을 몇 단계로 나눌지 잘 따져야 한다. 병렬 처리의 깊이 (= 동시에 처리할 수 있는 작업의 개수)를 잘 조율하여 성능 조절을 해야 한다.

 

=> 근데 저 고려사항대로 되면 좋겠지만, 처리 시간과 단계가 균등하지도 일정하지도 않다! 이로 인해 생기는 문제를 해저드라고 한다.

 

해저드의 종류

 

1) 구조적 해저드 : 프로세스 자원이 부족할 때 서로 다른 명령어가 같은 자원에 접근하려 할 때 발생한다.

-> 이 때는 추가 자원을 확보할 때까지 대기한다.

2) 제어 해저드 : 프로그램의 의존성에 의해서 발생한다. 분기에 의해서 프로그램 제어 순서가 바뀌어 명령어들이 쓸모가 없어진다. (낭비)

-> 이 때는 대기하거나 분기 예측을 통해 해결한다.

3) 데이터 해저드 : 상호 의존성에 의해 생기는 해저드이다.

-> 해결이 어렵지만 그래도 대기하거나 프로그래밍을 적절히 하면...

 

병렬 처리의 종류

1) 슈퍼스칼라 : 파이프라인을 처리할 수 있는 코어를 여러 개 구성하는 방식

2) 슈퍼파이프라인 기법 : 파이프라인의 각 단계를 세분하여 한 클록 내에 여러 명령어를 처리

3) 슈퍼파이프라인 슈퍼스칼라 기법 : 1) + 2)

4) SIMD : Single Instruction Multiple Data, 즉 하나의 명령어로 여러 개의 데이터를 한번에 처리하는 기법이다

 

'CS 전공 > OS' 카테고리의 다른 글

[운영체제] 6. 스케줄링  (2) 2024.04.21
[운영체제] 5. 쓰레드  (1) 2024.04.20
[운영체제] 4. 프로세스 (2)  (2) 2024.04.18
[운영체제] 3. 프로세스 (1)  (0) 2024.04.18
[운영체제] 1. 운영체제 개요  (0) 2024.04.15