IT 공부/컴퓨터 하드웨어 및 구조10 폰 노이만 구조의 혁신 폰 노이만 이전에도 컴퓨터는 있었다. 컴퓨터란 정보를 저장하고 처리하는 장치다. 물론 이 정의를 일반화하여 고대 중국의 주판을 컴퓨터라 할 수도 있다. 하지만 이 글의 논의에서 말하는 컴퓨터는 전자 컴퓨터를 말한다. 이런 관점에서 봤을 때, 최초의 컴퓨터는 존 모클리와 존 애커트가 1940년대에 개발한 애니악(ENIAC)이다. 문제는 에니악이 우리가 일반적으로 생각하는 범용 컴퓨터가 아니라는 점에 있었다. 이 때문에 에니악을 최초의 컴퓨터로 볼 수 없다는 시각이 현재는 주류의 의견이다. 우리가 컴퓨터에게 시키는 일은 알고리즘(계산 절차)을 통해 다양한 데이터 입력값에 대한 출력값을 얻는 것이다. 애니악은 철저하게 수소폭탄 궤적을 위한 알고리즘만을 수행할 수 있었다. 다양한 입력값에 해당하는 수소폭탄의 궤.. 2024. 3. 5. 논리 주소, 물리 주소 차이와 하드웨어적 메모리 보호 기법 1. 컴파일 단계에서부터 결정되어야 한다 논리 주소(가상 주소라고보 부른다)를 활용하기 위해서는 컴파일러가 미리 소스코드를 "실행 시간 바인딩(run time binding)"이 가능한 코드로 컴파일해야 한다. 궁극적으로 모든 프로그램은 메모리에 적재되어 CPU에 의해 실행되어야 한다. 따라서 어떻게 CPU가 프로그램의 메모리 상의 주소를 참조해 데이터를 긁어올 수 있는지 표준을 정해야 할 것이다. 컴파일러는 메모리 참조 방식(주소 바인딩, address binding)을 근거로 소스코드를 컴파일해야 한다. 다음은 그 종류다. 1-1. 컴파일 타임 바인딩 컴파일 단계에서 구체적인 물리 주소를 결정하는 식이다. 따라서 기계어 명령어에 이미 구체적인 참조 물리 주소가 적히는 식이다. 따라서 프로그램이 적재될.. 2024. 1. 3. 리눅스 환경에서 CPU 조사해보기 cpu MHz : 클럭 속도를 말한다. 메가헤르츠 단위로 표현되었는데 3.1GHz 정도다. 1초에 대략 3,000,000,000 번 '똑딱' 하고 반복한다. 클럭이 반드시 명령어 하나를 실행하는 주기는 아니다. 명령어 하나를 실행하는 데에도 다양한 단계를 거쳐야 한다. 명령어를 메모리에서 가져오고(fetch), 프로그램 카운터(pc) 값을 올리고, 명령어를 수행하고, .... 이런 식으로 말이다. 클럭은 소프트웨어가 아니라 하드웨적 관점에서 CPU가 하나의 처리를 할 수 있는 전산적 속도다. sibilings : 하이퍼쓰레딩(hyperthreading)을 말하며 하드웨어적 스레드 개수를 말한다. 내 가상머신의 리눅스는 1개 밖에 없는데, 이것은 내가 리눅스를 설치할 때 멀티쓰레딩 환경을 설정하지 않았기 .. 2023. 12. 28. 하드웨어 쓰레드와 소프트웨어 쓰레드 1. 코어와 하드웨어 스레드 (논리 프로세서) 스레드라는 단어가 하드웨어 단위에서 사용되는 경우도 있고, 위와 같이 소프트웨어적으로 사용되는 경우도 있다. 따라서 헷갈릴 수 있다. 그러나 서로 완전히 다른 개념이다. 멀티코어는 제어장치와 ALU와 같이 실제로 작업을 병렬적으로 처리할 수 있도록 CPU의 핵심 장치 자체를 여러 개 두는 것을 말한다. 시분할 방식이 아니라 정말로 여러 개의 코어에 작업을 적재시키면 동시에 실행시킬 수 있다. 하드웨어에서 말하는 멀티쓰레드는 제어장치나 ALU까지 병렬적으로 두는 것은 아니다. 다만 온전하게 하나의 실행 단위가 수행되기 위한 레지스터 세트 여러 개를 물리적으로 배치했다. 작업관리자로 내 컴퓨터의 코어 개수와 하드웨어 스레드 개수를 확인할 수 있다. 코어는 4개 .. 2023. 12. 27. 함수 호출 시 스택프레임이 관리되는 원리 (어셈블리 레벨) 1. 스택프레임이란 프로그램이 실행되다가 함수를 호출하면 제어흐름은 호출된 함수 내부로 넘어간다. 이때 해당 함수가 작업하고 있는 데이터를 저장할 새로운 공간인 메모리 블록이 생성되는데, 이 블록에는 함수가 전달받은 인자나 내부 지역 변수 등이 저장된다. 이러한 함수의 데이터 블록은 위 그림과 같이 스택 자료구조로 적재된다. 프로그램의 본질이 main 함수로부터 실행이 시작되어 하위 함수를 호출해나가는 top-down 방식이기 때문에 자신을 호출한 함수로 다시 제어흐름을 넘기기 위해서는 호출 히스토리가 필요하며, 이를 위해 스택이 사용되는 것이다. 2. SP(스택 포인터)와 BP(베이스 포인터) 스택이 실제로 어떻게 관리되는지 어셈블리어를 확인해보자. 2-1. 실행 환경 사실 어셈블리는 시스템마다 종류가.. 2023. 12. 26. 2의 보수 계산법의 의미 2의 보수를 구하는 법은 아래와 같다. 원래 양수의 비트를 반전시킨다 (NOT 연산) 1을 더한다 예를 들어, 1101(2)가 있으면 부호를 반전해 0010(2)를 얻는다. 여기에 1을 더한 0011(2)이 원래의 숫자 1101(13이다)의 보수다. 바로 이 보수(complement)를 음수로 간주하자는 것이 컴퓨터의 음수 표현법이다. 왜 보수를 음수로 취급할까? +10과 -10은 더하면 0이 된다. +123과 -123은 더하면 0이 된다. 즉, 수학적으로 말하면 음수는 원래의 수에 더해져서 덧셈의 항등원(0)을 만들어내는 수로 정의된다. 0과 1을 반전시키면 비트가 다른 데이터를 얻는다. 이 둘을 더하면 모든 비트열에 대해 0과 1을 더하는 것이므로 11111....이 된다. 여기서 1을 더하면 올림이.. 2023. 12. 26. 은근히 헷갈리는 비트, 바이트 단위 정리 1비트는 컴퓨터가 표현하는 정보의 이론적인 최소 단위. 정확하게는 어떤 특정한 정보 안에 들어 있는 정보량을 측정하는 단위다. 1바이트는 컴퓨터가 처리하는 정보의 최소 묶음 단위. 물론 비트 하나로 정보를 코딩할 수는 있다... 그러나 우리가 일상에서 컴퓨터로 처리하고 싶은 정보는 복잡한 맥락에 속해 있으므로 하나의 비트만으로는 적절하게 정보를 인코딩할 수 없다. 하나의 비트만으로 표현할 수 있는 정보는 고작 성별(남자 or 여자), 출석 여부(출석함, 안함) 따위에 불과할 것이다. 그렇다고 매번 정보를 표현하기 위해 하나의 비트들을 여러개 모아서 코딩하는 것은 보통 귀찮은 일이 아닐 것이다. 따라서 비트를 세트로 모아 미리 묶어서 처리하는 것이며, 보통 1바이트(8비트)를 한 단위로 묶어 사용하는 것이.. 2023. 12. 26. C언어 컴파일 과정 1. C언어 컴파일 C언어를 처음 배울 때 C언어의 컴파일을 상세하게 공부하지 않았다. 사실 알고 싶었으나 설명이 워낙 어려워 그냥 그려려니 하고 넘어갔던 것 같다. 그러나 공부를 하면 할수록 하드웨어에 가까운 C언어를 익힌다는 것이 얼마나 중요한지 체감하게 되었다. (소프트웨어의 원형이 결국 C언어 스타일의 프로그램으로 귀결되더라.) 특히 window10과 같은 GUI 환경에서 Visual Studio 툴로 컴파일을 하게 되는데, 이 컴파일은 컴파일하자마자 즉시 실행 파일을 만들어준다. 그래서 C언어 컴파일 과정을 눈으로 익히기가 쉽지 않다. 이후 리눅스 환경에서 디폴트로 설치되어 있는 gcc 컴파일러 프로그램을 통해 C언어 소스코드의 컴파일 과정을 천천히 할 수 있게 되면서 신기해했던 경험이 있다. .. 2023. 11. 15. 메모리 계층 구조와 알고리즘의 공학적 한계 1. 개발에 있어서 컴퓨터 하드웨어 문제 컴퓨터 기계 장치의 하드웨어적인 본질은 무엇일까? 폰 노이만 아키텍처에 따르면, 컴퓨터의 기계적 본질은 프로세서인 CPU와, 데이터와 명령어가 저장된 스토리지인 RAM이다. RAM와 CPU 두 하드웨어만 있으면 그것이 곧 흠 잡을 데 없는 컴퓨터다. 튜링 기계와 등가다. 실제로 컴퓨터 장치를 공부할 때, NAND 게이트를 차곡차곡 조립해나가 8비트나 16비트 컴퓨터를 만들 때가 있는데, 이때도 간단한 CPU와 RAM만으로 컴퓨터를 완성할 수 있다. 이것만으로도 컴퓨터의 원리를 설명하는데 충분하기 때문이다. 그러나 컴퓨터는 기계 장치다. 물리적인 제약 조건에 강하게 결합되어 있다. 실제 컴퓨터는 구체적인 재료와 물리적인 비용을 바탕으로 설계된다. 즉, 그 속도와 명.. 2023. 11. 3. 이전 1 2 다음