2024년 10월 1일 화요일

CPU bit별 발전에 따른 변화

 80년대 부터 컴퓨터를 접해본 나로서는 개인용 컴퓨터 기준으로 8bit ~ 64bit 까지 고루 겪어보게 되었다.

컴퓨터에 관심이 많아 개발을 일찍 시작하게 되면서 CPU에서 있다가 사라진 것들도 보개되고 반대로 없다가 생겨난 것도 보게 되었다.

아직 128bit 는 범용 CPU에 적용되려면 한참 걸릴 것 같으니 지금까지 겪어왔던 개인용 PC의 CPU들의 특징을 정리해 보려 한다.

[8bit CPU]

처음 접한 컴퓨터는 주로 MSX와 Apple 로 나뉘던 8bit CPU기반 PC들이었다.

CPU로 보자면 Z80과 mod6502 로 양 분 되던 시기 였다.

이들의 공통적인 특징은 기본 연산이 8bit 라는 점, 곱셈과 나눗셈 기능이 없다는 점, 그리고 일부 CPU (Z80)의 경우 IO 포트 영역이 따로 있다는 점으로 생각 된다.

CPU가 제어 가능한 주소 영역의 크기는 CPU의 bit수를 따라 가는 것이 일반적이다. 8bit CPU는 기본 연산이 8bit이기 때문에 주소 공간도 8bit 가 일반적이어야 겠지만, 아무리 가정용 컴퓨터라 하더라도 256byte (8bit = 256)로 소프트웨어를 운용한다는 것은 너무 심한 한계인 것이다.

그래서 일반적으로 8bit CPU들은 주소영역 제어만 예외적으로 16bit를 사용하고, 이를 위하여 일부 주소 제어 관련 레지스터들을 16bit로 만들어 놓았다.

일부 PC의 경우 16bit (64Kbyte)의 한계를 넘기 위해서 paging 방식을 사용하였다. 여기서 paging은 요즘 CPU에서 가상 메모리를 위해 사용하는 paging 과 결과적으로는 유사하지만, CPU가 아닌 외부장치의 도움을 받아 동작하는 paging이라 보면 된다.

MSX의 경우 16Kbyte 단위로 주소 공간을 나누어 연결되는 RAM이나 ROM, 주변기기를 교체하여 사용할 수 있도록 하여 일부 기종은 512Kbyte라는 초기 16bit PC와 맞먹는 RAM을 장착하기도 하였다.

또한 여담이지만 이 물리적 페이징 기능을 사용하여 (이것도 엄연한 페이징이므로) 멀티 테스킹을 구현한 OS도 있었다.

[16bit CPU]

개인용 컴퓨터, 게임기가 활성화 되면서 CPU는 더이상 군이나 기업을 위한 것이 아니게 되었고, 많은 CPU 제조사들이 가종용, 게임용 CPU를 경쟁적으로 출시하였다. 이때 눈에 띄는 두가지 CPU가 있는데, 8086/8088과 mc68000 이었다.

80x86 시리즈와 68000 시리즈는 같은 16bit지만 가는길이 너무 달랐다.

8086의 경우 16bit 지만 주소공간은 20bit를 가지고 있었고, Z80처럼 부족한 주소공간을 배려하여 I/O 포트 공간이 별도로 있었다.

68000의 경우 버스만 16bit 였고, 레지스터 및 연산은 32bit였다.

주소 공간은 24bit로 전체적으로 8086을 압도하고 있었다.

하지만 8086을 만든 intel은 상위 모델 개발에 힘을 쓰는 것이 아닌, 8bit PC와 경쟁하기 위하여 원가절감에 열을 올리고 있었고, 결과 나온 제품이 외부 8bit bus를 사용한 8088 이었다.

MS 창립자인 빌게이츠 마저 메모리 640Kbyte 면 누구나 문제없이 쓸수 있다 라고 할정도 였으니...

기술적으로는 68000 이 선도하고 있었지만, PC시장에 자리를 잡아버린 8086 으로 진입이 어려워져, 주로 게임기나 워크스테이션 등 마이너 한 영역에서 사용되게 되었다.

참고로 mc68000은 이전 모델인 6800의 상위 모델이라는 뜻도 있지만, 칩 제조에 사용된 트렌지스터 수가 68000개라 이름이 그렇게 결정되었다는 이야기도 있다.

[32bit]

16bit 치고 제약이 심한 8086/8088 은 그 한계가 빨리 왔다.

업무용으로 사용하기 때문에 적은 데이터를 빠르게 처리만 하면 된다라고 생각했던 intel이었지만, 멀티미디어라는 시대를 만나면서 생각을 바꾸지 않을 수 없었다.

