기술면접 준비하기[OS]

가온·2022년 10월 18일
0

Process와 Thread

Process와 Thread의 정의

  • Process는 실행 중에 있는 프로그램을 의미하고,
  • Thread는 프로세스 내에서 실행되는 흐름의 단위다.
  • 하나의 프로세스 안에서 여러 스레드가 생성 가능하며,(최소 1개인 메인 스레드를 보유) 완전히 독립적이어서 메모리 영역을 다른 프로세스와 공유하지 않는다.
  • 각 스레드는 개별 스택을 할당받고, 나머지 영역(코드/데이터/힙)은 스레드끼리 서로 공유하며 실행한다.

<Process의 메모리 영역>

  • Code : 실행할 프로그램의 코드가 저장되는 영역 (Read-Only)
  • Data : 전역변수와 static 변수
  • Heap : 사용자가 직접 관리할 수 있는 메모리 영역 (메모리 할당, 해제)
  • Stack : 함수의 호출과 관계되는 지역변수, 매개변수, 리턴 값 -> Stack Overflow

<Process의 문제점>

  • 프로세스 생성에 큰 오버헤드가 있다
  • 프로세스 사이에 통신이 어려움 (IPC 사용해야함)
    - IPC : Inter-Process Communication
    ex). socket

<Thread의 특징>

  • 스레드가 여러개 있는 것을 멀티스레드라고 한다.
  • 멀티스레드에서 각 스레드끼리 프로세스의 일정 메모리를 공유해서 사용한다.
  • 즉, 프로세스의 Context Switchig보다 스레드 Context Switching이 빠르다.

<Thread가 메모리를 공유함으로써 생기는 Process와의 차이점>

  • 동시에 여러 작업을 할 때, 멀티 스레드가 시스템 자원을 더 적게 사용함
  • 프로세스는 메모리 공유를 하지 않으므로, 프로세스 간 통신은 스레드 간 통신에 비해 복잡함
  • 스레드의 경우 공유 자원에 대한 동기화 이슈 발생

<동기화>

동기화 = 스레드의 단점

  • Thread간 자원 공유는 전역변수

멀티 프로세스 멀티 스레드

<Context Switching 관점>

Stack 영역만 교체하면 되기 때문에 멀티 스레드의 속도가 빠름

Context Switching이란?

  • CPU가 다음 우선순위의 프로세스 실행을 위해 Context를 저장하고 다음 실행을 위해서 Context를 교체하는 작업
  • Context : CPU가 해당 프로레스를 실행하기 위한 해당 프로레스의 정보들

<안정성 측면>

  • 멀티 프로세스 : 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않음 -> 안정성 높음
  • 멀티 스레드 : 하나의 스레드 장애가 전체 스레드에 영향을 끼칠 수 있음 -> 동기화 이슈가 발생 가능 (자원 공유)

Process의 생명주기(상태변화)

1) New로 생성된 이후에 Ready Queue에 들어감
2) 스케줄러에 의해서 Ready <-> Runing 변화
3) Event 발생시 Running -> Blocked
4) Blocked에서 Event 종료 시 Ready

교착상태(DeadLock)

  • 두 개 이상의 프로세스나 스레드가 서로 자원을 기다리면서 무한히 기다리게 되는 상태
  • 두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태

< DeadLock 발생 조건 >

1) 상호 배제(Mutual Exclusion)

  • 한 자원에 대한 여러 프로세스의 동시 접근은 불가능

2) 점유와 대기(Hold and Wait)

  • 하나의 자원을 소유하고 다른 프로세스 혹은 스레드의 자원 요청

3) 비선점(Non preemptive)

  • 다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없음

4) 환형 대기(Circle Wait)

  • 프로세스의 집합에서 순환 형태로 자원을 대기

< DeadLock 해결 방법 >

1) 예방 (Prevention)

  • 교착 상태 발생 조건 중 하나를 제거하면서 해결
  • 시스템의 효율성이 떨어지는 단점 존재

2) 회피 (Avoidance)

  • 교착 상태에 빠질 가능성이 있는지 확인 후 자원 할당
  • Safe sequence, Safe state -> 은행원 알고리즘 -> 사용 제약조건이 많음

3) 탐지 (Detection)

  • 교착 상태 발생을 허용 후 탐지한다.-> 복구로 이어짐

