본문 바로가기
🖥️/CS Basics

컴퓨터 하드웨어와 소프트웨어에 대한 기초

by HanaV 2023. 6. 6.
728x90

프로그래머가 CS 지식이 필요한 이유

 비전공자와 전공자의 제일 큰 차이점은 바로 CS(Computer Science) 지식에서 드러난다. 전공자들은 대학 수업에서 이런 이론적인 지식들을 다 배우고 오지만, 비전공자들은 보통 바로 실무 교육을 받기 때문에 CS지식에 약한 경우가 태반이다. ‘지금 자바 배우고 실무교육받는 것만으로도 벅찬데 하드웨어까지 공부해서 알아야 해? 면접 직전에만 잠깐 암기식으로 하면 되지 않을까하는 생각을 가질 수 있다. 단순히 컴퓨터를 다루고 관리하는 직업을 가지기 때문에 컴퓨터에 대해서 잘 알아야 한다는 것이 아니다. 물론 틀린 이유는 아닌데, 이보다 좀 더 근본적인 이유가 있다.

 컴퓨터는 기계이기 때문에 소스코드에 문제가 없더라도 하드웨어 적인 문제 때문에 오류가 날 수 있다. 명령이 완벽해도 실행할 하드웨어가 문제라면 당연히 문제가 생길 것이다. 만약 하드웨어 적인 지식이 아예 없는 프로그래머라면, ‘내 코드는 문제가 없는데 왜 그러지? 어떡하지?’하고 손을 놓을 수밖에 없다. 하지만 컴퓨터의 근간을 아는 프로그래머는 본인이 입력한 소스코드가 문제가 없는 것을 확신한다면, 코드 이외에 다른 문제를 분석하여 원인을 파악할 수 있다.
 
또한, 컴퓨터를 이용해 어떠한 서비스를 할 때 내가 어느 정도 성능과 용량의 컴퓨터를 써야 하는지 파악하여 선택할 수 있다. 만약 예산에 제한이 있는 상태에서 서버 구축을 위한 컴퓨터를 구입해야 한다면, 예산 안에서 어떠한 부품에 더 돈을 투자해야 할까? 서버 컴퓨터가 아닌 클라우드 서비스를 이용할 때도 예외는 아니다. 클라우드 서비스를 이용할 때도 CPU와 메모리, 그리고 용량까지 직접 선택해야 하기 때문이다. 이러한 지식이 전혀 없어 고려하지 않고 안일하게 선택한다면, 어떠한 문제가 터지게 될지 모르는 일이다.
 
이러한 이유에서 컴퓨터 구조를 아는 것은 올바른 판단을 할 수 있게 도와준다는 점에서 중요하다. 프로그래밍 언어만 알고 사용할 줄 아는 단순한 코더(coder)가 아닌, 원인을 생각하고 스스로 해결해 나가고 발전하는 프로그래머가 되기 위해서는 필수적이라고 볼 수 있다.

컴퓨터는 결국 명령어를 처리하는 기계이다. 즉 명령을 받는 쪽인 하드웨어와 그 하드웨어를 움직이게 명령하는 소프트웨어로 나눌 수 있게 된다. 하드웨어와 소프트웨어는 둘 중 하나라도 없으면 안 되는 관계이기 때문에, 이 둘의 관계를 잘 이해하는 것이 매우 중요하다. 그럼 먼저 하드웨어를 먼저 살펴보도록 하자.

 

컴퓨터의 하드웨어: 네 가지 핵심 부품

컴퓨터는 어떻게 명령어를 받고 작동되는 걸까?

