🙃아직 2차 정리가 필요한 글!

 

📌오버로딩과 오버라이딩의 차이점은 무엇인가요?

  • Overload는 같은 이름 메소드를 여러 개 정의하는 것을 뜻하는데 인자의 타입, 개수 등을 다르게 하여 다양한 타입의 호출에 응답할 수 있도록 하는 방식입니다. 하나의 메소드 명으로 여러 기능과 연산들을 구현하기 위해 사용되며, 하나의 클래스 또는 상속 관계의 클래스 관계에서 정의할 수 있습니다.
  • Override는 메소드의 내용을 덮어 씌우는 재정의를 뜻합니다. 이는 상속 관계에서만 가능하기 때문에 상위 클래스에서 정의된 메소드를 하위 클래스에서 좀 더 구체화하는 등 자신에 맞게 변경하여 재정의합니다. 메소드 명 뿐만 아니라 인자의 타입, 개수, 리턴 타입 등이 모두 동일해야 하는 조건이 있습니다.
더보기

📍오버로딩과 오버라이딩은 객체지향에서 다형성 활용한 대표적인 예인데 다형성에 대해 설명해주세요

 

다형성이란 하나의 타입에 여러 객체르 대입할 수 있는 성질

 

다형성을 활용하면 기능을 확장하거나, 객체를 변경해야할 때 타입 변경 없이 객체 주입만으로 수정이 일어나게 할 수 있다. 또한 상속을 한다면 중복되는 코드까지 제거할 수 있다. 

 

다형성을 구현하는 방법

 

📍SOLID 원칙에서 다형성을 기본으로 하는 원칙이 무엇일까?

OCP(Open-Closed Principle / 개방폐쇄원칙), DIP (Dependency Inversion Principle / 의존 역전 원칙)

 

📍오버로딩 , 오버라이딩 사례 찾아보기

 

 

📌 RDB와 NoSQL은 무엇인가요? 차이점 또는 장단점 위주로 설명해주세요.

RDB

  1. 관계형 데이터 모델에 기초를 둔 데이터베이스
  2. 2차원 데이터로 표현된다 (행/열)
  3. 상호관련성을 가진 테이블의 집합으로 구성된다

장점 : 

  • 스키마가 명확하게 정의되어 있다.
  • 오래 사용된 만큼 신뢰성이 높고, 데이터 무결성을 보장한다.
  • 유지보수가 편하다.

단점 :

  • 먼저 작성된 스키마를 수정하기 어렵다.
  • 시스템이 커지면 JOIN문이 많은 복잡한 쿼리가 만들어질 수 있다.
  • Vertical scalability(수직 확장성)는 좋지만, Horizontal scalability(수평 확장성)이 낮다.
  • 다른 DB에 비해 많은 자원이 활용되어 시스템 부하가 높다.

 

확장성이란

  • 수직 확장성 : = 스케일 업(scale-up) cpu 갯수나 cpu 코어를 늘려 처리량을 증가시키거나 메모리, 저장 용량을 추가해 단일 인스턴스 성능을 업그레이드 하는 방법
  • 수평 확장성 : = 스케일 아웃(scale-out) 단일 인스턴스 성능을 더 강력하게 만드는 방법이라기 보다 같은 타입의 인스턴스를 여러 개  시작해 시스템을 수평적으로 확장하는 방법
  • 오류 가능성(하나만 운영), 서버 소프트웨어 설계 비용, 단위 처리 속도의 세 가지 측면에서 보자면 수직 확장이 더 좋고. 확장 비용, 처리 가능 총량의 두 가지 측면에서 보자면 수평 확장이 더 좋다.

NoSQL (Not only SQL)

  1. 다양한 방식으로 데이터를 표현한다. Join이 없고 애플리케이션이 요구하는 형식으로 저장이 가능하기 때문에 읽어오는 속도가 빠르다.
  2. 연산이 빠르고 빅데이터 & 실시간 연산에 적합하다
  3. RDB가 정해진 스키마에 따르지 않으면 데이터 추가가 불가능 하지만  NoSQL 같은 경우 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.
  4. 테이블(혹은 컬렉션 혹은 또 다른 명칭) 사이에 딱히 명시된 제약이나 규칙이 없다
  5. 스키마가 고정적이지 않고, 매우 유연하다
  6. Horizontal scalability(수평 확장성)이 좋다
  7. 코스트 저렴 / 오픈소스도 많다

 

종류: MongoDB(json document 형태로 저장) Redis(key-value방식 읽고 쓰기가 빠름) Tao (GraphDB 각각의 entity를 저장하고 관계망으로 연결. 소셜 네트워크에 특화)

 

더보기

📍RDB를 써야하는 경우

 

📍NoSQL을 써야하는 경우

  • 정확한 데이터 구조를 알 수 없거나 변경/확장 될 수 있는 경우
  • 읽기를 자주 하지만, 데이터 변경은 자주 없는 경우
  • 데이터베이스를 수평으로 확장해야 하는 경우 (막대한 양의 데이터를 다뤄야 하는 경우)

 

📍스키마가 뭔가요?

데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 기술한 메타데이터의 집합

데이터베이스를 구성하는 데이터 개체(Entity), 속성(Attribute), 관계(Relationship) 및 데이터 조작 시 데이터 값들이 갖는 제약 조건 등에 관해 전반적으로 정의

사용자의 관점에 따라 외부 스키마, 개념 스키마, 내부 스키마로 나눠진다.

 

📍스키마 3계층

 

* 외부스키마

사용자나 응용프로그래머가 각 개인의 입장에서 필요로 하는 데이터베이스의 논리적 구조를 정의한 것

동일한 데이터에 대해 서로 다른 관점을 정의할 수 있도록 허용

 

* 개념 스키마

각 DB에는 1개의 개념 스키마만 존재

개체 간의 관계 및 무결성 제약 조건, 데이터베이스의 접근 권한 등에 대한 명세를 정의

데이터베이스 관리자(DBA)에 의해서 구성

 

* 내부 스키마

물리적 저장장치의 관점에서 본 DB 구조

실제로 저장될 데이터 항목의 내부 레코드 형식, 물리적 순서 등을 나타낸다.

시스템 프로그래머나 시스템 설계자가 보는 관점의 스키마

 

📍ACID 성질에 대해 말씀해 주세요

 

데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질

  • 원자성(Atomicity)은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다
  • 일관성(Consistency)은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다
  • 고립성(Isolation)은 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다
  • 지속성(Durability)은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다

📍ACID 모델 말고 NoSQL에 적용된 BASE 모델에 대해서 설명해주세요

