1. 컴퓨터의 하드웨어 구성
1.1 컴퓨터
- CPU, 메모리, 입출력장치로 구성됨
- 필수장치 : CPU, 메모리(주기억장치)
- 컴퓨터로 하는 대부분의 작업은 CPU와 메모리를 가지고 처리됨 - 주변장치 : 입출력장치(입력장치, 출력장치, 저장장치(보조기억장치))
1.2 CPU
- 명령어를 해석하여 실행하는 장치
- 산술논리 연산장치(ALU), 제어장치(Control unit), 레지스터로 구성됨
1.3 메모리
- 작업에 필요한 프로그램과 데이터를 저장하는 장소
- 바이트 단위로 분할되어 있으며 분할 공간마다 주소로 구분
1.4 입출력장치
- 입력장치 : 외부의 데이터를 컴퓨터에 입력하는 장치 (키보드, 마우스)
- 출력장치 : 컴퓨터에서 처리한 결과를 사용자가 원하는 형태로 출력하는 장치(모니터, 프린터)
- 메모리가 바이트 단위로 분할되어 있어서 입출력도 바이트 단위로 함
1.5 저장장치
- 메모리보다 느리지만 저렴하고 용량이 큼
- 전력이 끊겨도 데이터 저장 가능
- HDD, SSD, CD, USB 메모리
1.6 *버스
- CPU, 메모리, 입출력 장치, 저장장치 간 데이터 통로
추가적으로 버스에 관해서 부가 설명을 하자면 우리가 흔히 알고 있는 버스처럼 시스템에서의 버스는 데이터의 교통수단이라고 생각하면 될 듯 싶다.
위의 그림에서처럼 CPU, I/O 장치, 기억 장치들을 연결해주는 중심 통로이다.
하드웨어를 물리적으로 연결하여 서로 데이터를 주고 받을 수 있게 하는 역할을 하는 것이다. 각 장치들이 다른 장치로 데이터를 보낼 수 있도록 해준다.
1.7 메인보드
- CPU, 메모리, 입출력장치, 저장장치를 버스로 연결하는 장치
1.8 폰 노이만 구조
- CPU, 메모리, 입출력장치, 저장장치를 버스로 연결하는 컴퓨터 구조
- 메모리를 이용하여 프로그래밍이 가능한 컴퓨터 구조
- 폰 노이만 구조가 등장하기 전 : 하드 와이어링(진공관을 전선으로 연결하여 논리 회로를 구성하여 프로그램 작성) 을 이용한 컴퓨터 구조 - 저장장치에 있는 프로그램은 메모리로 올라와야 실행 가능
2. 클록 속도
2.1 클록(clock)
- CPU는 작업을 할 때 일정한 박자가 있는데 이 박자를 만들어 냄
- 클록이 일정 간격으로 clock tick(clock cycle)을 만들면 거기에 맞추어 CPU안의 모든 구성 부품이 작업함
2.2 클럭 속도(clock rate 또는 clock frequency)
- 초당 clock cycle 수 (1초에 clock cycle이 한 번이면 1Hz)
- ex) 3.4GHz CPU는 1초에 clock cycle이 3,400,000,000(3.4 x 10^9)번 발생하여 CPU가 1초에 약 34억 번의 연산(작업) 을 할 수 있음을 의미 (컴퓨터 살때 클럭 높으면 높을수록 성능 굿)
- ex) 메인보드가 1333MHz(1.3GHz)의 클럭을 사용하면 시스템 버스를 통해 초당 1.3억 번의 데이터 입출력이 가능하다는 의미
3. CPU의 구성과 동작
3.1 CPU
- 명령어를 해석하여 실행하는 장치
- 산술논리 연산장치, 제어장치, 레지스터로 구성됨
3.2 산술논리 연산장치(arithmetic and logic unit, ALU)
- CPU에서 데이터를 연산하는 장치
- 데이터의 덧셈, 뺄셈, 곱셈, 나눗셈 같은 산술 연산 수행
- AND, OR와 같은 논리 연산 수행
3.3 제어장치(control unit)
- CPU 명령어를 해석하여 제어신호를 보냄
3.4 레지스터(register)
- 데이터 연산을 위해 메인 메모리로부터 데이터를 읽어와 저장하는 곳
3.5 CPU의 산술논리 연산장치, 제어장치, 레지스터를 사용한 CPU 명령어 처리과정의 예
아래는 C언어로 작성한 덧셈 프로그램
int D2 = 2, D3 = 3, sum;
sum = D2 + D3;
위 코드에서 02 행을 어셈블리어로 바꾸면 아래와 같음
LOAD mem(100), register 2;
LOAD mem(120), register 3;
ADD register 5, register 2, register 3;
MOVE register 5, mem(160);
*(앞에 LOAD, ADD, MOVE는 CPU 명령어 - 제어장치는 명령어를 해석하여 제어신호를 보냄)
1. 01행 : 메모리의 100번지(D2)에 있는 값 2을 레지스터 2로 가져온다.
2. 02행 : 메모리의 120번지(D3)에 있는 값 3을 레지스터 3로 가져온다.
3. 03행 : 레지스터 2와 레지스터 3에 저장된 값을 더한 결과 5를 레지스터 5에 넣는다.
4. 04행 : 레지스터 5의 값 5를 메모리의 160번지(sum) 으로 옮긴다.
아래의 그림은 위의 어셈블리어 코드를 산술논리 연산장치, 제어장치, 레지스터를 사용하여 표현
4. 레지스터
4.1 CPU는 연산에 필요한 데이터를 메모리로부터 레지스터로 가져와서 연산을 수행한 다음 연산 결과를 레지스터에 저장했다가 메모리로 옮김
4.2 사용자 가시 레지스터(user-visible register)
- 사용자 프로그램에 의해 변경되는 레지스터
- 데이터 레지스터(DR) -> 데이터 저장
> 메모리에서 가져온 데이터를 저장하는 레지스터(일반 레지스터 또는 범용 레지스터라고 함) - 주소 레지스터(AR) -> 주소 저장
> 데이터의 메모리 주소 를 저장하는 레지스터
4.3 사용자 불가시 레지스터(user-invisible register)
- 사용자 프로그램에 의해 변경될 수 없는 레지스터
- 프로그램 카운터(PC, program counter)
> 다음에 실행할 명령어의 주소 또는 명령어의 코드 행 번호를 저장하고 있다가 제어장치에게 알려주는 레지스터
- 명령어 레지스터(IR, instruction register)
> 현재 실행 중인 명령어를 저장하는 레지스터
- 메모리 주소 레지스터(MAR, memory address register)
> 메모리로부터 읽거나 메모리에 쓸 데이터의 메모리 주소를 저장하는 레지스터
- 메모리 버퍼 레지스터(MBR, memory buffer register)
> 메모리로부터 읽거나 메모리에 쓸 데이터를 저장하는 레지스터
- 프로그램 상태 레지스터(PSR, program state register)
> 산술논리 연산장치의 연산결과의 상태(양수, 음수, 0인지, 자리 올림의 유무) 를 저장하는 레지스터
아래의 사진은 앞서 언급한 어셈블리어 코드의 행 번호 01의 "LOAD mem(100), register2;" 의 실행과정
1. 프로그램 카운터(PC)는 실행될 명령어 LOAD가 위치한 코드 행 번호 1를 저장하고 있다가 제어장치에게 전달하고 명령어 레지스터(IR) 에는 LOAD 명령어가 저장됨
2. 제어장치는 명령어 레지스터(IR)에 저장된 명령어 LOAD를 해석하여 제어신호를 보냄
3. 메모리 주소 레지스터(MAR)에는 데이터 2가 저장된 메모리 주소 100번지가 저장되고 메모리 주소 100번지에 저장된 데이터 2를 메모리 버퍼 레지스터로 가져옴
4. 메모리 버퍼 레지스터(MBR)에 저장된 데이터 2를 레지스터(register 2) 에 옮김
4.4 프로그램 상태 레지스터의 역할
- 산술논리 연산장치의 연산결과의 상태(양수, 음수, 0인지, 자리 올림의 유무)를 저장
- ex) 아래의 코드에서 D2-D3의 연산결과의 상태를 저장하고 있다가 제어장치에게 알려주어 다음에 몇 번째 행으로 이동할지 결정
if (D2-D3 > 0)
goto 100;
else
goto 200;
5. 버스
5.1 버스
- CPU, 메모리, 입출력 장치, 저장장치 간 데이터 통로
5.2 CPU 내부 버스
- CPU 내의 산술논리 연산장치, 제어장치, 레지스터를 연결하는 버스
- BSB(back-side bus) 라고도 함
5.3 시스템 버스
- 메인보드에서 CPU, 메모리, 주변 장치를 연결하는 버스
- FSB(front-side-bus)라고도 함
종류 | 설명 |
제어 버스 | - 제어 장치와 연결된 버스 - CPU 명령어를 해석하여 제어신호를 주고 받기 위해 사용됨 (양방향 통신) |
주소 버스 | - 메모리 주소 레지스터와 연결된 버스 - 메모리 또는 주변장치에 데이터를 읽거나 쓸 때 데이터의 메모리 주소 또는 주변 장치 내의 위치 정보를 보내기 위해 사용됨(단방향 통신) |
데이터 버스 | - 메모리 버퍼 레지스터와 연결된 버스 - 메모리 또는 주변장치에 데이터를 읽거나 쓸 때 데이터를 주고 받기 위해 사용됨 |
6. 메모리
6.1 메모리 보호 방법
1) 작업의 메모리 시작 주소를 경계 레지스터(boundary register)에 저장 후 작업
2) 작업이 차지하고 있는 메모리의 크기를 한계 레지스터(limit register)에 저장
3) 사용자의 작업이 진행되는 동안 이 두 레지스터의 주소 범위를 벗어나는지 하드웨어적으로 점검
4) 두 레지스터의 값을 벗어 나면 메모리 오류와 관련된 인터럽트가 발생
5) 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램을 강제 종료
6.2 부팅
- 컴퓨터를 켰을 때 운영체제를 메모리에 올리는 과정
- 부팅 과정
1) 컴퓨터의 전원을 켬
2) ROM에 있는 BIOS 프로그램이 실행되어 하드웨어 (CPU, 메모리, 주변장치) 가 정상적으로 동작 하는지 확인
3) BIOS 프로그램은 ROM에 있는 bootstrap 프로그램을 실행시켜서 하드디스크 내의 마스터 부트 레코드(master boot record, MBR)에 저장된 bootloader 프로그램을 메모리에 올림
4) Bootloader 프로그램이 실행되면 운영체제(OS)가 메모리에 올라감
7. 버퍼
- 두 장치 간의 속도 차이를 완화하기 위해 두 장치 간의 데이터 전송 시 데이터를 임시로 저장 하는 장치
- ex) 느린 장치에서 일정한 데이터를 버퍼에 모은 뒤 빠른 장치에 전송
- 하드디스크에서 일정한 데이터를 하드디스크 내의 버퍼에 모은 뒤 메모리에 전송 - ex) 유튜브 동영상을 볼 때 데이터를 다운로드하는 시간과 재생하는 시간의 속도 차이로 인해 동영상이 끊기는 문제를 해결하기 위해 동영상 데이터의 일정 부분을 버퍼에 넣은 뒤 실행
8. Spooling
8.1 CPU와 입출력 장치가 독립적으로 동작할 수 있도록 하는 기법
- CPU와 입출력 장치 간의 속도 차이를 완화 시킴
- ex) spooling 을 이용하여 CPU와 프린터를 통한 데이터 출력
- CPU가 출력 작업을 할 때 HDD에 출력할 내용을 보낸 뒤 CPU는 다른 작업을 할 수 있음
-> CPU와 프린터가 독립적으로 동작할 수 있게 하고 CPU의 효율성을 높임
- CPU는 출력할 내용을 토대로 HDD로 보내서 속도가 빠른 CPU와 속도가 느린 프린터의 속도 차이를 완화 시킬 수 있음
9. 캐시(cache)
- CPU와 메모리 간의 속도 차이를 완화시키기 위해 메모리의 데이터를 임시로 저장하는 버퍼의 일종
- CPU는 메모리에 접근해야 할 때 캐시를 먼저 방문하여 원하는 데이터가 있는지 찾아봄
- 캐시 히트(cache hit) : 캐시에 원하는 데이터를 찾았을 때
- 캐시 미스(cache miss) : 캐시에 원하는 데이터가 없을 때
- 캐시 적중률(cache hit ratio) : 캐시 히트의 비율
- 데이터가 많으면 많을수록 캐시 적중률 올라감 - 캐시 적중률을 높이기 위한 방법
- 캐시 크기를 증가 시킴
- CPU가 앞으로 사용할 데이터를 메모리로부터 캐시로 미리 가져옴
- 지역성(locality) 이론에 근거하여 현재 데이터와 가까운 데이터들이 사용될 확률이 높기 때문에 미리 가져옴
- 캐시가 크면 클수록 좋다. 캐시 사이즈가 큰 CPU가 처리속도가 빠르다[그림 9] 캐시의 구조
10. 저장장치의 계층 구조
- CPU보다 메모리가 느리기 때문에 CPU와 메모리 사이에 레지스터와 캐시를 배치하여 CPU가 작업을 빨리 처리하게 함
11. 인터럽트(interrupt)
11.1 인터럽트
- 소프트웨어와 하드웨어에 의해 발생하는 이벤트
- 운영체제는 인터럽트가 발생하면 실행 중인 프로세스를 중단하고 인터럽트를 먼저 처리함
11.2 인터럽트가 발생되는 경우
- 입출력(I/O) 작업이 완료되었을 때 CPU에게 알리기 위해 발생
- 숫자를 0으로 나눴을 때
- 사용자가 컴퓨터의 전원 버튼을 눌렀을 때
- 잘못된 메모리 주소를 참조(invalid memory access) 하였을 때
11.3 인터럽트 처리(handling)
1) 인터럽트 발생
2) OS는 실행 중인 프로세스를 중단하고 CPU의 상태를 보존함
3) 인터럽트 처리
4) 중단된 프로세스로 복귀하여 계속 수행
12. I/O method
12.1 I/O method
- CPU와 주변장치(입출력장치, 저장장치) 간의 데이터 I/O 방법
- Polling I/O, interrupt driven I/O, DMA(direct memory access)
- 인터럽트 기반의 interrupt driven I/O, DMA 방법이 많이 사용됨
12.2 I/O controller
- CPU와 주변장치(입출력장치, 저장장치) 사이에 존재
- CPU가 직접 데이터 I/O 처리를 하지 않고 I/O controller 에게 데이터 I/O 처리를 요청함
- I/O controller는 주변장치에 대한 데이터 I/O 처리
12.3 I/O controller 동작 과정
1) CPU가 I/O controller 에게 데이터 I/O 처리를 요청
2) I/O controller 는 입출력 장치로부터 요청 받은 데이터를 메모리로 옮기거나 메모리에 있는 데이터를 입출력 장치로 옮김
12.4 Polling I/O
- 입출력장치(키보드, 마우스 모니터, 프린터) 에 대한 문자(byte) 단위 데이터 I/O 처리
- Polling 방식
- CPU가 I/O controller에게 데이터 I/O 처리를 요청한 다음 CPU는 주기적으로 I/O controller의 데이터 I/O가 완료되었는지 확인
- Synchronous I/O
12.5 Interrupt driven I/O
- 입출력장치(키보드, 마우스, 모니터, 프린터)에 대한 문자(byte) 단위 데이터 I/O 처리
- Interrupt 방식
- CPU가 I/O controller는 데이터 I/O가 완료되면 CPU에게 Interrupt를 보냄
- Asynchronous I/O - 한 문자당 하나의 interrupt 발생
- 따라서, 블록 단위 데이터 I/O를 처리하려면 수많은 interrupt가 발생함
ex) 6400 byte로 구성된 블록은 6400번의 interrupt가 발생함
12.6 DMA(direct memory access)
- 저장장치(HDD, SSD, CD, USB 메모리)에 대한 블록(block) 단위 데이터 I/O 처리
- 동작과정
1) CPU가 I/O controller에게 블록 단위 데이터 I/O 처리를 요청할 때 메모리 상의 데이터의 시작 주소와 데이터의 크기를 알려줌. 그 다음 CPU는 다른 작업을 처리 -> CPU의 효율성을 높임
2) I/O controller는 블록 단위 데이터 I/O를 처리하는 동안 CPU의 간섭(명령)없이 메모리에 직접 접근하여 저장 장치로부터 요청 받은 데이터를 메모리로 옮기거나 메모리에 있는 데이터를 저장장치로 옮김
> [참고] 원래 입출력 장치는 CPU의 명령에 따라 메모리에 접근할 수 있음
3) I/O controller는 데이터 I/O가 완료되면 CPU에게 Interrupt를 보냄 - Asynchronous I/O
- 한 블록당 하나의 interrupt 발생
'운영체제' 카테고리의 다른 글
프로세스 동기화 및 임계구역 [운영체제] (0) | 2024.04.12 |
---|---|
CPU 스케줄링 [운영체제] (3) | 2024.04.03 |
운영체제의 소개 및 구조 [운영체제] (0) | 2024.03.24 |