나는 게임 중에서도 롤(LOL, League of Legends)이라는 컴퓨터 게임을 좋아한다. 내가 롤을 클릭하여 키는 것까지는 몇 초도 안 걸리는 짧은 시간이지만, 그 사이에 컴퓨터 내부에서는 어떤 일이 일어나는지 간단한 예시를 들어 설명해 보겠다. 내가 키보드나 마우스를 통해서 롤을 키라는 명령을 내리면 사람 역할을 하는 CPU가 롤을 실행하라는 명령을 받고, 롤 같은 응용 프로그램들이 쌓여 있는 창고인 디스크(SSD, HDD)에서 롤을 찾아서 꺼낸다. CPU는 롤을 가지고 작업대인 RAM에 펼쳐 놓고, 펼쳐 놓으면 그래픽 카드(=VGA Card)가 모니터에 잘 보이게 뿌려준다. 이때 그래픽 카드는 필수는 아니지만, 게임이나 영상을 볼 때 프레임이 떨어지지 않고 고화질로 출력할 수 있게 해 주기 때문에 쾌적한 게임을 위해서는 필요하다. 만약 내가 롤을 하면서 검색을 할 게 있어서 크롬을 클릭하면, CPU는 또 창고에 가서 크롬을 찾아서 RAM이라는 작업대에 놓는 것이다.
 
여기서 컴퓨터 하드웨어의 네 가지 중요한 부품이 다 나왔다. 바로 명령을 실행하는 CPU, CPU가 현재 처리하고 있는 내용이 가져와지는 주기억장치 RAM, 창고 역할의 보조기억장치인 디스크, 그리고 명령을 받고 출력하는 입출력 장치들이다. 이제 이 주요 부품들을 하나하나 자세히 알아보자.

CPU (Central Processing Unit: 중앙처리장치, 마이크로 프로세서)

 CPU는 컴퓨터의 중앙처리장치라고 하는데, 말 그대로 컴퓨터의 중앙에서 모든 데이터를 처리하는 장치이다. 인간으로 치자면 두뇌의 역할을 한다. 자세히 말하자면 CPU는 메모리에 저장된 값을 읽어 들이고, 해석하고, 실행하는 장치이다. 그렇기 때문에 무엇보다 일을 처리하는 속도가 중요하여 속도를 단위로 하고, 클럭이라고 한다. 하지만 속도는 지금 상향 평준화되어서 별로 큰 의미가 없어지게 되었고, 이제 성능을 따지게 되었다.
 CPU
를 제조하는 대표적인 회사는 IntelAMD가 있는데, 인텔을 예로 들어보겠다. 인텔 CPU를 검색하면 이름이 ‘Intel® Core™ i7-13700 K processor’ 이런 식으로 되어있다. 여기서 i7은 성능을 뜻하는데, 3/5/7/9가 있다. 숫자가 클수록 성능이 좋고 가격도 비싸진다. 그 뒤의 숫자는 세대를 나타낸다. 1370013세대로, 당연히 세대가 높을수록 성능이 좋다. KCPU의 용도를 구분하기 위한 코드로, K는 속도를 무리하게 올릴 수 있는 오버클럭이 가능한 제품이라는 뜻이다.
 CPU
를 구입할 때 코어 수도 나와있는데, 요즘은 한 개의 CPU 내부에 2, 4, 6개 등 여러 개의 코어를 넣어서 성능을 더 끌어올리고 있다. 하나의 코어에는 보통 하나의 스레드가 존재하는 것이 일반적인데, 스레드는 작업을 처리하는 논리적인 단위를 말한다. 요즘은 하이퍼 스레딩 기술을 이용해 하나의 코어에 두 개의 스레드를 사용하여 성능을 높이는 기술(멀티 스레딩, SMT)도 있다. 이렇듯 CPU의 성능을 고려할 땐 다방면으로 확인을 해야 한다.

사람 두뇌도 감각을 담당하는 부분, 신경을 담당하는 부분, 기억을 담당하는 부분 등이 나뉘어 있는 것처럼 CPU도 담당하는 부분이 나뉘어져 있다.

CPU에는 코어라고 CPU 중에서도 가장 핵심이 되는 부품이 모여 있는 곳이 있다. CPU 내부의 다이라고 불리는 사각형 블록 내부에 위치하는 코어는 ALU, Control Unit, Register로 구성되어 있다.
 
