본문 바로가기

컴퓨터 과학(CS)29

해시 알고리즘(hash algorithm) 해시 함수, 해시 알고리즘 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 여러가지 해시 알고리즘이 있는데 대표적으로 SHA 시리즈와 MD5가 있다. 해시 함수에 의해 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬 또는 해시라고 한다. 해시의 용도 중 하나는 해시 테이블이라는 자료구조에 사용되며, 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에 널리 사용된다. 해시 테이블 해시함수를 사용하여 키를 해시 값으로 변환하고, 이 해시 값을 색인(index)으로 삼아 키와 데이터(value)를 저장하는 자료구조를 말한다. 기본연산으로는 탐색(Search), 삽입(Insert), 삭제(Delete)가 있다. 해시 충돌(Hash Collision) 해시 충돌이란 해시 함수가 서로 다른 두 개.. 2022. 3. 2.
캐시와 조건부 요청 참고 및 정리: 위키피디아, 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 님) 인프런 강의 캐시 위키피디아 캐시(cache)는 컴퓨터 과학에서 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 같은 데이터에 반복적으로 엑세스하는 경우나 잘 변하지 않는 데이터의 경우 캐시를 사용하면 더 빠른 속도로 데이터에 접근할 수 있다. 그래서 데이터의 재사용 횟수가 한 번 이상이어야 캐시는 의미가 있다. 여러가지 캐시의 종류 CPU 캐시 디스크 캐시 웹 캐시: 브라우저 캐시, 프록시 캐시 이번 포스팅에서는 웹 캐시를 정리하고자 한다. 캐시의 기본 정의에 따라 웹 캐시는 웹 페이지의 요소를 저장하기 위한 임시 저장소이다. HTTP 요청으로 가져올 수 있는 모든 종류의 리소스(HTML, CSS, JS, 이미지.. 2022. 2. 14.
쿠키(cookie), 세션(session) 쿠키 등장 배경 HTTP 프로토콜에는 비연결성(Connectionless)과 무상태성(Stateless)라는 특징 때문에 사용자의 요청에 대한 응답이 끝나면 연결 상태를 해제하고, 상태 정보를 저장하지 않기 때문에 서버의 자원을 크게 절약할 수 있었다. 그러나 이로 인해 사용자를 식별할 수 없어서 같은 사용자가 요청을 여러번 하더라도 매번 새로운 사용자로 인식하는 단점이 있다. 예를 들어 장바구니에 물품을 담은 경우 새로고침 시 장바구니가 초기화 되어 사용자가 불편을 겪게 된다. 마찬가지로 페이지를 이동할 때마다 로그인을 계속 해야 하는 불편함이 생기게 된다. 이 문제를 해결하기 위한 두 가지 방법이 있다. 1) 사용자 정보를 담은 임시 파일을 클라이언트에 저장하여, 서버는 이 파일로 클라이언트를 식별:.. 2022. 2. 12.
Block/Non-block, 동기/비동기 많은 종류의 소프트웨어에서 동기 처리 방식이 Blocking이고, 비동기 처리 방식이 Non-Blocking이여서 동기와 Blocking, 비동기와 Non-block를 비슷한 개념으로 오해할 수 있다. 단지 일련의 작업들에 대해 순차적으로 하나씩 처리하고 완료하는 방식은 매 작업의 수행마다 Blocking하는 게 작업의 순서를 보장하기 쉬우며, 작업의 완료 상태를 신경쓰지 않고 여러 작업들을 번갈아 처리하는 구조에서는 한 작업을 수행하면서 Non-Blocking으로 다른 작업을 받아와서 처리하는 구조가 효율적이기 때문에 동기와 Block, 비동기와 Non-block이 자주 쓰이는 것이다. 그렇기 때문에 같은 개념으로 혼동하기 쉽지만, 이 두 가지 개념은 서로 다른 곳에 초점을 맞춘 개념이다. Block/.. 2022. 2. 10.
apache, nginx 차이 웹 서버는 HTTP를 통해 '웹 클라이언트'가 '요청한 데이터'를 제공(serve)해주는 즉, 요청에 응답하는 프로그램이다. 개발자는 서버에 Apache나 Nginx 같은 웹 서버 프로그램을 이용하여 사용자의 HTTP 요청에 응답하게 된다. 위키피디아 웹 서버(web server)는 다음의 두 가지 뜻 가운데 하나이다. 웹 서버: 웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램 (ex. Apache, NGINX) 웹 서버(하드웨어): 위에 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터 (ex. EC2, 내 컴퓨터) Apache 아파치 HTTP 서버(Apache HTTP Server)는 아파치 소프트웨어 재단에서 관리하는.. 2022. 1. 30.
직렬화, XML, JSON, YAML 직렬화(Serialization) 직렬화는 컴퓨터의 데이터 객체를 저장 매체에 저장할 수 있는 형식, 또는 네트워크를 통해 전송할 수 있는 것으로 변환하는 것을 뜻한다. 저장장치에 저장되는 데이터 또는 네트워크를 타고 다니는 데이터는 결국은 0과 1로 이루어진 디지털 데이터의 연속이다. 따라서 프로그래밍 언어에서 사용하는 변수, 구조체, 객체와 같은 데이터들을 저장장치에 저장하거나 네트워크로 전송할 때에는 여기에 적합한 형식으로 만들어 줘야 한다. 직렬화의 방식은 크게 두 가지가 있다. 1) 컴퓨터가 쉽게 이해할 수 있는 0과 1의 디지털 형식으로 된 이진(binary) 방식 2) 사람이 쉽게 읽을 수 읽는 형태로 직렬화하는 텍스트 방식 XML, JSON, YAML 같은 형식은 텍스트 형식 직렬화이고, .. 2022. 1. 26.
스택(stack), 큐(queue) 스택(stack) 스택은 제약을 갖는 배열로, 한쪽 끝에서만 자료를 넣거나 뺄 수 있는 LIFO 자료 구조이다. 자료를 넣는 것을 '밀어넣는다' 하여 푸쉬(push)라고 하고 반대로 넣어둔 자료를 꺼내는 것을 팝(pop)이라고 하는데, 이때 꺼내지는 자료는 가장 나중에(최근에) 푸쉬한 자료부터 나오게 된다. 나중에 넣은 값이 먼저 나오는 Last In, Frist Out(LIFO) 구조로 이루어져 있다. 제약을 갖는 자료 구조인 스택이 중요한 이유 1) 잠재적 버그를 막을 수 있다. 스택 위 항목을 제외하고는 삭제할 수 없으므로 배열 중간의 데이터를 삭제하는 코드를 작성하면 오류가 발생한다. 2) 문제를 해결하는 새로운 사고 모델을 제공한다. 스택은 마지막에 들어온 데이터부터 먼저 처리하는 후입 선출 방.. 2022. 1. 20.
소프트 링크, 하드 링크 링크(Link) 링크는 컴퓨터 상에서 어떤 대상으로의 연결이나 그와 연관한 복사본을 가리킨다. 우리가 윈도우에서 보는 모든 파일도 실제 파일에 대한 파일 시스템의 링크이다. 파일 시스템은 하드디스크 안의 실제 데이터에 쉽게 접근할 수 있도록 파일을 조직하고 관리하는 체제이다. 우리는 디스크에 기록된 실제 데이터를 직접 보는 게 아니라 파일 시스템에 기록된 파일의 정보(Inode)를 보고 있는 것이다. 파일 시스템 정보에는 파일에 대한 여러 정보와 함께 실제 파일이 저장된 디스크에 찾아갈 수 있는 링크 또한 저장되어 있다. 심볼릭 링크와 하드 링크를 이해하기 위해서는 Inode 개념을 먼저 이해해야 한다. 아이노드(Inode) 위키피디아 Inode는 유닉스 계통의 파일 시스템에서 사용하는 자료 구조다. I.. 2022. 1. 18.
표준 스트림(Standard Stream), 파이프(pipe) 표준 스트림 위키피디아 유닉스 및 유닉스 계열 운영 체제에서 프로그램(프로세스)과 주변 장치 사이에 미리 연결된 입출력 통로이다. 보통 입출력은 물리적으로 연결된 시스템 콘솔의 키보드와 모니터를 통해 일어나는데, 표준 스트림은 이것을 추상화한 것이다. 🔎 키보드와 모니터 같은 장치들의 입출력을 추상화한다는 것은 대체 무슨 뜻일까? 예전에는 입출력 장치를 다룰 때 각각의 장치들마다 전용 함수가 존재했다. 전용함수가 존재한다는 것은 어떤 입출력 장치를 사용할 때 어떤 데이터 형식을 사용할 것인지가 이미 정해져 있다는 뜻이다. 예를 들어, 키보드로 키를 입력받는 경우 getch와 같은 콘솔함수를 사용했고 이 함수는 4바이트 정수형 데이터 값을 반환하게 된다. 그래서 다양한 입출력 장치를 사용하기 위해서는 각 .. 2022. 1. 17.
도커를 위한 리눅스 쉘(bash) 이해 Docker는 기본적으로 리눅스 커널이 제공하는 기능 위에서 동작한다. 커널은 시스템 자원들을 관리하는 운영체제의 핵심이라고 했다. 쉘이라는 인터페이스를 통해 사용자의 명령어를 커널에 전달하여 시스템 자원들을 관리할 수 있다. 즉, 리눅스 커널을 조작하기 위해 리눅스 쉘 사용법을 알아야 한다. 리눅스 쉘에는 Bourne shell(sh), Bourne-again shell(bash), C shell, Korn shell(ksh) 등이 있는데, 현재 linux의 기본 shell 이자 가장 범용적으로 사용되는 것은 Bourne-again shell(bash)이다. 리눅스 bash는 사용자가 명령 줄을 입력하는 방식(CLI)의 장치이므로, 리눅스 명령어를 익힌다는 것은 결국 bash가 제공하는 명령어를 배우는.. 2022. 1. 17.
현대의 운영체제: 인터럽트 기반 시스템, 컴퓨터 버스 컴퓨터의 전원을 켜면 먼저, POST 과정이 시작되고 그 후에 부트 로더가 하드 디스크에 있는 운영체제 프로그램을 RAM으로 가져와 할당한다. 할당된 운영체제의 커널은 컴퓨터의 전원이 꺼질 때까지 메모리에 상주한다. 이제 부팅이 다 끝나고 우리는 운영체제(윈도우) 화면을 보게 되었다. 사용자가 운영체제에서 마우스를 움직인다고 가정하자. 이 동작을 컴퓨터는 어떻게 알고 실행할 수 있을까? 바로 인터럽트를 통해 알 수 있다. 이벤트와 인터럽트 사용자가 키보드를 입력하고 마우스를 클릭하는 등의 동작이나 사건을 이벤트라고 한다. 이벤트가 발생하면 CPU에게 이벤트 발생을 알리는데, 이벤트 발생을 알리는 것을 인터럽트(Interrupt)라고 부른다. 인터럽트는 '방해하다’라는 뜻인데, 컴퓨터 용어에서는 신호를 보.. 2022. 1. 16.
운영체제의 개념과 역할, 구조 참고 Operating System Concepts 10th Edition https://en.wikipedia.org/wiki/Terminal_(macOS) 운영체제 강의(KOCW 양희재 교수님) 컴퓨터 시스템은 크게 CPU, 메모리, 하드 디스크로 구성되어 있다고 볼 수 있다. 이 각각의 하드웨어를 연결했다고 해서 우리가 원하는 프로그램을 수행할 수 있는 것은 아니다. 이 컴퓨터라는 하드웨어에서 사용자가 프로그램들을 사용하려면 하드웨어와의 원활한 소통 수단(인터페이스)이 필요했다. 이를 위해 등장한 것이 운영체제다. 운영체제 의미와 커널 운영체제는 컴퓨터의 하드웨어를 관리하고, 하드웨어/사용자/소프트웨어를 매개하는 시스템 소프트웨어이다. 커널(Kernel)은 사전적인 의미인 '단단한 껍질 안의 씨앗'.. 2022. 1. 14.