ACID가 데이터베이스 트랜잭션이 안전하게 수행된다는 걸 보장하기 위한 성질 이라면

BASE는 가용성과 성능을 중시하는 특성을 말한다

 

BAsically available (기본적인 가용성) :

- 가용성을 중시, Optimistic Locking 및 큐 사용

 - 다수의 실패에도 가용성을 보장, 다수의 스토리지에 복사본 저장

Soft state

- 노드의 상태는 외부에서 전송된 정보를 통해 결정됨
- 분산 노드 간 업데이트는 데이터가 노드에 도달한 시점에 갱신

Eventually Consistent (최종 일관성) : 일시적으로 비일관적인 상태가 되어도 최적으로는 일관성이 있는 상태가 되는 성질

📍 No SQL에도 트랜잭션 갖고 있는애들 있어

🙃아직 2차 정리가 필요한 글!

 

📌 절차지향 / 객체지향 / 함수형 프로그래밍이란 무엇이고 차이점은 무엇인가?

 

프로그래밍 패러다임 종류

 

📍절차지향 프로그래밍 (구조적)

  • 실행 순서, 절차가 중점, 프로그램 전체가 유기적으로 연결되는 프로그래밍 방식
  • 전체 기능의 동작을 고려해 단계별로 기능을 구현
  • 컴퓨터의 처리구조와 유사하기 때문에 객체지향보다 속력이 빠르다.
  • 프로젝트가 커지면 그만큼 구조가 복잡해진다
  • 순서를 바꾸기 어려우며, 중복 코드의 가능성이 높아 유지보수가 어렵다. 디버깅 또한 어렵다 
  • 대표적인 언어 C

 

📍객체지향 프로그래밍

  • 객체들의 종류와 속성을 중점
  • 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체를 만들고, 객체를 설계하여 각 객체의 상호작용을 설계하는 방식
  • 특징은 4가지: 캡슐화, 상속, 추상화, 다형성
  • 절차지향보다는 속도가 느리지만 구조 파악이 쉽다
  • 객체로 코드를 재사용하여 생산성을 높이며, 유지보수가 쉽다.
  • 대표적인 언어로 자바, 파이썬, C++ 등이 있다.

 

📍 함수형 프로그래밍

  • 자료처리를 수학적 함수의 계산으로 취급해 상태와 가변 상태를 멀리한다. 
  • 함수형 프로그래밍은 수학과 밀접한 연관이 있어 배우는 것이 어렵지만 최근 AI,빅데이터 등으로 방대한 데이터를 빠르게 병렬적으로 계산할 필요로 각광받기 시작
  • 함수형 프로그래밍 만을 위한 언어도 존재하지만 객체지향 프로그래밍에 함수형 프로그래밍의 특징을 접목한 프로그래밍 언어도 있다. 자바도 그 중 하나이다.
  • 어떤 값을 넣어도 항상 동일한 결과 값을 갖는 순수함수를 갖는다. 함수에서 외부 상태값을 참조하거나 외부 상태를 변경하는 건 순수 함수가 아니다.
  • 데이터는 비상태성,불변성을 가져야 한다. 함수에 인자로 전달된 데이터를 변경하는 건 함수형이 아니며, 함수형 경우 데이터가 변경이 필요하다면 그건 원본데이터를 변경하는게 아니라 복사본으로 새롭게 만들어 변경하여 반환하는 방식으로 사용한다. 
  • 선언형 함수로 if, switch, for 등의 명령문을 사용하지 않고 함수형 코드를 사용해야한다.
  • 자바에서는 JDK8 부터 StreamAPI와 함수형 인터페이스 람다를 제공하고 있다. 

 

더보기

📍인터프리터란

 

📍객체란 

객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장 할 변수와 작업을 수행 할 메소드를 서로 연관된 것들끼리 묶어서 만든 것을 객체라고 할 수 있다. 

 

📍StreamAPI

 

📍람다

 

https://choirim.tistory.com/69

https://www.youtube.com/watch?v=4ezXhCuT2mw

 

 

 

📌 알고리즘에서 ‘시간복잡도‘와 ‘공간복잡도’란 무엇인가? 그리고 이것들은 왜 중요한가?

📍시간 복잡도

알고리즘이 문제를 해결 하는데 걸리는 시간 ( 실제로는 연산 실행 횟수 ) 

최고차항을 제외한 모든 항과 최고차항의 계수를 제외시킨다. 

 

📍공간 복잡도

알고리즘이 문제를 해결 하는데 사용하는 메모리 ( 고정 공간과 가변 공간을 더해 구함 )

 

S(P) = c + Sp(n)c: 고정 공간 (코드 저장 공간, 단순 변수, 고정크기의 구조 변수, 상수)Sp(n): 가변 공간 (동적으로 필요한 공간)

 

📍공통점

둘다 알고리즘 성능 분석 방법. 하드웨어와 상관없이 알고리즘 그 자체 만을 평가하기 위한 방법.

 

📍표기법

점근적 표기법

Big-O (빅오): 최악의 경우를 표기, 상한

Big-Omega (빅오메가): 최선의 경우를 표기, 하한

Big-Theta (빅세타): 평균, 상한과 하한의 교집합

 

📍서로 관계

서로 반비례 하는 경향이 있다 

 

📍왜 중요할까?

알고리즘 분석을 빠르게 할 수 있고, 언제 무엇에 쓸지 빠르게 파악이 가능하다

개발자로 하여금 자신의 코드가 미래에 어떻게 작동할지 알 수 있기 때문에 코드를 평가하여 더 나은 방법을 찾아볼 수 있게 한다. 

 

더보기

📍알고리즘

어떤 문제를 풀거나 계산하기 위한 일련의 유한한 절차 

 

📍좋은 알고리즘은 어떤걸까요?

- 모든 입력에 대한 올바른 출력을 생성

- 적은 실행시간과 적은 메모리 사용으로 효율적인 실행

- 다른사람이 이해하기 쉬운 알고리즘

- 재사용하기 좋은 알고리즘

 

📍좋아하는 알고리즘이 있나요?

정렬 알고리즘에 흥미가 있다

버블, 선택, 삽입 알고리즘 셋다 같은 O(n^2)의 시간 복잡도를 가지고 있지만 과정과 평균 성능으로 보면 전혀 다른 차이를 보인다. 어떤 것을 판별하는데 단 한가지 요소가 아니라 여러가지 요소를 가지고 detail하게 판별해봐야 한다는 생각이 들어 흥미를 갖게 되었다. 

 

