전산 기본 지식

https://slipp.net/questions/367

Blocking과 Non-blocking

두 개의 차이점은 파일 디스크립터 관련 함수에서 기다리냐 마느냐이다. Non-blocking에서 read는 읽을 데이터가 없을 시 에러(-1)을 return을 하게 되어 errno.h의 errno을 확인하여 EWOULDBLOCK(또는 EAGAIN) 일 경우 적절한 처리를 해주어야 하기 때문에 프로그래밍이 조금 더 복잡해 질 수도 있다.

참고로 non-blocking 소켓으로 connect를 할 때에도 connect 함수가 에러를 return (-1) 할 수가 있다. 하지만 이것도 errno를 확인해보면 EINPROGRESS가 발생하는데 이 말은 즉, 연결요청이 진행 중이다 라는 에러이다. 즉, '연결 완전 실패가 아닌 진행 중이지만 일단 에러로 return 하니 프로그래머가 알아서 처리를 하라' 라는 뜻이다.

이렇듯 non-blocking 소켓 프로그래밍을 할 경우 에러처리를 톡톡히 해주어야 하는 단점이 있습니다. 하지만 에러처리를 잘하면 어떠한 빈틈도 없는 멋진 프로그램이 될 수도 있다.

동기(Syncronous)와 비동기(Asyncronous)

동기는 사실상 블로킹과 차이점이 없다. 애플리케이션이 커널에 작업을 요청하고, 커널에서 작업이 끝날 때까지 어플리케이션이 기다려 주는 것이다. 즉, 동기화하기 위해서 봉쇄(Blocking)을 하는 것이다.

비동기는 Read 함수를 호출하면 바로 리턴이 되는 방식이다. 비동기 함수를 호출할 때는 작업이 완료 될 때 알려줄 수 있는 이벤트나 콜백 함수를 설정하게 된다. 즉, 애플리케이션이 커널에서 읽을게 있으면 이벤트를 주던지, 콜백 함수를 호출하면 된다.

즉, 비동기 프로그래밍은 Non-Blocking 처럼 지속적인 관찰이 필요한 프로그래밍이 아니라, 일단 작업을 걸어 두고 다른 작업을 진행하다가 어떠한 신호나 작업이 들어올 경우 걸어둔 작업을 진행한다.

인덱싱

데이터를 찾을 때(SELECT) 빨리 찾기 위해서 사용한다. 인덱스가 없다면 특정한 값을 찾기 위해 모든 데이터 페이지를 다 뒤져야 한다. 이것을 Table Scan이라고 한다.

인덱스가 찾고자 하는 칼럼이나 표현 식에 대해 존재하고, 인덱스를 사용하는 것이 더 효과적이라면 SQL 서버는 모든 페이지를 뒤지지 않고 데이터를 가져올 수 있다. 이것을 Index Seek라고 한다.

시스템의 부하를 줄여 전체 시스템의 성능을 향상시킬 수 있다.

하지만 인덱스를 만드는데 시간이 걸리고, 많은 공간이 필요하다.

데이터를 수정(INSERT, UPDATE, DELETE) 하는 시간, 특히 INSERT 작업은 오히려 더 많이 걸린다.

WHERE, SELECT, JOIN 자주 되는 곳에 인덱스를 걸기.

객체 지향 개발 원칙

SRP (단일책임의 원칙: Single Responsibility Principle) :
작성된 클래스는 하나의 기능만 가지며 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는 데 집중되어 있어야 한다.

OCP (개방폐쇄의 원칙: Open Close Principle) :
소프트웨어의 구성 요소(컴포넌트, 클래스, 모듈, 함수)는 확장에는 열려있고, 변경에는 닫혀있어야 한다. 이것은 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화 해야 한다는 의미로, 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 수정이 일어나지 말아야 하며, 기존 구성요소를 쉽게 확장해서 재사용할 수 있어야 한다.

LSP (리스코브 치환의 원칙: The Leskov Substitution Principle) :
서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다. 즉, 서브 타입은 언제나 기반 타입과 호환될 수 있어야 한다. 서브 타입은 기반 타입이 약속한 규약을 지켜야 한다.

ISP (인터페이스 분리의 원칙: Interface Segregation Principle) :
한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다는 원리이다. 즉, 어떤 클래스가 다른 클래스에 종속될 때에는 가능한 최소한의 인터페이스만을 사용해야 한다.

DIP (의존성역전의 원칙: Dependency Inversion Principle) :
구조적 디자인에서 발생하던 하위 레벨 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역정이다. 실제 사용 관계는 바뀌지 않으며, 추상을 매개로 메시지를 주고 받음으로써 관계를 최대한 느슨하게 만드는 원칙이다.

비트연산

1.AND( & ) : 둘 다 ‘참’일 때, return 1 2.OR( | ) : 둘 중 하나라도 ‘참’일 때, return 1 3.XOR( ^ ) : 두 값이 서로 다를 때, return 1 4.NOT( ~ ) 5.a << b : a의 비트들을 b칸씩 왼쪽으로 이동. a * 2^b 6.a >> b : a의 비트들을 b칸씩 왼쪽으로 이동. a / 2^b

저장 공간

CPU 캐시

캐시는 CPU와 메모리 사이에 위치하면서, 느린 메모리 속도를 보완해준다.

캐시의 데이터 단위인 캐시라인은 32Byte, 64Byte, 128Byte 등으로 나누어진다. 캐시 라인은 캐시 일관성(Cache coherence)에 매우 중요한 역할을 한다. 한 바이트를 읽어도 캐시라인 단위로 메모리로부터 읽어오며, 데이터를 메모리에 쓸 때 역시 캐시라인 단위로 써진다.

캐시 메모리는 데이터 지역성(Locality) 원리를 사용한다. 시간 지역성은 한 번 참조된 데이터는 잠시 후에 또 참조될 가능성이 높다는 것이고, 공간 지역성이란 참조된 데이터 근처에 있는 데이터가 잠시 후에 사용될 가능성이 높다는 것이다.

CPU가 데이터를 요청했을 때 캐시 메모리가 해당 데이터를 가지고 있다면 이를 Cache hit 라 부르고, 해당 데이터가 없어서 DRAM에서 가져와야 한다면 Cache miss 라 부른다. 이 때 해당 데이터를 캐시에 업데이트하기도 한다.

Direct Mapped Cache, Set Associative Cache, Fully Associative Cache

results matching ""

    No results matching ""