면접 대비 CS 질문 요약 (19~25)

나무에물주기·2022년 12월 18일
1
post-thumbnail
post-custom-banner

면접 대비 CS 질문 (19~25)

19. CPU Bound vs I/O Bound

  • CPU Bound 프로세는 I/O보다 연산으로 이루어진 CPU Burst가 큰 프로세스를 의미한다.
  • I/O Bound 프로세스는 I/O가 많은 즉, I/O Burst가 큰 프로세스를 의미한다.
  • 실제 프로그램은 CPU와 I/O가 번갈아가면서 작업이 이루어진다.
  • CPU Burst와 I/O Burst는 각각이 실행되는 시간을 의미한다
  • 게임에서는 I/O Bound 프로세스가 유리하다

20. 이동생성자, 이동 대입 연산자

  • **R-value reference(&&)를 사용하는 이동 생성자, 이동 대입 연산자 오버로딩. const가 빠진 것에 주의!**
  • **AutoPtr&& a**
    • **R-value reference인 a가 참조하는 인스턴스는 메모리에 자리 잡지 않고 잠깐 있다가 사라질 R-Value.**
  • 소유권 이동시 내용물들을 깊은 복사로 이전시킬 필요 없이 얕은 복사로 집 열쇠만 넘겨주면 된다.
    • 따라서 복사 생성자, 일반 대입 연산자 오버로딩에 비해 훨씬 빠르다.
      • for문으로 데이터를 전부 복사시키는 깊은 복사를 하지 않기 때문에
    • 얕은 복사 -> m_ptr = a.m_ptr;
      • Resource의 대입 연산자 오버로딩은 호출 되지 않는다.
        • Resource의 대입 연산자의 매개변수는 const가 안붙은 & 레퍼런스이므로 다른 함수라고 인식되어 오버로딩 되지 않음.
          • Resource의 대입 연산자는 깊은 복사를 수행하기 때문에 깊은 복사가 되지 않도록 Resource의 대입 연산자 매개변수는 그냥 L-value Reference로 설정
  • 소유권을 박탈을 반드시 해주어야 한다.
    • a.m_ptr = nullptr;
    • 별개의 새로운 공간을 만들어 내용물 데이터들을 복사한게 아니라 두 포인터가 같은 인스턴스를 가리키게 된 것이므로(얕은 복사) 복사 대상이 된 포인터의 소유권은 박탈 시켜 주어야 한다.
    • 박탈 시키지 않으면 대입 연산자 인수로 이 인스턴스를 참조 하게 된 매개 변수 AutoPtr && a가 대입 연산자 호출이 종료됨에 따라 소멸자가 호출되어 delete될 수 있기 때문이다.

21. 데드락 문제

  • 운영체제에서 데드락(교착상태)이란, 시스템 자원에 대한 요구가 뒤엉킨 상태입니다.

즉, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다릴 때 무한 대기에 빠지는 상황을 일컫습니다.

  • 데드락(Deadlock)의 발생조건

데드락이 발생하기 위한 조건은 크게 4가지로 말할 수 있습니다.

  1. 상호 배제
    • 한 번에 프로세스 하나만 해당 자원을 사용할 수 있다. 사용 중인 자원을 다른 프로세스가 사용하려면 요청한 자원이 해제될 때까지 기다려야 한다.
  2. 점유 대기
    • 자원을 최소한 하나 보유하고, 다른 프로세스에 할당된 자원을 점유하기 위해 대기하는 프로세스가 존재해야 한다.
  3. 비선점
    • 이미 할당된 자원을 강제로 빼앗을 수 없다(비선점).
  4. 순환 대기
    • 대기 프로세스의 집합이 순환 형태로 자원을 대기하고 있어야 한다.
  • 데드락(Deadlock)의 해결법

데드락의 해결법을 크게 3가지로 분류할 수 있습니다.

  1. 데드락이 발생하지 않도록 예방(prevention) 하기 (데드락의 발생조건 4가지 중 하나라도 발생하지 않게 하는 것)
  2. 데드락 발생 가능성을 인정하면서도 적절하게 회피(avoidance) 하기(Safe sequence, Safe state)
  3. 데드락 발생을 허용하지만 데드락을 탐지(detection)하여, 데드락에서 회복하기 (데드락을 탐지하고, 회복하는 알고리즘을 사용) 탐지 기법(Allocation, Request, Available) 회복 기법 (프로세스 중단, 자원 선점)

22. 동시성과 병렬성

동시성병렬성
동시에 실행되는 것 같이 보이는 것실제로 동시에 여러 작업이 처리되는 것
싱글 코어에서 멀티 쓰레드(Multi thread)를 동작 시키는 방식멀티 코어에서 멀티 쓰레드(Multi thread)를 동작시키는 방식
한번에 많은 것을 처리한번에 많은 일을 처리
논리적인 개념물리적인 개념

23. 스택오버플로우(Stack Overflow)

  • Stack Overflow는 Stack 영역의 메모리가 지정된 범위를 넘어갈 때 발생한다.

