해당글은 오늘 공부한 내용을 정리하여 메모하는 형식으로 작성한 것으로
설명이나 이해를 돕는 글이 아님을 명시합니다.
인코딩(부호화)이란?
ASCII 문자
UTF-8
[ 예시 ]
'코'를 표현
1100-1111-0101-0100
1110xxxx 10xxxxxx 10xxxxxx
// x 안에 순서대로 값을 채워넣습니다.
11101100 10111101 10010100
// utf-8 값을 알아내는 방법
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8'
encoder.encode('코') // Uint8Array(3) [236, 189, 148]
(236).toString(2) // "11101100"
(189).toString(2) // "10111101"
(148).toString(2) // "10010100"
'b'문자를 UTF-8로
0xxxxxxx
01100010
// utf-8 값을 알아내는 방법
encoder.encode('b') // Uint8Array [98]
(98).toString(2) // "1100010"
ASCII 코드는 7비트로 표현되고, UTF-8 에서는 1 byte의 결과로 만들 수 있다.
[ 특징 ]
UTF-16
유니코드 코드 대부분(U+0000부터 U+FFFF; BMP) 을 16 bits로 표현한다.
대부분에 속하지 않는 기타문자는 32 bit(4 bytes)로 표현하므로 UTF-16도 가변 길이라고 할 수 있으나, 대부분은 2 바이트로 표현한다.
U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101
이고 이 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라진다.
UTF-8에서는 한글은 3 바이트, UTF-16에서는 2 바이트를 차지한다.
Reference
유니코드, UTF-8, UTF-16, UTF-32 간단 정리
비트맵(래스터) | 벡터 | |
---|---|---|
기반기술 | 픽셀기반 | 수학적으로 계산된 Shape기반 |
특징 | 사진과 같이 색상의 조합이 다양한 이미지에 적합 | 로고, 일러스트와 같이 제품에 적용되는 이미지에 적합 |
확대 | 확대에 적합하지 않음, 보다 큰 사이즈의 이미지가 필요할 때, 사용하려는 크기 이상으로 생성하거나 스캔해야한다. | 품질 저하없이 모든 크기로 확대 가능하며, 해상도의 영향을 받지 않음 |
크기(dimension)에 따른 파일 용량(file size) | 큰 크기의 이미지는, 큰 파일 사이즈를 가짐 | 큰 크기의 벡터 그래픽은 작은 파일 사이즈를 유지할 수 있음 |
상호 변환 | 이미지 복잡도에 따라 벡터로 변환하는 것에 오랜시간이 걸림 | 쉽게 비트맵 이미지로 변환 가능 |
대표적인 파일 포맷 | jpg, gif, png, bmp, psd ... | svg, ai .. |
웹에서의 사용성 | jpg, gif, png 등이 널리 쓰임 | svg 포맷은 현대의 브라우저에서 대부분 지원 |
컴퓨터나 스마트폰의 기기 그 자체(하드웨어)는 스스로 할 수 있는 일이 없다. 하드웨어의 설계를 바탕으로 하드웨어에게 일을 시켜야만 그 의미가 있는데 하드웨어에게 일을 시키는 주체가 바로 운영체제이다.
시스템 자원관리
응용 프로그램은 컴퓨터를 이용해 다양한 작업을 하는 것이 목적이고, 운영체제는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 도와준다.
하드웨어를 구성하는 일을 하는 CPU, 자료를 저장하는 RAM, 디스크 등의 시스템 자원을 관리하는 주체가 바로 운영체제이다.
응용 프로그램 관리
응용 프로그램이 운영체제를 통해 컴퓨터에게 일을 시키려면, 컴퓨터를 조작할 수 있는 권한을 운영체제로부터 부여받아야 한다. 권한을 부여받고 난 후에는, 운영체제가 제공하는 기능을 이용할 수 있다.
응용 프로그램이 운영체제와 소통하기 위해서는, 운영체제가 응용 프로그램을 위해 인터페이스(API)를 제공해야 한다. 응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것을 시스템 콜(System call)이라고 부른다.
[ 예시 ]
더 알아보기
공룡책이라 불리는 Operating System Concepts 책,
이를 정리한 한글 문서도 있다.
사용자가 애플리케이션을 실행하면, 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션의 코드를 실행한다. 이때 실행되는 애플리케이션을 프로세스라고 부른다.
[ 예시 ]
Chrome 브라우저를 두 개 실행하면, 두 개의 프로세스가 생성된다.
이렇게 하나의 애플리케이션은 여러 프로세스(다중 프로세스)를 만들기도 한다.
멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미한다. 운영체제는 멀티 태스킹을 할 수 있도록, 프로세스마다 CPU 및 메모리 자원을 적절히 할당하고 병렬로 실행한다.
예를들어 워드로 문서작업을 하면서, 동시에 Chrome 브라우저에서 음악을 들을 수 있다.
멀티 태스킹은 꼭 멀티 프로세스를 의미하는 것은 아니다. 하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 애플리케이션도 있다. 하나의 프로세스가 어떻게 두 가지 이상의 작업을 처리하기 위해서 멀티 스레드가 필요하다.
멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이라면, 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라고 할 수 있다.
멀티 스레드는 다양한 곳에서 사용된다.
장점
프로세스를 이용하여 동시에 처리하던 일을 스레드로 구현할 경우, 메모리 공간과 시스템 자원의 소모가 줄어든다.
스레드 간의 통신이 필요한 경우에도 별도의 자원을 이용하는 것이 아니라, 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용한다. 따라서, 프로세스 간 통신 방법(IPC)에 비해 스레드 간의 통신 방법이 훨씬 간단하다. 시스템의 처리량(Throughput)이 향상되고 자원 소모가 줄어들어 자연스럽게 프로그램의 응답 시간이 단축된다. 이런 장점 때문에 여러 프로세스로 할 수 있는 작업을 하나의 프로세스에서 스레드로 나눠 수행한다.
단점
멀티 프로세스 기반으로 프로그래밍할 때에는 프로세스 간 공유하는 자원이 없어서 동일한 자원에 동시에 접근하는 일이 없다.
하지만 멀티 스레딩을 기반으로 프로그래밍할 때에는 공유하는 자원에 대하여 생각해야한다.
서로 다른 스레드가 같은 데이터에 접근하고, 힙 영역을 공유하기 때문에 서로 다른 스레드가 서로 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정하는 일이 발생할 수 있다.
그렇기 때문에 멀티스레딩 환경에서는 동기화 작업이 필요하다. 동기화를 통해 작업 처리 순서를 제어하고, 공유 자원에 대한 접근을 제어해야 한다.
키워드
데드락(Deadlock, 교착 상태)
뮤텍스(Mutex)와 세마포어(Semaphore) : 모두 동기화를 이용되는 도구
뮤텍스(Mutex) :
Locking 메커니즘으로 오직 하나의 쓰레드만이 동일한 시점에 뮤텍스를 얻어 임계 영역(Critical Section)에 들어올 수 있다.
오직 이 쓰레드만이 임계 영역에서 나갈 때 뮤텍스를 해제할 수 있다. 이유는 뮤텍스가 1개의 락만을 갖는 Locking 메커니즘이기 때문이다.
세마포어(Semaphore) :
락을 걸지 않은 쓰레드도 Signal을 보내 락을 해제할 수 있다
[ Reference ]
동시에 돌릴 수 있는 스레드 수는 컴퓨터에 있는 코어 갯수로 제한된다.
운영체제(또는 가상 머신)는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행되도록 하는데 이런 방식을 시분할이라고 한다.
트레이싱
레퍼런스 카운팅
더 공부하기
Reference
캐싱 개요