- 버블 정렬 알고리즘 : 앞에서 부터 2개씩 비교하여 완전히 정렬될 때까지 비교와 스왑을 반복하는 알고리즘. 한번의 싸이클당 n-1 비교와 여러번의 스왑이 일어날수 있으며 마지막 위치면 다시 앞으로 돌아가 반복.

- 선택 정렬 알고리즘 : 전체의 아이템 중 가장 작은 아이템의 위치와 현재 아이템의 위치를 스왑하는 알고리즘. 가장 작은 아이템부터 앞에서 정리하기 때문에 한 싸이클당 n-1번 비교하는 것은 동일하나 단 한번의 스왑이 일어난다.

- 삽입 정렬 알고리즘 : 두 알고리즘과 달리 전체를 비교해서 정렬하는 것이 아닌 삽입하려는 아이템만을 비교하여 적절한 위치에 정렬하는 방식

 

📍최악의 상황이 뭔가요? 그럴만한 케이스를 생각해본 적 있나요?

 

📍최악의 정도가 심한 알고리즘 중에 평균 성능이 좋은 케이스도 있다. 이런 경우 무엇을 선택할 것인가

 

📍추가적인 여러 기법들 : 평활 분석법, 분할상환분석 

- 평활 분석법

 

- 분할상환분석 

알고리즘의 전반적인 연산 집합에 대해 비용이 높은 연산, 그리고 비용이 덜한 연산 모두를 함께 고려하는 기법

다른 종류의 입력, 입력의 길이, 이 알고리즘의 성능에 영향을 미치는 다른 요인들을 전부 고려

 

📍시간 복잡도를 계산해 개선해본 경험이 있느냐 

 

📍시간 복잡도 계산

🙃아직 2차 정리가 필요한 글!

 

 

📌 웹 서버와 WAS의 차이는?

WS (Web Server):

서버 컴퓨터에 특정 폴더, 디렉토리에 브라우저가 읽을 수 있는 파일(정적 컨텐츠)을 넣어두고 이 폴더가 외부에서 접근할 수 있도록 개방하여 서버에 지정된 주소로 접속하면 그 파일을 받아 갈 수 있게 하는 것이 기본적인 웹서버의 역할

여기서 정적 컨텐츠란

변화가 없는 컨텐츠로 서버에 저장해두고 서버가 요청 받으면 응답만 해주면 되는 것을 말하며 어느 사용자에게든 동일한 결과를 보여준다. 

 

클라이언트(웹브라우저) 요청이 동적인 데이터면 동적 컨텐츠를 WS가 처리할 수 없기 때문에 WAS에 요청하고, WAS에서 처리한 결과를 받아 클라이언트에 반환

  • 예시 : Apache, Nginx, IIS
더보기

📍

Apache : 

Nginx :

IIS : 

 

WAS ( Web Application Server):

WAS는 DB조회 및 다양한 비지니스 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위한 Application 서버

  • 동적 컨텐츠 처리 : 누가 언제 어떻게 서버에 요청했는지에 따라 결과값을 다르게 보여주는 컨텐츠
  • (정적 컨텐츠 처리도 가능 왜냐면 WS를 내장하고 있기 때문) 
  • 프로그램 실행 환경과 데이터베이스 접속 기능을 제공한다.
  • 여러 개의 트랜잭션을 관리한다.
  • 업무를 처리하는 비즈니스 로직을 수행한다.
  • 웹 서버  + 컨테이너 형태 (WS가 보낸 동적 서버 컨텐츠를 실행하고 수행 결과를 다시 WS로 보내주는 역할)
  • 예시 : Tomcat, Jeus

WAS 하나로 두 가지 종류의 페이지를 배포 할 수 있는 데 왜 웹서버와 같이 사용할까요?

  • 보안 기능 : 웹서버의 Reverse Proxy 기능

공격에 대해 앞단에 WS 배치하여 중요 정보가 있는 WAS까지 전파되지 못하게 하거나 WAS단에서의 중요 정보가 밖으로 노출되지 않게 한다. 서버 내부적으로 파일들이 어느 폴더에 위치하고, 서비스가 몇 번 포트로 돌고 있는 지 등 서버의 정보를 숨긴다.

  • 웹서버의 reverse proxy가 갖는 기능 중 하나인 로드 밸런싱을 통해 클라이언트와 서버 Pool 사이에 위치하여 한 서버로 부하가 집중되지 않도록 트래픽을 관리해주는 기능을 사용할 수 있다
  • 구조적 유연성 : 하나의 웹서버를 두고 여러 웹 어플리케이션을 사용할 수 있는데 WS가 일종의 라우터 역할을 하여,  로드밸런싱, fail over, failback, 무중단 운영을 가능하게 한다. 
  • WAS만 사용하면 WAS장애시 오류 화면 노출이 불가능하기 때문에 WS이용해 장애에 대한 알림기능도 가능하다. 

 

더보기

📍공통점

  • HTTP 기반으로 동작, HTTP 프로토콜을 통해 전송

📍정적 페이지 

상황에 따라 변경되지 않는 페이지로 서버에서 변경하지 않는 한 변하지 않는다

사용자 요청에 관계 없이 항상 동일

 

📍동적 페이지

상황에 따라 변하는 페이지로 클라이언트에서 어떻게 접근하느냐에 따라 변경이 가능하다

사용자 요청에 따라 변화

 

📍로드밸런싱

 서버가 처리해야 할 업무 혹은 요청(Load)을 여러 대의 서버로 나누어(Balancing) 처리하는 장치 또는 기술을 의미

클라이언트와 서버 Pool 사이에 위치하여 한 서버로 부하가 집중되지 않도록 트래픽을 관리해 각각의 서버가 최적의 퍼포먼스를 가능하게 돕는다. 

 

📍로드밸런싱의 health check

서버에 주기적으로 http요청을 보내 서버의 상태를 확인하는 기능

health check 설정

- interval : health check 통해 서버 상태 확인하는 요청 전송 (default : 5초)

- fails : 요청 실패시 서버가 비정상이라고 인지 (default : 1회)

- passes : 서버가 다시 복구되어 요청이 성공하면 서버가 정상으로 인지 (default : 1회)

 

📍Scale Up, Scale Out

 

📍fail-over, 장애 극복, 장애 조치, 시스템 대체 작동 등

컴퓨터 서버, 시스템, 네트워크 등에서 이상이 생겼을 때 예비 시스템으로 자동 전환되는 기능

평소 운영되는 시스템을 Active,  같은 세팅으로 구성되어 대기하는 시스템을 Passive 라고 하는데 Active 시스템이 멈추거나 장애가 발생하면 Passive 시스템이 Active 상태로 변경되어 서비스를 이어 운영하게 된다. 