Stack 메모리는 보통 지역 변수가 저장되는 영역이다.

함수에서 지역 변수를 선언하면 지역 변수는 Stack 메모리에 할당되고 함수를 빠져나오면 Stack 메모리에서 해제된다.

하나의 프로그램이 실행될 때 수많은 함수를 호출하고 빠져 나오게 되는데 그 때마다 함수에서 사용하는 지역 변수는 Stack 영역에 할당되고 해제되는 것을 반복하게 되며 그에 따라 사용하는 Stack 영역도 변하게 된다.

만약 한 함수에서 너무 큰 지역 변수를 선언하거나 함수를 재귀적으로 무한정 호출하게 되면 stack overflow가 발생할 수 있다.

stack overflow가 발생하면 컴파일러 옵션에서 stack 영역의 크기를 늘리거나 또는 함수에서 사용하는 지역 변수의 크기를 줄이거나 아니면 지역 변수를 전역 변수로 바꾸어 해결할 수 있다.

Visual C++과 같은 PC 컴파일러에서는 디버깅 모드에서 Stack Overflow가 발생하면 Stack Overflow 에러 메세지를 출력하지만 임베디드 시스템에서는 Stack Overflow 에러 메세지를 출력하지 않고 이상 동작하는 경우가 많기 때문에 주의해야 한다.

24. 메모리 단편화

메모리 단편화

- RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태를 보고 메모리 단편화가 발생했다고 한다.

메모리 단편화는 내부 단편화와 외부 단편화로 구분 가능하다.

내부 단편화(Internal Fragmentation)

메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 상황

  • 예를 들어 메모장을 켰는데 OS가 4kb를 할당해줬다. 그런데 사실상 1kb만큼만 사용하고 있을 때 필요 이상으로 프로세스가 메모리를 할당받았으므로 내부 단편화가 3kb만큼 생긴 것임.

외부 단편화(External Fragmentation)

메모리가 할당되고 해제되는 작업이 반복될 때 작은 메모리가 중간중간 존재하게 된다. 이 때 중간중간에 생긴 사용하지 않는 메모리가 많이 존재해서 총 메모리 공간은 충분하지만 실제로 할당할 수 없는 상황

  • 예를 들어 메모리 처음 주소에 8mb짜리 프로세스가 할당되었고 바로 이어서 16mb짜리 프로세스가 할당되었다고 가정했을 때 8mb짜리 프로세스를 종료시키면 메모리 처음 주소부터 8mb만큼 공간이 생긴다.

이런 식으로 계속해서 빈 메모리가 쌓이는데 예를 들어서 빈 메모리의 공간중에 제일 큰 빈 메모리가 8mb라고 한다면 9mb짜리 프로세스를 할당을 해야할 때 마땅한 공간은 없지만 전체적으로 메모리 여유는 있을 때 외부단편화가 생겼다고 한다.

메모리 파편화 문제 해결 방법

1. 페이징(Paging)기법 - 가상메모리사용, 외부 단편화 해결, 내부 단편화 존재

보조기억장치를 이용한 가상메모리를 같은 크기의 블록으로 나눈 것을 페이지라고 하고 RAM을 페이지와 같은 크기로 나눈 것을 프레임이라고 할 때,

페이징 기법이란 사용하지 않는 프레임을 페이지에 옮기고, 필요한 메모리를 페이지 단위로 프레임에 옮기는 기법.

페이지와 프레임을 대응시키기 위해 page mapping과정이 필요해서 paging table을 만든다.

페이징 기법을 사용하면 연속적이지 않은 공간도 활용할 수 있기 때문에 외부 단편화 문제를 해결할 수 있다.

대신 페이지 단위에 알맞게 꽉채워 쓰는게 아니므로 내부 단편화 문제는 여전히 있다.

  • 페이지 단위를 작게하면 내부 단편화 문제도 해결할 수 있겠지만 대신 page mapping 과정이 많아지므로 오히려 효율이 떨어질 수 있다.

2. 세그멘테이션(Segmentation)기법 - 가상메모리사용, 내부 단편화 해결, 외부 단편화 존재

페이징기법에서 가상메모리를 같은 크기의 단위로 분할했지만 세그멘테이션기법에서는 가상메모리를 서로 크기가 다른 논리적 단위인 세그먼트로 분할해서 메모리를 할당하여 실제 메모리 주소로 변환을 하게 된다.

각 세그먼트는 연속적인 공간에 저장되어 있다.

세그먼트들의 크기가 다르기 때문에 미리 분할해 둘 수 없고 메모리에 적재될 때 빈 공간을 찾아 할당하는 기법이다.

마찬가지로 mapping을 위해 세그먼트 테이블이 필요하다.

(각 세그먼트 항목별 세그먼트 시작주소와 세그먼트의 길이 정보를 가지고 있음)

프로세스가 필요한 메모리 만큼 할당해주기 때문에 내부단편화는 일어나지 않으나 여전히 중간에 프로세스가 메모리를 해제하면 생기는 구멍, 즉 외부 단편화 문제는 여전히 존재한다.

