[Computer Engineering] String, Graphics, OS, Garbage Collection, Cache

문자열

Unicode - 전 세계에서 모든 문자를 컴퓨터에서 일관되게 표현할 수 있도록 설계된 산업 표준
같은 글이라도 인코딩 방식이 다를 경우 그 파일을 지원하지 않으면 읽을 수 없다. 따라서 인코딩 방식을 통일하려는 것.

인코딩 - 어떤 문자나 기호를 컴퓨터가 이용할 수 있도록 신호를 만드는 것 (이진법으로 만드는 것)
문자를 인코딩/디코딩 하는 미리 정해진 기준 - 문자열 세트, 문자셋(charset). standard charset - unicode

ASCII - 7비트 문자열 표현 인코딩. (영문 알파벳, 숫자, 특수문자, 공백문자)

UTF-8, UTF-16

Universal Coded Character Set + Transformation Format 8 bit/16bit

UTF-8

// utf-8: UTF-8은 유니코드 한 문자를 나타내기 위해 1byte 에서 4byte 까지 사용한다.

// 1110xxxx 10xxxxxx 10xxxxxx 에 순서대로 채워 넣는다.
// 11101100 10111101 10010100

let encoder = new TextEncoder(); // default: utf-8

// 예) '코'

encoder.endoce('코') // Uint8Array(3) [236, 189, 148] (3byte)

(236).toString(2); // 11101100
(189).toString(2); // 10111101
(148).toString(2); // 10010100

// 예) ASCII 문자 'b'
encoder.encode('b'); // Uint8Array [98]
(98).toString(2); // 1100010 (1byte)

utf-8은 1 byte 에서 4 byte 까지의 가변 인코딩이다.

  • 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩되는데, 더 작은 크기로 문자열을 표현할 수 있기 때문이다.(예 = b 를 1 바이트로, '코'를 3바이트로)

ASCII 코드 - 1byte
영어 외 글자 - 2, 3byte (한글은 3)
보조 글자 - 4byte (이모지 등)

  • 바이트 순서는 고정됨

UTF-16

유니코드 코드 대부분(U+0000 ~ U+FFFF)을 16bit 로 표현
16진수를 있는 그래도 2진법으로 변환하여 사용, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라짐.
한글 - 2byte

그래픽

Bitmap(raster)

  • 픽셀 기반
  • 사진에 적합
  • 확대시 깨짐, 큰 이미지 필요할시 새로 생성 필요
  • 큰 크기의 그림 - 큰 용량
  • 이미지가 복잡해지면 vector 로 변환시 오래 걸림
  • jpg, gif, png, bmp psd
  • 웹에서는 jpg gif png 많이 씀

Vector

  • 수학적으로 계산된 Shape 기반
  • 로고, 일러스트에 적합
  • 해상도에 상관없이 확대 가능
  • 용량이 그림 크기에 영향받지 않음.
  • raster 로 쉽게 변환
  • svg, ai
  • 웹에서는 svg 를 대부분의 브라우저가 지원

운영체제

프로그램 -> 운영체제 -> 하드웨어

Program

컴퓨터가 나오기 전 원래 프로그램의 뜻은 음악회를 말함. 여러 음악들의 집합 = 음악회
컴퓨터에서: 여러 instruction 들의 집합 -> 프로그램

운영체제는 하드웨어에게 일을 시킬 수 있도록 도와줌.
프로세스 관리(CPU), 메모리(RAM)관리, 입출력 관리(disk, network, etc), 권한 관리(컴퓨터의 파일에 마음대로 접근할 수 없도록) 등

프로그램이 시스템 자원을 사용할 수 있도록 운영체제에서 제공하는 함수(API)를 system call 이라고 한다.

Process

Program in execution
운영체제에서 실행 중인 하나의 프로그램

사용자가 앱을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당 받아 코드를 실행. 하나의 앱이 여러개의 프로세스를 가질 수도 있다. (예 - 인터넷 윈도우를 두개 띄우면 두개의 프로세스를 생성)