높은 가용성을 요구할 때 구성한다 

 

📍높은 가용성, 고가용성 (HA / High Availability)

가용성이란 일단 서비스를 정상적으로 사용 가능 한 정도를 의미하며

고가용성이란 서비스가 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질을 말한다. 

+ 가용성을 높이는 방법

시스템 이중화, 시스템 확장 등 

 

📍failback

페일 오버에 따라 전환된 서버, 시스템, 네트워크 등을 이상이 발생하기 전의 상태로 되돌리는 처리

 

📍단일 장애점, SPOF (single point of failure)

시스템 구성 요소 중에서 동작하지 않으면 전체 시스템이 중단되는 요소. 이중화가 되어있지 않다면 SPOF일 가능성이 높다.

 

📍로드밸런싱 알고리즘

- 라운드로빈 방식

- 가중 라이누드로빈 방식

- IP 해시 방식

- 최소 연결 방식

- 최소 리스폰 타임

 

📍부하분산에 가장 많이 활용되는 L4, L7 로드밸런서에 대해 설명

- L4, L7?

OSI 7계층에서의 Layer 번호, 상위 계층에서 사용되는 장비일수록(1 -> 7 상위) 하위 계층의 장비가 가지고 있는 기능을 모두 가지고 있어 상위로 갈수록 더욱 정교한 로드 밸런싱 가능

 

- L4 : 네트워크 계층이나 트랜스포트 계층의 정보를 바탕으로 로드를 분산, IP주소나 포트번호, MAC주소, 전송 프로토콜에 따라 트래픽을 나누는 것이 가능

 

- L7 : 애플리케이션 계층에서 로드를 분산, HTTP 헤더, 쿠키 등과 같은 사용자 요청을 기준으로 특정 서버에 트래픽을 분사하는 것이 가능하다. 패킷의 내용을 확인하고 그 내용에 따라 분산이 가능한 것

 

 

로드밸런서(Load Balancer)의 개념과 특징

[BY 가비아] 현대의 모든 정보는 인터넷을 통해 연결되어있습니다. 인터넷의 발달은 데이터 통신을 보다...

m.post.naver.com

 

📍라우터란 

컴퓨팅 디바이스와 네트워크를 다른 네트워크에 연결하는 네트워킹 디바이스

 

📍라우팅 

네트워크에서 경로를 선택하는 프로세스. 컴퓨터 네트워크는 하나 하나의 시스템을 노드, 그리고 이를 연결하는 경로 또는 링크로 구성된다. 서로 연결된 두 노드는 여러 경로를 통해 통신을 하는데, 라우팅은 미리 정해진 규칙을 사용하여 최상의 경로를 선택하는 프로세스다.

통신에 있어 효율성을 높이고 네트워크가 정체 없이 최대한 많은 용량을 사용할 수 있도록 데이터 트래픽을 관리함으로써 네트워크 장애를 최소화 할 수 있게 해준다. 

 

📍레이턴시, 처리량

분리 하면 처리량이 왜 좋아질까?

 

📍Tomcat 이랑 Apache 차이 (꼭 알아두기)

Apache가 WS

Tomcat은 자바에서 쓰이는 WAS 중 하나, 스프링 부트에 톰캣이 내장되어 있다.

JAVA EE 기반으로 만들어졌으며, JSP와 Servlet을 구동하기 위한 서블릿 컨테이너 역할을 수행한다.
아파치서버와는 다르게 DB연결, 다른 응용프로그램과 상호 작용 등 동적인 기능들을
사용할 수 있다.

 

📍서블릿 컨테이너가 뭘까요?

서블릿 : 

클라이언트의 요청을 받고 요청을 처리하여 결과를 클라이언트에게 제공하는 자바 인터페이스.

 

서블릿 컨테이너:

  • 서블릿들을 모아 관리
  • 새로운 요청이 들어올 때마다 새로운 스레드를 생성
  • 작업이 끝난 서블릿 스레드 자동 제거

 

📍브라우저만 요청 가능한거 아니니까 요청에 대한 부분은 다시 정리할 것 

요청이 모바일인지 브라우저인지 등 어떻게 구분이 가능한지

 

📍웹서버 문제 해결 방법으로 CDN

 

📍부하를 방지했을 때 스프링에서 이점이 있는지

스프링은 Apache Tomcat을 내장하고 있어 스레드를 몇개 가지고 있고 처리량

스프링 부트에 내장된 Tomcat은 다중 요청을 처리하기 위해, 부팅할 때 스레드 컬렉션인 Thread Pool을 생성한다. 유저 요청이 오면 이 스레드 풀에서 스레드를 할당한다. 

 

 

📍디렉토리 용량 초과시 어떻게 핸들링 할 것인가

EVS? EBS?를 증설 또는 S3를 활용해 정적 컨텐츠 내려주기

 

 

 

📌 Stack과 Queue 그리고 Array와 Linked List 자료구조에 대해 말씀해주시고 차이점에 대해 설명해주세요.

📍Stack vs Queue

  • 스택은 Last In First Out 후입선출 구조로 마지막에 저장된 것을 먼저 꺼내어 쓰는 자료 구조를 말합니다. 데이터 접근은 가장 최근에 쌓인 데이터인 top을 통해서 만 접근이 가능합니다. 가장 최근에 넣은 것을 다시 꺼내 쓰는 특징 때문에 웹 브라우저 뒤로 가기나 가장 최근 수정 내역으로 되돌리는 실행 취소 undo, 문자열 역 순 등의 기능으로 활용이 가능합니다.
  • 큐는 First In First Out의 선입선출 구조로 먼저 저장한 것을 먼저 꺼내는 자료 구조입니다. 삭제 연산만 이루어지는 곳을 Front라고 하며 삽입만 이루어지는 곳을 Rear라고 합니다. 입력된 순서에 따라 처리되기 때문에 순번을 지켜야하는 모든 처리에 사용됩니다. 프린트, 예매 대기열 등에 사용 
더보기

📍Queue 종류

Queue 인터페이스의 구현체도 여러개가 있는데 

우선순위 큐 (PriorityQueue) : 저장한 순서와 상관없이 우선순위 높은 것부터 꺼내는 방식

Deque(Double-Ended Queue) : 각각 한쪽만 추가 삭제 할 수 있는 Queue와 달리 양쪽 끝에서 추가 상제가 가능하다.

이 Deque 구현체 중에 ArrayDeque와 LinkedList가 있다.

 

📍메모리 구조의 Stack 대해서는 아나?