3. 메모리 풀(Memory Pool)

필요한 메모리 공간을 필요한 크기, 개수 만큼 사용자가 직접 지정하여 미리 할당받아 놓고 필요할 때마다 사용하고 반납하는 기법

메모리 풀 없이 동적할당과 해제를 반복하면 메모리의 랜덤한(실제로는 알고리즘에 의한) 위치에 할당과 해제가 반복되면서 단편화를 일으킬 수 있겠지만 미리 공간을 할당해놓고 가져다 쓰고 반납하기 때문에 할당과 해제로 인한 외부 단편화가 발생하지 않는다.

또한 필요한 크기만큼 할당을 해놓기 때문에 내부 단편화 또한 생기지 않는다.

하지만 메모리 단편화로 인한 메모리 낭비량보다 메모리 풀을 만들었지만 쓰지 않았을 때 메모리 양이 커질 경우 사용하지 않아야 한다.

메모리의 할당, 해제가 잦은 경우에 메모리 풀을 쓰면 효과적이다.

미리 할당해놓고 사용하지 않는 순간에도 계속 할당해놓으므로 메모리 누수가 있는 방식이다.

구현 방법

  • 큰 메모리 블록(페이지)을 힙으로 부터 할당
  • 할당 받은 페이지를 각 객체의 크기의 블록으로 나눔
  • 각 객체를 위한 블록을 순차적으로 링크
  • 이 때 현 시점에서 할당할 블록을 특정 포인터가 가리키게 함
  • 메모리 요청이 생기면 현재 헤더 포인터가 가리키는 블록을 돌려준다.
  • 할당이 일어난 후 헤더 포인터는 할당 직전에 가리키던 블록이 가리키던 블록을 가리킨다.
  • 사용되던 메모리가 해제되어 메모리 풀로 돌아올 경우 헤더 포인터는 그 블록을 가리키고 방금 전까지 헤더 포인터가 가리키던 블록을 돌아온 블록의 다음 포인터가 가리키게 한다.

25. TCP, UDP

TCP(Transmission Control Protocol)

TCP는 신뢰성 있는 데이터 전송을 지원하는 연결 지향형 프로토콜입니다. 일반적으로 TCP와 IP가 함께 사용되는데, IP가 데이터의 전송을 처리한다면 TCP는 패킷 추적 및 관리를 하게 됩니다. 연결 지향형인 TCP는 3-way handshaking이라는 과정을 통해 연결 후 통신을 시작하는데, 흐름 제어와 혼잡 제어를 지원하며 데이터의 순서를 보장합니다.

흐름 제어: 보내는 측과 받는 측의 데이터 처리속도 차이를 조절해주는 것

혼잡 제어: 네트워크 내의 패킷 수가 넘치게 증가하지 않도록 방지하는 것

특징

  • 연결형 서비스로 가상 회선 방식을 제공
  • 데이터의 전송 순서 보장
  • 데이터의 경계를 구분하지 않음
  • 신뢰성 있는 데이터 전송
  • UDP보다 전송속도가 느림
  • 연결을 설정(3-way handshaking)과 해제(4-way handshaking)

UDP(User Datagram Protocol)

UDP는 비연결형 프로토콜로써, 인터넷상에서 서로 정보를 주고받을 때 정보를 보낸다는 신호나 받는다는 신호 절차를 거치지 않고 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜입니다. TCP와는 다르게 연결 설정이 없으며, 혼잡 제어를 하지 않기 때문에 TCP보다 전송 속도가 빠릅니다. 그러나 데이터 전송에 대한 보장을 하지 않기 때문에 패킷 손실이 발생할 수 있습니다.

특징

  • 비연결형 서비스로 데이터그램 방식을 제공
  • 비신뢰성
  • 데이터의 경계를 구분
  • 패킷 오버해드가 적어 네트워크 부하 감소
  • 혼잡 제어를 하지 않기 때문에 TCP보다 빠름
  • TCP의 handshaking 같은 연결 설정이 없음

TCP vs UDP

TCP(Transfer Control Protocol)UDP(User Datagram Protocol)
연결형 프로토콜비연결형 프로토콜
데이터의 경계를 구분하지 않음데이터의 경계를 구분함
신뢰성있는 데이터 전송 (데이터 재전송 존재O)비신뢰성 데이터 전송 (데이터 재전송 존재X)
일 대 일(Unicast) 통신일 대 일, 일 대 다(Broadcast), 다 대 다(Multicast) 통신

요약

TCP는 연속성보다 신뢰성 있는 전송이 중요할 때에 사용되는 프로토콜이며,UDP는 TCP보다 빠르고 네트워크 부하가 적다는 장점이 있지만 신뢰성 있는 데이터 전송을 보장하지는 않습니다.그렇기 때문에 신뢰성보다는 연속성이 중요한 실시간 스트리밍과 같은 서비스에 자주 사용됩니다.

profile
개인 공부를 정리함니다
post-custom-banner

0개의 댓글