원티드 프리온보딩 백엔드 챌린지

흑이·2023년 6월 5일
0

원티드 프리온보딩 백엔드 챌린지 6월 과정 사전 과제 제출


Question

인터프리터 방식과 컴파일 방식의 차이점을 서술해 주세요.

  • 인터프린터 방식
    • 코드를 한 줄씩 읽어가며 이진코드로 변환, 컴파일을 하는 과정이 필요 없기 때문에 코드 수정이 잦은 서비스의 경우 업데이트가 훨씬 수월하지만 실행 속도는 컴파일러 언어보다 느리다.

  • 컴파일 방식
    • 코드 전체를 컴파일러를 통해 변환, 컴파일 이후에는 최적화된 코드를 한번에 실행하기에 실행이 빠름, 코드 수정 시 컴파일 과정을 다시 진행해야 하기 때문에 개발 편의성이 떨어진다.

프로세스와 스레드의 차이점을 서술해 주세요.

  • 프로세스
    • 독립적인 메모리 공간을 가진다.
    • 운영체제로부터 자원을 할당 받아 실행되며, 다른 프로세스의 메모리와 자원에 직접 접근할 수 없다.
    • 자원을 새롭게 설정하는 과정이 요구되므로 생성 비용이 크다.
    • 컨텍스트 전환이 오래 걸림
    • 프로세스의 자원 공유와 통신은 주로 특수한 상호 작용 기술(IPC)을 사용해야 한다.
    • 운영체제가 자원을 각자 분리해서 관리하기 때문에 안정성과 보안 측면에 유리

  • 스레드
    • 프로세스 내에서 실행되는 작업 흐름으로, 같은 프로세스 내에서 공유되는 메모리와 자원을 활용
    • 동일한 프로세스 자원을 공유하기 때문에 생성 비용이 낮다.
    • 컨텍스트 전환이 빠름
    • 프로세스 내의 자원을 공유하므로, 스레드 간의 통신이 훨씬 쉽고 빠름

JVM의 정의와 메모리 구조를 아는 대로 서술해 주세요.

자바 바이트 코드를 실행할 수 있는 환경을 제공하는 가상 머신
JVM을 통해 개발자는 하드웨어와 운영 체제에 상관없이 자바 코드를 실행할 수 있으며, 재사용성과 플랫폼 독립성을 가진다.


1. 메소드 영역 : 클래스와 인터페이스에 대한 정보를 저장하기 위한 영역으로, 필드, 메소드, 인터페이스 등의 정보 및 클래스의 static 변수를 저장한다.


2. 힙 영역 : 객체와 배열을 저장하는 영역으로, 메소드와 스레드에 독립적이며 공유되는 자원, 가비지 컬렉터가 동작하는 주 영역으로, 사용되지 않는 객체를 정리해 주는 역할


3. 스택 영역 : 메소드를 실행할 때 마다 프레임이 생성되는 영역으로, 지역변수와 매개 변수, 리턴값 및 연산 중 발생하는 값들을 저장하며, 스택 프레임은 메소드 호출이 종료되면 사라진다.


4. PC 레지스터 : 스레드가 시작될 때마다 생성되며, 현재 실행되고 있는 명령의 주소를 저장하는 영역으로, 각 스레드마다 하나씩 존재


5. 네이티브 메소드 스택 : JVM 밖의 순수한 C/C++ 코드를 실행하기 위한 스택으로, JNI(Java Native Interface)를 통해 호출되는 네이티브 메소드의 실행 정보를 저장

Java의 GC 알고리즘 중 하나만 선택해 아는 대로 서술해 주세요.

Mark and Compact : Mark 단계에서는 Mark and Sweep 알고리즘과 동일하게 도달 가능한 객체에 마킹, 이후 Compact 단계에서 살아있는 객체들을 한 곳으로 옮기고, 마킹되지 않은 객체들을 삭제해 빈 공간을 생성

세마포어에 대해서 아는 대로 서술해 주세요.

운영체제에서 여러 프로세스나 스레드가 공유 리소스에 대한 동시 접근을 제어하는 동기화 기술, 정수 값으로 표현


1. P(Proberen) 연산: 세마포어 값이 0 이하라면 실행을 중지하고, 세마포어 값을 1 감소시킵니다.


2. V(Vertex) 연산: 세마포어 값을1 증가시킵니다. 이후 세마포어 값이 0보다 크고, 실행 중지된 스레드나 프로세스가 있는 경우 실행 재개합니다.


세마포어를 통해 공유 리소스에 접근하는 과정


스레드나 프로세스가 공유 리소스에 접근할 때 P 연산을 수행합니다. 이때마포어 값이 음수이면 이 스레드나 프로세스는 기다립니다.


공유 리소스 접근이 허용되면 작업을 수행합니다.


작업이 완료되면 V 연산을 수행해 세마포어 값을 증가시키고, 기다리는 다른 스레드나 프로세스의 실행을 재개합니다.

Java의 synchronized에 대해서 아는 대로 서술해 주세요.

  • synchronized 키워드를 사용하면 객체나 메소드에 대한 동시 접근을 제한하고, 한 시점에 오직 한 스레드만 접근이 가능하게 함으로써 동시성 문제를 해결할 수 있다.


    자바에서 synchronized 키워드는 주로 두 가지 용도로 사용

  1. 동기화된 블록: 동기화된 블록은 주어진 시간에 하나의 스레드만 블록을 실행할 수 있도록 하는 반면, 동일한 블록에 액세스하려는 다른 스레드는 차단되고 잠금이 해제될 때까지 대기합니다.


    synchronized (object) {
    // Synchronized code block
    }

  2. 동기화된 메서드
    public synchronized void synchronizedMethod() {
    // Synchronized method body
    }


    synchronized는 스레드 안전을 달성하기 위한 강력한 도구이지만 과도하게 또는 비효율적으로 사용하면 성능 오버헤드가 발생할 수 있다는 점에 유의해야 한다.

0개의 댓글