포스트

10/3 면접 준비


CS 관련 지식

운영체제

1. 프로세스와 스레드의 차이
  • 프로세스는 메모리 상에서 실행중인 프로그램을 말하고
  • 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 의미합니다.
  • 프로세스는 최소 하나 이상의 스레드를 보유하고 있으며, 운영체제로부터 자원을 할당 받습니다.
  • 스레드는 프로세스로부터 자원을 할당 받고 프로세스의 코드/데이터/힙 영역을 공유하기 때문에 좀 더 효율적으로 통신이 가능합니다.
  • 또한 컨텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드 쪽이 빠릅니다.
  • 그리고, 스레드는 자원 공유로 인해 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야합니다.
2. 컨텍스트 스위칭이란
  • 컨텍스트 스위칭은 한 Task가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행하여 작업들이 동시에 처리될 수 있도록 하는 방법입니다.
  • 방해가 발생하면 현재 프로세스의 상태를 PCB에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작합니다.
  • 이 때, CPU는 아무런 일을 하지 않으므로 잦은 컨텍스트 스위칭은 성능 저하를 유발할 수 있습니다.
  • 스레드와 프로세스의 동작 방식은 약간 다른데, 스레드는 캐시 메모리나 PCB에 저장해야하는 내용이 적고, 비워야하는 내용도 적기 때문에 상대적으로 더 빠른 컨텍스트 스위칭이 일어날 수 있습니다.
3. 동기와 비동기의 차이와 장단점 (+ 블로킹 논블로킹)
  • 동기와 비동기는 두 개 이상의 작업이 시간을 맞춘다 혹은 안맞춘다로 구분할 수 있습니다.
  • 동기 방식은 메서드 리턴과 그 결과를 전달받는 시간이 일치하는 명령 실행 방식입니다.
  • 또, 동기 방식은 한 함수가 끝나는 시간과 바로 다음 함수가 시작하는 시간이 같습니다.
  • 반대로 비동기 방식은 여러 개의 처리가 동시에 이루어지는 방식으로, 동기 방식에 비해 단위 시간 당 더 많은 작업을 처리할 수 있습니다.
  • 하지만, CPU나 메모리를 많이 사용하는 작업을 비동기로 처리하게 되면 과부하가 걸릴 수 있습니다.
  • 마찬가지로 프로그램의 복잡도도 증가하게 됩니다.
  • 블로킹과 논블로킹은 동기, 비동기와는 다른 관점으로, 내가 직접 제어할 수 없는 대상을 상대하는 방법에 대한 분류입니다.
  • 블로킹 방식은 대상의 작업이 끝날 때 까지 제어권을 대상이 가지고 있는 것을 의미합니다.
  • 반면에 논블로킹은 대상의 작업 완료 여부와 상관없이 새로운 작업을 수행합니다.
4. 멀티 스레드 프로그래밍
  • 멀티 스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 의미합니다.
  • 멀티 스레드 프로그래밍의 장점으로는 멀티 프로세스에 비해 메모리 자원 소모가 줄어든다는 점,
  • 힙 영역을 통해서 스레드 간 통신이 가능하기 때문에 프로세스 간 통신보다 간단하다는 점,
  • 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠르다는 점이 있습니다.
  • 반면, 단점으로는 힙 영역에 있는 자원을 사용할 때는 동기화 해야한다는 점,
  • 동기화를 위해 락을 과도하게 사용하면 성능이 저하될 수 있다는 점,
  • 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있다는 점이 있습니다.
5. thread-safe 하다는 의미와 설계하는 법
  • thread-safe는 멀티 스레드 프로그래밍 환경에서 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 실행되더라도 각 스레드의 결과가 올바르다는 것을 의미합니다.
  • 이를 설계하는 방법에는 java.util.concurrent 패키지의 하위 클래스를 사용하고,
  • 인스턴스 변수를 두지 않으며
  • Singleton 패턴을 사용하거나
  • 동기화 블럭에서 연산을 수행하는 방법들이 있습니다.
