Little Jay

[OS] Computer System Overview I (Components, Processor, PIC) 본문

Univ/Operating System(OS)

[OS] Computer System Overview I (Components, Processor, PIC)

Jay, Lee 2022. 7. 8. 16:08

Basic Components

  컴퓨터는 크게 네 가지의 구성요소로 이루어진다.

  • 처리기(processor): 컴퓨터의 동작을 제어하고 데이터를 처리한다. 하나만 있는 경우에는 일반적으로 중앙처리장치(CPU)라고 부른다.
  • 주기억장치(main memory): 데이터와 프로그램을 저장하는 장소이다. 전형적인 휘발성(volatile)이기에 컴퓨터를 shutdown 시키면 메모리의 내용이 사라진다. 
  • 입출력모듈(I/O Module): 컴퓨터와 외부 환경 간의 데이터 이동을 담당한다. 외부 환경은 주로 보조기억장치, 통신장비, 단말기 등등 다양한 외부 장치로 구성이된다.
  • 시스템 버스(System Bus): 처리기, 주기억장치, 그리고 입출력 모듈간의 통신을 담당한다. 

Processor

 프로세서는 다양한 장치들로 구성이 되어있다.

  • ALU(Arithmeric/Logic Unit)이 들어있다. 수학적인 계산과 더불어 논리 비교 연산을 수행하는 장치이다.
  • CPU(Central Processing Unit)은 ALU, Control Unit, 레지스터들을 제어하는 동시에일련의 instruction을 수행한다.
  • PC(Program Counter)는 다음에 수행이 되는 instruction의 주소이다. 일반적으로 명령이 수행되면 다음 실행할 주소를 반입한다. 만약 branch가 일어나게 된다면 해당 주소를 반입한다. 
  • IR(Instruction Register)은 현재 실행 중인 명령을 기억하는 레지스터.
  • PSW(Program Status Word)는 시스템 내부의 순간순간의 상태를 기록하고 있는 정보.
  • AC(Accumulator)는 연산 결과를 임시로 저장하는 레지스터로 누산기라고도 함.
  • MAR(Memory Address Register): 데이터의 주소를 가리키고 있는 레지스터
  • MBR(Memory Buffer Register): 데이터를 임시로 기억하는 레지스터로 데이터를 처리하기 위해 거쳐가는 레지스터

출처: https://velog.io/@shinychan95/%EC%BB%B4%ED%93%A8%ED%84%B0-%EA%B5%AC%EC%A1%B0-1%EA%B0%95-%EC%A0%95%EB%A6%AC

 위 그림의 초록색 부분을 보자. Moore's Law(무어의 법칙)으로 인해 Frequency가 잘 올라가다가 2000년 초반에서 부터는 잘 올라가지 않는다. 이를 빨간색 부분을 보면 Power Consumption이 덩달아 같이 증가하고 있다. 이에 대해 자세하게 정리한 그림이 있는데 궁금한 사람은 Hennsy Petterson의 RISC-V 2판에 그림이 잘 나와있으니 참고하면 되겠다. (저작권 문제는 많이 민감해서 블로그에 혹시 잘못된 그림은 전부 고치고 있는 중이다) 각설하고 PIC, Z80, ARM PXA 등등 1970년대 부터 꾸준히 Frequency가 잘 성장해 왔는데 문제는 Power Consumption이 너무 높아지게 되었다. 그래서 Pentium4부터 Multiprocessor을 사용하게 되었으며 그 기점이 Dual Core의 시작이라고 한다. Frequency와 Power의 trade-off로 인한 멀티프로세서가 대두하게 되었다. 

 

 GPU(Graphical Processing Unit)도 일종의 Processor라고 봐야 하는데 이는 간단한 numeric 연산의 수요가 매우 높아지면서 발전하게 되었다. Single Instruction Multiple Data(SIMD) 방식을 사용해서 간단한 연산을 병렬처리를 효율성있게 처리한다. 게임, 인공지능, 머신러닝, 이미지 처리 등등 분야에서 많이 사용하게 된다. 

 

 Soc(System on a Chip)은 다양한 모바일 디바이스들이 등장함에 따라 발전했다. 핸드폰에 인텔 i5 12세대 프로세서를 넣을 수 없는 듯이 디바이스의 크기에 맞추기 위해 Processor하나에 DSP, CPU, Main Memory 등이 모두 들어가 있는 것이다. 특히 Arm Model에서는 Big, Little Core을 활용해서 CPU의 전력 사용을 줄이고자 하고 했다. (삼성 엑시노스 화이팅....) 이에 대한 동작 원리를 간단하게 설명하자면 각 코어별로 수행하는 작업을 다르게 Scheduling해줌으로서 전력 사용량을 분산시킬 수 있다. 이를 통해 Power을 30~40%정도 줄일 수 있다고 한다. 작은 작업들은 Little Core에게 할당하고 무거운 작업들에 대해서는 Big Core에게 할당하는 방식이다. 일반적으로 Little Core의 전력 소비량을 낮지만 computation 당 power 소모량은 x=y 그래프 처럼 그려지는 반면, Big Core는 약 y = 0.5x + 10 정도로 그릴 수 있다. 그래서 이 Arm 방식에서는 OS가 어떤 CPU에게 어떤 작업을 할당하는지가 중요하다. 

