2022. 2. 4. 01:56ㆍIoT Embeded 강의
#컴퓨터의 구조
지난 글에서 여러개의 트랜지스터 소자가 모여 하나의 논리 회로를 이루고 논리,산술 연산 기능을 구현하는 것을 간략히 배웠습니다. 트랜지스터가 모여 집적회로를 형성하고 더 나아가 복잡한 기능을 하는 시스템을 만들 수 있는데 그 중간과정은 저도 잘 모르는 부분이 많아 넘어가겠습니다. 이번엔 컴퓨터의 구성요소를 간단히 다루며 핵심부품인 CPU 의 동작원리에 대해 정리할 것입니다.
1. 중앙 처리 장치(Central Processing Unit)
CPU는 중앙 처리 장치로 컴퓨터의 두뇌 역할을 담당합니다. 메모리에 저장된 명령어와 데이터들을 가져와 그에 맞게 산술/논리 연산을 수행하는 장치입니다. CPU와 함께 GPU(Graphic Processing Unit)도 핵심 부품으로 생각할 수 있는데 임베디드 교육, c프로그래밍에 관련해서 다루기 때문에 관련 내용은 영상 링크를 첨부하는 것으로 간단하게 생략하겠습니다. 관련 자료를 찾아보면서 내린 결론은 우리가 보는 모니터, 디스플레이 위의 픽셀 구현에 필요한 연산들은 CPU가 담당하기에는 상대적으로 간단하고 양이 많은 것입니다. 때문에 이를 병렬연산에 특화된 GPU가 대신합니다.
https://www.youtube.com/watch?v=1BAZf3PsjWA
2. 메모리(Random Access Memory, Read Only Memory)
RAM은 처리할 데이터와 명령어를 저장해두는 장치입니다. HDD(하드디스크),SSD와의 차이점은 전원이 차단되면 저장된 데이터가 사라지는 휘발성 메모리라는 것입니다(비휘발성 램도 있다고 합니다). 초기에는 CPU가 하드디스크에서 직접 명령어와 데이터를 끌어와서 연산을 수행했는데 읽어오는 속도가 너무 느린 것을 개선하기 위해 나온 것이 지금의 RAM 으로 발전했습니다. 하드디스크에서 명령어와 데이터를 가져와 메모리에 저장해두어 CPU에서 보다 빠르게 데이터들을 읽을 수 있도록 중간다리 역할을 합니다. ROM 에 대해서는 나중에 부트로더를 배우게 되면 다시 업데이트 하겠습니다.
3. 보조기억장치(HDD, SSD,USB)
데이터들을 장기 기록, 보관하는 장치이다. 하드디스크(Hard Disk Drive)는 간단히 말해서 내부의 회전하는 기계적 부품과 자성을 이용해 데이터들을 원판 위에 기록하는 방식으로 쉽게 비유하면 레코드판과 비슷하다고 할 수 있습니다. 때문에 데이터를 읽고 기록하는데 기계적 장치들이 움직이는 시간들이 전자를 이용하는 CPU보다 느릴 수 밖에 없습니다. SSD(Solid State Drive)는 그 구동 방식이 USB와 비슷하며 일종의 플래시 메모리입니다. 내부의 트랜지스터 소자에 전하를 축적시켜 기록하는 방식으로 데이터를 읽고 기록하는 속도가 HDD 보다 우수합니다.
#CPU의 작동원리
CPU는 메모리에서 명령어와 데이터를 받아 명령어에 맞게 데이터들을 산술/논리 연산을 한뒤 다시 메모리에 데이터를 전달합니다. 메모리는 이를 외부 저장장치에 다시 장기 기록을 하도록 전달합니다. CPU 내부에서도 크게 3가지로 나눌 수 있는데 제어 장치(Control Unit)와 산술/논리 장치(Arithmetic/Logic Unit), 레지스터(Register)로 구분 할 수 있고 레지스터도 세분화하여 여러 부분으로 구분할 수 있습니다. 보다 상세한 내용은 아래 영상 링크의 영상을 참고하시길 바랍니다. 정말 좋은 자료로 전체 영상을 보시면 반도체 물성에서부터 CPU동작 원리까지 이해하는데 큰 도움이 될 것입니다.
https://www.youtube.com/watch?v=Fg00LN30Ezg
1.컴파일
영상에서 프로그래밍 언어에서 어셈블리 언어로, 그리고 기계어로 번역된 뒤 기계어를 받아들인 cpu가 작동하는 과정을 보셨을텐데요. 기계어를 사람이 보고 프로그래밍을 하기에는 너무 비효율적이고 피곤하기 때문에 보다 인간에 가까운 언어들이 개발됐고 이를 고수준 언어(High-level) 라고 합니다. 기계어에 가까운 언어는 반대로 저수준 언어(Low-level)라고 합니다. 또 고수준 언어에서 기계어로 번역하는 과정을 컴파일(Compile)이라 합니다.
2.링크
저는 코딩을 배우다 보면서 '라이브러리' 라는 단어를 많이 접하게 됐습니다. 이는 자주 쓰는 기본 기능들을 미리 만들어 놓은 것이며 함수,메세지 틀, 클래스 값등 여러 가지가 될 수 있습니다. 쉽게 말해 자주 쓰는 소스 코드들은 따로 저장해둔 뒤 다음에 소스 코드를 작성할 때 불러와서 사용하는 것입니다. 만약 제가 소스코드를 작성하면서 어떤 함수를 사용하기 위해서 함수에 대한 코드를 매번 작성하게 되면 너무 힘들고 비효율 적입니다. 대신 라이브러리와 연결하여 그 함수를 불러오는 한줄 코드를 작성하는 것이 훨씬 편하겠죠. 이때 라이브러리에 있는 함수를 지금 만드는 소스코드의 실행파일에 연결시키는 작업이 필요한데 이를 링크(Link)라고 합니다.
3.빌드
c언어를 이용해 코드를 작성한 뒤 빌드를 해야 합니다. 빌드를 한 뒤에 실행파일이 만들어져야 우리가 작성한 코드의 결과를 확인할 수 있습니다. 빌드는 앞서 말한 컴파일과 링크의 두 단계로 이루어진다. 고수준 언어를 기계어로 번역하고 라이브러리에 연결하는 작업을 한 뒤 메모리를 통해 CPU로 내 소스 코드가 전달되고 결과가 출력됩니다. 무사히 빌드 단계를 거쳐 원하는 결과를 보면 좋겠지만 실제로 코딩을 하다보면 여러 번 에러를 마주하게 됩니다. 게다가 에러메세지는 무슨 말인지 전혀 모르기에 해결할 방법도 떠오르지 않는 경우가 많죠... 이런 어려움을 해결하기 위해 다음에는 세 가지 에러의 종류에 대해 정리해보려고 합니다.
'IoT Embeded 강의' 카테고리의 다른 글
반복문의 기본 문법 (0) | 2022.02.08 |
---|---|
조건문의 기본 문법 (0) | 2022.02.07 |
C언어 에러 종류 (0) | 2022.02.04 |
디지털 논리회로 (0) | 2022.01.29 |
하드웨어의 이해 (0) | 2022.01.29 |