프로그램이 자동으로 사용하는 임시 메모리 영역,  함수 호출시 지역변수, 매개변수가 저장되고 함수 종료시 사라진다. Stack 영역에서는 이름처럼 Stack 구조를 사용하기 때문에 후입 선출 방식으로 push로 데이터를 저장하고 pop으로 데이터를 인출한다. 

 

📍메모리 구조에 대해서 

Code : 실행할 프로그램의 코드가 저장되는 영역, 텍스트 영역이라고도 하며, 프로그램이 시작하고 종료 될때까지 메모리에 계속 남아 있는다. 

Data : 프로그램의 전역 변수와 정적 변수가 저장되는 영역. 프로그램 시작과 함께 할당되며 종료시 소멸한다. 

Stack : 프로그램이 자동으로 사용하는 임시 메모리 영역,  함수 호출시 지역변수, 매개변수가 저장되고 함수 종료시 사라진다. Stack 영역에서는 이름처럼 Stack 구조를 사용하기 때문에 후입 선출 방식으로 push로 데이터를 저장하고 pop으로 데이터를 인출한다. 메모리의 높은 주소에서 낮은 주소로 할당한다. 

Heap : 프로그래머가 직접 공간을 할당, 해제하는 메모리 공간으로 런 타임 크기가 결정된다. new 연산자를 통해 메모리를 할당한다. 힙 영역은 선입선출의 방식으로 메모리의 낮은 주소에서 높은 주소 방향으로 할당한다(Stack과는 반대방향). 

 

📍오버 플로우

한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘치는 현상이다. 

힙은 메모리 위쪽 주소 부터 할당하고, 스택은 메모리 아래쪽 주소부터 할당되어 각 영역이 상대 공간을 침범하는 일이 발생하는데 힙이 스택을 침범하면 힙 오버 플로우라고 하며, 반대로 스택이 힙을 침범하면 스택 오버 플로우라고 한다. 

 

📍해결방법

 

📍DFS 에서 stack이나 재귀함수로 푸는데 왜 이걸 사용하는 걸까

 

📍java의 컬렉션의 stack은 무엇을 상속받고 있을까요? 내부 구현은 어떻게 되어 있을까

java에서 stack은 vector를 상속받아 사용하는 데 vector는 sychronized 처리가 되어 있어 권고 되지 않는다.

대신 Deque를 사용하는 것을 추천하고 있다. 

 

📍Stack을 구현한다면 어떤 자료구조를 사용해서 구현 할 수 있을까요?

ArrayList로 구현, ArrayList가 제공하는 메서드로 Stack구현이 쉽기때문(?)

 

 

📍 Array vs LinkedList

배열과 링크드리스트는 입력된 데이터들이 나열되어 저장되어 있는 자료구조라는 공통점이 있지만, 그 연결 방식이 다릅니다.

 

  • 연결의 차이

배열은 메모리 공간에서 연속적으로 저장되어 있고 처음 생성할 때 그 크기를 정하며 자바 같은 경우에는 이후 변경이 불가능합니다. 데이터 접근 시에는 index를 통해 접근하게 하거나 순차적으로 탐색하여 접근하게 됩니다. 링크드리스트는 배열과 달리 메모리를 연속적으로 사용하지 않고 데이터를 담은 노드들은 이전과 다음 노드를 나타내는 포인터를 통해 연결됩니다.

 

  • 데이터 접근 및 삽입과 삭제에서의 차이

링크드 리스트는 배열과는 다르게 index가 없어 바로 접근이 불가능하고 순차적인 검색을 통해 데이터에 접근하게 됩니다.

이런 특징 때문에 배열에 비해 탐색적인 면이 불리해 보이지만 이 특징은 삭제와 삽입에서 용이하게 작용합니다. 배열에서 배열 중간에 값을 삭제하거나 제거하면 그 인덱스 이후 모든 값이 모두 당겨지거나 밀려나는 큰 처리가 일어나나 링크드리스트는 포인터만 수정하기 때문에 삭제 삽입 전후 노드만 수정하면 됩니다.

 

  • 메모리 할당 차이

배열은 선언시 컴파일 당시에 메모리가 할당되어 정적 메모리로 할당 받는다

Lisnked list의 메모리는 새로운 노드가 추가될 때마다 할당되어 동적 메모리 할당을 받는다. 

 

더보기

📍ArrayList 사이즈 증가하는 원리

List가 외부적으로 size를 자유자제로 변하는 것처럼 보이지만 실제로는 사이즈가 변하는 게 아니라 새로운 배열로 저장하는 것이다. 

배열을 더이상 저장할 공간이 없으면 보다 기존 배열의 1.5배 큰 새로운 배열을 생성해서 기존 배열에 저장된 내용을 새로운 배열로 복사한 다음 저장한다. 

 

📍깊은 복사 vs 얕은 복사

ArrayList는 얕은 복사가 일어난다. 왜?

- 깊은 복사

객체를 복사할 때 "인스턴스 변수까지" 복사함

별도의  메모리 공간에 값을 복사하여 복사한 값을 변경해도 원본에 영향을 미치지 않는다.

 

- 얕은 복사

객체를 복사할 때 "객체만, 주소값만"을 복사함

따라서 두 원본, 복사 인스턴스 변수는 같은 객체를 바라보고 있어 한쪽이 수정되면 다른 한쪽도 변경된다.

 

- 방어적 복사

 

 

📍자바 List 종류

  • ArrayList : Vector 클래스의 단점을 보완하기 위해서 나온 클래스. 객체를 추가하면 객체가 인덱스로 관리된다.  인덱스로 관리되는 것은 배열과 유사하지만 사용중에 크기가 변할 수 있다는 큰 차이점이 있다. Thread-safe하지 못하다. 멀티스레드 환경에서 사용해야 한다면 CopyOnWriteArrayList 또는 Collections.synchronizedList를 사용할 수 있습니다. ArrayList는 초기 용량이 10이고 초과하면 1.5배, iterator만사용할 수 있다.
  • Vector : 벡터는 자바 컬렉션 프레임워크가 나오기 전부터 있던 클래스. 순서를 유지하고, 중복을 허용한다. , iterator와 Enumeration이 사용가능하다. 초기용량 10이고 초과하면 2배. HashTable과 마찬가지로 소스 코드 호환 때문에 남아 있는 클래스 이기 때문에 ArrayList를 사용하는 것이 추천된다. Vector가 성능적으로 문제가 되는 건 Thread-safe 특성 때문인데 동기화가 필요한지 여부와 상관없이 작업을 잠그는 오버헤드가 있기 때문.
  • LinkedList : 링크드리스트 역시 List의 구현체지만, 메모리를 연속적으로 사용하지 않고 데이터를 담은 노드들은 이전과 다음 노드를 나타내는 포인터를 통해 연결된다. 배열에서는 중간 값을 삽입하거나 삭제하면 그 뒤의 값을 전부 앞으로 끌고오거나 밀어내야하는 큰 이동이 있는데 링크드리스트 사이에 값을 삽입, 삭제시 연결하는 포인터를 수정하기만 하면 되므로 이런 상황에서의 성능이 우수하다  

