본문 바로가기

Computer Science

(45)
<디자인 패턴> 싱글톤 패턴 1. 소개 싱글톤 패턴에 대해 patterns.dev는 다음과 같이 소개하고 있다. Singletons are classes which can be instantiated once, and can be accessed globally. This single instance can be shared throughout our application, which makes Singletons great for managing global state in an application. 간단히 말해 싱글톤은 단 한번만 인스턴스화되는 클래스이며, 전역상태를 관리하는 데 용이한 패턴이라는 것이다. 2. 싱글톤 * 개념 - 앱 전반에서 사용되는 숫자 카운터가 있을 때, 흔히 아래와 같이 작성할 수 있다. let coun..
<알고리즘> 퀵정렬은 병합정렬보다 항상 좋은 선택인가 1. 소개 최근에 필자는 하스켈이라는 언어를 공부하고 있다. 함수형 프로그래밍에 대한 깊은 이해를 위해서 겉핥기를 하고 있는데, 최근 정렬과 관련하여 궁금한 점이 생겨서 이렇게 정리하게 되었다. 참고로 이 포스팅에서 하스켈에 대해 깊이 알 필요는 없으며 함수형 언어라고만 생각해도 이해하는 데에는 지장이 없다. Data.List는 리스트 정렬을 위한 sort 함수를 제공한다. 이 함수는 퀵정렬을 쓰지 않는다. 대신 병합 정렬이라는 알고리즘의 효율적인 구현을 사용한다. - WikibooksHaskell - 지금까지 공부하기로는 대부분의 언어에서 정렬 함수는 퀵정렬(Quick Sort)을 활용하고 있다고 배웠다. 심지어 같은 시간복잡도를 가지는 병합정렬에 비해 일반적으로 더 빠르며, 면접 준비에서도 그렇게 대..
<네트워크> http 버전 별 특징 (3.0) 1. HTTP/3 - HTTP/3 은 UDP 기반의 프로토콜인 QUIC을 사용하여 통신하는 프로토콜이다. 아직 HTTP/2 도 점유율이 50%가 되지 않는데 놀랍다. 아직 표준은 아니지만 구글은 이미 실험적으로 사용하고 있다. - UDP를 모른다면 TCP와의 비교에 대해 먼저 알아보는 것을 추천한다. 어쨌든 UDP를 조금이라도 안다면 이런 생각이 들 것이다. TCP보다 당연히 빠르지만 신뢰성도 떨어지고 전송 순서도 보장되지 않는 프로토콜 아닌가? 이는 반은 맞고 반은 틀렸다. TCP는 신뢰성있는 통신을 위해 몇 가지 방법을 사용하였다. 이들 또한 클라이언트와 서버와의 통신이므로 레이턴시가 발생하고, 이는 TCP라는 프로토콜이 생길 때부터 정의된 표준이므로 무시할 수가 없다. 2. TCP의 문제점 - 위에..
<네트워크> http 버전 별 특징 (0.9 / 1.0 / 1.1 / 2.0) 1. http/0.9 - 초기 단계의 http 프로토콜은 버전 번호도 없었으며 매우 간단했다. 이후 버전과 구별하기 위해 0.9라고 불리게 되었다. - http/0.9 요청은 단일 라인으로 구성되며 리소스에 대한 경로로 가능한 메서드는 GET이 유일했다. GET /myapp.html - 응답 또한 매우 단순하게 파일 내용 자체로 구성되어 있었다. 헤더도 없이 html파일만 전송될 수 있으며 다른 유형의 문서는 전송될 수 없음을 의미했다. 상태코드도 없어서 문제가 있을 경우 파일 내부에 문제에 대한 설명과 함께 보내곤 했다. 2. http/1.0 - http/1.0은 이전에 비해 브라우저와 서버에서 확장성있게 진화되었다. 1.0이라는 버전정보가 전송되기 시작했고, 상태코드가 응답의 시작 부분에 붙어 전송되..
<알고리즘> 퀵 소트 & 힙 소트 1. 퀵 소트와 힙 소트 * 퀵 소트 - 퀵 소트(Quick Sort)는 병합 정렬(Merge Sort)와 마찬가지로 분할 정복 알고리즘을 활용한다. 그러나 병합 정렬과 달리 배열을 비균등하게 분할하여 정렬을 수행한다. - 퀵 소트는 불안정 정렬에 속한다. - 퀵 소트는 어떤 과정으로 정렬을 하는 것일까. 오름차순 정렬을 한다고 가정하자. 먼저 배열 내의 요소를 하나 선택한다. 이는 기준이 되는 원소로 피벗(pivot)이라 칭한다. 피벗을 기준으로 피벗보다 작은 원소는 피벗의 왼쪽으로 옮겨지고, 큰 원소는 피벗의 오른쪽으로 옮긴다. - 위의 과정을 한 번 거친 후, 피벗을 제외하고 왼쪽 배열과 오른쪽 배열에 대해 각각 같은방식으로 정렬한다. 부분 배열이 더 이상 분리가 불가능할 때까지 반복한다. 그러면 ..
<알고리즘> 삽입정렬과 병합정렬 1. 삽입정렬과 병합정렬 * 삽입 정렬(Insetion Sort) - 선택정렬과 버블정렬과 마찬가지로 제자리 정렬(in-place sorting) 알고리즘이다. - 삽입 정렬은 마치 카드게임에서 손 안의 패를 정렬하는 것과 같다. 카드를 새로 받으면 기존에 정렬시켜둔 카드 사이에 삽입시켜 정렬시킨다. 이에 따라 동일한 값에 대해 순서가 유지되는 안정정렬방식을 보장한다. - 삽입 정렬을 알아보기 위해 10 5 7 1 3 이라는 5개의 숫자를 오름차순으로 정렬시켜보자. - 삽입 정렬은 두 번째 값부터 정렬을 시작하며, 해당 값과 그 앞의 값들과만 비교한다. - 먼저 5와 10을 비교한다. 5가 더 작으므로 10을 뒤로 이동시키고 5를 그자리에 삽입한다. 5 > 10 7 1 3 5 10 7 1 3 - 다음은 ..
<네트워크> 페이지 렌더링 과정 1. 소개 - 지난 포스팅에서는 페이지 로딩 과정에 대해 알아보았다. 거기서 렌더링을 간단하게 짚어보았는데, 이번 포스팅에서는 그 부분에 대한 과정을 좀 더 자세히 알아보고자 한다. - 브라우저가 렌더링 하는 과정을 간단하게 미리 언급하자면, 먼저 html과 css를 처리하여 DOM트리와 CSSOM 트리를 빌드한다. 그리고 그 둘을 결합하여 렌더트리(렌더링트리)를 만들고, 각 레이아웃을 실행하여 형태를 계산한다. 마지막으로 그들을 그린다. 이제 이 과정을 세세하게 알아보자. 2. 과정 * DOM - 다운받은 html을 파싱하며 DOM트리를 만든다. - html을 파싱하는 것은 다음 일련의 과정을 거친다. ∙ Conversion : 바이트를 읽고 인코딩하여 문자열로 바꾸는 과정을 의미한다. ∙ Tokeni..
<네트워크> 페이지 로딩 과정 1. 소개 - 이번 장에서는 우리가 브라우저에서 특정 페이지로 이동할 때 어떤 과정을 거치는지 알아보자. - 흔히 우리는 브라우저가 URL을 해석하고 HTTP를 사용하여 웹페이지를 다운로드하여 사용자에게 보여준다고 알고있다. 이 장에서는 그 뒷면에서 어떤 과정들을 거치는지 알아볼 것이다. 2. 과정 - 여기서 설명하는 과정은 현재의 페이지(www.current.com) 에서 특정한 다음 페이지(www.next.com) 로 이동한다고 가정한다. - 이 때 웹 페이지를 로드하는 과정은 아래의 W3C Spec을 따른다. - 아래의 노란 부분은 JS로 건드릴 수 없고, 네트워크 Level에서 작업된다. * Prompt for unload - 현재 페이지에서 다른 페이지로 이동할 때 발생하는 이벤트이다. - js..
<운영체제> 멀티프로세스와 멀티스레드 1. 멀티프로세스 * 멀티프로세싱 - 하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하는 것을 의미한다. - 각 프로세스들은 독립적으로 동작하며 자원이 서로 다르게 할당된다. * 장점 - 여러 자식 프로세스 중 하나에 문제가 발생하면, 다른 프로세스에 영향없이 그 프로세스만 죽는다. 따라서 안정적으로 프로그램을 운용할 수 있다. - 구현이 비교적 간단하다. * 단점 - 메모리 사용량이 많다. - 프로세스 간 공유를 하려면 통신을 해야하므로 까다롭다. - 스케줄링에 따른 Context Switching이 잦아 성능저하의 우려가 있다. 스위칭은 캐시 메모리 초기화 등 무거운 작업이 진행되므로 많은 시간을 낭비한다. 2. 멀티스레드 * 멀티스레딩 - 최근에 가장 흔히 사용..
<운영체제> 프로세스 스케줄링 1. 스케줄링이란 * Context Switching - 멀티태스킹은 운영체제를 통해 CPU가 필요한 자원을 프로세스 또는 스레드에 나누는 행위를 의미한다. 우리가 여러 프로그램을 동시에 실행할 수 있는 이유가 멀티태스킹 덕분이다. - 지난 포스팅에서도 봤던 그림이다. 프로세스가 동시에 실행되는 것처럼 보이지만, 실제로 CPU는 한번에 한 가지 명령어 밖에 처리하지 못하기 때문에 동시는 아니다. - CPU는 동시가 아니라 아주 빠르게 프로세스들을 번갈아가며 실행하고 관리한다. 이렇게 번갈아 실행하는 행위를 Context Switching이라 한다. 빠른 스위칭 덕에 우리는 마치 동시에 프로세스가 돌아가는 것처럼 느끼게 된다. * CPU 스케줄러 - Context Switching을 할 때 CPU를 적절하..