ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 동시성 이해를 위한 컴퓨터 기본 구조
    Apple🍎/Cocurrency 2025. 1. 26. 20:01

     

     

    컴퓨터란 데이터들을 정해진 규칙에 따라 연산을 수행하는 장치 입니다. 


    요리에 한번 비유를 해볼까요? 

    데이터: 요리의 재료들이 데이터에 해당합니다.
    예를 들어 계란, 설탕, 밀가루와 같은 실제 재료들은 컴퓨터가 처리하는 원시 데이터와 같습니다.
    재료들은 자체로는 아무 의미가 없지만, 정해진 규칙에 따라 처리되면 의미 있는 결과물이 됩니다.

     

    정해진 규칙: 레시피가 바로 정해진 규칙에 해당합니다.
    레시피는 "계란을 3 넣고, 설탕 2스푼을 넣은 섞는다" 같이 재료를 어떤 순서로, 어떻게 처리해야 하는지 정확히 명시합니다.
    이는 컴퓨터 프로그램이 데이터를 어떻게 처리할지 정의하는 것과 같습니다.

     

    연산: 실제 요리 과정이 연산에 해당합니다.
    재료를 섞고, 반죽하고, 굽는 등의 물리적 행위들은 컴퓨터가 수행하는 더하기, 빼기, 곱하기와 같은 연산과 대응됩니다.
    이러한 과정들을 통해 원재료(데이터) 최종 요리(결과물) 변환됩니다.

     

    컴퓨터는 데이터를 “정해진 규칙”에 따라 처리하는 기계입니다.

    이러한 규칙들은 프로그래머들이 C++, Java, Python 등의 프로그래밍 언어로 작성한 소스 코드를 통해 만들어 집니다.

    이렇게 만들어진 규칙들의 집합을 프로그램이라고 하는데,

    우리가 일상적으로 사용하는 유튜브, 메모장, 인터넷 브라우저 등이 모두 프로그램의 예시입니다.

    각각의 프로그램들은 자신만의 고유한 목적(동영상 재생, 텍스트 편집, 웹 탐색 등)을 위한 규칙들을 담고 있어서, 우리는 컴퓨터에서 이러한 다양한 프로그램들을 실행함으로써 원하는 작업들을 수행할 수 있게 됩니다. 

     

     

    앞서 만든 프로그램을 실행시키기 위해서는 두가지 핵심적인 장치가 필요합니다. 

    1. 연산 장치 (프로세서) : 저장 장치에서 프로그램과 데이터를 가져와 실제 계산과 처리를 수행하는 장치 입니다. 
    2. 저장 장치 (메모리) : 프로그램의 명령어들과 처리할 데이터를 보관하는 공간입니다. 

    맥북을 구매하기 위해서 홈페이지를 방문하면 위와 같은 스펙을 확인할 수 있는데요.

    여기서 CPU와 GPU는 연산을 수행하는 연산 장치 그리고 RAM과 SSD는 저장장치에 해당합니다

    저장장치는 크게 둘로 나눌 수 있습니다. 

    1. 주 기억 장치 (RAM) 은 현재 실행 중인 프로그램과 데이터를 임시로 저장하는 곳으로 전원이 꺼지면 내용이 사라지는 휘발성 메모리입니다. 빠른 읽기 / 쓰기 속도로 연산장치와 직접 통신합니다. 
    2. 보조 기억 장치 (SSD / HDD )는 프로그램과 데이터를 영구적으로 저장하는 곳으로 전원이 꺼져도 내용이 유지됩니다. RAM 보다는 느리지만 큰 용량을 제공합니다. 

    메모앱과 같은 프로그램은 다음과 같은 과정을 거쳐 실행됩니다. 

    1. 평소에 메모 앱과 작성한 메모들은 SSD(영구 기억 장치) 저장되어 있습니다. 
    2. 우리가 앱을 실행하면 운영체제는 SSD로부터 메모 프로그램과 이전에 작성했던 메모들을 찾아 메모리 가져옵니다.
    3. CPU메모리 위에 올라와 있는 데이터들을 가지고 메모 앱의 명령어들을 실행하며 새로운 메모를 작성하거나, 기존 메모를 수정하는 등의 작업을 처리합니다. 

    이러한 과정이 초당 수십억 번씩 반복되면서 우리가 사용하는 프로그램들이 실행되는 것입니다.

     

    CPU는 매우 빠른 속도로 연산을 수행하지만, RAM에서 데이터를 읽고 쓰는 속도는 이보다 훨씬 느립니다.

    이런 속도 차이를 줄이기 위해 CPU와 RAM 사이에 캐시를 둡니다. 

    캐시는 CPU가 곧 필요할 것 같은 데이터를 미리 가져다 놓는 고속 메모리입니다.

    CPU 내부에는 레지스터라는 가장 빠른 메모리가 있는데, 여기에는 현재 실행 중인 명령어와 그 명령어가 사용하는 데이터가 저장됩니다.

    코어(Core)는 CPU 내부에서 실제 연산을 수행하는 독립적인 처리 장치 입니다. 

    하나의 코어는 번에 하나의 작업만 있습니다. 

    따라서 4 코어 CPU는 동시에 4개의 작업을 수행할 수 있습니다.   

    코어(Core)는 위와 같은 구성요소들로 이루어져 있으며 다음과 같은 과정을 거쳐 연산을 수행합니다. 

    0. 앞서 프로그램 실행과정에서 언급했던 것처럼 프로그램이 실행되기 위해서는 먼저 명령어와 데이터들을 메모리 위에 가져옵니다. 

    1. 프로그램 카운터는 다음 연산에 필요한 명령어와 데이터를 가지고 있는 메모리 주소를 가지고 있습니다. 
    2. 메모리 주소 레지스터는 프로그램 카운터로부터 주소를 넘겨받아 그 메모리 주소로 찾아가 명령과 데이터를 가지고 옵니다.
    3. 메모리 버퍼 레지스터는 메모리 주소 레지스터가 가져온 값들을 일시적으로 저장한 다음에 명령어는 명령어 레지스터에 연산에 사용될 데이터는 누산기로 보냅니다. 
    4. 제어장치는 명령어 레지스터에 있는 명령을 가져와 해석하고 이에 따라 각 시스템이 실행되도록 지시를 합니다. 
    5. 누산기 레지스터는 연산의 중간 값이나 결과 값을 일시적으로 저장하고 최종값은 메모리 버퍼 레지스터를 통해 메모리로 전송합니다. 
    6. 산술 논리 장치는 데이터에 대하여 명령어에 따라 산술 논리 연산을 실행합니다. 

    코어(Core)의 기본 동작 사이클은 4단계로 나누어 볼 수 있습니다. 

     

    1. 인출(Fetch) 단계

    프로그램 카운터가 다음 실행할 명령어의 메모리 주소를 가지고 있다가, 이를 메모리 주소 레지스터로 전달합니다. 메모리 주소 레지스터는 이 주소를 사용해 메모리에서 실제 명령어와 데이터를 가져와 메모리 버퍼 레지스터에 임시 저장합니다.

     

    2. 해석(Decode) 단계

    메모리 버퍼 레지스터에 저장된 내용 중 명령어는 명령어 레지스터로 전달됩니다. 제어장치는 이 명령어 레지스터의 내용을 받아서 해석하고, 어떤 동작을 수행해야 할지 결정합니다.

     

    3. 실행(Execute) 단계

    제어장치의 해석에 따라 산술 논리 장치가 실제 연산을 수행합니다. 이때 필요한 데이터는 메모리 버퍼 레지스터에서 누산기로 전달된 값을 사용합니다. 연산 과정의 중간 결과값들은 누산기에 임시 저장됩니다.

     

    4. 저장(Store) 단계

    연산이 완료되면 누산기에 있는 최종 결과값은 메모리 버퍼 레지스터를 거쳐 다시 메모리로 저장됩니다. 이렇게 한 사이클이 완료되면 프로그램 카운터는 다음 명령어의 주소를 가리키게 되고, 새로운 사이클이 시작됩니다.

     

    CPU는 이러한 기본적인 명령어 실행 사이클을 통해 연산을 수행하지만,

    현대의 컴퓨터 시스템에서는 더 복잡한 문제들을 다뤄야 합니다.

    여러 프로그램이 동시에 실행되고, 다양한 하드웨어 자원들을 효율적으로 관리해야 하며, 프로그램 간의 충돌도 방지해야 합니다. CPU 혼자서는 이러한 복잡한 관리 작업을 수행하기 어렵습니다.

     

    "이러한 복잡한 관리 작업을 효율적으로 처리하기 위해서는 추가적인 시스템이 필요했습니다.

    하드웨어 자원 관리, 프로그램 실행 제어, 파일 시스템 관리 등을 체계적으로 수행할 수 있는 중간 계층이 필요했고,

    이것이 바로 운영체제의 탄생 배경이 되었습니다."

     

    맨 위의 '사용자 애플리케이션'은 우리가 실제로 사용하는 프로그램들입니다.

    카카오톡, 워드, 게임 같은 것들이죠. 이 프로그램들은 우리가 쉽게 사용할 수 있도록 만들어져 있습니다.

     

    중간의 '운영체제'는 번역가 같은 역할을 합니다.

    위에서 프로그램이 "파일 저장해줘"라고 쉽게 말하면,

    운영체제는 이것을 하드웨어가 이해할 수 있는 복잡한 명령어로 바꿔줍니다.

     

    맨 아래 '하드웨어'는 실제 컴퓨터 부품들입니다. CPU, 메모리, 하드디스크 같은 것들이죠. 이것들은 아주 복잡한 방식으로 일하지만, 운영체제가 중간에서 관리해주기 때문에 우리는 그런 복잡한 것들을 몰라도 됩니다.

     

    이 시스템에서 메모리는 두 개의 중요한 공간으로 나뉩니다:

     

    User Space(사용자 공간)

    - 우리가 일상적으로 사용하는 모든 프로그램들이 실행되는 공간입니다

    - 이 공간의 프로그램들은 제한된 권한만 가지고 있어서 하드웨어에 직접 접근할 수 없습니다

    - 하드웨어를 사용해야 할 때는 반드시 운영체제에게 부탁해야 합니다.

     

    Kernel Space(커널 공간)

    - 운영체제의 핵심 부분이 동작하는 특별한 공간입니다

    - 하드웨어를 직접 제어할 수 있는 특별한 권한을 가지고 있습니다

    - 사용자 프로그램의 요청(시스템 콜)을 처리하고 하드웨어를 관리합니다

     

     

    지금까지 기본적인 컴퓨터 구조와 작동 방법에 대해서 알아봤으니 하드웨어 계층에서 병렬 컴퓨팅을 어떤 방식으로 지원하는지 알아봅시다. 

    현대에 들어서는 한번에 여러 연산을 수행하기 위해서 다양한 형태의 프로세서가 나왔는데요. 

    그중에서 멀티 코어 프로세서와 멀티 프로세서의 차이에 대해서 알아보겠습니다. 

     

    멀티코어 프로세서는 하나의 큰 칩 안에 여러 개의 코어가 통합되어 있습니다.

    각 코어는 같은 칩 안에서 매우 가까운 거리에 위치해 있어 서로 간의 통신이 매우 빠르고 효율적입니다.

     

    반면 멀티프로세서는 각각의 독립된 프로세서 칩들이 시스템 버스를 통해 연결되어 있습니다.

    각 프로세서는 자신만의 완전한 처리 장치를 가지고 있지만, 프로세서 간 통신을 위해서는 시스템 버스를 거쳐야 하므로 상대적으로 통신 속도가 더 느립니다.

     

    멀티코어 프로세서는 하나의 공유 메모리 버스를 사용하여 매우 빠른 통신이 가능합니다.

    멀티프로세서는 시스템 버스를 통해 통신하며, 이는 공유 메모리 버스보다 상대적으로 더 느립니다.

     

    이러한 구조적 차이 때문에 멀티코어 프로세서는 코어 간 긴밀한 협력이 필요한 작업에 더 적합하고,

    멀티프로세서는 독립적인 작업들을 병렬로 처리하는 데 더 적합합니다.

     

     

     

    MIMD(Multiple Instruction, Multiple Data)와 SIMD(Single Instruction, Multiple Data)는 컴퓨터 병렬 처리의 두 가지 주요한 아키텍처 방식입니다. 이들의 근본적인 차이는 명령어와 데이터를 어떻게 처리하느냐에 있습니다.

     

    MIMD는 여러 개의 처리 장치가 각각 다른 명령어를 실행하면서, 서로 다른 데이터를 처리할 수 있는 구조입니다.

     

    MIMD의 주요 특징:

    1. 유연성: 각 처리 유닛이 독립적으로 동작하므로 다양한 작업을 동시에 처리할 수 있습니다.

    2. 복잡성: 여러 명령어 스트림을 관리해야 하므로 구조가 더 복잡합니다.

    3. 응용 분야: 일반적인 컴퓨팅 작업, 멀티태스킹에 적합합니다.

    4. 대표적 예시: 현대의 멀티코어 CPU가 이 방식을 사용합니다.

     

    다음으로 SIMD(Single Instruction, Multiple Data)를 살펴보겠습니다:

     

    SIMD는 하나의 명령어여러 데이터를 동시에 처리하는 구조입니다.

     

    SIMD의 주요 특징:

    1. 효율성: 하나의 명령어로 여러 데이터를 동시에 처리할 수 있어 특정 작업에서 매우 효율적입니다.

    2. 단순성: 하나의 명령어 스트림만 관리하면 되므로 구조가 상대적으로 단순합니다.

    3. 응용 분야: 그래픽 처리, 벡터 연산, 멀티미디어 처리에 특히 적합합니다.

    4. 대표적 예시: GPU가 이 방식을 활용합니다.

     

    이러한 차이 때문에 각각의 아키텍처는 서로 다른 종류의 작업에서 강점을 보입니다

     

    1. MIMD는 다음과 같은 경우에 적합합니다:

       - 여러 사용자가 동시에 다른 프로그램을 실행할 때

       - 복잡한 의사결정이 필요한 작업

       - 서로 다른 알고리즘을 병렬로 실행해야 할 때

     

    2. SIMD는 다음과 같은 경우에 적합합니다:

       - 이미지나 비디오 처리

       - 대규모 행렬 연산

       - 같은 연산을 많은 데이터에 적용해야 할 때

     

     

    CPU는 한 명의 뛰어난 박사와 같습니다.

    박사는 아주 복잡한 문제도 해결할 수 있고, 상황에 따라 유연하게 대처할 수 있습니다.

    하지만 한 번에 하나의 일만 처리할 수 있다는 한계가 있습니다.

     

    반면 GPU는 10,000명의 초등학생들과 같습니다. 각각의 초등학생은 박사만큼 복잡한 문제는 풀지 못하지만, 덧셈과 같은 간단한 계산은 할 수 있습니다. 10,000명이 동시에 덧셈을 하면 어마어마한 양의 계산을 빠르게 처리할 수 있죠.

    하지만 복잡한 수학 문제가 주어지면 해결하기 어렵습니다.

     

    CPU(박사)는 복잡한 의사결정이 필요한 작업을 담당합니다.

    GPU(초등학생들)는 간단하지만 반복적인 대량의 계산을 담당합니다.

    'Apple🍎 > Cocurrency' 카테고리의 다른 글

    쓰레드는 뭘까?  (0) 2025.01.27
    프로세스는 뭘까?  (0) 2025.01.27

    댓글

Designed by Tistory.