CPU 하나는 한 시점에 하나의 process 밖에 실행 못함.
Single core 는 multi-process 를 할 수 는 있지만 multi-processing 은 불가
Multi-core 일 경우 multi-processing 이 가능

Thread, Multi-thread

Thread

하나의 코드 실행 흐름

각 스레드마다 call stack 이 존재하고 각 스레드는 독립적으로 작동

Multi-Thread

두가지 이상의 작업을 동시에 처리

운영체제는 멀티태스킹을 할 수 있도록 cpu 및 메모리 자원을 프로세스마다 적절히 할당해주고 병렬로 실행시킴.

프로세스 내부의 멀티태스킹 - 멀티스레드
운영체제 내부의 멀티태스킹 - 멀티프로세스

장점

메모리 공간과 시스템 자원 소모가 줄어듬
스레드 간의 통신은 heap 메모리를 사용 - 프로세스간 통신 방법(IPC)에 비해 간단
시스템의 throughtput 향상, 프로그램 응답시간 단축
여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 스레드로 나누어 수행

단점

멀티 프로세스 - 공유하는 자원 x
멀티 스레딩 - heap 을 공유하기 때문에 동기화 작업이 필요(작업 처리 순서 제어, 자원 접근 제어)
관련 키워드 - 데드락, 뮤텍스, 세마포어

사용사례

  • 대용량 데이터 분할처리
  • 네트워크 통신
  • 서버가 다수의 클라이언트 요청을 분할처리

Concurrent, Parallel

동시에 돌릴 수 있는 스레드의 수는 컴퓨터의 있는 코어 갯수로 제한되므로, OS 는 각 스레드에 시간을 나눠주면서 여러 스레드를 돌아가면서 실행시켜야 한다.(시분할)

병행성

  • 여러개의 스레드가 시분할 방식으로 동시에 수행되는 것처러 착각을 불러일으킴
  • Context switching 으로 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 한 태스크를 멈추는 것

병렬성 - 멀티코어 환경에서 여러개의 스레드가 실제로 동시에 수행 되는것.

가비지컬렉션

프로그램에서 더 이상 쓰지 않는 메모리를 자동으로 찾아 해제하는 기능
Java, C#, Javascript 등

대표적인 가비지 컬렉션의 방법

  • Reference counting - 객체마다 레퍼런스 카운트라는 멤버변수를 둬서 카운트가 0이되면 해제하는 방식 (순회 참조하는 객체는 해제가 안된다는 한계가 존재)
  • Mark-and-sweep algorithm (트레이싱) - 객체마다 flag 를 두고, 가비지 컬렉션 사이클마다 객체 참조 트리를 순회하며 참조되지 않는 객체를 표시하고 해제하는 방식. 대부분의 브라우저가 이 방식을 사용

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

캐시

고속의 데이터 임시 저장소.

더 느린 기본 스토리지 계층에 액세스해야 하는 필요를 줄임으로써 연산속도를 빠르게 만든다.

캐시 데이터는 일반적으로 RAM 과 같이 빠르게 액세스할 수 있는 하드웨어에 저장되며 소프트웨어 구성 요소와 함께 사용될 수도 있다.

장점

  • 성능개선, db 비용 절감, 백엔드 부하 감소, 예측 가능한 성능, db hotspot(조회 요청이 많은 곳) 제거, 읽기 처리량(IOPS: Input/Output operations per second, 아이옵스) 증가

웹서비스에서 캐시가 적용되는 예제

  • 클라: HTTP 캐시 헤더, 브라우저
  • 네트워크: DNS 서버, HTTP 캐시 헤더, CDN, 리버스 프록시
  • 서버/DB: 키-값 데이터 스토어(redis 등), 로컬 캐시(in-memory, disk)

https://aws.amazon.com/ko/caching/


운영체제 참고자료

https://codex.cs.yale.edu/avi/os-book/OS10/regular-exercises/index-exer.html
https://parksb.github.io/article/5.html

좋은 웹페이지 즐겨찾기