먼저 계산기 역할을 하는 ALU (Arithmetic Logic Unit: 연산논리장)는 계산을 위해 존재하는 회로들의 모임이라고 보면 된다. 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 산술 연산과 AND, OR, XOR 등의 논리연산을 할 수 있다. CPU가 자신 및 주변 기기들을 제어할 수 있는 Control Unit (제어장치)가 있다. CPU는 제어장치를 통해 컴퓨터 부품을 관리하고 작동시키기 위한 전기신호를 보낸다. CPU가 명령어를 읽고 싶을 때 메모리를 읽는 전기신호를 보내고, 명령을 해석하는 것이다. 마지막으로 CPU 내부에는 작은 저장장치가 있는데, 이를 Register(레지스터)라고 한다. 레지스터는 CPU 계산과정의 일부로 작동한다.

위에서도 말했듯이 요즘은 단일 코어가 아닌 하나의 CPU에 멀티 코어를 넣는데, 무거운 프로그램과 기본적인 멀티태스킹을 위해 듀얼 코어 CPU와 쿼드 코어 CPU의 보급이 증가하고 있는 추세이다.

캐시 메모리(Cache Memory) CPU 코어에 있지는 않지만 CPU내부에 있고, CPU와 메모리 사이에 위치해 있다. 책상에서 자주 사용하는 물건을 가까운 자리에 두면 다음에 또 사용할 때 더 빠르게 꺼낼 수 있다. 마찬가지로 CPU는 자주 쓰는 데이터를 CPU와 가까운 위치인 캐시 메모리에 저장해 빠르게 꺼내서 쓸 수 있도록 한다.
 
캐시 메모리는 일반 메모리보다 속도가 빠르기 때문에, CPU가 메모리에 직접 접근해야 하는 횟수를 줄여줘서 CPU와 메모리의 속도 차이로 인한 병목 현상을 줄여준다. 캐시 메모리는 CPU가 메모리에 접근하기 전에 캐시 메모리에 필요한 데이터가 있는지 확인을 한다. 캐시 메모리에 있으면 메모리까지 갈 필요가 없는 것이고, 없다면 메모리로 이동해서 찾는다. 그렇기 때문에 용량이 크면 빠르고 좋겠지만, 캐시 메모리는 가격이 비싸기 때문에 일반적으로 작은 용량으로 구성된다.

여태까지 설명한 CPU의 구조를 간단히 그림으로 상상해 보자면 다음과 같다.

주기억장치 (Main Memory)

CPU 내부에도 레지스터랑 캐시 메모리라는 메모리가 있었지만, 이 둘은 속도는 빠르지만(메모리는 레지스터가 제일 빠르고, 캐시메모리, RAM 순으로 빠르다) 용량이 매우 적기 때문에 이 보다는 용량이 큰 주기억장치인 메인 메모리가 필요하다. 메인 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다. 프로그램이 실행되려면 메모리에 저장되어 있어야 하고, 메모리에 저장된 값의 위치는 주소로 알 수 있다위에서 말한 작업대에 비유되는데, 작업대는 크면 클수록 더 많은 것을 꺼내 두고 사용할 수 있을 것이다. 그래서 메모리는 저장할 수 있는 용량이 중요하기 때문에 단위는 크기인 Byte를 사용한다.