출처: https://itigic.com/ko/big-little-architecture-in-processors/

 일반적으로 우리는 Von Neumann Architecture에 따라 Program을 메모리에 올리고 사용하는 방식으로 Processor를 설계, 제작해왔다. 그러나 최근들어서 AI의 발전에 따라 폰 노이만 아키텍쳐가 가지는 병목현상으로 인해 AI 개발하는데에 있어서 비효율성이 도래했다. 따라서 새로운 패러다임이 등장했으며 Neuromorphic Architecture를 바탕으로 한 NPU, 양자 컴퓨터등이 개발되고 있는 추세이다. 이는 분산처리가 주 목표이며 폰 노이만 아키텍쳐의 탈피이다. 

Memory

 RAM(Random Access Memory)은 크게 두 가지로 나뉘게 된다. Static RAM(SRAM), Dynamic RAM(DRAM)이다. SRAM은 주로 Cache를 지칭한다. 한 비트 당 6개의 트랜지스터로 구성이 되어 직접도가 낮아, 가격이 비싸다. 따라서 속도가 빠르다. 반면 DRAM은 주로 Main Memory를 지칭하며, 한 비트 당 하나의 트랜지스터로 구성이 되어있어 직접도가 높아 가격적인 측면에서 유리하다. 반면 속도는 SRAM보다 느리다. 두 메모리 모두 휘발성이기 때문에 Power가 꺼지게 되면 담겨있던 정보가 모두 날라가게 된다. Non-volatile Memory에는 Flash Memory 정도가 있겠다. 

Flash Memory

 Flash Memory는 대표적인 Non-Volatile unit이다. 휴대용 디바이스에서 많이 사용된다. 플래시 메모리는 어디에나 존재하고 있고, 직접도가 높으며, 속도도 HDD보다 월등히 높다. 또한 Access Latency가 낮으며 내구성 측면에서 뛰어나다. 그러나 Flash Memory의 한계는 읽기/쓰기 속도의 비대칭적 성능 차이에서 온다. Reading이 약 20us라고 한다면 Writing은 200us 정도로 성능이 비대칭적이다. 또한 In-place Update가 되지 않기 때문에 페이지가 속한 전체 블록이 지워진 후에만 페이지를 쓸 수 있다. 또한 블록이 닳는다. 따라서 약 100000번 정도 사용하면 블록이 닳아서 사용하지 못하기 때문에 내부적인 내구성은 떨어진다. 이를 해결하기 위해 wear leveling이라는 기술이 사용되어 사용하고 있는 블럭을 플래시 메모리 전체에 걸쳐 적절히 분산시킨다. 내부적으로는 절연체이고 이에 대해서는 교수님께서 대학원에서 한 학기동안 나가는 내용이라고 하시기에 여기까지 하겠다. 

Hard Disk Drive

 자성체의 자기화 원리를 통한 전극 저장소이다. 자세한 내용은 다루지 않겠다.

Solid State Disk

 SSD는 Flash Memory를 바탕으로 한 대용량 저장소이다. 즉 Flash Memory를 HW화 했다고 이해하면 되겠다. Flash Translation Later(FLT)라는 SW Logic를 통해서 논리적으로 HDD와 같은 Drive로 인식하게 해준다. 

Instruction Set Register

 ISA라고 하면 SW와 HW간의 인터페이스라고 할 수 있다. 다시말해 Instruction과 State로서 바라보는 것이다. ISA는 instruction과 Machine State(Registers & Memory)를 정의한다. 우리가 흔히 말하는 x86, x86-64, IA64, ARM 등등이 모두 ISA의 이름이라고 할 수 있다. 

 Instruction은 Opcode와 Operands로 나눌 수 있다. Opcode는 명령어, Operands는 피연산자이다. 이를 Assembly언어라고도 하는데 이에 대한 자세한 정리는 시스템 프로그래밍 파트에서 자세하게 정리가 되어있다. 