중간에 80286이라는 메모리 용량을 16Mbyte까지 늘릴 수 있는 16bit CPU를 만들었지만, 기존 소프트웨어도 호환이 안되고, 용량이나 속도가 압도적으로 빠른것도 아니었기 떄문에 보호모드에 대한 시험 작품이나 좀 더 빠른 8086으로 만족해야 했었다.

이 후 칼을 갈던 intel은 80386이라는 걸출한 32bit CPU를 만들어 내었다.

당시 32bit CPU들이 서버용으로 많이 나와있었고, MC68000은 이미 32bit의 기반이 되어있었기 때문에 살짝 업그레이드 하여 완벽한 32bit 모델을 내놓았지만, PC 시장에서는 80386의 경쟁상대가 되지 못하였다.

바로 16bit 호환성 때문이었다.

32bit는 주소공간이 기본적으로 4GByte 나 되었기 때문에 당시 사람들은 이번에야 말로 이보다 큰 주소공간이나 메모리를 쓸 일은 없을것이라 생각했다.

16bit CPU와 32bit CPU의 큰 차이를 말하라 한다면 CPU 차원의 paging 지원으로 생각 한다.

이때부터 PC는 가정에서 게임이나, 특수한 소프트웨어 하나를 돌리는 빈도보다 작고 생활에 자주 쓰이는 소프트웨어를 쓰는 빈도가 높아지기 시작했다.

그 큰 메모리 공간에 작은 소프트웨어 하나만 실행시키기에는 CPU 성능과 메모리를 낭비하는 것이나 다름 없었다.

이때 부터 업체들은 작은 프로그램들을 동시에 여러개 실행 시킬 수 있는 멀티테스크를 지원하는 OS개발과 이를 쉽게 사용하기 위한 GUI를 사용하기 시작했다.

16bit 시절부터 일부 CPU에서 셀렉터 개념으로 메모리의 구간을 지정하여 나누어 쓸 수 있는 기능을 제공하였지만, 여러 프로그램을 동시에 돌리는 효율이 매우 좋지 않았다. 이를 극복할 수 있는 것이 paging이었다.

여러 업체들이 멀티 테스킹 OS를 지원하기 위하여 mmu (memory management unit)을 탑재하기 사작하였고, intel은 진심으로 multi tasking을 지원하기 위하여 tss (task state segment)와 16bit 소프트웨어를 multi taske 하기 위한 v86모드를 지원하였다.

새로운 32bit를 지원하면서 mmu도 내장하고 multi task도 잘 지원하면서 기존 16bit 소프트웨어도 활용할 수 있는 CPU니 PC 분야에서는 이를 대항할 CPU가 없을 정도였다.

당시 RISC와 CISC 간의 효율성 논란이 심하기도 하였는데, 80386이 CISC라는 점을 들어 RISC CPU에서 80386을 빠르게 애뮬레이션 할 수 있다고 호기롭게 나서는 개발 업체도 있었지만, 이는 RISC와 CISC의 장단점을 제한된 상황에서 생각한 오산이었다.

실제로 나온 제품은 사용하기 어려울 정도로 느렸고, 이런 호환성 이야기는 지금도 간간히 나오지만, 여러세대 전의 CPU가 아닌 이상 최신 CPU를 빠르게 애뮬레이션 하는 CPU는 아직까지 보지 못했다.

본론으로 돌아와 GUI가 활성화 되면서 사람들은 멀티 미디어에 관심을 가지게 되었고, 이는 CPU 및 하드웨어 , OS 개발자들에게 시작되는 지옥의 서막이었다.

멀티미디어 데이터의 특징은 일부 복잡한 연산도 있지만, 그보다 더 필요한 것이 단순한 대량의 데이터 연산 및 출력이었다.

그래픽 카드들은 경쟁하기 위해 1년도 되지 않아 더 높은 해상도와 색상을 지원하는 그래픽 카드를 쏟아 내었고, CPU와 메모리는 높아진 해상도와 색상으로 인해 메가 단위 용량의 그래픽 데이터를 전송하고 출력하느라 쉽게 한계에 다다르게 되었다.

이 후 32bit CPU들은 멀티미디어 가속을 위한 기능 위주로 발전을 하게 된다.

8bit 시절 64Kbyte 메모리에서 4Mbyte 면 어마한 차이가 있었지만, 겨우 1024x768해상도의 2 ~ 3Mbyte 가량 하는 그림 한장이면 용량이 반이상 차버리게 되었다.

킬로바이트 시절이 엇그제 같은데 멀티미디어가 등장하면서 시대는 Mega를 건너뛰고 Giga를 요구하게 되었다.

[64bit]