우리가 흔히 말하는 메모리가 바로 RAM (Random Access Memory)이다. CPU가 현재 처리 중인 일들을 불러와 작업할 수 있도록 하는 기억장치이다. RAM은 컴퓨터의 전원을 끄면 내용이 사라지는 휘발성 메모리이다.

 RAM을 추가해서 용량이 커지면 작업대가 넓어지기 때문에 여러 작업을 하기에는 더 편해지긴 한다. 그래서 다다익램이라는 말이 있기도 하다. 하지만 어느 정도 이상 있다면 이 이후부터는 메모리 레이턴시, 메모리 쓰루풋, 그리고 멀티 스레딩을 지원하는 CPU가 등장한 이후에는 메모리 레벨 병렬 처리(MLP)가 성능의 지표가 된다. 간단히 말하자면 메모리 레이턴시는 메모리에 있는 데이터에 대한 요청이 들어오고 검색이 완료될 때까지의 시간이고, 쓰루풋은 메모리에 있는 데이터를 읽고 쓰고 저장할 수 있는 처리율, 그리고 MLP는 여러 개의 스레드가 메모리에 접근할 때 병렬 처리 기능을 통해 얼마나 빠르게 데이터를 처리할 수 있는지를 보는 것이다.

보통 RAM은 싱글 채널보다는 듀얼 채널로 운용을 하는데, 이는 32GB RAM을 사용한다고 해도 32GB RAM 하나보다는 16GB RAM 두 개를 사용한다는 뜻이다. 비용 측에서는 싱글 채널이 더 싸지만, 듀얼 채널은 CPU RAM 간의 데이터를 싱글 채널보다 2배 더 많이 보낼 수 있다. RAM을 홀수로 장착하면 듀얼 채널을 이용할 수 없고, RAM2개더라도 둘이 성능차이가 나면 느린 부품의 속도를 따라가기 때문에 이미 설치된 RAM과 동일한 RAM을 장착하는 것이 맞다.

보조기억장치

주기억장치는 휘발성 메모리라고 했다. 그렇기 때문에 전원이 꺼져도 데이터를 기억하고 싶다면 보조기억장치를 사용해야 한다. 속도는 주기억장치보다는 느리지만, 주기억장치에 비해서 싼 편이라서 용량도 크다. 마찬가지로 저장할 수 있는 용량이 중요하기 때문에 단위는 크기인 Byte를 사용한다

SSD (Solid State Driver)는 반도체 기반의 정보를 저장하는 기억장치이다. (Solid State가 반도체이다) 과거에는 물리적인 디스크를 고속으로 회전시켜서 데이터를 저장하는 HDD (Hard Disk Driver)를 주로 사용했다. HDD가 물리적 장치라면 SSD는 전기적 장치이다. 전기적으로 데이터를 저장하기 때문에 HDD에 비해서 속도가 월등히 빠르고 전력소모도 적다. 그렇다면 HDD를 왜 사용하냐고 물을 수 있는데, 바로 가격 때문이었다. 예전에는 HDD에 비해 가격이 많이 비싸서 HDD와 같이 사용을 했지만, 요즘은 가격이 많이 떨어져서 SSD만 사용하기도 해서 HDD는 거의 쓰이지 않는다. 이 외에도 예전에는 CD, DVD, Blu-ray 등의 Optical Disk도 쓰였다.

입출력장치 (Input/Output Device)

입출력장치는 말 그대로 명령의 입력과 출력을 받는 장치이다. 컴퓨터 외부에 연결되어 컴퓨터 내부의 정보를 교환할 수 있고, 우리가 흔히 보고 사용하는 부품이라고 보면 된다. 입력장치에는 키보드, 마우스, 조이스틱 등이 있고, 출력장치는 모니터, 프린터기 등이 있다. 이 외에도 주변 장치가 있다. 컴퓨터 케이스는 컴퓨터에서 전자적 기능을 담당하지는 않지만, 컴퓨터 부품을 안전하게 보호하고 열을 효과적으로 냉각시켜서 쾌적하게 작동할 수 있도록 해준다. Power는 전기를 공급받아 필요한 곳에 분할해서 나누어 주는 역할을 한다.

메인보드(Mother Board)와 버스

이렇게 컴퓨터 안에는 정말 다양한 부품이 있다. 컴퓨터가 작동하려면 이 부품들이 서로 상호작용하며 데이터를 주고받아야 하는데, 이 여러 가지 부품을 연결시켜 주는 게 메인보드(Mother board)라는 판과 버스(bus)이다.

