안녕하세요
혼자 공부하는 컴퓨터 구조+운영체제
책을 공부하면서 정리한 개념을 포스팅 해보겠습니다.
저는 Java + Spring 기반의 백엔드 개발자 지망생으로 현재 여러 프로젝트를 하며
CS의 중요성을 뒤늦게 깨닫게 되어 열심히 공부를 하고 있습니다.
개발을 진행하며 제 코드가 CS까지 고려하고 생각하는 수준에 도달할 때 까지 열심히 공부하겠습니다.
1) CS를 알아야하는 이유
❓ 개발자들은 코드만 잘짜면 되는거 아닌가요 ❓
라는 생각을 저도 개발을 시작한지 얼마 안되었을 때 하였습니다.
코드를 잘짜고, 기능 구현만 잘하면 끝이 아닌가 라는 생각을 하였습니다.
그러나 프로젝트를 진행하고, 성능(=속도) 와 관련된 장애? 아닌 속도 느림을 겪고 그 문제를
해결하기 위해 노력을 한 경험이 있었습니다. 그 당시에는 아무것도 몰랐기에 주구장창 sql쿼리 성능 개선과 코드 개선만 하였습니다. 지금 되돌아 생각을 해보니 CS지식이 있었다면, 문제를 더 쉽게 접근하고 해결할 수 있었다는 생각이 듭니다.
✔ 결국 CS 지식을 바탕으로 한 개발자는 , 코드만 짜는 코더가 아닌 다양한 문제를 스스로 해결할 줄 아는 더 넓은 시야를 가진 개발자가 될 수 있게 만들어 준다고 생각합니다.
그리고 개발자는 성능,용량,비용 문제를 해결하는 역할을 해야 합니다.
이 문제를 해결하는 데에는 프로그래밍 자체를 잘 한다고해서 해결할 수 없습니다. 이 문제는 CS지식이 기반이 되어야지 쉽게 접근할 수 있습니다
위 상황을 제외하고도 여러 상황(장애상황, 개선사항) 등을 고려해야 할 때 CS지식은 정말 중요하다고 생각을 합니다.
2) CS 는 무엇일까?
CS는 무엇을 의미하는 걸까요?
CS는 Computer Science의 약자로 일반적으로는 컴퓨터 구조 + 운영체제 위 두가지를 의미 합니다.
위 두가지를 완벽하게 이해하고, 실무에 적용할 수 있다면은 완벽한 개발자가 될 수 있을 것이라고 생각합니다.
그렇다면 우리가 CS지식을 공부하기 위한 기초인 컴퓨터 구조 부분에서 지식 2가지를 알아보겠습니다.
[운영체제에 관련된 필요 지식은 나중에 포스팅 해서 올리겠습니다.]
간단하게 위 2가지를 알고있어야 한다고 생각합니다.
1) 컴퓨터가 이해하는 정보
컴퓨터는 0과1로 표현된 정보만을 이해합니다(=2진법) 그리고 0과 1로 표현되는 정보에는 크게 두가지가 있습니다.
바로 데이터 와 명령어 입니다.
우리는 살면서 데이터 라는 단어는 많이 들어봤을 겁니다.
평소에 어떠한 정보를 가리키는 말로 데이터 라는 단어를 사용했을 거라고 생각합니다.
컴퓨터 관점에서 데이터는 숫자, 문자,이미지, 동영상 과 같은 정적인 정보를 데이터 라고 합니다.
왜냐면 데이터는 그냥 정보 덩어리 일뿐이지 어떠한 명령이 없다면 그냥 가만히 움직이지 않는
덩어리 이기 때문입니다.
그렇기 때문에 이 덩어리(=데이터)를 움직이기 위해서는 명령어가 필요합니다.
그러므로 둘중 하나라도 없다면 쓸모가 없는 것이 되겠죠, 어떻게 보면 공생관계라고 생각합니다.
데이터가 있기에 명령어가 필요하고, 명령어가 있기에 데이터가 움직일 수 있는 것 입니다.
여기서 질문🖐
컴퓨터를 한마디로 정의해보세요?
라는 질문을 받는다면 뭐라고 대답을 할 것 인가요?
-> 저는 컴퓨터는 명령어를 처리하는 기계입니다 라고 답할 수 있을 것 같습니다.
컴퓨터가 이해하는 정보에는 데이터, 명령어가 있지만, 이 둘 중 컴퓨터를 실질적으로 작동시키는 더 중요한 정보는 명령어 입니다.
ex)
‘1’ 과 ‘2’는 데이터 입니다.
‘1과2를 더하라’ 는 명령어 입니다.
‘안녕하세요’는 데이터 입니다.
‘안녕하세요 를 출력해라’ 는 명령어 입니다.
즉 명령어는 컴퓨터를 작동시키는 정보이고, 데이터는 명령어를 위해 존재하는 일종의 재료이다.
이런 점에서 컴퓨터 프로그램은 ‘명령어들의 모음’ 으로 정의할 수도 있습니다.
이러한 이유로 명령어는 컴퓨터 구조를 학습하는데 있어 데이터보다 중요한 개념이라고 할 수 있습니다.
2) 컴퓨터의 4가지 핵심 부품
컴퓨터에는 아주아주 많은 부품이 구성되어 있습니다. 그리고 그 많은 부품들이 협동이 잘 되어 우리는 지금 노트북 or 데스크탑을 잘 사용하고 있습니다.
그 많은 부품들을 다 알 필요는 없고, 개발자들은 4가지 핵심 부품만 알고있으면 됩니다.
1) 중앙처리장치(CPU)
2) 주기억장치(메모리)
3) 보조기억장치
4) 입출력장치
위 4가지를 부품의 역할만 이해하고 있어도 컴퓨터의 작동 원리를 대부분 파악할 수 있습니다.
이제 4가지 핵심 부품을 구조를 그림으로 보겠습니다.
🖐 위 사진을 보면서 간단하게 설명을 하겠습니다.
1️⃣ 가장 바깥 쪽 둘러 싸고 있는 사각형은 메인보드 입니다.
2️⃣ 메인보드 안에서 시스템 버스(양방향 수직 화살표) 가 있습니다.
=> 시스템 버스는 간단하게 말하면 부품끼리 소통을 하게 도와주는 역할 입니다.
3️⃣ CPU 내부에는 ALU, 제어장치와 여러 레지스터가 있습니다.(시스템버스 연결 O)
4️⃣ 메모리는 메인보드 내 시스템 버스와 연결되어 있다.
5️⃣ 보조기억장치는 메인보드 내 시스템 버스와 연결되어 있습니다
6️⃣ 모니터,키보드,마우스 등은 메인보드 내 시스템 버스와 연결 -> 입출력장치
간단하게 설명을 하면은 위처럼 설명할 수 있고 이번에는 하나하나 더 자세히 알아보겠습니다.
메모리
메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품입니다.
=> 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다.
메모리는 프로그램이 저장되기 위해서는 주소 라는 개념을 사용합니다.
프로그래밍에서의 주소(Stack, Heap) 이라는 개념을 들어본 사람이 있다보면 더 쉽게 와닿을 수 있습니다.
현실에서도 주소를 알면 원하는 위치를 쉽게 찾아갈 수 있는 것처럼, 컴퓨터 내부에서도 주소를 사용하여 메모리
내 원하는 위치에 접근할 수 있습니다.
위 그림에는 1,2번지에 명령어, 3,4번지에 데이터가 저장되엉 있고 5,6번지에는 아무것도 없는 상태를 표현한
메모리 주소 입니다. 위 사진은 이해를 쉽게 하기 위해 우리의 말로 해석한 사진일 뿐이고, 실제로는 이와 같이
저장되어 있지 않습니다.
간단한 예를 들어 32비트 아키텍처에서 메모리 주소 0x00000000부터 0xFFFFFFFF 까지의 범위에 저장될 수 있습니다.
즉 2^32 승 까지 저장할 수 있다는 뜻입니다
보통 요즘 컴퓨터는 64비트 아키텍처이므로 메모리 주소 0x0000000000000000부터 0xFFFFFFFFFFFFFFFF까지의 범위에는 각각의 주소에 해당하는 8바이트 데이터가 저장되어 있습니다
간단하게 정리를 하면은
- 프로그램이 실행되기 위해서는 반드시 메모리에 저장되어 있어야 한다.
- 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장한다
- 메모리에 저장된 값의 위치는 주소로 알 수 있다.
CPU
cpu는 컴퓨터의 두뇌 입니다. 그 만큼 없어서 안되는 존재입니다.
cpu는 메모리에 저장된 명령어를 읽고, 읽은 명령어를 해석하고 실행하는 부품입니다.
cpu내부 구송 요소는 산술논리연산장치(ALU), 레지스터, 제어장치가 있습니다.
ALU : 계산기라고 생각하면 편합니다. 컴퓨터의 모든 연산을 도 맡아 합니다
레지스터 : CPU내부의 작은 임시 저장 장치입니다. 프로그램을 실행하는데 필요한 값들을 임시로 저장한다.
레지스터의 종류는 다양하고, 각자 다른 이름과 역할이 있습니다.
제어장치 : 제어신호 라는 전기 신호를 바탕으로 명령어를 해석하는 장치 입니다.
- 저장된 값을 읽는 => 메모리 읽기
- 저장된 값을 저장 => 메모리 쓰기
이 두가지만 간단하게 알고 있으면 됩니다.
- CPU는 메모리에 저장된 값을 읽어들이고, 해석하고, 실행하는 장치이다.
- CPU 내부에는 ALU, 레지스터, 제어장치가 있다.
- ALU는 계산하는 장치, 레지스터는 임시 저장 장치 제어장치는 제어 신호를 발생시키고 명령어를 해석하는 장치다.
보조기억장치
앞서 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다고 했지만, 이 메모리는 두가지 약점이 있다.
1) RAM은 가격이 비싸 저장 용량이 적다는 점
2) RAM은 휘발성 이기 때문에 전원이 꺼지면 저장된 내용을 잃음
는 두가지 치명적인 단점이 있습니다.
저는 여러 작업을하는 도중에 전원이 꺼져서 작업한 내용을 잃어버린적 있나요?
그 이유가 바로 컴퓨터가 꺼지면서 RAM에 저장된 데이터+명령어 들이 사라져 버린 탓 입니다.
위 이유 때문에 메모리보다 크기가 크고 전원이 꺼져도 저장된 내용을 잃지 않는 메모리인 보조기억장치 가 생겼습니다.
대표적으로 보조기억장치는
하드디스크, SSD, USB 메모리, DVD, CD-ROM과 같은 저장 장치가 보조기억장치의 일종 입니다.
메모리는 '현재 실행되는 프로그램 저장'
ex) 크롬, 게임 등등
보조기억장치는 '보관할 프로그램을 저장'
ex) 한글파일, 파워포인트 등등
이라고 생각하면 와닿을 수 있습니다.
입출력장치
입출력장치는 간단하게 설명하면 우리가 자주 사용하는 키보드,마우스,스피커,프린터 등등 컴퓨터에는 없지만
우리가 간접,직접적으로 연결해서 사용하는 것들을 의미합니다.
컴퓨터 관점에서 말한다면 외부기기가 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치를 의미한다.
그렇다면 여기서 ❗질문❗
보조기억장치로 알고 있는 하드디스크, USB메모리, CD-ROM도 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를
교환할 수 있는 장치 아닌가요? 그러면 보조기억장치랑 입출력장치는 같은거 아닌가요??
보조기억장치는 관점에 따라 입출력장치의 일종으로 볼 수 있습니다. 실제로 보조기억장치와 입출력장치를 컴퓨터 주변에 붙어 있는 장치 라는 의미에서 '주변장치' 라 부르기도 합니다.
다만 보조기억장치는 모니터,마우스,키보드와 같은 일반적인 입출력장치에 비해 메모리를 보조한다는 특별한 기능을 수행하는 입출력장치 입니다.
메인보드 시스템 버스
지금까지 설명한 4개의 부품은 모두 메인보드(=마더보드)에 연결이 됩니다.
메인보드에 연결된 부품들은 서로 정보를 주고받을 수 있습니다. 이는 메인보드내부에 버스라는 통로가 있기 때문입니다.
다양한 버스가 있지만, 위 4가지 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스 입니다.
시스템 버스는 주소버스, 데이터버스, 제어버스 로 구성되어 있습니다.
- 주소 버스 : 주소를 주고받는 통로
- 데이터 버스 : 명령어와 데이터를 주고 받는 통로
- 제어 버스 : 제어 신호를 주고받는 버스
이상 포스팅 마치겠습니다. 감사합니다.
틀린 부분이 있으면 지적해주세요 감사합니다.
ref : 혼자 공부하는 컴퓨터구조 + 운영체제 (저자:강민철)