32bit 라는 4Gbyte의 주소공간으로 한계에 다다르자 intel 은 PAE (물리주소 확장)등으로 발악을 해보고, 새로운 64bit CPU 개발로 판을 바꿔보려고 한 시도를 할 때, AMD에서는 AMD64라는 새로운 규격으로 시장을 흔들었다.

64bit CPU는 일부 서버용 CPU를 제외하고는 32bit 시절보다 빨리 활성화 되진 않은 것 처럼 느껴진다.

생각라기로는 mips 나 arm , power 등 다른 CPU들은 PC 시장에서 밀려나면서 주로 임베디드 시장을 바라 봤는데, 임베디드 시장에서는 멀티미디어 장비가 아닌 이상 32bit로도 매우 넘치는 사양이었다. 현재까지도 임베디드 시장에서는 8bit CPU도 간간히 쓰일 정도인데, 64bit는 불필요한 고퀄리티라 할수 있었다.

하지만 스마트 폰이 대중화 되기 시작하면서 PC의 기능을 스마트 폰에서도 같이 쓰기 시작하자 스마트폰용 CPU들이 64bit로 넘어오기 시작했다.

64 bit 주소공간은 18446 엑사 바이트의 방대한 크기를 지원하기 때문에 초기에는 64bit 주소를 다 쓰기 어려워 40bit 만 사용하는 CPU들이 주로 나왔다.

하지만 딥러닝 등 대량의 데이터 처리가 필요한 AI나 빅데이터 처리가 필요해 지면서 48bit 지원으로 늘어나더니, 지금은 64bit 다 지원하는 CPU도 나오기 시작하고 있다.

[없어지는 것들]

CPU가 이만큼 진화하면서 불필요해지고 없어져 가는 것들도 생기게 된다.

- 1byte 디버깅 소프트웨어 인터럽트

8086 시절, 코드를 디버깅 하기 쉽게 하기 위하여 intel에서는 0xCC 1byte 로

int 3 이라는 소프트웨어 인터럽트를 호출하는 명령을 만들었다.

코드를 디버깅 하기 위하여 원래 코드 값을 백업해 두고 그자리에 0xCC 한바이트

만 집어 넣으면 브레이크 포인트를 걸을 수 있는 당시로선 효과적인 도구였다.

하지만, 보안으로 인해 실행 코드 영역에 쓰기 작업이 금지되는 요즘 시절에

위와 같은 디버깅 방식은 효율이 좋지 않고, CPU에 디버깅 레지스터들이 지원

되면서 64bit에 와서는 해딩 기능이 삭제되었다.

- io port 영역

주소 영역이 부족하던 시절에는 주변기기 장착을 위해 별도의 io용 주소 영역을

만들었었다. 하지만, 메인 주소공간이 빠르게 넓어지고, 별도 IO 공간 구현에

자원 낭비를 하는 것이 비효율적이 되자, 지금은 사라지고 있다.

- tss

80386이 나왔을 때 multi task 를 보다 빠르게 구현하기 좋은 도구였으나,

멀티미디어, AI 등 다양한 가속이 나오고 io port 영역 마저 사라지는 추세에서는

유연하지 못한 tss 는 불필요하게 되었다. intel도 64bit에서는 형식상 유지만

하고 실질적인 multi task에서는 사용하지 않고 있다.

- inc , dec

c 언어에서 보면 i++, i-- 와 같은 하나씩 증가하거나 감소시키는 명령이 있었다.

생각 보다 사용빈도가 높아 intel에서는 이를 CPU 차원에서 지원하여 보다 빠른

실행속도를 구현하였으나, 근래에 들어와서는 생각보다 효율이 없어 64bit 부터

없에는 추세이다.

- selector 기반 보호모드

16bit 시절 paging 을 쓰기전에 나왔던 보호모드는, 호환을 이하여 유지는

하였지만, 지금은 다들 flat 모드 위주로 사용하기 때문에 굳이 유지해야 할

필요가 없는 기능이 되었다. 64bit에서 사라지는 추세이다.

- 16bit, 32bit 호환 모드

더 이상 16bit 시절 소프트웨어나 구형 32bit 소프트웨어를 운영할 필요가

없어지면서, 64bit에서는 해당 기능들을 삭제해 가는 추세이다.

intel 도 x86S 라는 16bti, 32bit 호환모드를 제거하는 모드에 대한 표준안을

만들면서 준비하는 중이다.

쓰다보니 거의 CPU 변천사가 되어버렸다.

넋두리 처림 나열된 내용을 보면 내 글 실력도 많이 부족하다는 것을 느낀다.

계속 정리하며 글을 쓰다 보면 언젠가 실력이 늘지 않을까 생각한다.

댓글 없음:

댓글 쓰기