[TIL] 2021.09.12 - 기술 면접 자료 정리
오늘은?
기술 면접 공부
Compile과 Interpret
Compile과 Interpret은 소스 코드를 변환하고 실행시키는 방식을 말한다.
Compile: 소스 코드가 runtime 되기 전에 기계어로 한 번에 변환 및 해석되는 방식이다. 그렇기 때문에 소스 코드에 문제가 있다면 실행되지 않고 오류를 알린다. 기존 코드는 원시 코드, 변환된 코드를 object code라 한다. 대표적인 compile 언어는 C/C++, JAVA가 있다.
Interpret: 소스 코드가 먼저 runtime 된 후에 코드 한 줄씩 변환 및 해석되는 방식이다. 그렇기 때문에 소스 코드에 문제가 있더라도 그 코드 전까지는 실행된 후, 오류를 알린다. 가상 머신 위에서 컴파일되기에 소스 코드의 이동이 자유롭다. 대표적인 interpret 언어는 python이다.
RDBMS (관계형 데이터베이스)와 NoSQL
1.RDBMS
엄격하게 정해진 스키마 (Fields, Records의 제약 조건에 대한 명세)에 따라 데이터를 저장하기에 명확한 데이터 구조를 보장하는 데이터베이스이다. 그렇기에 중복 데이터가 존재하지 않아 저장 공간을 절약할 수 있으며, 데이터 수정 (update)이 용이하다.
그리고 테이블 간의 관계를 통해서 큰 규모의 데이터를 여러 개의 테이블 (ex. user, item, buying)에 분산 저장할 수 있다. 분산 저장을 통해 보안을 철저히 하고, 테이블을 구조적으로 도식화 함으로 효율적으로 관리할 수 있다. 다만, 테이블 관계가 복잡해질수록 JOIN이 많은 SQL 쿼리가 만들어질 수 있다.
데이터 수정 (update)가 자주 발생하는 시스템이거나, 명확한 스키마가 중요한 경우 RDBMS가 적합하다.
2. NoSQL
스키마 없이 유연하게 데이터를 저장/관리할 수 있는 데이터베이스이다. MongoDB가 대표적인 NoSQL이다.
데이터 중복이 허용되기에 수정 (update)을 위해서는 중복으로 저장된 데이터를 검색하여 모두 수정해야 하는 번거로움이 있으며, 엄격한 스키마가 없다 보니 데이터에 대한 규격화된 결과 값을 얻을 수 없다.
정확한 데이터 구조를 알지 못하거나, 데이터 수정 (update)보다는 쓰기 (write)와 읽기 (read)가 더 자주 발생하는 경우 NoSQL이 적합하다.
절차 지향과 객체 지향
절차 지향 프로그래밍 (Procedural Programming): 물이 위에서 아래로 흐르는 것처럼 순차적인 처리가 중요시되는 프로그래밍 기법이며, C가 대표적인 절차 지향 프로그래밍 언어다. 컴퓨터의 처리구조와 유사해 실행 속도가 빠르지만 디버깅이 어렵다.
객체 지향 프로그래밍 (Object Oriented Programming): 실제 세계를 표방하여 데이터와 절차를 하나의 덩어리로 처리하는 프로그래밍 기법이다. Java, Python, C++ 이 대표적인 객체 지향 프로그래밍 언어다. 객체 지향 프로그래밍은 기존에 짜인 코드를 재사용하기 용이하며 디버깅이 쉽다. 단, 처리 속도가 느리며 설계에 많은 노하우와 시간이 필요하다. 객체 지향 프로그래밍은 아래의 네 가지 특징을 가진다.
추상화: 객체가 가진 공통의 속성이나 기능을 묶어 명시적인 이름을 부여하는 것을 말한다.
캡슐화: 관련된 데이터와 코드를 하나로 묶은 것으로 데이터를 감추고 외부와의 상호작용은 메서드를 통하는 방법이다.
상속: 이미 작성된 클래스를 이어받아서 새로운 클래스를 생성하는 것으로, 기존 코드를 재활용하는 것을 말한다.
다형성 (Polymorphism): 같은 코드로 다른 행위를 하는 것을 말한다. 이를 가능케 하는 것이 Overriding과 Overloading이다.
Overriding과 Overloading
객체 지향 프로그래밍의 다형성을 지원하는 방법이다.
Overriding: 부모 클래스가 가지고 있는 메서드를 자식 클래스가 재정의해서 사용한다. 즉, 메서드의 이름/매개변수/반환형이 같은 상속받은 메서드를 덮어쓰는 것으로 부모 클래스의 메서드는 무시하고 자식 클래스가 필요로 하는 메서드를 추가하여 사용하는 것이다.
Overloading: 같은 이름의 메서드 (함수)를 여러 개 정의하되, 매개 변수의 유형과 개수를 달리하여 다양한 유형의 호출에 응답하는 것이다.
페이지 교체 알고리즘
요구 페이징이 발생했을 때 교체할 물리 메모리의 페이지를 선정하는 알고리즘이다.
FIFO (First In First Out): 물리 메모리에 적재된 지 가장 오래된 페이지를 교체한다. 페이지의 사용 빈도를 무시하기 때문에 활발하게 사용하는 페이지가 교체될 수 있다는 문제점이 있다. 페이지가 적재된 순서를 Queue에 저장하는 방식을 사용한다.
LRU (Least Recently Used): 가장 오랜 기간 사용되지 않은 페이지를 교체한다. 많은 운영체제가 사용하는 알고리즘이다.
LFU (Least Frequently Used): 참조 횟수가 가장 적은 페이지를 교체한다. 만약 교체 대상이 여러 개일 경우에 LRU를 사용한다. LFU는 초기에 한 페이지를 집중적으로 참조하다가, 이후에 참조하지 않는 경우에 메모리에 계속 남아있을 수 있다는 문제점이 있다.
MFU (Most Frequently Used): LFU와 반대로 참조 횟수가 가장 많은 페이지를 교체하는 알고리즘이다.
메모리 단편화 (Memory Fragmentation)
내부 단편화: 교체된 페이지의 크기가 할당된 공간의 크기보다 작은 경우 내부 단편화가 발생한다. 이는 저장 공간 낭비로 이어진다.
외부 단편화: 메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 되는데, 이때 총 메모리 공간은 충분하지만 교체된 페이지의 크기가 할당된 공간의 크기보다 큰 경우 외부 단편화가 발생한다.
페이징과 세그먼테이션
메모리 단편화를 해결할 수 있는 기법이다.
페이징: 페이지가 연속적인 물리 메모리 공간에 들어가야 하는 제약을 해결하기 위한 방법이다. 가상 메모리는 페이지, 물리 메모리는 프레임이라는 고정 크기의 블록으로 나눈 후, 페이지 테이블의 매핑을 통해 1:1 대응시킨다. 이는 외부 단편화를 해결할 수 있다. 페이지 단위를 작게 하면 내부 단편화(Internal fragmentation) 역시 해결할 수 있지만 페이지에 공간을 할당한 후, 남는 공간이 적어지기 때문에 그만큼 page mapping 과정이 증가할 수 있다.
세그멘테이션: method, function, object, variables 등 프로그램의 논리적 단위를 바탕으로 서로 다른 크기의 블록으로 나누는 방법이다. 세그먼트들의 크기가 서로 다르기 때문에 메모리를 페이징 기법처럼 미리 분할해 둘 수 없고, 메모리에 적재될 때 빈 공간을 찾아 할당하는 사용자 관점의 가상 메모리 관리 기법이다. 각 세그먼트 별로 길이 값을 가지고 있어 내부 단편화를 해결할 수 있다.
프로세스와 스레드
프로세스: 운영체제로부터 프로세서, 주소 공간, 메모리와 같은 시스템 자원을 할당받는 작업의 단위로 실행된 프로그램을 의미한다. 프로세스는 실행될 때 운영 체제로부터 독립된 메모리 영역 (Code, Data, Stack, Heap)을 할당받으며 다른 프로세스의 자원에는 접근할 수 없다.
스레드: 프로세스 내에서 동작되는 실행의 단위로서 Stack 외에 프로세스가 할당받은 자원 (Code, Data, Heap)을 스레드끼리 공유, 이용하면서 실행된다. 하나의 프로세스가 실행되면 기본적으로 하나의 메인 스레드가 생성된다.
멀티 프로세스: 하나의 프로그램을 프로세스 여러 개로 구성하여 Context switching을 통해 실행하는 것을 말한다. 하나의 프로세스에 문제가 생기더라도 다른 프로세스에 영향을 미치지 않는다.
멀티 스레드: 하나의 프로그램을 한 프로세스 내에 여러 개의 스레드로 구성하여 실행하는 것을 말한다. 멀티 프로세스보단 멀티 스레드가 더 효율적인데 그 이유는 스레드 간의 통신 비용이 훨씬 적기 때문이다. 하지만 스레드 간의 자원 공유는 전역 변수를 이용하기에 동기화를 신경 써야 한다.
ThreadLocal
말 그대로 스레드 내부에서 사용되는 지역변수를 말한다. 각각의 thread scope 내에서 공유되어 사용될 수 있는 값으로 다른 스레드에서 공유 변수에 접근할 시 발생할 수 있는 동시성 문제의 예방을 위해 만들어졌다.
Context Switching
프로세서가 멀티 프로세싱을 구성하여 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선순위의 프로세스가 실행되어야 할 때, 기존 프로세스의 상태 또는 레지스터 값 (context)을 저장하고 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값을 교체하는 작업을 Context switching이라 한다.
멀티 프로세싱을 Computer multitasking을 통해 빠른 속도로 Task를 바꿔 가며 실행하여 실시간 처리에 근사하도록 하는 기술이다.
교착 상태 (Deadlock) 발생 4가지 조건
교착 상태란 서로 다른 프로세스가 서로의 자원을 요구하며 무한정 기다리는 현상을 말하며, 아래의 4가지 조건 중 하나라도 만족하지 않으면 교착 상태는 발생하지 않는다.
1. 상호 배제 (Mutual exclusion): 한 번에 한 프로세스만이 자원을 점유할 수 있다.
2. 점유 대기 (Hold and wait): 프로세스가 이미 자원을 점유하는 상태에서 다른 자원을 무한정 기다린다.
3. 비선점(No preemption): 프로세스가 어떤 자원의 점유를 끝낼 때까지 그 자원을 뺏을 수 없다.
4. 순환 대기(Circular wait): 각 프로세스들이 원형으로 구성되어 순환적으로 자원을 요구한다.
뮤텍스와 세마포어
뮤텍스: 한 스레드, 프로세스에 의해 소유될 수 있는 Key를 기반으로 한 상호 배제 기법이다. 한 스레드가 임계 영역에 들어갈 때 lock을 걸어 다른 스레드가 접근하지 못하도록 하고, 임계 영역에서 나올 때 unlock 한다.
세마포어: 현재 공유 자원에 접근할 수 있는 스레드, 프로세스의 수를 나타내는 값을 두는 상호 배제 기법이다. 그 값만큼 동시에 스레드가 해당 공유 자원에 접근할 수 있다.
RISC와 CISC
프로세서가 가진 명령어 세트를 기준으로 RISC와 CISC로 나눕니다.
RISC (Reduce Instruction Set Computer): 핵심적인 명령어를 기반으로 최소한의 명령어 세트를 구성한 프로세서다. 고정적인 길이와 간단한 명령어로 빠른 동작 속도를 자랑한다. 적은 명령어 세트를 가지고 있으므로 프로그램을 구성하는 명령어가 단순하지만 다수의 명령어를 필요로 한다.
CISC (Complex Instruction Set Computer): 연산을 처리하는 복잡한 명령어들을 수백 개 이상 탑재하고 있는 프로세서다. 명령어 길이가 다양하며 개수가 많아 프로그램의 구성이 복잡해지지만 소수의 명령어로 구현할 수 있다.
OSI 7 Layer
네트워크에서 통신이 일어나는 과정을 7단계로 캡슐화하여 서로 다른 동작을 각 layer에서 담당하는 것을 말한다. 이로서 통신이 일어나는 과정을 단계적으로 파악할 수 있으며 layer 별로 각기 다른 동작을 수행하기에 오류 탐지가 용이하다.
Physical layer: 전기적, 기계적 특성을 바탕으로 비트 흐름을 전송한다. 이 계층은 데이터를 전달만 할 뿐, 데이터가 무엇인지 전혀 신경 쓰지 않는다. (케이블, 리피터, 허브 등)
DataLink layer: 안전한 정보 전달을 보장한다. 물리 계층에서 전달받은 프레임의 오류를 찾고 필요시 재전송을 요청한다.
Network layer: 오류 없는 패킷을 목적지까지 안전하고 빠르게 전달하는 경로 (라우팅)를 찾는 계층이다.
Transport layer: 전송을 통해 통신을 활성화하는 계층이다. 패킷의 전송이 유효한지 확인하고 실패한 패킷을 재전송한다.
end-to-end 통신의 신뢰성을 보장하고, 오류 검출, 흐름 제어, 중복 검사를 수행한다.
Session layer: 그 전까진 물리적 측면의 통신이었다면 포트를 연결하여 논리적인 통신을 가능케 하는 계층이다.
Presentation layer: 응용 프로그램을 위해 형식상 차이를 갖는 데이터를 인코딩하여 일관된 형태의 데이터를 표현하는 계층이다.
Application layer: 사용자와 직접 상호작용하는 계층이다. 크롬, 파이어폭스가 대표적 예시이다.
TCP와 UDP
이 둘은 전송 계층에서 패킷을 보내기 위한 프로토콜이다.
TCP (Transmission Control Protocol): 연결형 서비스로 3-way handshaking 과정을 통해 연결을 설정하고, 4-way handshaking을 통해 해제한다. 그렇기에 높은 신뢰성과 전송 순서를 보장한다. 1:1 통신에서 사용된다. UDP보다는 속도가 느리다.
UDP (User Datagram Protocol): 비연결형 서비스로 패킷을 주고받을 때 신호 절차를 거치지 않는다. 그렇기에 신뢰성이 낮으며 전송 순서가 바뀔 수 있다. 1:N이나 N:N 통신에서 사용된다. TCP보다 속도가 빠르다.
3-way handshaking과 4-way handshaking (TCP)
3-way handshaking: 장치들 사이의 접속을 성립하기 위한 절차로 양 장치 모두 데이터 통신 준비가 되었다는 것을 보장한다.
과정: SYN (Client) → SYN + ACK (Server) → ACK (Client)
4-way handshaking: 장치들 사이의 통신을 종료하기 위한 절차이다.
과정: FIN (Client) → ACK (Server) → FIN (Server) → ACK(Client)
'Today I Lived > 구직 - 2021' 카테고리의 다른 글
[TIL] 2021.09.17 - 면접 && 미소 채용 절차 제안 (2) | 2021.09.17 |
---|---|
[TIL] 2021.09.16 - 코딩 테스트 (4) | 2021.09.16 |
[TIL] 2021.09.14 - 인기가 있네? (6) | 2021.09.14 |
[TIL] 2021.09.13 - 첫 면접 (0) | 2021.09.13 |
[TIL] 2021.09.11 - 지원 (2) | 2021.09.11 |
댓글