Chapter1. 컴퓨터 구조
1-1. 컴퓨터의 기본 구조
1-2. CPU와 Memory
Chapter2. 운영체제(OS)
2-1. 운영체제
2-2. 프로세스
2-3. 스레드
Chapter3. 문자열과 그래픽
Chapter4. 가비지 컬렉션과 캐시
Chapter1. 컴퓨터 구조
하드웨어 + 소프트웨어
하드웨어 : 전자 회로 및 기계 장치로 입출력 장치, 중앙처리장치(CPU), 기억장치 등으로 구성되어 있다.
소프트웨어 : 하드웨어 위에서 하드웨어를 제어하며 작업을 수행하는 프로그램
컴퓨터의 기본 구성 요소
- 입력장치(Input) / 출력장치(Output)
- 내부
- 중앙처리장치(CPU) : 연산 담당
- 주 기억장치 & 보조 기억장치 : 저장 담당
✨ 입력 장치
- 컴퓨터가 처리할 수 있는 형태로 데이터와 명령을 받아들이는 물리적인 장치
ex) 키보드와 마우스, 스캐너와 타블렛, 혹은 컴퓨터에 연결하여 무언가를 입력할 수 있는 장치
✨ 출력 장치
- 처리된 데이터를 사람이 이해할 수 있는 형태로 출력하는 물리적인 장치
ex) 모니터(컴퓨터에서 나오는 글자, 그림 등의 결과를 화면에 보여주는 장치), 프린터(전자 장비에 저장되어 있는 문서를 종이 등에 인쇄하는 장치)
✨ 중앙처리장치
- CPU의 내부 구성
- 산술/논리 연산 장치(ALU) : 덧셈을 수행
- 제어 장치 : 프로그램에 따라 명령과 제어 신호를 생성하여 각종 장치의 동작을 제어
- 레지스터 : CPU 내부 메모리로, CPU에서 사용하는 데이터를 일시적으로 저장하는 장소
✨ 저장 장치
- 주 기억 장치(Memory) : 데이터나 프로그램을 보관하기 위한 일차 기억 장치
- 프로그램 수행을 위해 필요한 정보에 비해 중앙처리장치 내에 구비되어 있는 레지스터의 용량이 너무 작다.
- 그래서 주로 정보를 저장하고, 필요할 때 읽어들이는 저장소로 사용된다.
- 주 기억 장치 종류 : RAM, ROM
- 보조 기억 장치 : 주 기억 장치를 보조. ex)디스크, 씨디
- 주 기억 장치에 비해 기억된 내용을 읽는 속도는 느리지만 대용량의 기억이 가능하다.
- 현재 사용하지 않는 프로그램은 보조 기억 장치에 저장된다.
- 보조 기억 장치의 종류 : 플로피 디스크와 하드 디스크 같은 자기 디스크, CD와 DVD 같은 광 디스크, 그리고 USB와 SSD 같은 플래쉬 메모리
📌 CPU와 Memory
CPU
CPU : 각종 연산을 수행하고 기억장치에 기억된 명령어를 수행하는 컴퓨터 시스템의 핵심 부품
- 폰 노이만 구조 : 중앙 처리 장치(CPU)를 통해 연산을 수행하게 되는 구조
- CPU, 주기억장치인 메모리, 보조 기억 장치인 디스크와 씨디 + I/O((입출력장치)까지 추가 => 컴퓨터를 이루는 기본 골격
✨ CPU의 구조
-
내부 구성
-
1. 산술/논리 연산 장치(ALU: Arithmetic Logic Unit) : 산술적인 연산과 논리적인 연산 수행
- 가산기, 보수기, 누산기, 기억 레지스터, 데이터 레지스터 등으로 구성
- 캐시나 메모리로부터 읽어온 데이터는 → 레지스터(Register)라는 CPU 전용의 기억장소에 저장되고, ALU는 이 데이터를 이용해 산술 연산을 수행한다.
- 부동소숫연산장치(FPU)와 정수연산장치, 논리연산(AND, OR 등)장치 등이 있다.
-
2. 제어 장치(CU: Control Unit) : 시그널을 통해 데이터 흐름을 통제
-
3. 레지스터(Register) : CPU 내부의 메모리
- 중앙처리장치(CPU) 내부에 있는 기억장치
- 레지스터 구성
- 범용 레지스터(General-Purpose Register) : 산술 연산 논리장치에 의해 사용됨
- 전용 레지스터(Dedicated-Purpose Register) : PC 등 특수 목적에 사용됨
- 레지스터 종류
- IR (Instruction Register) : 현재 수행 중에 있는 명령어 부호를 저장하고 있는 레지스터
- PC (Program Counter) : 명령이 저장된 메모리의 주소를 가리키는 레지스터
- AC (Accumulator) : 산술 및 논리 연산의 결과를 임시로 기억하는 레지스터
✨ CPU의 기능
CPU 기능 : 명령어 수행 과정 & 데이터 처리 방식
- 명령어 인출 및 해독 : 모든 명령어들에 대하여 공통적으로 수행하며 기억 장치로부터 명령어를 읽어온다.
- 데이터 인출 및 처리, 쓰기 : 명령어에 따라 필요할 때만 수행한다.
명령어
-
시스템이 특정 동작을 수행시키는 작은 단위
-
구성
- 동작코드(Op-code: Operational Code) : 각 명령어의 실행 동작을 구분하여 표현
- 오퍼랜드(Operand) : 명령어의 실행에 필요한 자료나 실제 자료의 저장 위치
-
명령어 수행 과정
- 읽기(Fetch Instruction, FI): 메모리에서 명령을 가져온다.
- 해석(Decode Instruction, DI): 명령을 해석한다.
- 실행(Execute Instruction, EI): 명령을 수행한다.
- 기록(Write Back, WB): 수행한 결과를 기록한다.
-
명령어 처리 방식
Memory
기억소자 = 반도체
전류를 제어하는 반도체의 특징을 이용해 임시적인 내용들을 기억하게 만드는 것
✨ 메모리 분류별 특성
메모리는 시스템이 활성화 된 상태에서 그 값을 기억하고 있지만 시스템이 꺼지게 되면(ShutDown) 지워진다.
그에 비해 보조 기억장치는 시스템이 꺼져도 기억하고 있는 값이 휘발되지 않는다.
✨ 메모리 성능
✨ 메모리 종류
1. 주기억장치
RAM(Random Access Memory)
- 컴퓨터의 전원이 끊어지면 내용이 휘발되기 때문에 보조 저장 장치가 반드시 필요하다.
- RAM의 크기는 프로그램의 수행 속도에 영향을 준다.
- CPU에서 직접 접근이 가능한 유일한 저장 장치
- RAM의 종류
- SRAM : 리프레쉬 필요X / 전력 소모 적음 / 비쌈
- DRAM : 리프레쉬 필요O / SRAM보다 저가 / 많이 사용되는 편
ROM(Read Only Memory)
대부분 읽을 수만 있는 장치로 구성되어 있으며 전원이 끊겨도 내용이 보존된다.
2. 보조기억장치
자기 디스크
- 원판 표면의 철 입자의 방향(N/S극)으로 0과 1을 표현.
- 디스크 드라이브는 자기 디스크로부터 데이터를 읽는 주변 장치를 의미
- 자기 디스크에는 플로피 디스크(FDD)와 하드 디스크(HDD)가 존재한다.
광 디스크(optical disc, OD)
- 빛의 반사를 이용하여 자료를 읽어내는 저장 매체
- 1세대인 CD → 2세대 DVD → 3세대인 블루레이 디스크.
차세대 디스크로는 테라 디스크나 HVD등이 존재한다.
플래시 메모리
- 전자적으로 데이터를 지우고 쓸 수 있는 비휘발성 메모리로 충격에 강하여 휴대용 기기에 널리 쓰인다.
- 플래시 메모리에는 USB와 SSD가 존재
- SSD : HDD와 달리 디스크, 헤더와 같은 기계적 장치는 X / 저전력, 저소음, 저중량
✨ 캐시 메모리(Cache Memory)
Cache : 보관이나 저장
- 메인 메모리와 CPU 간의 데이터 속도 향상을 위한 중간 버퍼 역할
- CPU의 처리속도와 상대적으로 느린 메인 메모리에서의 속도의 차이를 극복하는 완충 역할
- CPU와 메인 메모리 사이에 존재
- 역할이나 성능에 따라 CPU 안/밖에 존재 가능
캐시 메모리의 성능 결정 요소
- 캐시 메모리는 메인 메모리의 일정 블록 사이즈의 데이터를 담아 두었다가 CPU에 워드 사이즈 만큼의 데이터를 전송한다.
- 이때 이 사이즈들이 캐시의 성능에 영향을 미친다.
- 블록사이즈나 워드 사이즈가 상대적으로 크다면 그만큼 Cache의 Hit Ratio율이 높아지기 때문.
- Cache Hit : CPU가 필요한 데이터가 Cache Memory 내에 들어와 있을 경우
- Cache Miss : 접근하고자 하는 데이터가 없을 경우
- Hit Ratio : 원하는 데이터가 Cache에 있을 확률
성능 결정 요소 | 내용 |
---|
Cache 크기 | Cache Memory의 Size의 크기가 크면 Hit Ratio율과 반비례 관계 |
인출 방식 (Fetch Algorithm) | - 요구 인출(Demand Fetch): 필요 시 요구하여 인출하는 방식선 - 인출(Pre-Fetch): 예상되는 데이터를 미리 인출하는 방식 |
쓰기 정책 (Write Policy) | Write-Through: 주기억 장치와 캐시에 동시에 쓰는 방식. Cache와 메모리의 내용이 항상 일치하며 구성 방법이 단순하다. Write-Back: 데이터 변경만 캐시에 기록하는 방식. 구성방법이 복잡하다. |
교체(Replace) 알고리즘 | Cache Miss 발생시 기존 메모리와 교체하는 방식. FIFO, LRU, LFU, Random, Optimal Belady’s MIN(향후 가장 참조 되지 않을 블록을 교체)등이 있다. |
사상(Mapping) 기법 | 주기억장치의 블록을 적재할 캐시 내의 위치를 지정하는 방법 직접 매핑(direct mapping), 어소시에이티브 매핑(associative mapping), 셋 어소시에이티브 매핑(set associative mapping) 등이 있다. |
Chapter2. 운영체제(OS)
기기의 하드웨어 상에 프로그램들이 동작되려면 하드웨어들과 적절하게 데이터를 주고 받으며 논리적인 일을 해야한다.
이 하드웨어에게 일을 시키는 주체가 바로 운영체제
하드웨어 - 소프트웨어의 중간다리
✨ 운영체제의 목적 및 기능
- 목적 : 처리능력 향상, 사용 가능도 향상, 신뢰도 향상, 반환 시간 단축 등
- 기능
- 프로세서, 기억장치, 입출력장치, 파일 및 정보 등의 자원을 관리
- 자원을 효율적으로 관리하기 위해 자원의 스케줄링 기능을 제공
- 스케줄링 : 어떤 자원을 누가, 언제, 어떤 방식으로 사용할지를 결정해주는 것
- 사용자와 시스템 간의 편리한 인터페이스를 제공
- 시스템의 각종 하드웨어와 네트워크를 관리하고 제어
✨ 운영 체제의 시스템 자원 관리
운영체제가 없다면 응용 프로그램이 실행될 수 없다.
- 응용 프로그램 : 컴퓨터를 이용해 다양한 작업을 하는 것이 목적
- 운영체제 : 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 도와주고, 시스템 자원을 관리하는 주체
- 프로세스 관리 CPU
- 메모리 관리
- I/O(입출력) 관리 (디스크, 네트워크 등)
응용 프로그램 관리
모든 응용 프로그램이 시스템의 자원을 마음대로 사용한다면, 해커에 의한 공격에 무방비한 상태가 된다.
따라서 응용 프로그램은 응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리하는 게 중요하다.
응용 프로그램: 운영체제를 통해 컴퓨터에게 일을 시키는 것
- 운영체제 : 컴퓨터를 조작할 수 있는 권한을 응용 프로그램에게 부여한다.
- 응용 프로그램 : 운영체제로부터 컴퓨터 조작 권한을 부여받고 운영체제가 제공하는 기능을 이용한다.
- 운영체제 / 응용 프로그램 소통 : 운영체제가 응용 프로그램에게 인터페이스(API)를 제공해야 한다.
- 시스템 콜(System call) : 응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것
ex) 응용 프로그램이 프린터 사용 권한을 획득한 후에는, 프린터를 사용할 때 필요한 API를 호출해야 하고, 이 API는 시스템 콜로 이루어져 있다.
📌 프로세스
프로그램이 실행 중인 상태로 특정 메모리 공간에 프로그램의 코드가 적재되고 CPU 가 해당 명령어를 하나씩 수행하고 있는 상태
사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행한ㄴ데 이때 실행되는 애플리케이션을 프로세스라고 한다.
ex) 크롬 브라우저 2개를 실행하면 2개의 프로세스가 생성됨
✨ 프로세스 구성 요소
1. 유저 메모리 영역 관리(Virtual Address Descriptors)
- 유저 메모리 공간 : 프로세스 별로 독립된 영역을 가지게 되는 곳
- 커널 메모리 공간 : 모든 프로세스가 공유하여 사용
- VAD(Virtual Address Descriptors) : 프로세스 별로 독립적인 유저 메모리 영역을 관리하는 관리 테이블
2. 핸들 테이블(Handle Table)
- 핸들 테이블 : 프로세스에서 사용하는 모든 핸들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간.
프로세스가 종료하게 될 때 이 테이블의 정보를 참고하여 이 프로세서에서 사용하고 있는 모든 커널 객체를 자동으로 반환
3. 독립적인 메모리 공간
- 프로세스 단위로 관리되는 자원 중 가장 중요한 구별점은 가상 메모리
- 페이징 기법을 이용하여 프로세스마다 별도의 고유한 메모리를 사용할 수 있게 한다(윈도우의 경우)
- 페이징 기법 : 메모리 공간을 할당 받으면 이걸 블록으로 나눠서 나눈 것들을 메모리에 저장하는 것. RAM을 효과적으로 관리할 수 있게 된다.
✨ 프로세스 특징
자원 소유의 단위
- 각각의 프로세스는 자신의 실행 이미지 로드와 실행에 필요한 추가적인 메모리 공간을 가져야함
- 이것은 각 프로세스마다 구별되어야 하며
- 해당 프로세스가 접근하고자 하는 파일, I/O 장치들 또한 프로세서 단위로 할당 받아 관리되어야 한다.
디스패칭의 단위
- 프로세스 : 하나의 프로그램이 운영체제로부터 CPU 의 자원을 일정 기간 동안 할당 받아 명령어를 실행하는 것
- 운영체제는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해서 CPU 의 사용 시간을 각각의 프로세스에 골고루 나누어 주어야한다.
- 하나의 프로세스에서 여러 개의 디스패칭 단위가 실행
- 이러한 디스패칭 단위를 스레드라고 한다.
✨ 프로세스 상태
- 실행(Run) : 프로세스가 프로세서를 차지하여 서비스를 받고 있는 상태
- 준비(Ready) : 실행될 수 있도록 준비되는 상태
- 대기(Waiting) : CPU 의 사용이 아니라 입출력의 사건을 기다리는 상태
✨ 프로세서 VS 프로세스
둘은 엄밀히 다른 개념.
프로세서(Processor)
프로세서는 하드웨어적인 측면과 소프트웨어적인 측면으로 나누어 볼 수 있다.
- 하드웨어적인 측면 : 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛. 중앙처리장치(CPU)를 의미하며 적어도 하나 이상의 ALU와 레지스터를 내장하고 있다.
- 소프트웨어적인 측면 : 데이터 포맷을 변환하는 역할을 수행하는 데이터 처리 시스템. 워드프로세서나 컴파일러 등이 여기에 속한다.
프로세스(Process) : 특정 목적을 수행하기 위해 나열된 작업의 목록.
- 메모리에 적재 되어 프로세서에 의해 실행 중인 프로그램
📌 스레드
스레드 : 명령어가 CPU를 통해서 수행되는 객체의 단위
- 하나의 프로세스 내에는 여러 개의 스레드가 존재할 수 있다. (반드시 1개 이상)
- 같은 프로세스에 있는 스레드는 같은 주소 공간에 존재하게 되며 자원과 상태를 공유한다.
- 하나의 스레드가 수정한 메모리는 같은 메모리를 참조하는 스레드게 영향을 미치게 된다.
✨ 스레드는 왜 필요한가?
수행 능력 향상
- 여러개의 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해서
- 하나의 프로세스 안에서 여러 개의 루틴을 동시에 수행할 때 스레드를 사용한다.
✨ 스레드의 구성요소
- 가상 CPU : 인터프리터, 컴파일러에 의해 내부적으로 처리되는 가상 코드
- 수행 코드 : Thread Class에 구현되어 있는
run()
Method 코드
- 처리 데이터 : Thread에서 처리하는 데이터
✨ 스레드의 특징
⭐️ 프로세스 내에서 실행되는 흐름의 단위
⭐️ 하나의 스레드는 시작해서 종료할 때까지 한번에 하나씩 명령들을 수행한다.
⭐️ 각 스레드마다 call stack이 존재하며, 나머지 Code, Data, Heap 영역은 스레드 끼리 공유한다.
- 반면, 프로세스는 다른 프로세스의 메모리에 직접 접근 불가능
- call stack: 실행 중인 서브루틴을 저장하는 자료 구조
⭐️ 스레드는 다른 스레드와 독립적으로 동작한다.
- 독립적으로 동작하기 때문에 두 개 이상의 스레드가 동작되는 경우, 두 개 이상의 스레드의 실행 및 종료순서는 예측할 수 없다.
✨ 싱글 스레드와 멀티 스레드
싱글 스레드(Single-Thread)
- 프로세스가 단일 스레드로 동작하는 방식
- 일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법
- 하나의 레지스터, 스택으로 표현
- 대표적인 싱글 스레드 언어 : 자바스크립트
- 장점
- 자원 접근에 대한 동기화를 신경쓰지 않아도 됨
- 문맥 교환(context switch) 작업 X
- 문맥 교환 : 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용이 필요
- 프로그래밍 난이도 쉬움, CPU 메모리 적게 사용
- 단점
- 여러 개의 CPU를 활용 불가
- 싱글 스레드는 하나의 물리적 코어만 사용하므로 멀티 코어 머신에서 CPU사용을 최적화할 수 없다.
- 최적화를 위해선 Cluster 모듈을 이용하여 여러 프로세스를 사용가능한데 프로세스끼리 자원 공유는 어렵기 때문에 Redis와 같은 부가 인프라가 필요하다.
- 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.
- 에러 처리를 못하면 멈춰버린다.
멀티 스레드 (Multi-Thread)
- 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것
- 멀티 프로세스(multi process) : 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것
- 장점
- 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답 가능
- 한 프로세스를 여러 프로세서에서 수행할 수 있으므로 효율적
- 문제점
- 주의 깊은 설계가 필요하며, 디버깅이 까다로움(동시성 문제 예방할 코드 설계)
- 프로세스 밖에서 스레드 각각을 제어할 수 없다
- 자원 공유의 문제가 발생
- 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받게 되는 구조
- 문맥 교환 작업을 요구한다.
- 데드락(Deadlock, 교착 상태) : 2개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리기 때문에 서로가 아무것도 완료하지 못하는 상태
- 뮤텍스(Mutex) : Key에 해당하는 어떤 오브젝트가 있으며 이 오브젝트를 소유한(스레드,프로세스)만이 공유자원에 접근가능
- 세마포어(Semaphore) : 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줌(즉, 동기화 대상이 하나 이상)
동시성과 병렬성의 차이
- 동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 개수로 제한된다.
- 시분할 : 운영체제(또는 가상 머신)는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 하는 것.
- Concurrency(동시성, 병행성): 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 착각을 불러일으킴
- Parallelism(병렬성): 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행됨
Chapter3. 문자열과 그래픽
📌 문자열
- 유니코드를 사용해야 텍스트를 정확하게 저장할 수 있다.
- 프로그래밍 언어마다 문자열을 저장하는 자료형이 다르다.
- 문자열 하나가 몇 바이트인가는 자료형이 차지하고 있는 바이트를 이해할 때 답변할 수 있다.
유니코드(Unicode)
- 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준
- ISO 10646 문자 집합, 문자 인코딩, 문자 정보 데이터베이스, 문자를 다루기 위한 알고리즘 등을 포함
- 유니코드 탄생 이전 : 지원하지 않는 다른 인코딩 형식으로 저장된 파일의 경우 제대로 불러올 수 없었다.
- 인코딩(부호화) : 어떤 문자나 기호를 컴퓨터가 이용할 수 있는 신호로 만드는 것.
- 인코딩과 문자를 해독하는 디코딩을 하기 위해선 미리 정해진 기준을 바탕으로 입력과 해독이 처리되어야 한다.
- 문자셋(charset): 인코딩과 디코딩의 기준, 문자셋의 국제 표준이 유니코드다.
- 유니코드 목적 : 현존하는 문자 인코딩 방법을 모두 유니코드로 교체하기
- 유니코드는 ASCII를 확장한 형태.
ASCII 문자
- 영문 알파벳을 사용하는 대표적인 문자 인코딩
- 7 비트로 모든 영어 알파벳을 표현할 수 있다.
- 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자를 포함
UTF-8과 UTF-16의 차이점
인코딩 방식의 차이
UTF-8 특징 1 : 가변 길이 인코딩
- 유니코드 한 문자를 나타내기 위해 1 byte(= 8 bits)에서 4 bytes까지 사용
- 원리
- 이처럼 UTF-8은 1 byte에서 4 bytes까지의 가변 길이를 가지는 인코딩 방식이다.
- 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩된다. 사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문에.
- UTF-8은 ASCII 코드의 경우 1 byte, 크게 영어 외 글자는 2byte, 3byte, 보조 글자는 4byte를 차지. 이모지는 보조 글자에 해당하기 때문에 4byte 차지
UTF-8 특징 2 : 바이트 순서가 고정됨
UTF-16에 비해 바이트 순서를 따지지 않고, 순서가 정해져 있다.
UTF-16 특징: 코드 그대로 바이트로 표현 가능, 바이트 순서가 다양함
-
UTF-16은 유니코드 코드 대부분(U+0000부터 U+FFFF; BMP) 을 16 bits로 표현한다.
- 대부분에 속하지 않는 기타 문자는 32bit(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 2 바이트로 표현한다.
-
U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101
.
- 이 이진법으로 표현된 문자를 16bits(2bytes)로 그대로 사용하며 바이트 순서(엔디언)에 따라 UTF-16종류도 달라진다.
-
UTF-8에서는 한글은 3 바이트, UTF-16에서는 2 바이트를 차지한다.
📌 그래픽
비트맵(Bitmap)과 벡터(Vector)는 디지털 이미지의 종류
- 디지털 이미지 : 디지털 카메라를 이용하여 현실세계의 사물을 촬영하거나 스캐너를 이용하여 사진이나 그림을 디지털 형태로 받아들인 것
✨ 비트맵(Bitmap)
웹 상에서 디지털 이미지를 저장하는 데에 가장 많이 쓰이는 이미지 파일 포맷 형식
래스터 그래픽(점 방식)이라고 한다.
이미지의 각 점들을 격자형의 픽셀 단위로 구성되며, 한 지역을 차지하는 셀은 위치에 따라 다른 값을 가진다.
- 장점 : 컴퓨터에게 부담을 덜 주는 구조
- 단점 : 확대를 하면 계단현상 발생, 경계가 모호, 이미지 사이즈 커질수록 용량 무거워짐
✨ 벡터(Vector)
비트맵이 격자형의 픽셀 단위로 이미지를 구성한다면 벡터는 이미지를 점과 점을 연결해 선을 표현하고 선과 선을 연결해 면을 표현하는 식의 수학적 원리로 그림.
주로 도형, 글자 등을 그리는 작업에 사용됨
- 장점 : 계단현상X, 수학적 연산으로 만들기 때문에 사이즈를 키워도 용량에 변화가 없음.
- 단점 : 컴퓨터에게 부담을 가하는 방식
| 비트맵(래스터) | 벡터 |
---|
기반 기술 | 픽셀 기반 | 수학적으로 계산된 Shape 기반 |
특징 | 사진과 같이 색상 조합이 다양한 이미지에 적합 | 로고, 일러스트와 같이 제품에 적용되는 이미지에 적합 |
확대 | 확대하면 계단현상 발생 | 품질 저하 없이 확대 가능 |
크기에 따른 파일 용량 | 큰 크기의 이미지는 큰 파일 사이즈를 가짐 | 큰 크기의 벡터 그래픽은 작은 파일 사이즈를 유지할 수 있음 |
상호 변환 | 이미지의 복잡도에 따라 벡터로 변환하는 것에 오랜 시간이 걸림 | 쉽게 래스터 이미지로 변환 가능 |
대표적인 파일 포맷 | jpg, gif, png, bmp, psd | svg, ai |
웹에서의 사용성 | jpg, gif, png 등이 널리 쓰임 | svg 포맷은 현대의 브라우저에서 대부분 지원 |
Chapter4. 가비지 컬렉션과 캐시
📌 가비지 컬렉션
프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것
가비지 컬렉션 기능을 가진 언어(혹은 엔진) : 자바, C#, 자바스크립트 등
<-> C, C++ 메모리 관리를 개발자가 해줘야 함.
가비지 컬렉션의 방법
1. 트레이싱 : mark and sweep 방법
- 한 객체에 in-use flag를 두고,
가비지 컬렉션 사이클마다 메모리 관리자가 모든 객체를 추적해서 사용 중인지 아닌지를 flag에 표시(mark)한 후,
표시되지 않은 객체를 삭제(sweep)하는 단계를 통해 메모리를 해제한다.
2. 레퍼런스 카운팅 : 한 객체를 참조하는 변수의 수를 추적하는 방법
- 예전엔 사용했으나 지금은 잘 안 씀.
- 변수의 레퍼런스가 복사될 때마다 : 레퍼런스 카운트++
- 객체를 참조하고 있던 변수의 값이 바뀌거나, 변수 스코프를 벗어나면 : 레퍼런스 카운트--
- 레퍼런스 카운트 === 0(아무도 그 객체에 대한 레퍼런스를 가지고 있지 않을 때) : 그 객체와 관련한 메모리는 비울 수 있다.
많은 시간이나 연산이 필요한 작업의 결과를 저장해두는 것
- 일시적인(temporarily) 데이터를 저장하기 위한 목적으로 존재하는 고속의 데이터 저장 공간
- 캐싱을 사용하면 이전에 검색&계산한 데이터를 효율적으로 재사용 가능
✨ 캐시의 일반적인 작동원리
- 캐시 데이터 저장은 어떻게?
- RAM(Random Access Memory)과 같이 빠르게 액세스할 수 있는 하드웨어에 저장됨
- 소프트웨어 구성 요소와 함께 사용될 수도 있다.
- 느린 작업의 요구를 줄이고, 데이터 검색 성능을 높인다.
- 캐시는 기본 스토리지 계층(SSD, HDD)에 액세스하여 데이터를 가져오는 더 느린 작업의 요구를 줄이고, 데이터 검색의 성능을 높인다.
- 데이터의 하위 집합을 일시적으로 저장
- 속도를 위해 용량을 절충하는 캐시는 데이터의 하위 집합을 일시적으로 저장한다.
- 완전하고 영구적인 데이터가 있는 데이터베이스와 대조적
✨ 캐시의 장점
- 애플리케이션 성능 개선
- 데이터베이스 비용 절감
- 백엔드 부하 감소
- 예측 가능한 성능
- 데이터베이스 핫스팟 제거
- 읽기 처리량 증가
- 읽기 처리량: IOPS; Input/output operations per second. HDD, SSD 등의 컴퓨터 저장 장치의 성능 측정 단위
✨ 캐시를 적용한 웹서비스 예
- 클라이언트: HTTP 캐시 헤더, 브라우저
- 네트워크: DNS 서버, HTTP 캐시 헤더, CDN, 리버스 프록시
- 서버 및 데이터베이스: 키-값 데이터 스토어(e.g. Redis), 로컬 캐시(인-메모리, 디스크)