📍 링크드 리스트 종류

- 단일 연결 리스트 (singly linked list)

저장하는 데이터가 들어가는 데이터 필드와 다음 노드를 가리키는 링크 필드가 있는데 단일 연결 리스트는 마지막 노드의 링크가 null로써 마지막 노드를 표현하는 것이 특징

 

- 원형 연결 리스트 (circular linked list)

마지막 노드의 링크필드가 null이 아니라 첫 번째 노드를 가리키는 것이 특징

하나의 노드에서 다른 모든 노드로 접근이 가능해(?) 삽입과 삭제가 용이

 

- 이중 연결 리스트 (doubly linked list)

한 노드에 오른쪽 링크, 왼쪽 링크가 존재한다. 특정 노드에서 양방향으로 자유롭게 움직일 수 있어,  단일 리스트가 선행 노드를 찾기 힘든것, 원형 리스트는 한바퀴를 다시 돌아 선행 노드를 찾아야하는 점 등의 단점을 보안했다.

그러나 링크필드가 늘어남에 있어 공간을 더 많이 차지하게 되었고 코드가 복잡하다는 단점이 있다.

 

+ 왜 이런 종류가 나왔을까? 무슨 문제점이 일어나서 생겼을까?

스프링 부트 앞단 Tomcat이 큐로 HTTP 요청을 받음, 이게 쌓이면 뒤에 오는 요청이 버려지기도 한다. 그리고 request는 Ack을 받기 전까지 계속 데이터를 보내는? 이거는 좀더   

 

📍 우선순위 큐는 어떤 자료구조로 이루어져있는지, 큐에 대한 걸 더 보안해

 

 

🙃아직 2차 정리가 필요한 글!

 

📌 @SpringBootTest와 @WebMvcTest의 차이점을 설명해 주세요.

둘다 JUnit5를 사용한 테스트 코드를 사용할 때 사용되는 어노테이션이다

@SpringBootTest

  • 프로젝트의 "전체" 컨텍스트를 load하여 프로젝트 전체의 Bean을 모두 주입하기 때문에 속도가 느리다. (테스트 대상이 아닌 Service, Repository 객체도 모두 메모리에 사용된다)
  • 주로 통합 테스트를 할 때 사용한다.
  • 실제 환경과 가장 유사하게 테스트가 가능하다.
  • Service 메서드의 스펙이 변경되어도 Mocking 값을 수정하지 않아도 된다 (변경이 자유롭다)
  • 테스트 단위가 커서 디버깅하기 어렵다.

@WebMvcTest

  • 필요한 Bean만을 등록해 테스트에 필요한 의존성만을 추가하여 슬라이스 테스트를 진행할 수 있다. 테스트가 빠르다 
  • 컨트롤러 역할만 테스트한다.
  • Web Layer(?)에 해당하는 Bean만 빠르게 생성한다.
  • 통합 테스트를 위해 Mock으로 테스트 할 수 있다.
  • Mock객체를 사용하므로 실제 동작과 차이가 있다.
  • Mocking 메서드의 변경이 일어나면 수정해줘야 한다. 
더보기

📍 Mock 객체란?

 

📍테스트 코드의 장점

 

📍유저의 행동반경 확인, 오류  

 

📍테스트 단위

 

 

📌 트랜잭션이 무엇인지 설명해 주세요.

트랜잭션이란 데이터베이스에 질의어를 이용하여 접근해 상태를 변화 시키기 해서 수행하는 작업의 단위를 말한다. 이는 작업의 완전성을 보장해주는 것으로, 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리 못했을 경우 롤백하여 작업의 일부만 적용되는 현상이 일어나지 않도록 한다

 
트랜잭션의 4가지 특징(성질) : ACID

  • 원자성(Atomicity)은 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다
  • 일관성(Consistency)은 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다
  • 고립성(Isolation)은 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다
  • 지속성(Durability)은 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다
더보기

📍RollBack

하나의 트랜잭션 처리가 정상적으로 종료되지 못한 경우 이전 상태로 돌아가는 것

 

📍Commit

하나의 트랜잭션이 성공적으로 끝나, DB의 상태가 일관성이 있음을 알리는 연산

 

📍트랜잭션의 상태

 

📍트랜잭션 격리 수준 (Isolation Level)

* 정의 :

여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 고립되어 있는지를 나타내는 것이다. 다른 트랜잭션이 변경한 아직 완료가 되지 않아 일관성이 확보되지 않은 값에 대해 조회 또는 변경을 허용하는 수준을 말한다.  

 

* 일관성이 없는 데 왜 허용을 해줘야 하나?

트랜잭션에 완전한 Lock을 통해 완전한 독립성을 보장하면 데이터베이스에 대한 무결성을 지킬 수 있으나 동시에 수행되는 많은 트랜잭션들이 순서를 기다려야하는 것 때문에 응답이 늦어지고 성능이 떨어지게 된다. 

 

* isolation level의 종류

- Read Uncommitted (레벨 0)  

아직 완료되지 않은(Uncommitted 또는 Dirty) 트랜잭션이 변경한 데이터를 다른 트랜잭션이 읽는 것을 허용.

select 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 "않는" level

 

- Read Committed (레벨 1) : default

트랜잭션이 수행되는 동안 다른 트랜잭션 접근 불가. Commit된 데이터만 조회 가능

select 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 level

 

- Repeatable Read (레벨 2)

트랜잭션 완료까지 select 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 level

 

- Serializable (레벨 3)


📍트랜잭션 전파, 속성?

 

 

 

03. 기술 면접 - 데이터베이스 - 트랜잭션 (Transaction)

공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다 트랜잭션이란? - 데이터베이스의 상태를 변환시키는 하나의 논리적인 작업 단위

theheydaze.tistory.com

 

 

📌 TCP와 UDP의 공통점과 차이점을 설명해보세요.