해외에서는 마더보드라고 더 많이 불리는 메인보드는 컴퓨터에 연결된 하드웨어를 연결하는 전자회로 기판이다. 아까 CPU를 두뇌에 비유한 것처럼 설명하자면, 마더보드는 서로 연결해 주는 신경계 같은 존재라고 보면 된다. 마더보드에는 컴퓨터의 각 부품들을 하나로 연결해 주는 회로와 밖으로 신호를 보낼 수 있는 출력 포트를 가지고 있다.
 
버스는 핵심 부품들끼리 정보를 주고받을 수 있는 통로 역할을 한다. 다양한 종류의 버스가 있지만, 컴퓨터의 핵심 부품을 연결하는 버스는 시스템버스이다시스템 버스는 크게 3가지로 이루어져 있는데, 이는 주소를 주고받는 주소버스, 명령어와 데이터를 주고받는 데이터 버스, 제어 신호를 주고받는 제어 버스이다.
 
만약 CPU 1번지에 있는 명령어를 실행하고 싶으면, 먼저 제어버스를 통해서 메모리 1번지에 있는 명령어를 읽어 들이는 제어 신호를 보낸다. 그 후, 주소버스를 통해서 읽고자 하는 주소를 보내고, 메모리는 데이터버스를 통해서 CPU내부에 있는 저장장치인 레지스터에 1번지에 있는 명령어를 보낸다. CPU는 레지스터에 있는 명령어를 해석해서 필요한 번지에 있는 데이터를 읽어 들이고, 레지스터에 받는다. 그리고 CPU 내부에 사칙연산을 하는 ALU가 계산을 실행한 후, 레지스터로 결괏값을 저장한다. 컴퓨터는 이러한 과정을 반복해 가며 작동을 하는 것이다.

하드웨어와 소프트웨어

이제 우리가 마우스로 클릭을 하면 CPU가 명령을 받아 메모리에서 정보를 가져와서 계산하고, RAM에 저장해서 모니터에 출력해 줘서 우리가 볼 수 있다는 것은 알았다. 근데 여기서 알아야 할 점은 누군가 명령을 내려주는 대로 일을 수행하는 기계라는 점이다. 누군가가 컴퓨터 하드웨어가 효율적으로 작동하도록 지시해줘야 한다. 하지만 컴퓨터는 01로만 이루어진 기계어로 작동하기 때문에 우리가 매번 읽고 해석하기에는 문제가 있다. 이때, 우리가 쓰는 한글이나 영어, 마우스 클릭 등의 명령을 컴퓨터의 언어로 변환해 동작방법을 지시해 주는 것이 소프트웨어이다. 정확히 말하자면 이 역할을 하는 것이 시스템 소프트웨어(System Software)이고, 롤이나 MS워드 같이 메모리에 저장되어 있는 프로그램들은 응용 소프트웨어(Application Software, app)라 한다. 우리가 응용 소프트웨어인 롤을 하기 위해서는 시스템 소프트웨어가 있어야 하고, 시스템 소프트웨어가 실행되기 위해서는 본체인 하드웨어가 있어야 한다. 반대로 생각해 보면,소프트웨어는 우리가 하드웨어를 편하게 사용하기 위해 개발되고 있고, 이것이 우리 프로그래머가 해야 하는 일인 것이다.

하드웨어를 컨트롤하는 소프트웨어: 운영체제

 우리가 컴퓨터나 핸드폰의 전원을 켤 때 보이는 WindowsAndroid 등을 운영체제(OS, Operating System)라 한다. 운영체제란, 프로그램이 실행되기 위해 필요한 시스템 자원(컴퓨터의 네 가지 핵심 부품도 포함된다)들과 실행 중인 프로그램을 관리하는 시스템 소프트웨어이다. 우리는 운영체제 덕분에 우리는 요구사항만 명령하면 우리가 원하는 서비스를 편리하게 제공받을 수 있게 된다.
 데스크탑(클라이언트용)용
