프로그램 실행을 요청받은 CPU가 한번에 처리할 수 있는 메모리의 크기이다. 즉, 32비트 CPU는 주어진 데이터를 32비트씩 잘라서 수행하고, 64비트 CPU는 64비트씩 잘라서 수행한다. 한번에 수행하는 데이터가 많을수록 데이터 입출력이 줄고 연산이 빨라지기 때문에 64비트 CPU가 훨씬 빠르다.
8비트 이진 데이터(예를 들어 실행 파일이나, ZIP 파일 등)를 문자 코드에 영향을 받지 않는 공통 ASCII 영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식을 가리키는 개념입니다.
CPU는 최상위 계층의 '중앙처리장치'로써 컴퓨터의 두뇌와 같은 역할을 담당합니다. 따라서 데이터 처리와 더불어 프로그램에서 분석한 알고리즘에 따라 다음 행동을 결정하고 멀티태스킹을 위해 나눈 작업들에 우선순위를 지정하고 전환하며 가상 메모리를 관리하는 등 컴퓨터를 지휘하는 역할을 수행합니다.
GPU는 픽셀로 이루어진 영상을 처리하는 용도로 탄생했습니다. 반복적이고 비슷한 대량 연산을 병렬적(Parallel)으로 수행하기 때문에 CPU보다 훨씬 빠릅니다. 영상, 렌더링을 비롯한 그래픽 작업의 경우 픽셀 하나하나에 대해 연산을 하기 때문에 연산능력이 비교적 떨어지는 CPU가 GPU로 데이터를 보내 재빠르게 처리합니다.
CPU는 GPU보다 적은 코어를 갖고 있지만 각 코어가 GPU보다 강력하므로 순차 작업(Sequential task)에 좋습니다. 반면 GPU는 병렬 작업을 효율적으로 처리할 수 있는 수천 개의 코어를 가지므로병렬 작업(Paralell task)에 좋습니다.
애플리케이션의 연산 집약적 부분을 GPU로 넘기고 나머지 코드만을 CPU에서 처리하는 GPU 가속 컴퓨팅은 딥러닝, 머신러닝 영역에서 강력한 성능을 제공합니다. 사용자 입장에서는 연산 속도가 놀라울 정도로 빨라졌음을 느낄 수 있죠.
프로세서가 가진 명령어 세트를 기준으로 RISC와 CISC로 나누니다.
RISC (Reduce Instruction Set Computer): 핵심적인 명령어를 기반으로 최소한의 명령어 세트를 구성한 프로세서다. 고정적인 길이와 간단한 명령어로 빠른 동작 속도를 자랑하한다. 적은 명령어 세트를 가지고 있으므로 프로그램을 구성하는 명령어가 단순하지만 다수의 명령어를 필요로 한다.
CISC (Complex Instruction Set Computer): 연산을 처리하는 복잡한 명령어들을 수백개 이상 탑재하고 있는 프로세서다. 명령어 길이가 다양하며 개수가 많아 프로그램의 구성이 복잡해지지만 소수의 명령어로 구현할 수 있다.
RISC(Reduced Instruction Set Computer)와 CISC(Complex Instruction Set Computer)는 프로세서의 명령어 세트 설계 철학을 나타냅니다. 현대 CPU들은 이러한 기본적인 개념을 바탕으로 발전해 왔으며, 때로는 경계를 넘나드는 특징을 보이기도 합니다.
현대 CPU들은 RISC와 CISC라는 명확한 경계 없이, 각 아키텍처의 장점을 융합하여 특정 목적에 최적화된 형태로 발전하고 있습니다. ARM은 RISC의 효율성을 바탕으로 모바일 시장을 선도하고 있으며, 인텔은 CISC의 강력한 명령어 세트에 RISC의 효율성을 더하여 고성능 컴퓨팅을 지원하고 있습니다. Apple M1은 ARM 아키텍처의 가능성을 더욱 확장하며 새로운 가능성을 제시하고 있습니다.
좀 더 자세히 설명하면 다음과 같습니다.
CPU 내부에 실제로 존재하는 물리적인 처리 장치입니다. 각 코어는 독립적으로 명령어를 실행할 수 있습니다. 예를 들어, 쿼드 코어 CPU는 4개의 독립적인 코어를 가지고 있습니다.
하나의 물리적인 코어가 동시에 처리할 수 있는 명령어 스트림의 수입니다. 현대적인 CPU 기술 중 하나인 SMT (Simultaneous Multithreading) 또는 인텔의 하이퍼스레딩(Hyper-Threading) 기술을 통해 하나의 물리 코어가 여러 개의 논리 프로세서로 인식될 수 있습니다.
코어의 유휴 자원을 활용하여 여러 개의 명령어 스트림을 번갈아 가며 처리함으로써, 마치 여러 개의 코어가 있는 것처럼 보이게 합니다. 예를 들어, 하나의 코어가 두 개의 논리 프로세서를 지원한다면, 운영체제는 해당 코어를 2개의 독립적인 처리 장치로 인식합니다.
따라서 작업 관리자에서 보이는 "논리 프로세서"의 수는 CPU가 동시에 처리할 수 있는 스레드의 총 개수를 나타냅니다.
정리
코어: 실제 물리적인 처리 단위
논리 프로세서: 운영체제가 인식하는 가상의 처리 단위 (스레드와 동일한 개념으로 이해하시면 됩니다.)
스레드: 프로그램 실행의 가장 작은 단위이며, 논리 프로세서를 통해 병렬로 실행될 수 있습니다.
작업 관리자에서는 CPU의 병렬 처리 능력을 보여주기 위해 논리 프로세서의 수를 표시하며, 이는 곧 CPU가 동시에 처리할 수 있는 스레드의 수를 의미합니다.
1) 사용자가 운영체제에게 프로그램 실행을 요청한다.(run)
2) 운영체제(OS)는 프로그램의 정보를 HDD로부터 읽어 할당된 메인 메모리 (code, data, stack, heap)에 각각 적재한다.
3) CPU는 메인메모리에서 읽어온 정보를 바탕으로 차례로 코드를 실행한다.
프로그램이 실행되면 운영체제는 메인 메모리(RAM)에 실행에 필요한 메모리 공간을 할당해준다. 이 메모리 공간은 크게 4가지 영역으로 나뉜다.
힙 영역과 스택 영역은 사실 같은 공간을 공유한다. 힙이 메모리 위쪽 주소부터 할당되면 스택은 아래쪽부터 할당되는 식이다. 그래서 각 영역이 상대 공간을 침범하는 일이 발생할 수 있는데 이를 각각 힙 오버플로우, 스택 오버플로우라 한다.
Compile과 Interpret은 소스 코드를 변환하고 실행시키는 방식을 말한다.
☑️ 시각적으로 한번에 이해하기 좋은 영상입니다!
https://youtu.be/Dx2tSsd3aFc?si=BMogwgVC9EqWFNNO
자료형에 대한 정보가 미리 정의되어 있으므로 자료형의 이름을 통해 메모리 공간을 할당할 수 있다. 이는 효율적인 메모리 공간 사용을 보장한다.
정수형의 표현 범위보다 큰 수를 사용하려 할 때 오버플로우가 발생하며 작은 수를 사용하려 할 때를 언더플로우가 발생한다. unsigned 명령을 통해 양수 범위만 사용할 수 있다.
큐: 리스트의 한쪽 끝에서는 원소들이 삭제되고, 반대쪽 끝에서는 삽입만 가능하게 만든 순서화된 자료구조이다. 선입선출, FIFO 방식을 따른다. 원소 값 삭제가 발생하면 리스트 내의 모든 원소가 한칸씩 앞으로 이동하여야 하므로 연산이 오래 걸린다.
힙: 이진 트리의 일종으로 최대 힙 트리, 최소 힙 트리로 나뉜다. 최대 힙은 최대 값을 루트로 하여 부모 노드의 값이 항상 자식 노드의 값보다 큰 트리 구조이며, 최소 힙은 최소 값을 루트로 하여 부모 노드의 값이 항상 자식 노드의 값보다 작은 트리 구조다.
트리: 하나의 뿌리에서 가지로 나뉘어 데이터가 저장됨으로서 계층 구조를 갖는 자료구조이다.
정점과 간선으로 이루어진 그래프 자료구조를 탐색하는 방식이다.
RDBMS
엄격하게 정해진 스키마 (Fields, Records의 제약 조건에 대한 명세)에 따라 데이터를 저장하기에 명확한 데이터 구조를 보장하는 데이터베이스이다. 그렇기에 중복 데이터가 존재하지 않아 저장 공간을 절약할 수 있으며, 데이터 수정 (update)이 용이하다.
그리고 테이블 간의 관계를 통해서 큰 규모의 데이터를 여러 개의 테이블 (ex. user, item, buying)에 분산 저장할 수 있다. 분산 저장을 통해 보안을 철저히 하고, 테이블를 구조적으로 도식화 함으로 효율적으로 관리할 수 있다. 다만, 테이블 관계가 복잡해 질수록 JOIN이 많은 SQL 쿼리가 만들어 질 수 있다.
데이터 수정 (update)가 자주 발생하는 시스템이거나, 명확한 스키마가 중요한 경우 RDBMS가 적합하다.
NoSQL
스키마없이 유연하게 데이터를 저장/관리할 수 있는 데이터베이스이다. MongoDB가 대표적인 NoSQL이다.
데이터 중복이 허용되기에 수정 (update)을 위해서는 중복으로 저장된 데이터를 검색하여 모두 수정해야하는 번거로움이 있으며, 엄격한 스키마가 없다보니 데이터에 대한 규격화된 결과 값을 얻을 수 없다.
정확한 데이터 구조를 알지 못하거나, 데이터 수정 (update)보다는 쓰기 (write)와 읽기 (read)가 더 자주 발생하는 경우 NoSQL이 적합하다.
운영체제는 사용자에게 편리한 인터페이스 환경을 제공하고 컴퓨터 시스템의 자원을 효율적으로 관리하는 소프트웨어입니다.
운영체제는 인터페이스(GUI)와 시스템 호출(System call), 커널(Kernel)과 드라이버(Driver)로 구성됩니다. 이 중 사용자와 으용 프로그램에 인접하여 커널에 명령을 전달하고 실행 결과를 사용자와 응용 프로그램에 돌려주는 인터페이스와 운영 체제의 핵심 기능을 모아놓은 커널로 구분됩니다.
운영체제의 역할과 목적은 아래와 같습니다.
시스템 호출(System call)은 커널이 자신을 보호하기 위해 만든 인터페이스입니다.
커널은 보안을 위해 사용자나 응용 프로그램이 자원에 직접 접근하는 것을 차단하므로 자원을 이용 하려면 시스템 호출이라는 인터페이스를 이용해야 합니다.
커피를 마시기 위해 준비하는 과정을 예를 들어볼까요? 우리는 커피를 만들기 위해서 커피머신과 재료를 찾고, 이를 조제하여 마십니다. 그러기 위해서는 재료를 구비하고 커피머신의 사용법을 명확히 알아야 하죠. 이 과정 중 커피머신이 망가지거나 더러워질 수 있습니다.
반면 카페에서 커피를 주문한다고 생각해봅시다. 위의 번거로운 과정을 겪지 않아도 되는 것이죠! 이것이 직접 접근(사용자가 컴퓨터 자원에 직접 접근하여 작업)과 시스템 호출(작업을 요청하고 결과만 전달)입니다.
가상 머신(Virtual Machine, VM)
은 물리적 하드웨어 시스템에 구축되어 자체 CPU, 메모리, 네트워크 인터페이스 및 스토리지를 갖춘 가상 환경입니다.
커널 기반 가상 머신(KVM)과 같은 하이퍼바이저가 탑재된 물리적 머신을 호스트 머신, 호스트 컴퓨터, 호스트 운영 체제 또는 간단히 호스트라고 부릅니다. 리소스를 사용하는 여러 VM을 게스트 머신, 게스트 컴퓨터, 게스트 운영 체제 또는 간단히 게스트라고 부릅니다. 하이퍼바이저는 CPU, 메모리, 스토리지 등의 컴퓨팅 리소스를 처리하는 리소스의 풀로, 기존 게스트 간 또는 새로운 가상 머신에 쉽게 재배치할 수 있습니다.
VM은 시스템의 나머지 부분과 격리되며, 서버처럼 하나의 하드웨어에 여러 VM이 존재할 수 있습니다. 이는 수요에 따라 또는 더 효율적인 리소스 사용을 위해 호스트 서버 간에 이동할 수 있습니다.
가상 머신을 생성하고 구동하는 소프트웨어입니다.
가상 머신 모니터(Virtual Machine Monitor, VMM)라고도 불리는 하이퍼바이저는 하이퍼바이저 운영 체제와 가상 머신의 리소스를 분리해 VM의 생성과 관리를 지원합니다.
하이퍼바이저로 사용되는 물리 하드웨어를 호스트라고 하며 리소스를 사용하는 여러 VM을 게스트라고 합니다.
하이퍼바이저는 CPU, 메모리, 스토리지 등의 리소스를 처리하는 풀로, 기존 게스트 간 또는 새로운 가상 머신에 쉽게 재배치할 수 있습니다.
모든 하이퍼바이저에서 VM을 실행하려면 메모리 관리 프로그램, 프로세스 스케줄러, I/O(입력/출력) 스택, 기기 드라이버, 보안 관리 프로그램, 네트워크 스택과 같은 운영 체제 수준의 구성 요소가 필요합니다.
하이퍼바이저는 할당되었던 리소스를 각 가상 머신에 제공하고, 물리 리소스에 대해 VM 리소스의 일정을 관리합니다. 물리적 하드웨어는 계속해서 실행 작업을 수행하므로 하이퍼바이저가 일정을 관리하는 동안 CPU가 VM에서 요청한 대로 CPU 명령을 계속 실행합니다.
서로 다른 여러 개의 운영 체제를 나란히 구동할 수 있으며, 하이퍼바이저를 사용해 동일한 가상화 하드웨어 리소스를 공유합니다. 바로 이러한 부분이 가상화의 핵심적인 이점입니다. 가상화가 없다면 하드웨어에서 운영 체제를 1개만 구동할 수 있습니다.
컨테이너
와 VM
은 유사하다고 볼 수 있습니다. 이 두 가지 모두 다양한 IT 요소를 결합해 시스템의 나머지 부분으로부터 분리하는 패키지 컴퓨팅 환경이기 때문입니다. 중요한 차이점은 확장 방식과 이식성
컴퓨터 프로그램(프로세스)이 필요하지 않은 메모리를 계속 점유하고 있는 현상
메모리는 CPU 가 직접 접근하는 유일한 저장장치입니다.
메모리 시스템(하드웨어)은 주소(메모리 위치)를 관리하며 할당과 접근을 제어하는데, 이는 제한된 물리적 메모리의 효율적인 사용(할당)과 효율적인 메모리 참조(논리-물리주소 할당)를 위함입니다.
이러한 관리에는 여러 전략이 있습니다.
새로 적재되어야 할 데이터를 주기억장치 영역 중 어느 곳에 배치할지를 결정하는 전략입니다.
페이지, 세그먼트 등이 적재될 위치를 결정하는 정책으로, 종류는 아래와 같습니다.
최적 적합 > 최초 적합 > 최악 적합
순으로, 시간 효율성은 최초 적합 > 최적적합 ≒ 최악적합
순이 됩니다.요구 페이징이 발생했을 때 교체할 물리 메모리의 페이지를 선정하는 알고리즘이다.
메모리 단편화를 해결할 수 있는 기법이다.
페이지가 연속적인 물리 메모리 공간에 들어가야하는 제약을 해결하기 위한 방법이다. 가상 메모리는 페이지, 물리 메모리는 프레임이라는 고정 크기의 블록으로 나눈 후, 페이지 테이블의 매핑을 통해 1:1 대응 시킨다. 이는 외부 단편화를 해결할 수 있다. 페이지 단위를 작게하면 내부 단편화(Internal fragmentation) 역시 해결할 수 있지만 페이지에 공간을 할당한 후, 남는 공간이 적어지기 때문에 그 만큼 page mapping 과정이 증가할 수 있다.
method, function, object, variables 등 프로그램의 논리적 단위를 바탕으로 서로 다른 크기의 블록으로 나누는 방법이다. 세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법처럼 미리 분할해 둘 수 없고, 메모리에 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리 기법이다. 각 세그먼트 별로 길이 값을 가지고 있어 내부 단편화를 해결할 수 있다.
스레드 세이프(Thread-safe)란 어떤 함수, 변수, 객체가 여러 스레드로부터 동시 다발적인 접근이 일어나도 프로그램 실행이 보장되는 것입니다.
스레드 세이프한 프로그래밍이란 아래의 조건이 충족되어야 합니다.
~
말 그대로 스레드 내부에서 사용되는 지역변수를 말한다. 각각의 thread scope 내에서 공유되어 사용될 수 있는 값으로 다른 스레드에서 공유 변수에 접근할 시 발생할 수 있는 동시성 문제의 예방을 위해 만들어졌다.
프로세서가 멀티 프로세싱을 구성하여 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때, 기존 프로세스의 상태 또는 레지스터 값 (context)을 저장하고 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값을 교체하는 작업을 Context switching이라 한다.
멀티 프로세싱을 Computer multitasking을 통해 빠른 속도로 Task를 바꿔 가며 실행하여 실시간 처리에 근사하도록 하는 기술이다.
교착 상태란 서로 다른 프로세스가 서로의 자원을 요구하며 무한정 기다리는 현상을 말하며, 아래의 4가지 조건 중 하나라도 만족하지 않으면 교착 상태는 발생하지 않는다.
이 둘의 궁극적인 목표는 ‘다수의 프로세스나 스레드가 공유 자원에 동시에 접근하는 것을 제어하는 것’이다.
뮤텍스: 한 스레드, 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호배제 기법이다. 한 스레드가 임계 영역에 들어갈 때 lock을 걸어 다른 스레드가 접근하지 못하도록 하고, 임계 영역에서 나올 때 unlock한다.
세마포어: 현재 공유 자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두는 상호 배제 기법이다. 그 값만큼 동시에 스레드가 해당 공유 자원에 접근할 수 있다.
네트워크에서 통신이 일어나는 과정을 7단계로 캡슐화하여 서로 다른 동작을 각 layer에서 담당하는 것을 말한다. 이로서 통신이 일어나는 과정을 단계적으로 파악할 수 있으며 layer 별로 각기 다른 동작을 수행하기에 오류 탐지가 용이하다.
이 둘은 전송 계층에서 패킷을 보내기 위한 프로토콜이다.
과정: SYN (Client) → SYN + ACK (Server) → ACK (Client)
과정: FIN (Client) → ACK (Server) → FIN (Server) → ACK(Client)