TCP는 신뢰성이 보장되는 전송 시에 이용하며 3 way handshake를 통해 신뢰성을 보장하게 된다. 신뢰성 있는 연결이라 하는 이유는 3 way handshake를 통해 프로그램이 데이터를 전송하기 전에 먼저 목적지와 수신지를 확실하게 하여 세션을 수립하여 전송을 보장하기 때문이다.
수립과정은 

  • 클라이언트가 서버에 SYN패킷으로 요청을 보내고 응답을 기다리는 SYN_SENT 상태가 된다. 
  • 서버는 SYN 요청을 받아 클라이언트에게 SYN / ACK 패킷을 보내고 응답을 기다리는 SYN_RECEIVED 상태로 기다린다. 
  • 마지막으로 클라이언트가 서버로부터 응답을 받아 ACK 패킷을 보내면 서버의 상태가 ESTEBLISHED가 되어 연결이 수립되고 데이터가 오고 가게 된다.

UDP는 이런 신뢰성은 보장하지 않지만 TCP와 같은 절차가 없어 TCP 보다 빠르고 네트워크 부하가 적다는 장점이 있다. 따라서 TCP는 확실히 데이터가 전송되어야 하는 부분에서 사용하나 UDP는 신뢰성 보다는 연속성이 중요한 실시간 스트리밍과 같은 서비스에 사용된다.

 

더보기

📍OSI 7계층에서 전송계층 사용

 

📍패킷이란

 

📍공통점 : 오류 체크 체크썸

둘다 포트 번호를 통해 목적지 설정


📍3 way handshake

📍4 way handshake

 

 

🙃아직 2차 정리가 필요한 글!

 

📌 Parameter와 Argument의 차이에 대해 설명해주세요.

📍Parameter (매개변수)

매개변수는 메서드가 작업을 수행하는 데 필요한 값을 제공 받기 위한 것으로 필요한 만큼 메서드 정의시 선언부에 선언하게 된다. 

 

📍Argument (인자, 인수)

인자는 메서드를 호출할 때 괄호 안에 지정해준 값이며 메서드 호출시 전달되는 실제 값을 의미한다. 인자 값은 메서드의 매개변수에 대입되기 때문에 메서드에 선언된 매개변수와 개수, 순서 등이 일치해야한다. 타입 또한 일치하거나 자동 형변환이 가능한 것이어야 한다.

 

📍Call by Value vs Call by Reference

Call by Value 호출 방식은 메서드 호출시 전달되는 인자의 값을 복사하여 메서드의 매개변수로 대입하는 방식이다. 복사된 값은 메서드 안에서 로컬 변수로 사용되어 변경이 생겨도 메세드 밖의 원본 값에 영향을 미치지 못한다. 

복사하여 처리하기 때문에 원본 값이 안전하다는 장점이 있지만 복사한 만큼 메모리를 추가적으로 사용한다는 단점이 있다.

Call by Reference 호출 방식은 메서드 호출시 전달되는 인자의 참조주소를 복사하여 전달하기 때문에 메서드 안에서 변경이 생기면 원본에도 영향을 미치게 된다. 복사하지 않고 참조하기 때문에 빠르다는 장점이 있다.

그런데.... 참조주소를 복사하여 전달하는 것도 결국은 값을 복사하는 거기 때문에 Call by reference도 사실상 Call by Value가 아닌지....

 

 

📌 프로세스와 스레드의 차이에 대해 설명해 주세요

실행 중인 프로그램을 의미하며, 프로그램을 실행하면 OS부터 실행에 필요한 자원을 할당 받아 프로세스가 된다.

프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 스레드로 구성되어 있다. 스레드는 프로세스의 자원을 이용해 실제로 작업을 수행하는 것을 말합니다. 그래서 모든 프로세스에는 최소 한가지 이상의 스레드가 존재하며,  둘 이상의 스레드를 가진 프로세스를 멀티스레드 프로세스라고 한다.

 

프로세스는 OS로 부터 각자의 자원을 할당받아 서로 자원을 공유하지 않는다. 

스레드는 프로세스의 내에서 Stack만 따로 할당 받고 Code, Data, Heap영역을 공유한다. 

 

더보기

📍프로그램

저장 장치에 파일이 저장되어 있지만 메모리에는 올라가 있지 않은 정적인 상태

 

📍OS로부터 프로세스가 할당 받는 메모리 영역 구조

Code :

Data :

Stack :

Heap :

 

📍멀티 프로세스 = 멀티 태스킹

CPU에 존재하는 여러개의 프로세서(여러개의 코어)가 실제로 병렬적으로 일을 처리하는 것 즉, 여러개의 프로그램이 동시에 실행될 수 있는 것이다. 동시성과 달리 물리적으로 여러가지 일을 한꺼번에 수행한다. 

 

📍멀티 스레드

하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행하는 것이다. 여기서 말하는 특징이 동시성인데 CPU의 코어는 한번에 한가지 일만 할 수 있으므로 실제로 동시에 수행하는 것은 아니며 스레드 간에 빠르게 교차되면서 실행되기 때문에 동시라고 느끼게 된다.

 

장점) 

- CPU의 사용률을 향상시킨다

- 자원을 보다 효율적으로 사용할 수 있다.

- 사용자에 대한 응답성이 향상된다. (싱글스레드로 서버 프로그램을 작성한다면 사용자의 요청마다 새로운 프로세스를 생성해야하는 데 스레드를 생성하는 것 보다 더 많은 시간과 메모리를 차지해 많은 수의 요청을 서비스하기 어렵다)

- 작업이 분리되어 코드가 간결해 진다. 

 

단점)

여러스레드가 같은 프로세스 내의 자원을 공유하면서 작업을 하기 때문에 동기화 문제, 교착상태와 같은 문제가 발생할 수 있다.

 

📍스레드 간의 작업 전환 (Context Switching / 컨텍스트 스위칭)

멀티스레드로 작업을 수행하게 되면 싱글 스레드로 2가지 일을 하는 것보다 시간이 더 걸리게 되는데 이는 두개의 작업을 번갈아가며 작업할 때 전환하는 시간이 걸리기 때문이다. 전환할 때는 현재 진행 중인 작업의 상태(ex. 다음에 실행할 위치 등)의 정보를 저장하고 읽어 오는데 걸리는 시간이다. 

 

📍스레드의 우선 순위

 

 

📍동기 (Synchronization) 그리고 비동기 

동기는 순차적으로 발생하는 코드 흐름을 의미하며 요청과 동시에 결과가 주어질 것이라는 걸 보장 받는다.

그 한 작업에 대한 보장을 하기에 설계가 매우 간단하고 직관적이지만 그 한 작업을 보장하기 위해 결과가 나올 때까지 내내 대기해야 한다.
비동기화는 순서 없이 자유롭게 발생하는 코드 흐름을 뜻하고 요청 이후에 결과를 받기 전까지 다른 작업들을 진행할 수 있다. 결과가 주어지기까지 여러 작업을 할 수 있어 자원을 효율적으로 쓸 수 있지만 그걸 가능하게 하려면 동기화 보다는 복잡한 설계가 이루어져야 한다.

 

