- 스레드 프로세스 설명
프로세스는 운영체제로부터 자원을 할당 받는 작업의 단위이고,
스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스는 운영체제로부터 cpu, 메모리등의 자원을 할당 받고,
스레드는 이 자원을 공유하면서 작업을 처리한다.
프로세스가 실행되면 메인 스레드가 생성되고 이 메인 스레드에서 작업이 진행된다.
스레드 간에는 메모리를 공유 하면서 작업을 빨리 처리할 수 있다.
멀티 스레드 프로그램을 구현할 때는 자원의 공유에 대해서 유의 하면서 작성해야 한다.
- 데드락, 뮤텍스, 세마포어
데드락: 교착상태, 두개 이상의 작업이 상대방의 작업이 끝나기만을 기다리면서 대기하는 것, 아무 작업도 완료되지 못하는 상태
뮤텍스: 상호배제, 크리티컬 섹션을 가진 스레드의 실행 시간이 겹치지 않게 단독으로 실행될 수 있게 하는 기술이다.
한 스레드가 크리티컬 섹션을 사용하고 있으면 다른 스레드가 사용하지 못하게 대기하게 한다.
세마포어: 공유된 자원의 데이터를 여러 '프로세스'에서 접근하는 것을 막는 것
가장 큰 차이는 동기화 대상의 갯수
뮤텍스는 동기화 대상이 하나뿐이고, 세마포어는 동기화 대상이 하나 이상일 때
뮤텍스는 상태가 0, 1 두개 뿐인 이진 세마포어
-JVM
자바 가상 머신
자바 바이트 코드를 실행 할 수 있는 주체
자바 바이트 코드는 플랫폼 독립적이며 모든 JVM은 규격에 정의된 대로 자바 바이트 코드를 실행한다.
자바 컴파일러가 .java를 .class 의 자바 바이트 코드를 생성한다.
-인터프리터, 컴파일러, JIT
인터프리터는 실행시간에 기계어로 변경하여 실행하는 것
컴파일러는 실행하기전에 프로그램을 기계어로 변경
JIT는 인터프리터와 컴파일러 방식을 혼합하여 실행시점에 기계어 코드를 생성하면서 그 코드를 캐싱하여 같은 함수가 여러번 불릴때 기계어 코드를 생성하는 것을 방지
- Java의 메모리 영역
클래스 영역(메소드 영역)
- 자바 클래스가 로드 되는 영역
- 자바 바이트 코드가 로드 되는 영역
- 클래스 정보
- static 변수 정보
- 메소드 정보
힙영역
- new 연산자로 생성된 객체와 배열을 저장하는 공간
- 클래스 영역에 로드된 클래스만 생성 가능
- GC가 진행되는 영역
- Permanent Generation :
- 생성된 객체들의 정보의 주소 값이 저장된 공간
- New Area:
- Eden
- 객체들이 최초로 생성 되는 공간
- Survivor1, 2
- Old Area
- New Area 에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간
- 세가지 영역으로 구분됨
스택영역
- 지역변수, 매개변수가 저장
- 메소드가 실행될때의 변수가 기록되고, 메소드가 종료되면 사라짐
네이티브 메소드 영역
- 네이티브 메소드들이 저장되는 공간
PC 레지스터
- 스레드가 생성될때마다 생성되는 공간
-GC 실행 과정
- 마킹
- 참조 되는 영역과 참조 되지 않는 영역을 구분하여 삭제 대상을 마킹
- 삭제
- 마킹된 영역을 삭제
- 압축
- 남은 공간의 사용 효율을 높이기 위해서 압축
-Java의 GC 실행과정
자바의 GC는 마이너 GC와 메이저 GC 두가지가 있다. 그리고 힙영역에서 GC가 일어 난다.
힙영역은 PermGem, New, Old 영역으로 구성되고, New, Old 영역에서 GC가 일어난다.
메이저 GC는 마이너 GC에 비해 시간이 오래 걸리고 실행중 프로세스가 정지 된다.
마이너 GC: New 영역에서 일어나는 Garbage Collection
1) Eden영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection 발생
2) Survivor1 영역에 값 복사
3) Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
4) Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우,
Eden 영역에 생성된 객체와 Survivor1영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
5) 참조되고 있는 객체를 Survivor2 영역에 복사
6) Surviver2 영역을 제외한 영역의 객체들을 삭제
7) 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
이후 이 작업을 반복
메이저 GC
1) Old영역에 있는 모든 객체들을 검사
2) 참조되지 않은 객체들을 한꺼번에 삭제
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
- 스택과 큐의 차이
<스택>
- LIFO 구조
- push, pop 구현
- top 변수로 현재의 위치 확인
<큐>
- FIFO
- enqueue, dequeue 를 구현
- 파일안의 내용을 읽을 때 캐쉬와 연관지어 설명
파일의 IO 성능 향상을 위해 페이지 캐시라는 메모리 영역을 만들어서 사용
한번 읽은 파일의 내용을 페이지 캐시에 저장해 놨다가 다시 한번 동일한 파일에 접근이 일어나면 디스크에 접근하지 않고 캐시에서 읽어서 제공하는 방식
- 콜바이 밸류, 레퍼런스 차이
함수를 호출할 때 인자의 값을 넘겨주는가 주소를 넘겨주는 가의 차이
자바는 기본적으로 call by value 이지만 기본자료형과 참조 자료형의 차이로 인하여 call by reference 효과를 낼 수 있다.
- 리플렉션의 사용이유
구체적인 클래스 타입을 알지 못해도 컴파일된 클래스의 정보를 알아내어 클래스를 사용할 수 있는 기법이 리플렉션
클래스 파일은 바이트 코드가 되고 이것이 클래스 영역에 보관된다.
동적으로 클래스를 교체하여 프렘워크에서 유연성있는 동작을 보장
- 큐를 이용해 스택처럼 사용할 수 있는 알고리즘
- 2개의 큐를 이용하여 구현
- 한개의 큐에는 데이터를 저장하고, 데이터를 출력할 때 다른 큐에 순서대로 넣어서 출력
큐, 스택 구현 방법
큐는 head, tail 두개의 변수를 이용하여 데이터가 있는 위치와 나가야할 위치를 확인
스택은 top 하나만 이용해서 구현
- 메모리 누수(Memory Leak)
프로그램에서 할당한 메모리를 회수 하지 않아서 가용한 메모리가 줄어 들면서 부족해 지는 현상
- wrapper 클래스의 사용으로 오토박싱된 메모리가 해제 되지 않는 현상
- 캐쉬로 객체를 사용하고 해제 하지 않는 경우
- 자료구조를 생성하면서 제대로 처리하지 않는 경우
- 파이썬의 GIL
- 한번에 하나의 스레드만 사용할 수 있게 락(Lock)을 거는 것
- 공유자원의 관리를 간단하게 GC를 사용하기 편리하다. c/c++ 확장모듈의 개발도 편리
- 멀티스레드를 사용하기 위해서 멀티프로세스 모듈을 이용
- 파이썬의 성능이 느린 이유
- 인터프리터 언어라서 처리에 느림
- 하지만 생산성이 높음
- 패턴
- 전략 패턴(Strategy Pattern)
- 알고리즘을 변경할 수 있게 만든 패턴
- 싱글톤 패턴(Single Pattern)
- 동일한 인스턴스를 프로그램 전역에서 사용할 때 유용하게 쓸수 있는 패턴
- 정렬 알고리즘
- 거품정렬
- 선택정렬
- 삽입정렬
- 퀵정렬
'개발자 > 면접' 카테고리의 다른 글
[hive] 하이브 관련 주요 면접 질문 (0) | 2018.04.18 |
---|---|
[스크랩] 기술 면접 관련 질문 (0) | 2018.01.16 |
[면접] 면접질문 모음 사이트 - Awsome Interview (0) | 2017.12.26 |
[면접][Hadoop] 맵리듀스(MapReduce) 관련 면접 주요 질문 (0) | 2017.09.25 |