6. 프로세스 동기화
  • 다중 프로세스 환경에서 자원 등에 한 프로세스만이 접근 가능하도록 하는 것입니다.
  • 프로세스 동기화를 하지 않으면 데이터의 일관성이 깨지기 때문에 연산 결과가 잘못 반환될 가능성이 있습니다.
  • 여러 프로세스나 스레드가 동기화 매커니즘 없이 자원에 접근하려는 상황을 경쟁 상태라고 합니다.
  • 여러 스레드가 동시에 접근해서는 안되는 공유 자원에 접근하는 코드 블럭을 임계 구역이라고 합니다.
  • 한 임계 구역에는 하나의 스레드 혹은 프로세스만 접근 가능합니다.
  • 임계 구역에 접근하는 것을 제어하기 위해서 세마포어, 뮤텍스와 같은 매커니즘을 사용합니다.
  • 임계 구역 문제를 해결하기 위한 조건으로는
  • 한 프로세스가 임계구역에서 동작 중이면 다른 프로세스로는 접근할 수 없는 상호 배제,
  • 임계 구역에서 작업중인 프로세스가 없다면 임계 구역으로 진입하려는 프로세스를 적절히 선택해서 진입할 수 있도록하는 진행
  • 한 프로세스가 임계 영역으로 진입을 요청한 후 다른 프로세스는 진입이 유한한 횟수로 제한되어야하는 유한 대기,
  • 모두를 만족해야 합니다
7. 교착 상태와 기아 상태
  • 교착 상태는 서로 다른 프로세스가 서로 점유하고 있는 자원의 반납을 대기하고 있는 상태를 말합니다.
  • 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야하는 상호 배제,
  • 할당된 자원을 가진 상태에서 다른 자원을 기다리는 점유 대기,
  • 다른 프로세스가 자원의 사용을 끝낼 때 까지 뺏어 갈 수 없는 비선점,
  • 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있는 순환대기,
  • 네 가지 조건을 만족하는 경우 교착 상태가 발생합니다.
  • 이를 해결하기 위해서는
  • 4가지 조건 중 하나라도 만족되지 않도록 하고
  • 알고리즘을 데드락이 발생하지 않도록 해야 합니다.
  • 기아 상태는 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스가 영원히 자원을 할당받지 못하는 경우를 뜻 합니다.
  • 이를 해결하기 위해서 우선 순위를 수시로 변경하거나, 오래 기다린 프로세스의 우선 순위를 높여주거나, Queue를 사용해야합니다.
8. 세마포어와 뮤텍스의 차이
  • 세마포어는 여러 개의 프로세스가 접근 가능한 공유 자원을 관리하는 방식이고, 뮤텍스가 될 수 있지만, 뮤텍스는 한 번에 한 개의 프로세스만 접근 가능하도록 관리하는 방식입니다.
  • 따라서 뮤텍스는 세마포어가 될 수 없습니다.
  • 또한, 세마포어는 다른 프로세스가 세마포어를 해제할 수 있지만, 뮤텍스는 락을 획득한 프로세스만 락을 반환 할 수 있습니다.
9. 가상 메모리
  • 가상 메모리는 프로세스가 실제 메모리의 크기와 상관없이 메모리를 이용할 수 있도록 지원하는 기술 입니다.
  • 가상 메모리는 실제 메모리인 RAM과 보조 기억 장치의 Swap 영역으로 구성됩니다.
  • OS는 메모리 관리자를 통해 메모리를 관리하며 프로세스는 사용하는 메모리가 실제 메모리인지, Swap 영역인지 알 수 없습니다.
  • Java 에서는 Swap 영역을 설정하지 않은 경우에 OOM이 발생할 수 있습니다.
  • Swap 영역은 실제 메모리가 아니기 때문에 지연 시간이 많이 발생하며, 가급적이면 Swap 메모리를 사용하지 않도록 설계하는 것이 좋고,
  • 만약 계속해서 사용하는 양이 증가한다면 메모리 누수를 의심해 볼 수 있습니다.
10. 캐시의 지역성
  • 시간 지역성과 공간 지역성으로 나눌 수 있으며,
  • 시간 지역성은 최근에 접근한 데이터에 다시 접근하는 경향을 의미하고,
  • 공간 지역성은 최근 접근한 데이터의 주변 공간에 다시 접근하는 경향을 의미합니다.
11. 프로세스 관련 용어
  • PCB는 프로세스 제어 블록으로 프로세스에 대한 중요한 정보를 저장합니다.
  • PC는 프로그램 카운터로 프로세스 실행을 위한 다음 명령의 주소를 표시합니다.
  • 캐시 메모리는 자주 사용되는 데이터가 저장되는 공간으로 CPU의 레지스터와 메모리 사이에서 병목 현상을 완화하는 장치입니다.
이 블로그는 저작권자의 CC BY 4.0 라이센스를 따릅니다.