📍스레드 동기화

멀티 스레드의 경우 여러 스레드가 같은 자원을 쓰게 되면서 서로의 작업에 영향을 주게 된다. 그래서 의도치 않은 결과를 얻는 문제가 발생할 수 있다.

이를 방기하기 위해 동기화를 해주게 되는 데

방법1)

synchronized 키워드를 통해 임계영역을 설정하는 것이다. 2가지 방법이 있는데 메서드 전체를 임계영역으로 설정하는 경우 메서드 호출시점부터 해당 메서드d에 포함된 객체의 lock을 얻어 작업을 수행하다 메서드가 종료하면 lock을 반환한다.

또는 특정한 영역을 임계 영역으로 지정하게 되는 데 해당 영역 블럭에 들어가면서 지정한 객체에 대한 lock을 얻고 이 블럭을 지나가면 그 객체에 대한 lock을 반환한다.

임계영역은 멀티스레드 프로그램의 성능을 좌우하기 때문에 가능하다면 메서드 전체보다는 영역을 최소화하여 효율적이니 프로그램이 되게 해야한다. 

방법2)

wait()와 notify() 방법으로 synchronized로 하나의 객체에 lock이 걸리면 임계영역으로 지정된 코드가 끝날때까지 다른 스레드는 모두 기다려야하는 문제를 개선하기위해 나왔다. 동기화된 임계영역 코드를 수행하다가 작업을 진행할 상황이 아니면 wait()를 호출하여 스레드가 lock을 반납하고 기다린다. 그러면 다른 스레드가 lock을 얻어 해당 객체에 대한 작업을 수행하고 아까 lock을 반납한 스레드가 작업을 진행할 수 있게 되면 notify()를 호출해 다시 lock을 얻어 중단했던 작업을 이어간다(재진입 / reentrance). 하지만 오래 기다린 스레드가 먼저 lock을 얻는 다느 보장이 없어서 계속 lock받지 못하고 기다리는 기아 현상이 나타날 수 있다. 또한 같은 객체에 대해 우선적으로 처리해야하는 스레드와 그 처리 이후에 작업을 할 수 있는 스레드가 있는 경우, 우선순위가 높아야할 스레드가 먼저 통지를 받아야하는 데 전부 같이 경쟁하는 경쟁 상태에 놓일 수도 있게 된다.

 

방법이 3가지 더 있는데 일단 여기까지

 

 

📍교착상태 (Deadlock)

두개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있어 결국 아무것도 완료되지 못한 상태를 말한다. 

 

📍교착상태 발생 조건 : 조건 4가지가 모두 만족되야 발생

- 상호배제 : 한번에 한개의 프로세스만이 공유자원을 사용할 수 있음

- 점유대기 : 프로세스가 할당된 자원을 가진 상태로 다른 자원을 기다림

- 비선점 : 이미 할당된 자원을 강제적으로 빼앗을 수 없어 다른 프로세스가 자원을 자발적으로 반환 할 때 까지 기다림

- 순환대기 : 프로세스의 자원 점유와 점유된 자원을 요청하는 관계가 원형을 이루며 대기. 

 

📍교착상태 해결방법

- 예방 : 교착상태가 애초에 발생하지 않도록 하는 방법으로 교착상태 발생 조건 4가지 중 하나라도 부정함으로써 해결하는 방법이다. 하지만 이 방법은 시스템 처리량이나 자원 사용의 효율성을 떨어뜨리는 단점이 있다.

 

- 회피 : 교착상태가 발생할 가능성이 있는 자원은 할당하지 않고 안전 상태의 자원요청만 허가 하는 방법

프로세스 수 고정, 자원 종류와 수 고정, 프로세스가 요구하는 최대 자원수 인지, 프로세스 자원 사용후 반드시 반납

과 같은 가정이 필요하다

교착상태를 회피하기 위한 알고리즘으로는 은행원 알고리즘과 자원 할당 그래프 알고리즘이 있다.

하지만 회피방법은 문제 발생에 대한 일관성과 가정이 완벽할 것이라는 보장이 현실적으로 어렵다는 문제가 있다. 

 

- 탐지 : 시스템에 데드락이 발생했는 지 여부를 탐색하고 탐지되었다면 회복 기법 알고리즘을 활용해 교착상태를 복구하는 방법. 하지만 지속적인 탐지로 인한 오버헤드가 발생한다

 

- 회복 : 교착상태가 발생했을 때 해결하는 기법

사용자 처리: 교착상태 프로세스 중 하나를 사용자가 직접 강제 종료

시스템 처리 :

프로세스 중지 ( 교착상태에 있는 모든 프로세스를 중지하거나, 교착 상태가 해결 될때 까지 하나씩 중지),

자원 선점(프로세스로 부터 자원을 빼앗아 교착상태가 해결될때까지 다른 프로세스들에게 자원 할당)

 

-무시 : 교착상태에 대해 대비하지 않는다. 

대부분의 운영체제에서 사용하는 가장 일반적인 방법. 교착상태를 대비하기 위한 방법들의 비용 소모가 발생 확률에 비해 너무나도 커서 취하는 방법이다.

 

📍은행원 알고리즘

자원 할당 결정전에 예상되는 모든 자원의 최대 할당량을 가지고 시뮬레이션 하여 안전상태에 들 수 있는지 여부를 검사하여 교착상태를 미리 조사하는 알고리즘

 

📍자원 할당 그래프 알고리즘

자원 할당 그래프에 예약 간선을 추가하여 예약 간선으로 설정한 자원에 대해서만 자원 할당을 요청할 수 있고 사이클이 형성되지 않을 때만 자원을 할당하는 방법

 

📍동시성과 병렬성

동시성은 컴퓨터의 코어가 여러가지 작업을 동시에 수행하는 개념이나 사실은 동시에 실행되는 것 처럼 보이는 것을 말합니다. 코어는 한번에 하나의 명령어만 처리할 수 있는데, 멀티 스레드를 동작시켜 그 스레드간에 빠르게 교차되면서 실행되기 때문에 동시라고 느끼게 되는 것이다. 동시성은 여러 일을 한꺼번에 다루는 것에 관한 논리적인 개념이라고 봅니다.
병렬성은 컴퓨터의 코어가 2개 이상의 것에서 실제로 동시에 여러 작업을 처리하는 것을 말합니다.  동시성과는 달리 여러 일을 한꺼번에 실행하는 물리적인 개념으로 봅니다.

+ Recent posts