4) 복구 (Recovery)

  • 프로세스 종료 : 교착 상태의 프로세스 모두 중지, 하나씩 제거해보기
  • 자원 선점 : 점유된 자원을 선점해 다른 프로레스에 할당

CPU 스케줄링

선점형 (Preemptive)

  • 선점형 스케줄링은 높은 우선순위의 프로세스가 들어올 경우 현재 프로세스를 중지시키고, 높은 우선순위의 프로세스를 처리

비선점형 (Non-Preemptive)

  • 비선점 스케줄링은 한번 할당하면 끝날 때까지 다른 프로세스가 들어오지 못함

FCFS (First Come First Serve)

  • 비선점형
  • Ready Queue에 도착한 순서에 따라 CPU를 할당하는 기법
  • 공평성은 유지되지만 짧은 작업이 긴 작업을, 중요한 작업이 중요하지 않은 작업을 기다림
  • 장점 : 평균 응답시간이 길다
  • 단점 : 도착순서에 따라 공평하다

SJF (Shortest Job First)

  • 비선점형
  • 실행시간이 가장 짧은 프로세스에 먼저 CPU를 할당하는 기법
  • 가장 적은 평균 대기 시간을 제공하는 최적 알고리즘
  • 장점 : 평균 응답 시간을 최소화 할 수 있다.
  • 단점 : 실행 시간이 긴 프로세스는 CPU를 할당받지 못하고 무한히 대기하는 현상 발생(starvation)

HRN (Highest Response Ratio)

  • SJF를 보완하는 알고리즘
  • 우선순위 계산 결과값이 높으면 우선순위 부여
  • 우선순위 = (대기시간 + 서비스시간) / 서비스시간

SRT (Shortest Remaining Time first)

  • 선점형
  • 새로운 프로세스가 도착할 때마다 새로운 스케줄링이 이루어진다.
  • 현재 실행 중인 프로세스의 남은 시간과 대기 큐에 프로세스의 실행시간이 가장 짧은 프로세스에게 CPU를 할당하는 기법
  • 비선점 기법인 SJF를 선점 형태로 변경한 기법
  • 단점 : 잦은 선점으로 인한 Context switching 부담, starvation의 위험

RR (Round Robin)

  • 선점형
  • 각 프로세스는 동일한 크기의 할당 시간 (time wuantum)을 갖게 된다.
  • 할당 시간이 지나면 프로세스는 선점당하고 ReadyQueue의 제일 뒤로 간다.
  • 설정한 time quantum이 너무 커지면 FCFS와 같아진다.
  • 반대로 너무 작아지면 스케줄링 알고리즘의 목적에는 이상적이지만 잦은 context switching으로 overhead가 발생한다.

Priority Scheduling

  • 우선순위가 가장 높은 프로세스에게 CPU를 할당
  • 우선순위 산정 방식에 따라 앞에 나온 알고리즘과 유사해질 수 있음
    - 선점형 방식 : 더 높은 우선순위의 프로세스가 도착하면 실행중인 프로세스를 멈추고 CPU를 선점
    • 비선점형 방식 : 더 높은 우선순위의 프로세스가 도착하면 Ready Queue의 Head에 넣음

뮤텍스, 세마포어

  • shared memory 접근 제어

페이징 세그먼트

  • 메모리 관리 기법

동기(Sync)와 비동기(Async)

  • 메소드 실행과 결과 반환 시점 관련

컴파일 언어와 스크립트 언어의 예시와 차이점

  • 컴파일 언어 : C, C++, JAVA 등

  • 스크립트 언어 : python, PHP

  • 컴파일 언어는 컴파일러를 통해 사전에 컴파일되어, 기계어 상태로 실행되므로 실행이 빠름

  • 또한 컴파일 단계에서 전체코드를 기계어로 변환할 때, 최적화작업을 진행하여, 실행 시간을 보다 빠르게 할 수 있음

  • 이에 반해 스크립트 언어는 컴파일 단계 없이, 실행 단계에서 한 줄씩 기계어로 번역 후, 실행되므로 통상 컴파일 언어보다 실행이 느림

  • 또한 전체 코드에 대한 실행 코드 최적화가 어려움

profile
코딩기딩기딩기딩

0개의 댓글