TH3 6R3@T H@CK
컴퓨터 구조 본문
※ 운영체제 수업 내용 복습
* 내용 추가 예정
메모리의 종류
램(RAM)
Random Acess Memory
→ read+write
→ 메인 메모리
휘발성 메모리
→ 전원이 공급되고 있을 때만 데이터를 저장할 수 있고, 전원이 끊어지면 데이터가 손실됨
DRAM
∙ Dynamic RAM
∙ 저장된 0과 1의 데이터가 일정 시간이 지나면 사라지므로 일정 시간마다 다시 재생시켜야 함
∙ 현대 컴퓨터에서 주로 사용
∙ 메인 메모리 목적으로 사용
SRAM
∙ Static RAM
∙ 전력이 공급되는 동안에는 데이터를 보관할 수 있어 재생할 필요가 없음
∙ 캐시를 SRAM으로 많이 만듦
∙ 현대 컴퓨터에서 주로 사용
∙ DRAM보다 좀 더 비쌈
SDRAM
∙ Synchronous Dynamic Random Access Memory
∙ 클록틱(펄스)이 발생할 때마다 데이터를 저장하는 동기 DRAM
비휘발성 메모리
→ 전원 공급이 끊어져도 데이터가 손실되지 않음
플래시 메모리
∙ 디지털카메라, MP3 플레이어, USB 드라이버같이 전력이 없어도 데이터를 보관하는 저장장치
SSD
∙ 가격이 비싸지만 빠른 데이터 접근 속도, 저전력, 내구성 때문에 많이 사용
∙ 메인 디스크, 부팅 디스크로 많이 사용
롬(ROM)
Read Only Memory
∙ 비휘발성 메모리로 Chip에 영구적으로 데이터가 저장
∙ Usage: BIOS, Firmware
마스크 롬
∙ 데이터를 지우거나 쓸 수 없음
PROM
∙ Programmable ROM
∙ 전용 기계를 이용하여 데이터를 한 번만 저장할 수 있음
EPROM
∙ Erasable Programmable ROM
∙ 데이터를 여러 번 쓰고 지울 수 있음
메모리 보호의 필요성
* 메인 메모리 보호
∙ 현대의 운영체제는 *시분할 기법을 사용하여 여러 프로그램을 동시에 실행하므로 사용자 영역이 여러 개의 작업 공간으로 나뉘어 있음
∙ 메모리가 보호되지 않으면 어떤 작업이 다른 작업의 영역을 침범하여 프로그램을 파괴하거나 데이터를 지울 수도 있으며, 최악의 경우 운영체제 영역을 침범하면 시스템이 멈출 수도 있음
* 시분할 기법
∙ 하나의 CPU로 여러 작업을 동시에 실행하는 기술
∙ 한 번에 하나의 작업만 가능한 일괄 작업 시스템에 비해 효율성이 뛰어남
∙ 시간을 분할하는 방법 때문에 여러 작업이 동시에 실행되는 것처럼 보임
메모리 보호 방법
1. 작업의 메모리 시작 주소를 경계 레지스터에 저장 후 작업 시작
2. 작업이 차지하고 있는 메모리의 크기, 즉 마지막 주소까지의 차이를 한계 레지스터에 저장
3. 사용자의 작업이 진행되는 동안 이 두 레지스터의 주소 범위를 벗어나는지 하드웨어적으로 점검
4. 두 레지스터의 값을 벗어 나면 메모리 오류와 관련된 인터럽트가 발생 (실행 중단)
5. 메모리 영역을 벗어나서 발생한 인터럽트의 경우 운영체제가 해당 프로그램을 강제 종료
부팅
컴퓨터를 켰을 때 운영체제를 메모리에 올리는 과정
1. 바이오스(롬)
∙ 절대 변경되면 안 되는 SW 저장
1-1. 하드웨어 점검
∙ cpu, 메모리 연결이 잘 돼 있는지, 메인 보드 상태가 부팅 가능한지 등 체크
1-2. 메모리에 부트스트랩 코드를 올려서 실행
∙ 부트로더: 최초의 부팅을 위해서 실행되는 메모리에 적재되는 소프트웨어
2. 부트스트랩 코드가 운영체제 프로세스 실행
∙ 컴퓨터에서 첫 번째로 생성되는 프로세스 → 운영 체제
버퍼(Buffer)
∙ 속도에 차이가 있는 두 장치 사이에서 그 차이를 완화하는 역할을 하는 장치
∙ 일정량의 데이터를 모아 옮김으로써 속도의 차이를 완화
∙ 하드웨어와 소프트웨어 모두 포함하는 개념
∙ 일종의 중간 저장 매개체
스풀(Spool)
∙ CPU와 입출력장치가 독립적으로 동작하도록 고안된 소프트웨어적인 버퍼
* 입출력 장치는 CPU, 메모리와 비교할 때 아주 느림
* 버퍼와 스풀 구분 기준
- 버퍼: 주기억 장치 메인 메모리를 버퍼로 사용하는 경우
- 스풀: 디스크, 입출력장치를 처리하기 위한 버퍼 공간을 디스크에 둔 경우
∙ [예] 스풀러
∙ 인쇄할 내용을 순차적으로 출력하는 소프트웨어로 출력 명령을 내린 프로그램과 독립적으로 동작
∙ 인쇄물이 완료될 때까지 다른 인쇄물이 끼어들 수 없으므로 프로그램 간에 배타적
캐시(cache)
∙ 메모리와 CPU 간의 속도 차이(BSB와 FSB의 속도 차이)를 완화하기 위해 메모리의 데이터를 미리 가져와 (CPU 프로세스 안에) 저장해두는 임시 장소 (하드웨어)
* 메모리 → 디스크 대비 훨씬 빠르지만 CPU보다 훨씬 느림
∙ 필요한 데이터를 모아 한꺼번에 전달하는 버퍼의 일종으로 CPU가 앞으로 사용할 것으로 예상되는 데이터를 미리 가져다놓음 (prepatch)
∙ CPU는 메모리에 접근하기 전 캐시를 먼저 방문하여 원하는 데이터가 있는지 봄 → CPU 사이클을 아낄 수 있
캐시의 구조
∙ 캐시 히트(cache hit): 캐시에서 원하는 데이터를 찾는 것으로, 그 데이터를 바로 사용
* hit: 있음
∙ 캐시 미스(cache miss): 원하는 데이터가 캐시에 없으면 메모리로 가서 데이터를 찾음
* miss: 없음
* 캐시에서 데이터를 찾는 속도가 메모리에 접근하는 것보다 훨씬 빠름
∙ 캐시 적중률(cache hit ratio): 캐시 히트가 되는 비율
즉시 쓰기(write through)
∙ 캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 방식
∙ 메모리와의 빈번한 데이터 전송으로 인해 성능이 느려짐 → 단점
∙ 메모리의 최신 값이 항상 유지되기 때문에 급작스러운 프로그램 종료에도 데이터를 잃어버리지 않음 → 장점
지연 쓰기(write back)
∙ 캐시에 있는 데이터가 변경되면 이를 즉시 메모리에 반영하는 것이 아니라 변경된 내용을 모아서 주기적으로 반영하는 방식
∙ 카피백(copy back)이라고도 함
∙ 메모리와의 데이터 전송 횟수가 줄어들어 시스템의 성능을 향상할 수 있음
∙ 메모리와 캐시된 데이터 사이의 불일치가 발생할 수도 있음
L1 캐시와 L2 캐시
∙ 캐시는 명령어와 데이터의 구분 없이 모든 자료를 가져오는 일반 캐시, 명령어와 데이터를 구분하여 가져오는 특수 캐시로 구분
∙ L1 캐시: CPU 레지스터에 직접 연결
∙ L2 캐시: 메모리에 직접 연결
∙ 현대 프로세서들은 일반적으로 L3 캐시를 가짐
∙ 코어 간 공유를 위한 캐시
∙ Last-level cache (LLC) 라고도 부름
∙ L1 → L2 → L3
비쌈 쌈
빠름 느림
(크기 작은 순 나열)
저장장치의 계층구조
∙ 속도가 빠르고 값이 비싼 저장장치를 CPU 가까이, 값이 싸고 용량이 큰 저장장치를 반대쪽에 배치(ex. 메모리 근처)하여 적당한 가격으로 빠른 속도와 큰 용량을 동시에 얻는 방법
∙ 이점 → 효율 극대화를 위함
∙ CPU와 가까이 레지스터나 캐시를 배치하여 CPU가 작업을 빨리 진행할 수 있음
∙ 메모리에서 작업한 내용을 하드디스크와 같이 저렴하고 용량이 큰 저장장치에 영구적으로 저장할 수 있음
폴링 방식(polling)
∙ CPU가 직접 입출력장치에서 데이터를 가져오거나 내보내는 방식
∙ CPU가 장치의 상태를 주기적으로 검사하여 특정 조건을 만족할 때 데이터를 처리
∙ CPU가 명령어 해석과 실행이라는 본래 역할 외에 모든 입출력까지 관여해야 하므로 작업 효율이 떨어짐
∙ busy-wait으로도 표현
∙ 인터럽트 방식의 반대 개념
인터럽트 방식(interrupt)
∙ 입출력 관리자가 대신 입출력을 해주는 방식
∙ CPU의 작업과 저장장치의 데이터 이동을 독립적으로 운영 → 시스템의 효율을 높임
∙ 데이터의 입출력이 이루어지는 동안 CPU가 다른 작업을 할 수 있음
인터럽트
∙ 입출력 관리자가 CPU에 보내는 완료 신호
인터럽트 번호
∙ 많은 주변장치 중 어떤 것의 작업이 끝났는지를 CPU에 알려주기 위해 (CPU가 그에 상응하는 동작을 처리할 수 있도록) 사용하는 번호
∙ 윈도우 운영체제에서는 IRQ라 부름
인터럽트 벡터
∙ 여러 개의 입출력 작업을 한꺼번에 처리하기 위해 여러 개의 인터럽트를 하나의 배열로 만든 것
인터럽트 동작 방식
1. CPU가 입출력 관리자에게 입출력 명령을 보낸다.
2. 입출력 관리자는 명령받은 데이터를 메모리에 가져다놓거나 메모리에 있는 데이터를 저장장치로 옮긴다.
3. 데이터 전송이 완료되면 입출력 관리자는 완료 신호(인터럽트)를 CPU에 보낸다.
인터럽트 종류
입출력(I/O) 인터럽트
∙ 해당 입출력 하드웨어가 주어진 입출력 동작을 완료하였거나 또는 입출력의 오류 등이 발생하였을 때 중앙처리장치에 대하여 요청하는 인터럽트
∙ ex) 키보드 인터럽트
외부(external) 인터럽트
∙ 시스템 타이머(timer)에서 일정한 시간이 만료된 경우나 오퍼레이터가 콘솔 상의 인터럽트 키를 입력한 경우 (ex. Ctrl+C로 강제 종료 → I/O 인터럽트도 함께 발생) , 또는 다중 처리 시스템에서 다른 처리기로부터 신호가 온 경우 등에 발생
SVC(SuperVisor Call) 인터럽트
∙ 사용자 프로그램이 수행되는 과정에서 입출력 수행, 기억장치의 할당, 또는 오퍼레이터의 개입 요구 등을 위하여 실행 중의 프로그램이 SVC 명령을 수행하는 경우
∙ 운영체제 관점에서 어떤 목적에 해당되는 기능들을 수행하기 위함
기계 검사(machine check) 인터럽트
∙ 컴퓨터 자체 내의 기계적인 장애나 오류로 인한 인터럽트
프로그램 에러(program error) 인터럽트
∙ 주로 프로그램의 실행 오류로 인해 발생
∙ 수행 중인 프로그램에서 0으로 나누는 연산 (divide-by-zero)
∙ 보호(protection)되어 있는 기억장소에 대한 접근 (segmentation fault)
∙ 허용되지 않는 명령어의 수행 (illegal instruction)
∙ 스택의 오버플로(overflow) 등과 같은 오류가 발생할 때 (stack protection)
* 위 같은 비정상적인 종류가 발생했을 때 core dump 발생
* core dump: 컴퓨터 프로그램이 특정 시점에 작업 중이던 메모리 상태를 기록한 것
직접 메모리 접근 (Direct Memory Access, DMA)
∙ 데이터가 이동하는 데에는 언제나 CPU의 개입이 있어야 하나, CPU에 많은 부하가 걸림
∙ 입출력 관리자가 CPU의 허락 없이 메모리에 접근할 수 있는 권한
∙ 메모리는 CPU의 작업 공간이지만, 데이터 전송을 지시 받은 입출력 관리자는 직접 메모리 접근 권한이 있어야만 작업을 처리할 수 있음
메모리 매핑 입출력 (Memory Mapped I/O, MMIO)
∙ 메모리의 일정 공간을 입출력에 할당하는 기법
∙ mmap으로 매핑된 메모리 영역을 두 프로세스 간 공유 메모리 영역으로도 활용 가능
* cf) geeksforgeeks mmap 기반 producer-consumer 구현 (https://www.geeksforgeeks.org/posix-shared-memory-api/)
* 생산자 ∙소비자 문제: 자원을 공유하지만 하나는 생산하고 다른 하나는 소비하는 형태의 작업으로 두 프로세스(또는 스레드) 사이에 협업이 필요
병렬 처리 (parallel processing)
∙ 동시에 여러 개의 명령(분산 컴퓨팅)을 처리하여 작업의 능률을 올리는 방식
* ex) GPU
→ CPU는 보통 코어가 4개 or 8개인데, GPU는 코어가 100개임. (행렬 연산) 따라서 AI 분야에서 자주 사용
* CPU core
- CPU의 핵심적인 연산을 수행
- 연산을 수행하는 핵심적인 로직이 들어있는 디지털 전자 회로
- 한 번에 어떤 프로그램을 실행할 수 있는 능력을 가진 연산 장치
파이프라인 기법
∙ CPU에서 성능을 높이기 위해서 명령어 처리를 여러 단계로 나누어 단계별로 동시에 수행하여 병렬화를 시키는 것
슈퍼스칼라 기법
∙ 2개의 작업을 동시에 처리하는 방식 (2-way 또는 2-wide) → 두 배로 자원 투입
∙ 4개, 8개, ... N → N-way 또는 N-wide
∙ 명령어 수준(Instruction-level) parallelism을 추구하는 기술(CPU가 하나하나의 명령어를 실행)로, 멀티 스레드를 통한 thread-level parallelism과는 다른 개념 → 슈퍼스칼라 기법은 thread-level parallelism보다 훨씬 세분화된 수준의 병렬 처리
∙ 현대의 CPU는 이 두가지 모두 취하는 형태(Instruction-level parrlelism + Thread-level parallelism)
병렬 처리 시 고려 사항
1. 상호 의존성이 없어야 병렬 처리가 가능
∙ 각 명령이 서로 독립적이고 앞의 결과가 뒤의 명령에 영향을 미치지 않아야 함
→ 동시에 실행시켜야 하니까
2. 각 단계의 시간을 일정하게 맞춰야 병렬 처리가 원만하게 이루어짐
∙ 오랜 시간이 걸리는 작업 때문에 진행이 전반적으로 밀려서 전체 작업 시간이 늘어나므로 단계별 시간의 차이가 크면 병렬 처리의 효과가 떨어짐
→ 컴퓨터가 실행하는 명령어 수준으로 가져오면 컴퓨터 CPU clock에 대응됨
3. 전체 작업 시간을 몇 단계로 나눌지 잘 따져보아야 함
∙ 병렬 처리의 깊이 N은 동시에 처리할 수 있는 작업의 개수를 의미
∙ 이론적으로는 N이 커질수록 동시에 작업할 수 있는 작업의 개수가 많아져서 성능이 높아지지만, 작업을 너무 많이 나누면 각 단계마다 작업을 이동하고 새로운 작업을 불러오는 데 시간이 너무 많이 걸려서 오히려 성능이 떨어짐
→ 단계별 명령 수행 외적으로 드는 오버헤드들이 부가적으로 생기기 때문에 비효율적
멀티 프로세서 시스템 (multi processor system)
∙ 컴퓨터의 성능을 높이기 위해 프로세서를 여러 개 설치하여 사용하는 시스템
→ 메인보드에 프로세서가 여러 개 꽂혀 있음
∙ 프로세서마다 레지스터와 캐시를 가지며 모든 프로세서가 시스템 버스를 통하여 메인 메모리를 공유
∙ 장점: 많은 작업을 동시에 실행시킬 수 있음
* 프로세서: 하나의 CPU 칩(CPU 패키지), 컴퓨터의 두뇌에 해당
멀티 코어 시스템 (multi-core system)
∙ 기존 시스템을 유지한 채 멀티 프로세싱을 할 수 있게 하는 시스템
∙ 하나의 칩(chip)에 CPU의 핵심이 되는 코어(core)를 여러 개 만들어 여러 작업을 동시에 처리
→ 멀티 코어이면서 싱글 프로세서
∙ 듀얼코어(dual core)는 CPU의 주요 기능을 담당하는 코어가 2개, 쿼드코어(quad core)는 4개
Q. 만약 멀티 프로세서 시스템에서 3개의 CPU가 내장되어 있다고 할 때, CPU1에는 코어 1개, CPU2에는 코어 2개, CPU3에는 코어 3개 이런 식으로 각각의 CPU 코어 개수가 다를 수도 있는지 궁금함
A. ??
현대의 CPU
∙ 하나의 칩에 멀티코어와 명령어 병렬 처리 기능을 한꺼번에 구현
∙ 서버급 장비의 경우, 멀티프로세서+멀티코어 형태인 경우도 다수
+ Hyperthreading
- 코어가 4개이지만 논리적인 코어의 수가 8개처럼 보이도록 가상화
- 인텔에서 만든 기술
- 하드웨어적으로 서포트를 해주는 기능
- 멀티 프로세서, 멀티 코어와는 또다른 기술
CPU에서 명령어가 실행되는 과정
1. 명령어 패치(IF): 다음에 실행할 명령어를 명령어 레지스터에 저장
→ Instruction Fetch(추출)
→ 명령어 레지스터로부터 내가 지금 뭘 수행하면 되는지를 가져오는 행위
2. 명령어 해석(ID): 명령어 해석
→ Instruction Decode
→ ISA(Instruction Set Architecture) 메뉴얼에 따라
3. 실행(EX): 해석한 결과를 토대로 명령어 실행
→ Excute
4. 쓰기(WB): 실행된 결과를 메모리에 저장
→ Write Back
※ 여기에 일반적으로 3-4단계 사이 MEM(데이터 메모리에 있는 피연산자 접근)을 넣어 5-stage로 나타내기도 함.
→ 메모리로부터 값을 가져와서 실행해야 되는 경우
Recap: 파이프라인 기법
∙ CPU의 사용을 극대화하기 위해 명령을 겹쳐서 실행하는 방법
→ 명령어 수준에서 파이프라인(동시에 처리)을 활용해서 실행 시간을 단축시키는 방식
파이프라인의 위험
∙ 데이터 위험 (Data hazard)
∙ 데이터의 의존성 때문에 발생하는 문제
∙ 데이터 A를 필요로 하는 두 번째 명령어는 앞의 명령어가 끝날 때까지 동시에 실행되어서는 안 됨
∙ 데이터 위험은 파이프라인의 명령어 단계를 지연하여 해결
→ 하나의 명령을 실행하고 딜레이를 줘서 데이트 업데이트가 완료 된 이후에 실행을 해야 문제가 없음
* 파이프라인의 명령 단계를 일부러 지연시켜서 처리를 하도록 설계가 되어 있는 ISA들도 굉장히 많음
∙ 제어 위험 (control hazard)
∙ 프로그램 카운터 값을 갑자기 변화시켜 발생하는 위험
∙ 첫 명령어를 실행하고 보니 goto 문이어서 다음 문장이 아니라 다른 문장으로 이동하게 되면 현재 동시에 처리되고 있는 명령어들이 쓸모 없어짐
→ 파이프라인을 통한 이득을 얻을 수 없으며 CPU 사이클 낭비
∙ 제어 위험은 분기 예측이나 분기 지연 방법으로 해결
∙ 구조 위험 (structural hazard)
∙ 서로 다른 명령어가 같은 자원에 접근하려 할 때 발생하는 문제
∙ 명령어 A가 레지스터 RX를 사용하고 있는데 병렬 처리되는 명령어 B도 레지스터 RX를 사용해야 한다면 서로 충돌
∙ 데이터 캐시와 명령어 캐시가 나눠져 있는 이유
→ 나눠져 있지 않을 경우 구조 위험이 훨씬 많이 생길 수 있음
Recap: 슈퍼스칼라 기법 (super-scalar)
∙ 파이프라인을 처리할 수 있는 코어를 여러 개 구성하여 복수의 명령어가 동시에 실행되도록 하는 방식
∙ 대부분은 파이프라인 기법과 동일하지만 코어를 2개 구성하여 각 단계에서 동시에 실행되는 명령어가 2개라는 점이 다름 (2-way인 경우)
슈퍼파이프라인 기법 (super-pipeline)
∙ 파이프라인의 각 단계를 세분하여 한 클록 내에 여러 명령어를 처리
∙ 한 클록 내에 여러 명령어를 실행하면 다음 명령어가 빠른 시간 안에 시작될 수 있어 병렬 처리 능력이 높아짐
슈퍼파이프라인 슈퍼스칼라 기법 (super-pipelined super-scalar)
∙ 슈퍼파이프라인 기법을 여러 개의 코어에서 동시에 수행되는 방식
무어의 법칙 (Moore's law)
∙ CPU의 속도가 24개월마다 2배 빨라진다는 내용
∙ 초기의 CPU에만 적용되며 지금은 그렇지 않음
∙ 요즘에는 CPU 처리 속도를 올리는 대신 멀티코어를 장착해 CPU를 여러 개 사용
∙ 하나의 코어에서 여러 개의 명령어를 동시에 실행하는 멀티스레드 기술도 많이 사용
암달의 법칙 (Amdahl's law)
∙ 주변장치의 향상 없이 CPU 속도를 2GHz에서 4GHz로 늘리더라도 컴퓨터 성능이 2배 빨라지지는 않는다는 법칙
∙ CPU 속도를 올려도 메모리를 비롯한 주변장치가 CPU 발전 속도를 따라가지 못해 컴퓨터의 전반적인 성능은 저하
∙ 싱글코어 대신 듀얼코어를 사용하더라도 CPU 내 다른 부품의 병목 현상으로 CPU 성능이 2배가 되지 않음