크래프톤 정글 3DAY 운영체제 공부를 위한 기초 공부
레지스터
나는 이 친구를 맨 처음에 임시 기억장치라고 이해했다.
뭐 물론 레지스터가 기억을 하는 역할을 전혀 안한다는 것은 아니나, 레지스터는 근본적으로 보았을 때 TO_DO_LIST
명령어들을 적재해두는 장소에 가깝다.
주로 책에서는 레지스터에서 기억
이라는 키워드를 전달하는데 지금 내가 TIL을 작성하면서 할 일에 집중을 하였을까?
그 이유중 하나는 임시 기억이라는 특성에 집중을 하면 나같이 처음 개념을 접한 사람들은 캐쉬메모리와의 혼동이 오기도 하며, 근원적으로 보았을 때 레지스터가 기억을 하는 내용들은 모두 명령어 실행에 필요한 무언가들을 저장해놓는 곳이기 때문이다.
예를 들어 데이터 레지스터는 연산에 사용되는 데이터들을 일시적으로 저장하고, 주소 레지스터는 이후 무언가 수행할 것들을 하기 위해 메모리의 주소를 저장하는 식이다.
지역성
레지스터는 매우 빠르다.
그리고 데이터나 명령어들을 일시적으로 저장하기 때문에 높은 성능을 보인다.
그러나 레지스터는 개개개개개비싸기 때문에 추가를 하기 어려우므로 프로세서 설계자들은 이 작은 레지스터들을 어떻게 관리할 것인지에 대해 고민하며, 이러한 특성 때문에 레지스터는 호출의 빈도가 잦은 것이다.
제어 불가
사실 레지스터는 제어하는 것이 불가능에 가까우며, 사실상 명령을 내리는 곳에 가깝고 저장은 그걸 하기 위한 보조적인 임무나 마찬가지이다.
명령을 처리 하기위한 주소와 같은 것들이 바로 레지스터에 들어가게 된다.
초기 컴퓨터
초기 컴퓨터는 CPU와 레지스터 메인디스크로만 이루어져있었다.
그런데 레지스터와 메인 디스크 사이 속도처리의 간극이 커지면서 SRAM이라는 캐시 메모리의 개념이 탄생하게 된 것이다.
캐시 메모리
캐시메모리를 언급하기 이전에, 메모리는 계층적인 구조를 가진다.
라는 사실을 꼭 머리에 새겨두어야한다.
캐시 메모리는 L1,L2,L3로 나뉘는데 cpu에 가까운 방향일수록 빠르고 DRAM에 가까워질수록 느려지게 된다.
그 이유는 바로 캐시 메모리가 cpu와 dram사이의 처리 속도를 극복하여, 어떠한 일을 처리할 때에 자연스럽게 발생하는 지연을 최소화하기 위해 사용되기 때문이다.
스마트 캐쉬
자 요즈음에 나오는 스마트 캐쉬라는 개념 역시 바로 자연스러운 지연에서부터 출발을 해야한다.
원래부터 cpu는 메인메모리에서 데이터나 명령어를 가져오는 일을 하고싶지만, 이러한 과정에서 cpu는 한번에 한 개의 일 밖에 못하기 때문에 캐쉬라는 것을 만들었다고 앞에서 설명했다.
그러나 캐시는 비싸고 용량이 작다는 특징이 있으므로, 임시로 캐시를 빌리고 그것으로도 해결이 안되면 dram을 캐시화하여 자주 사용하는 데이터를 보관하는데 이를 스마트캐쉬라고 부른다.
프로그램 카운터
카운터라는 이름 때문에 뭔 프로세스의 실행횟수를 센다거나, 무언가를 세는 역할이 아닐까 착각하기 쉽지만 프로그램 카운터의 본질은 포인터에 가깝다.
아까 말한 레지스터가 투두리스트라면, 프로그램 카운터는 바로 그 투두리스트를 하기 위해 필요한 주소값들을 저장해놓는 곳이다.
그렇다면 왜 포인터가 아니라 카운터가 이름에 붙을까?
그 이유는 프로그램 카운터가 CPU가 명령어를 순차적으로 실행하면 그 때마다 그 값이 증가하고, 프로그램이 점프 등의 제어 흐름을 만나면 해당 목적지의 주소로 변경되는 역할을 하기 때문이다.
고급언어와 기계어
이전에 C를 공부하며 들었던 의문중에 하나는 C는 지나치게 고물딱지 같고 하드웨어와 직접적인 연관성을 가지는 것 같은데 왜 고급언어로 분류되는 가였다.
이것에 대해 디테일한 이해를 하기 위해서는 컴파일과 인터프립터 등등에 대한 이해를 갖추어야한다.
한문장으로 요약하자면, 고급언어와 기계어를 나누는 기준은 인간이 느끼기에 답답하냐 고물딱지 같느냐가 기준이 아니라 컴파일을 거쳐야 기계가 이해할 수 있느냐 아니냐가 기준이기 때문이다.
컴파일이란
컴파일은 일종의 소프트웨어 도구인 컴파일러를 사용하여 이루어진다.
소프트웨어와 하드웨어를 연결할 수 있도록 도와주는 단계로 모든 것을 기계어로 번역을 하는 단계이다.
인터프린터 언어
인터프린터 언어는 한 줄씩 기계어로 번역되는 방식이므로 개 느리다는 특징이 있다.
그렇다면 인터프린터 언어는 사장되었을까? 아니다.
JS와 같은 웹 언어들은 여전히 인터프린터 언어인 경우가 더러 있는데, 그 이유는 웹은 빠른 속도보다 사용자의 경험이 중요하기 때문에 조금씩 화면을 띄워줘도 상관이 없기 때문이다.
참고로 파이썬도 느려터진 이유중에 하나가 인터프린터 언어이기 때문이다.
PCB
pcb를 하드웨어적인 관점에서 보기 위해서는 cpu역시 반도체라는 것을 이해해야만 한다.
pcb는 간단하게 설명하자면 하드웨어의 요소연결 및 지원을 하며 어떤면에서보자면 컨트롤유닛과 마찬가지로 스케줄링 정보에 대해 관찰한다거나 하는 식으로 논리적인 부분들을 컨트롤 하기도 한다.
pcb에는 트랜지스터와 같은 수많은 하드웨어적인 컴포넌트가 들어간다
트랜지스터
0과1을 전기적으로 컨트롤해준다.
논리게이트는 근본적으로 뜯어보면 전기가 흐를까 말까인데 바로 이것에 대해 직접적으로 하드웨어상으로 관장하는 것이 트랜지스터이다.
따라서 트랜지스터는 동작을 제어하며 데이터를 처리하는데에 중요한 역할을 한다.
컨트롤 유닛
소프트웨어적 관점에서 보면 어떤 논리적인 연산을 처리하는 곳이 컨트롤 유닛이다.
트랜지스터는 동작을 제어하고 논리게이트가 이루어질 수 있도록 해주는 하드웨어라는 점에서 보았을 때 무언가를 컨트롤한다는 데에서 공통점을 가진다.
프로세스
우리가 보기에 하나의 프로그램이 돌아갈 때에는 프로세서, 메인메모리, 입출력 장치 등등이 모두 동시에 쓰이는 것과 같은 느낌을 받는다.
그러나, 사실 진짜로 이러한 것들이 모두 돌아가는 것은 아니고 이때 사용되는 것은 프로세스이다.
task
프로세스에 대해 공부를 한다면 꼭 task라는 키워드를 안고 가야한다.
task는 일을 하는 가장 작은 단위로 원래는 프로세스가 하나의 task만을 처리 가능하다.
쓰레드는 프로세스 내에서 실행되는 실행의 흐름을 의미한다.
O/S란
오퍼레이팅 시스템은 소프트웨어와 펌웨어 사이의 통로에 있다.
우리가 사용하는 컴퓨터는 크게 바라보면 4개의 계층으로 나눌수 있으며 이 계층은 s/w계층->o/s계층->펌웨어 계층->h/w계층으로 나눌 수 있다.
간략하게 설명하자면 펌웨어는 h/w와그 상위 단계를 연결해주기 위한 계층으로 대표적인 예시로는 하드웨어를 관리하는 바이오스가 속해있다.
s/w와 o/s를 연결하는 것이 바로 드라이버이다.(ex.사운드 카드 드라이버)
컴퓨터 구조 나누어보기
위에서 말한 4개의 컴퓨터 구조에 대해 설명을 더해보자면, H/W계층은 우리가 생각하는 반도체와 같은 것들이다.
펌웨어
펌웨어는 o/s없이 동작하는데 이것이 가능한 이유는 독립성과 안전성을 가지고있기 때문이다.
os
os는 오퍼레이팅 시스템의 약자로 소프트웨어의 제어를 담당한다.
램
램은 캐쉬 영역과 데이터 영역으로 나누어서 보아야한다.
캐쉬 영역은 빠른대신 용량이 적고, 캐쉬 영역에 속하지 않는 다른 램이 해야하는 기억들을 데이터 영역이라고 부른다.
캐쉬 영역
메인 메모리 내의 캐시 메모리는 주로 더 빠른 SRAM으로 처리된다.
딱 한마디로 sram을 정의하면 모든 cs지식을 단기로 저장하는 우리들의 뇌와 비슷하다…
데이터 영역
이미 실행시 지정된 값으로 초기화가되는 데이터들이 들어간다.
대표적인 예시로는 알아서 0으로 초기화되는 전역변수가 있다.
M3 프로세서는 다르다
cpu와 메모리 사이의 속도 차이로 인해 AI구동과 같은 무거운 일을 하면 병목현상이 생기게 된다.
그래서 이러한 문제점들에 대해 고민하고 새로운 구조를 채택한 것이 맥의 m3프로세서이다.
참고로 왜 인공지능하면 우리가 파이썬을 떠올릴까에 대한 대답도 이와 연관된다.
우리가 사용하는 인공지능 관련 파이썬 라이브러리는 대부분의 경우 내부 구동에서는 c나 c++같은 구닥다리로 쓰여져있다.
HDD
하드디스크는 보통 느리다.
그 이유는 하드디스크가 구동되는 원리가 자성에 의해 0이 되고 자화의 유무에 따라 0과1이 되는 방식으로, 물리적으로 돌아가야만 무언가를 기억할 수 있기 때문이다.
참고로 cpu의 속도는 클럭단위 hdd의 속도는 rpm단위로 표현한다.
SSD
SSD에 대해 아주 간략하게 설명하자면 우리가 사용하는 usb를 주기억장치화 한 것이다.
그래서 빠르다는 특징을 가지고 있다.
댓글남기기