How Processor Works

 프로세서는 단순히 Instruction을 수행한다. 그러면 이제 Processor가 어떻게 동작하는지 알아보자. 우선 Processor는 Memory에 올라간 Program의 Instruction을 Fetch(반입)한다. 이때 PC는 다음에 수행해야 할 명령어, 즉 주소값을 달고 있으며, IR 레지스터에 현재 Fetch되었던 Instruction이 들어가게 된다. 따라서 IR Register에 있는 명령어를 단순히 Execute시키면 되는 것이다. 따라서 Processor는 정말 단순하게 말하자면 명령어들을 Fetch - Execute 하는 것이다. 

 엄밀하게 말하자면 Instruction은 Fetch만 한다고 해서 명령어를 수행할 수는 없는 노릇이다. 명령어에 대한 해석이 필요한데 이 과정이 Decoding 작업이다. Decoding 작업에서는 명령의 Opcode를 보고 이 명령어가 어떤 것을 수행해야 하는지 알려준다. Data에 대한 계산을 수행해야하는지, Call이 되어 다른 Function을 수행하러 가야하는 것인지, LW/SW를 해야 하는것인지, I/O 작업을 해야하는지 알아야 한다. 이 과정을 Decoding이라고 한다. 이는 컴퓨터 구조론과도 밀접하게 관련이 되어있는데 Pipelining을 통해서 Opcode를 빠르게 작업해서 CPU의 Utilization을 최대화 시켜야한다. Fetch - Decode - Execute 이것을 까먹지 말자. 

 따라서 위와 같은 그림이 그려지게 된다. 그림을 직접 PPT로 만들어서 좀 이상해 보일 수는 있는데, 각설하고 명령어가 4Byte라고 가정했을 때 PC += 4를 하게 된다. 이제는 Interrupt도 생각을 해봐야 한다. Program은 당연히 그 효율성을 위해 Interrupt를 사용한다. Interrupt에 대한 내용 역시 시스템 프로그래밍 파트에서 정리해 놓았다. (여기) Interrupt는 Device와 통신하기 위한 HW적 Mechanism 정도로 이해하면 될 것이다. Interrupt를 처리할때, 특히 I/O Device에서 오는 Interrupt를 처리할 때 PIC(Programmable Interrupt Controller)을 활용한다. PIC를 통해서 CPU의 Interrupt 처리 효율을 높일 수 있다. 모든 I/O Device에서 Interrupt는 PIC로 보내게 되고 PIC는 Processor에세 Interrupt Request Bit을 보내게 된다. 그러면 CPU는 PC += 4를 하는 것이 아니라 현재의 PC와 PSW를 Stack에 저장해놓고, PIC에서 Interrupt Request Number을 보낸 것의 Handler의 주소를 올려놓는다. Interrupt는 Kernel Mode에서 수행이 되야하기 때문에 PSW를 Kernel Mode로 바꾸고 다른 Interrupt들이 들어오지 못하게 Interrupt를 Disable 시킨다. 각 I/O Device에는 IRQ(Interrupt Request) Line이 PIC와 연결되어 있으며 PIC는 단순히 그 번호를 전달해주는 MUX의 역할을 하는 것이다. CPU에 그 라인들을 전부 다 달수는 없는 노릇이기에 PIC를 활용한다. 이때 Handler가 정상적으로 호출이 된다면 Processor는 PIC에 ACK 신호를 보낸다. 그렇다면 왜 Programmable일까에 대한 의문이 생길 수 있다. 이는 디바이스의 IRQ 요청을 번호로 변환해준다. 이는 Interrupt를 걸고 IRQ 번호를 Processor에게 전달해서 Processor로 부터 ACK를 받는 방식이다. 또한 여러 IRQ가 올 수 있는데 Masking, 즉 disable시켜 들어오는 IRQ를 peding시킬 수 있다. 이는 Priority에 따라 조정이 가능하다. 따라서 PIC를 가히 Programable하다고 할 수 있는 것이다. 

 

많이 부족하지만 지적 및 저작권 침해 문제는 항상 환영이다.

 

Reference

William Stallings. (2018). Operating Systems: Internals and Design Principles (8th Edition): Pearson.

Comments