운영체제에는 Windows, Linux, macOS가 많이 쓰이지만, Windows가 사용자에게 최적화가 잘 되어있어서 압도적인 점유율을 보이고 있다. 모바일 운영체제에는 안드로이드와 IOS가 있고, 이 두 개가 모바일계에서는 거의 100%를 잡고 있다. 서버용 운영체제는 데스크탑과는 다른 양상을 보이고 있는데, Linux Unix가 제일 많이 쓰이고 Windows가 그 뒤를 따르고 있다. 유닉스는 몇 십 년간 쓰여온 만큼 안정성이 보장되어 있어 주로 큰 기업이나 대학에서 선호하고, 리눅스는 오픈소스로 공개되어 있기 때문에 수정하고 재배포하는 것들이 자유로워서 많이 쓰인다. 이렇듯 운영체제마다 특징이 다 다르기 때문에 사용 목적에 따라서 적당한 운영체제를 선택해야 한다.

그렇다면 이제 운영체제가 하는 역할을 세부적으로 살펴보자

먼저 운영체제는 프로세스를 관리한다. 여기서 프로세스는 현재 실행 중인 프로그램을 말한다. 우리는 컴퓨터로 한 가지 작업만 하지 않기 때문에 단순히 실행만 한다고 끝나는 일이 아니다. 운영체제는 여러 개의 프로그램이 CPU를 이용할 때 어떤 프로세스를 먼저, 얼마나 할당할지, 얼마나 오래 실행할지를 관리해 준다.또한, 프로세스는 운영체제를 통해 자원에 접근하여 필요한 자원을 효율적으로 사용할 수 있는데, 이를 시스템 호출이라고 한다.

프로그램이 실행될 뿐만 아니라 저장될 때에도 운영체제가 관여한다. 각 프로그램이 메모리의 어떤 주소에 저장되어야 하는지, 어느 정도의 메모리를 확보해줘야 하는지 메모리를 할당해 주고 관리하는 역할을 한다. 예를 들어 게임을 새로 실행했으면, 게임은 메모리 어디에 적재될지 운영체제가 결정하고, 게임이 종료되었으면 메모리에서 지워준다.

 또 운영체제는 실행하고자 하는 프로그램이 메모리의 물리적인 크기가 작은 경우에도, 효율적인 방식을 통해서 실행할 수 있도록 해준다. 이러한 운영체제의 가상메모리 관리에 대한 것은 페이징과 스와핑을 검색해 보면 더 자세히 알 수 있다.

 이 외에도 장치 드라이버를 관리해서 데이터를 어떻게, 어디에 저장될지도 결정해 주고,우리의 명령어를 컴퓨터에게 해석해 주는 역할도 한다.

 효율이라는 단어가 많이 반복된 것에서 예상할 수 있듯이, 운영체제의 목적은 효율적으로 일을 처리하고 관리하는 데 있다.

어플리케이션

 응용 소프트웨어는 어플리케이션이라고도 불리며, 운영체제에서 실행되는 모든 소프트웨어를 말한다. 우리가 어플을 실행시킬 때 그 어플의 기능을 사용하고자 실행시키는 것에서 볼 수 있듯이 응용 소프트웨어는 특정 작업을 수행하기 위해 설계되었다. Microsoft Office, 포토샵, 게임 등이 모두 여기에 속한다.

 

 물론 외울 때는 단어로 정리해 가며 외우는 것이 훨씬 효율이 좋고 보기도 좋다.
하지만 나는 전부터 아빠가 IT 쪽 이야기를 할 때 '외웠구나'하는 느낌이 아닌 '다 이해하고 이야기처럼 풀어내고 있구나'하는 느낌을 계속 받았고, 나도 이렇게 컴퓨터에 대해 기초적인 지식을 외우는 것이 아니라 이해하고 싶어서 줄글로 풀어써봤다.

728x90

"); wcs_do();