최근 db의 내부에 대해 공부하면서 결국 컴퓨터에 뭔가를 저장할 때 디스크,메모리의 작동 방식도 알아야겠다고 생각했습니다.
-디스크의 i/o속도가 메모리보다 왜 느린지,
-디스크에 파일을 저장한다는 건 물리적으로 어떤일이 일어나는건지,
-메모리에 명령어가 어떻게 올라가 cpu가 이를 실행하는지 등
os에서 일어나는 일을 알아야 그 위의 응용프로그램도 깊이 이해할 수 있을 것 같습니다.
그래서 컴퓨터의 핵심장치인 디스크, 메모리, cpu에 대해 파악하고 이를 기반으로 프로세스,스레드에 대해 깊이 이해하려합니다.
이번 포스팅에서는 주로 하드웨어 장치에 대해 알아보고 그 후 프로세스,스레드가 이 장치들을 활용해 어떻게 동작하는지 알아보겠습니다.
- 디스크, 메모리의 물리적인 구조와 원리
- cpu
- cpu의 구조 - 코어(alu, registers, cu), controllers
- cpu의 명령어 연산 사이클
- 클럭이란
컴퓨터의 보조기억장치(secondary storage)역할을 하는 저장장치로 디스크가 주로 쓰인다. 컴퓨터의 전원을 꺼도 데이터가 휘발되지 않는, 상대적으로 영구적인 컴퓨터의 저장장치이다.
현대에 주로 쓰이는 디스크 종류는
가 있다.
우리가 컴퓨터에 저장하는 파일들이 디스크에 저장된다는 건데, 컴퓨터는 이 파일들의 데이터를 0,1의 조합으로 저장한다는 건 들어보았을 것이다.
물리적으로 0,1을 어떻게 저장해 표현했을지 더 살펴보자.
hard disk는 전류의 의해 자기장이 생기면 이 자기장에 따라 디스크의 자성체가 자기화 되면서 위치하는 방향이 달라지는데, 이에 따라 0,1을 저장한다.
전하의 방향을 헤드를 통해 읽는다.
헤드라는 물리적인 장치를 움직여 읽기 때문에 이전의 헤드위치에 따라 다음 위치로 이동하는 거리가 달라진다.
때문에 한꺼번에 읽을 정보는 디스크의 특정 영역에 모아놓거나, 헤드의 움직임을 최소화하도록 스케줄링하는 방법 등이 필요하다.
I/O를 위해 물리적인 움직임을 해야하기에 접근속도는 가장 느린편이다.
ssd는 플래시메모리이다.
하드 디스크와 다른 점은 기계적 장치(head)가 아니라 반도체를 이용해 전자적 신호로 정보에 접근한다.
때문에 hdd보다 빠른 I/O 속도를 보인다. 하지만, HDD 에 비해 수명이 짧고, 가격이 비싸고, 자기장 이나 전정기에 약한 단점이 있다.
메모리임에도 비휘발성을 가지기에 디스크로 사용되는데,
이게 가능한 이유는 d-ram,s-ram과 다르게 플로팅 게이트에 전하를 간직하고 있어 휘발을 막을 수 있다.
플래시 메모리는 여러 개의 셀로 구성되어 있으며, 각 셀은 미세한 전하를 저장하는 '플로팅 게이트'라는 구조를 가지고 있다.
전원이 켜져 있을 때, 데이터를 쓰기 위해 전류가 셀로 흘러들어가면, 전하가 이 플로팅 게이트에 '갇히게' 된다. 이렇게 갇힌 전하는 전원이 꺼진 후에도 유지되며, 이 전하의 유무를 통해 데이터의 '0'과 '1'을 표현하게 된다.
ssd는 hdd와 다르게 쓰기 성능과 읽기 성능의 차이가 상대적으로 크다.
읽기의 속도가 더 빠르고, 어느 데이터를 읽든지 읽기 속도가 거의 동일하다. (hdd에서는 헤드의 현재 위치에 따라 이동거리가 달라지기에 편차가 있다.) random read도 일정한 속도로 할 수 있다는 의미이다.
플래시메모리의 특성 상 데이터를 지우는 횟수에 한계가 있다.(내구도가 소모된다.) 때문에 ssd의 섹터들이 고른 횟수로 초기화되도록 관리하는 wear leveling 전략이 필요하다.
정리하자면 hdd는 자기장으로 전하의 방향을 제어해 0,1을 표현하고 헤드를 움직여 이를 수행한다. ssd는 플로팅 게이트라는 곳에 전하를 저장하는 방식으로 전하의 유무로 0,1을 표현한다. ssd는 hdd보다는 빠른 속도를 보이고 random access의 속도도 일정하다.
이런 특성에 따라 ssd와 hdd 중 무엇을 선택하느냐는 소프트웨어 아키텍처까지도 영향을 미칠 수 있다. -> https://d2.naver.com/helloworld/162498
ssd 또한 메모리라면, 메인 메모리와는 속도 차이가 없는걸까?
아니다. ssd가 더 느리다.
메인 메모리에는 주로 dram이 사용되는데, dram은 전하를 컴패시터에 저장한다.
그리고 커패시터는 플로팅 게이트에 비해 전하 저장과정이 단순하고 빠르다.
때문에 메인 메모리의 I/O속도가 더 빠르다.
대신 카패시터는 전류가 없으면 그 정보를 유지하지 못하기에 데이터(전하)가 휘발된다.
sram은 주로 cpu의 캐시 메모리에 사용되는데 이는 dram보다도 더 빠른 I/O 성능을 보여준다.
여기까지 어떻게 0,1이라는 정보를 메모리에 저장하는지 파악했을 것이다.
다음으로는 이 정보를 어떻게 cpu에 적재해 연산하여 명령어들을 수행 -> 프로그램 수행이 가능한지 알아보자.
- cpu는 어떤 구조로 이뤄졌는가?
cpu는 어떤 방식으로 동작하나?
cpu의 코어, 클럭은 무엇을 의미하나?
cpu에서의 프로세스, 스레드는 뭔가?
central processing unit(CPU)는 컴퓨터의 주요 연상 장치이다.
cpu의 목적은 메모리로부터 데이터를 가져와 연산하는 것이다.
여기서의 연산이란 메모리에 있는 1과0으로 이뤄진 데이터를
읽어오고(fetch),해석하고(decode),연산해 적재(execute)하는 과정을 말한다.
이는 cpu의 코어에서 일어나는 일인데, 이 과정에 대해서는 좋은 영상이 있어 보면 재미있게 이해할 수 있다.
CPU는 어떻게 동작할까?
cpu는 아래처럼 생긴 녀석이다.
추상화하면 아래와 같이 나타낼 수 있다
memory controller, I/O controller, 코어, 캐시(주로 2,3차) 로 이뤄졌다.
메모리 컨트롤러는 CPU와 메인 메모리 사이의 데이터 교환을 관리한다.
CPU가 메모리에 저장된 데이터를 읽어오거나 메모리에 데이터를 저장할 때 이 과정을 조정하는데, 메모리 주소 할당, 메모리 접근 속도 조절, 데이터의 읽기와 쓰기 연산 등을 관리한다고 볼 수 있다. MMU가 이 부분에 포함된다.
I/O 컨트롤러는 CPU와 시스템의 입출력 장치 사이의 데이터 교환을 관리한다. 키보드, 마우스, 프린터, 디스플레이, 네트워크 인터페이스 등과 같은 장치들의 데이터 전송을 조절한다.
cpu의 연산은 코어(core) 부분을 통해 일어난다.
CPU의 코어는 크게
로 구성된다.
-클락이 코어마다 물리적으로 존재하지는 않는다. 이 이미지는 기능적 추상화이기에 이렇게 표현되었다
메모리의 값들이 레지스터로 올라오고 이 값들을 CU에서 해독해 ALU로 연산, 메모리에 적재 등의 작업을 한다.
시간 순으로 설명하자면
PC(program counter)값의 위치로 메모리 접근 -> 메모리의 값을 레지스터에 적재 ->
해당 값을 CU에 넘겨 해독 -> 명령어의 작업 수행 ( ALU, 누산기(연산 저장 레지스터)를 통해 연산 수행 , 연산 결과를 메모리에 저장... )
이것이 하나의 명령어 사이클이다.
cpu코어는 앞서 설명한 ALU, 레지스터, 제어장치, L1캐시 등으로 이뤄졌다고 했는데 이를 실제 육안으로 확인해보자
코어는 다이(die)라고 하는 cpu내의 칩 안에 존재한다.
현미경으로보면 아래와 같은 형태로 매우 작은 트랜지스터들이 모여있다.
각 장치들을 육안으로 명확하게 구분하기는 힘들다;;
저런 미세한 금속 모양들이 아래처럼 구성되어 있다.
cpu 하나에는 여러 개의 코어가 존재할 수 있다.
cpu의 다이 안에 여러 개의 코어를 위치시키기도, 다이를 더 추가해 코어를 추가하기도 한다. 흔히 멀티코어라고 한다.
여러 개의 코어를 통해 일반적으로 코어 1개일 때보다 더 빠른 연산을 해낼 수 있다.
클럭은 CPU 내부의 발진기(Oscillator)에 의해 발생하는 일정한 주기로 동작하는 신호이다. cpu가 데이터를 표현하기 위해 전압을 올렸다 내렸다 하는 신호인데, 이 클럭의 수가 높을 수록 빠른 속도로 명령어를 처리한다고 볼 수 있다.
클럭의 단위는 Hz(헤르츠)이다. Hz는 독일 물리학자 하인리히 루돌프 헤르츠로부터는 유래된 단위인데, 1초에 몇번의 진동인지를 의미한다. 1초에 1번의 진동은 1Hz이다. 3.2GHz라면 1초에 32억번의 전압 상승/하강 신호를 발생한다는 것이다.
이는 왜 필요할까?
명령어 수행의 동기화, 코어의 열 조절 등의 이유로 필요하다.
alu가 연산하는 속도, 레지스터에 적재되는 속도가 제각각 달라질 수 있기에 이를 클럭 단위로 '무궁화 꽃이 피었습니다'하듯이 박자에 맞춰 일한다.
레지스터에서 레지스터로 정보가 이동, 연산을 수행, 메모리에서 레지스터로 값을 가져오기 등의 작업은 클럭 주기 마다 이뤄진다.
또한 cpu의 alu는 레지스터들로 이뤄지는데 이는 열에 취약한 장치이기에 속도의 제한 없이 마구 사용되다 온도가 높아져 버리면 이상이 생길 수 있어 속도를 제어해 사용한다.
그럼 프로그램이 실행된다는 것(프로세스가 실행)은 무엇이냐?
명령어의 흐름들이 메모리 -> cpu에 적재되어 연산/적재되는 것이다.
디스크에서부터 일련의 명령어들이 메모리에 올라오고, 이게 cpu를 통해 연산되고 다시 메모리,디스크에 저장되는 것을 말한다.
디스크 -> 메모리 -> cpu -> 메모리 -> 디스크로 명령어와 데이터들이 이동,연산/적재된다.
물론 이는 단순화된 흐름이고 이 과정에서 여러 이슈들이 있다.
다음 포스팅에서 알아보겠다.
https://velog.io/@ttomy/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%8F%99%EA%B8%B0%ED%99%94
https://www.youtube.com/watch?v=Fg00LN30Ezg
https://www.baeldung.com/cs/core-vs-cpu