| 컴퓨터 구조
01. 컴퓨터의 큰 구조
- 컴퓨터는 크게 하드웨어와 소프트웨어로 나누어집니다.
- 집에 있는 컴퓨터를 열어보면 그 안에 하드웨어를 볼 수 있는데,
크게 1) CPU, 2) 메모리, 3) Storage, 4) Network, 5) IO 장치로 나누어져요.
- 소프트웨어에는 시스템 소프트웨어와 응용 소프트웨어가 있는데요,
시스템 소프트웨어는 운영체제(OS) 나 장치 드라이버와 같이 사용자가 컴퓨터를 작동할 수 있게 하는 유틸리티를 말하며
응용 소프트웨어(= Application software)는 오라클이나 게임과 같이 특정 문제나 업무를 처리하기 위한 목적으로 만들어진 소프트웨어를 말합니다.
[참고 : 양자 컴퓨터] - 양자 컴퓨터는 양자의 기본 성질인 중첩, 얽힘 등을 사용해서 다수의 정보를 처리할 수 있는 새로운 컴퓨터를 말합니다. - 오늘날의 트랜지스터(일종의 스위치)는 반도체 칩에서 원자의 크기로 나아가고 있다고 해요 (HIV바이러스보다 작은 크기) - 큐비트 곧, 1과 0이 동시에 존재하는 '중첩'으로 양자 병렬처리가 가능해서 속도가 엄청나게 빨라지게 되었다고 해요. - 양자 컴퓨터는 현재 계속적인 연구단계에 있으며, IBM이나 구글 등에서 연구를 진행하고 있다고 해요. - 다만 속도가 지나치게 빠르다 보니 손쉽게 보안을 뚫어버리기도 한다고 해요. 하지만 의료시술 및 연구에 적절히 사용될 수 있으며 보완할 시 가능성이 무궁무진하기에 차세대 컴퓨터로 주목을 받고 있다고 합니다. 양자 컴퓨터가 보급형이 되면 이제 영화 Her에 나오는 AI도 꿈만은 아니겠죠? |
02. 폰노이만 구조
- 컴퓨터의 구조는 다양한 방식으로 분류될 수 있는데, 폰노이만에 의해 그 구조가 깔끔하게 정리되었다고 합니다.
- 간략하게 요약하면, 폰노이만 구조는 1) CPU, 2) 메모리, 3) 프로그램 으로 이루어진다고 해요.
- 이 구조에 따르면 컴퓨터는 키보드와 같은 입력장치로부터 받아온 데이터를
(1) CPU의 메모리를 통해 저장하는데,
(2) 레지스터에서는 변수와 같은 작은 데이터 및 중간처리과정에서의 데이터를 저장하고
캐시에서는 자주 사용하는 데이터를 임시 저장해 빠르게 접근하며
RAM(요즘엔 DRAM, DDP4)을 통해서는 전반적인 처리를 위한 데이터를 보관한다고 합니다.
(3) 프로그램은 어떤 문제를 해결하기 위해 만들어진 명령문의 집합체를 의미하는 것으로, 앞서 말한 시스템 프로그램이나, 응용 프로그램이 이에 해당됩니다. 사용자는 프로그램을 통해 컴퓨터와 소통을 하는데요. 프로그램이 돌아가면서 사용자의 명령을 컴퓨터가 이해할 수 있게 0과 1로 변환하고 CPU의 연산장치(ALU)를 통해 명령을 처리합니다.
03. 비트(bit, 0과 1)와 비트논리연산(AND, OR, NOT)
- 폰노이만 구조에서 잠시 언급된 CPU의 연산장치(ALU)에는 마이크로 연산 곧,
1) 논리연산을 수행하는 부분과 2) 산술연산을 수행하는 부분, 그리고 3) 시프트 연산을 수행하는 부분이 있습니다.
- 여기서 연산을 수행할 때에 "비트"라는 단위가 사용됩니다.
- 비트는 2진수 1과 0을 나타내는 것으로, 스위치를 키고 끄는 것과 같이 ON과 OFF를 의미해요.
- 이 2진수의 수에 대해 비트 논리 연산을 수행할 수 있는데, 그것이 바로 AND/OR/NOT 연산입니다.
- 컴퓨터 내부 회로는 AND, OR, NOT을 토대로 다시 NAND, NOR, XOR...을 만들어내는데요.
- 논리회로를 엮어내어 산술연산을 만들 수도 있습니다.
[ 참고 : bit와 byte와 nibble ] 1 byte = 8 bits 1 nibble = 1/2 bytes = 4bits * nibble은 영어로 '야금야금 먹다'라고 합니다. bite는 영어로 '한 입 베어 씹어 먹다'라는 뜻이라 해요. 그러니 해석하면 byte는 '한 입'이니 1이고, nibble은 '야금'이니 1/2로 보면 쉬울 것 같아요. 이런 소소한 재미. 버그도 그렇지만 공부하면 할 수록 과거 개발자들의 소박하며 귀여운 네이밍들을 볼 수 있네요.ㅎ |
04. 비트 산술연산, 조합회로와 순차회로
- 앞에서 ALU에는 논리연산 외에도 산술연산을 수행한다고 이야기하였습니다. 그 중에서도 덧셈을 담담하는 것이 바로 아래의 '가산기'에요.
(1) 가산기(Adder)
- ALU에는 가산기라는 것이 있는데요. 논리회로를 조합해 반가산기 -올림을 제외한 한 자릿수 덧셈만 처리-를 만들고, 다시 추가으로 논리회로를 조합해 전가산기-올림까지 처리-를 만들면 제대로된 덧셈이 가능해집니다.
- 전가산기를 여러개를 묶으면 이젠 여러 자릿수를 계산할 수 있게 됩니다. 8개를 묶으면 8bit, 16개를 묶으면 16bit... 더 나아가서는 64bit의 자릿수를 처리할 수 있게 돼요.
(2) 발진기와 클럭
- 앞에서는 논리회로를 조합해서 만든 가산기(=덧셈기)를 말했다면, 이번엔 NOT을 만들어주는 발진기를 소개하려 합니다.
- 발진기(Oscilliator)는 전자회로를 통해 연속파의 교류신호를 발생하는 회로를 말하는데요. (말이 참 어렵다)
- 쉽게 말하면 0 -> 1 -> 0 -> 1.. 을 마치 매트로놈처럼 주기적으로 반복해서 만들어주는 녀석이라고 생각하면 됩니다.
- 다시, Oscilliator를 통해서 0이 들어오면 1을, 1이 들어오면 0을 반환하는 걸 하나의 사이클로 보는데요.
- 클럭(Clock)은 1초 동안 이 사이클이 움직이는 주파수를 말하는 것으로, 단위는 Hz로 표기됩니다.
- 클럭이 높을 수록 처리속도는 빨라지는데, 클럭을 높힌다고 다 놓은 것이 아닌 것이, 그만큼 발열량과 소비 전력이 커지는 단점이 있다고 합니다. 그래서 최근에는 클럭(클럭 - 비유 : 도로 제한 속도)을 높히기 보다는 멀티 코어(코어 - 비유 : 도로 차선) 또는 멀티 스레드를 통해 CPU 성능을 높이는 것을 추구한다고 해요.
(3) 플립플롭과 비트의 Write/Read
- 플립플롭(flip-flop)은 래치(latch)라고도 하며, NOR게이트를 조합해 만든 회로인데요, 최근에 스위치가 ON이었는지, OFF였는지를 알 수 있게 해주는 회로입니다.
- 결국 다시 말해, 플립플롭은 0 or 1 곧, 비트를 저장할 수 있는 회로를 말해요.
- 플립플롭의 종류는 R-S flip-flop, Level-triggered flip flop, D-type flip-flop, JK flip-flop 등 종류가 매우 다양하다고 합니다.
- 전원이 공급되는 한, 플립플롭은 상태의 변화를 위한 신호(클럭)이 발생할 때까지 현재 상태를 유지해요.
- 플립플롭을 여러개 묶으면 8bit latch를 만들수 있는데요, 8-to-1 selector와 3-to-8 decoder로 온전한 8 bit latch를 만들 수 있다고 합니다. 그리고 이 8bit latch가 우리가 말하는 RAM이라고 해요. RAM에서는 8-to-1 selector와 3-to-8 decoder를 통해 3개의 Address가 있으면 8개 중 하나의 비트를 선택해서 쓰거나 읽을 수 있다고 합니다.
- 이제 이 8 X 1 latch를 여러개 연결하게 되면 하나의 비트에서 여러개의 비트를 쓸 수 있는 m * n RAM array를 만들 수 있다고 해요. 그렇다면 64k RAM은 얼만의 데이터를 쓸 수 있을까요? 65536(2^16) x 8bits라고 합니다.
* 1 Megabytes = 1 Mega x 8 bits = 8 Megabits
[ 참조 : 어셈블리어 - 주소 배정 ] MOV R1, #120 R1 <- 주소120 직접 지정 MOV R1, R2 R1 <- R2 MOV R1, 120 R1 <- 주소120의 데이터 넣기 MOV R1, @120 R1 <- 상대 주소 120 --- 위 세가지와 다르다. |
(4) 누산기(Accumulator)와 레지스터
- 앞서 가산기에서 덧셈을 처리한다는 이야기를 하였고, 쭉쭉 내려와 RAM에서 특정 데이터를 저장하고 읽을 수 있다는 걸 이야기했어요. 이번에는 누산기에 대해 이야기를 할 건데요.
- 누산기는 산술 및 논리연산의 결과 또는 중간계산과정을 저장하는 레지스터를 말합니다.
- 구체적으로 들어가면 8-bit Adder와 8-bit Latch로 구성되어 있으며, Clear스위치가 눌리면 어떤 데이터든 기존 값을 삭제하고, Adder를 통해 덧셈이 이루어진다고 해요.
(5) Program Counter (PC)
- Program Counter, 16-bit counter는 1씩 증가하는 조합논리회로를 말한다고 해요.
- 프로그램 카운터는 다음에 실행될 명령어가 들어갈 주기억장치의 주소를 기억하는 레지스터입니다.
Register | Program Counter | = 명령 계수기. 다음 수행될 명령어의 주소를 저장 |
Instruction Register | = 명령 레지스터. PC가 지정하는 번지에 기억된 명령어를 임시 저장 |
|
Status Register | = 상태 레지스터. CPU의 상태(flag) 정보 기억 프로세서의 상태나 연산 결과의 상태를 저장하기 위한 특수 목적의 레지스터 |
|
General Purpose Register | = 범용 레지스터. 작은 데이터들의 임시 저장 공간. 연산 처리 및 데이터 주소를 지정 |
* 인터럽트시 PC는 1, R = 0이 된다.
* Set(Preset) : 101010 | 111111 = 111111, Clear(Reset) : 101010 & 000000 = 000000
05. 어셈블리어(저급 언어)와 고급언어.
- 어셈블리어는 기계어와 일대일 대응이 되는 저급 언어로, 컴퓨터 구조에 따라 사용하는 기계어가 달라집니다. 컴퓨터의 CPU마다 지원하는 오퍼레이션의 타입과 갯수, 레지스터의 타입과 갯수, 저장 데이터 표현 형태도 다 다르기 때문에 컴퓨터 제조업체에 따라서 어셈블리어도 다를 수 밖에 없어요.
- 어셈블리어는 니모닉이라고 하는 일련의 숫자를 단어로 바꿔준 언어를 사용합니다. (ex. MOV, LOAD, ADD, h)
- 어셈블리어의 한계를 극복하기 위해 고급언어가 등장하게 되었는데요,
- 이 중에서도 컴파일 언어는 소스 코드를 어셈블리어에서 기계어로 변환하는 "컴파일링"을 통해 먼저 메모리에 기계어로 번역된 코드를 올려두고 실행을 하는 언어를 말합니다. 예를 들어, C언어가 있죠. (자바도 컴파일 언어라고도 하는데, 사실상 컴파일과 인터프리터가 섞인 형태입니다)
- 반면 인터프리터 언어는 사전의 컴파일링 없이, 소스 코드를 한 줄씩 실행하며, 컴파일링을 진행하고 변환 코드를 실행하는 언어를 말합니다. 예를 들어, javascript, SQL, python, Ruby, 스크래치 등이 있습니다.
06. 다시 폰노이만. CPU의 구조와 실행과정
- 다시 폰노이만 구조로 돌아오면, 컴퓨터는 아래와 같이 구성됩니다.
[1] CPU : Controller Unit(Program Counter, 주소) + ALU (가산기 + 논리연산 + 레지스터)
[2] Memory
[3] 프로그램
- CPU의 기본 구조
PC(Program Counter) | 다음 실행할 명령어 주소를 저장 |
IR(Intruction Register) | 최근 인출한 명령어 보관 |
누산기 | 데이터 일시 보관 |
MAR(Memory Address Register) | CPU가 메모리 참조 위해 보관하는 데이터 주소를 가진 레지스터 |
MBR(Memory Buffer Register) | CPU가 메모리부터 읽거나, 저장할 데이터 자체를 보관하는 레지스터 |
- CPU의 기본 실행 구조
Instruction Fetch | 실행할 명령어를 메모리에 읽어 CPU로 가져옴 |
Instruction Decode | 인출한 명령어에 포함된 데이터를 가져오고 명령어를 해독 |
Instruction Execution | 명령어 실행 |
Write Back | 실행 결과 저장 |
* Instruction은 여기서 '명령어'라는 의미
- CPU의 명령어 구조 : opcode(사전 약속된 명령어) + operand(argument, 데이터)
[참조]
- 마이크로 연산, https://devraphy.tistory.com/308?category=1014713
- 레지스터 전송과 마이크로 연산 바로가기
- 클럭(Clock), https://soojong.tistory.com/entry/%ED%81%B4%EB%9F%ADClock
- 클럭과 코어와 스레드, 캐시메모리 https://library.gabia.com/contents/infrahosting/1227/
'Computer Science > OS' 카테고리의 다른 글
[운영체제] 프로세스와 스케줄러 (0) | 2022.07.23 |
---|---|
[운영체제] 운영체제란? 커널, 시스템 콜, 커널 모드 (0) | 2022.07.23 |
[ 네이밍 규칙 ] 웹 개발자가 알아야할 네이밍규칙 스크랩 (0) | 2022.05.18 |
[네트워크] 멀리있는 컴퓨터끼리는 이렇게 데이터를 주고받는다. - (3계층) IPv4, ICMP, 라우팅 테이블 및 전송, 조각화 (0) | 2022.05.15 |
[네트워크] 통신하기 전 반드시 필요한 ARP 프로토콜 (0) | 2022.05.15 |