본문 바로가기
CS

운영체제

by 짱닭 2021. 3. 24.
반응형

운영체제

하드웨어를 관리하고, 응용 프로그램과 하드웨어 사이에서 인터페이스 역할을 하며 시스템의 동작과 자원을 제어하는 시스템 소프트웨어

프로세스

프로세스는 실행되는 프로그램 자체와 프로그램이 실행되는 주변 환경을 포함하는 개념이다.
디스크에서 메모리로 적재되어, CPU 자원의 할당을 받을 수 있음

실행되는 주변 환경이란 사용중인 파일, 데이터, 메모리 영역(스택, 힙, 데이터, 코드 영역) 주소 공간등을 뜻한다.

프로세스가 생성될 때, 기본적으로 하나의 스레드가 같이 생성된다.
각 프로세스는 별도의 주소공간을 할당받는다.

  • Code : 코드 자체를 구성하는 메모리 영역 (프로그램 명령)
  • Data : 전역변수, 정적변수, 배열 등 (초기화된 데이터)
  • Heap : 동적 할당시 사용 (new(), mallock() 등) (메모리 주소가 낮은 영역부터 채워진다)
  • Stack : 지역변수, 매개변수, 리턴 값, 함수를 호출한 caller의 환경정보 (임시 메모리 영역) (메모리 주소가 높은 영역부터 채워진다)

프로세스의 생성과정

  1. PCB가 생성되며 OS가 실행한 프로그램의 코드를 읽어들여 프로세스에 할당된 메모리의 Text segment에 저장한다.
  2. 초기화된 전역 변수 및 static 변수를 data segment에 할당.
  3. HEAP과 Stack은 초기 메모리 주소만 초기화됨.
  4. PCB에 여러 정보가 기록되면 Ready Queue에서 CPU를 할당받기까지 대기한다.

PCB, 프로세스 제어 블록(Process Control Block)
PCB 는 특정 프로세스에 대한 중요한 정보를 저장 하고 있는 운영체제의 자료구조이다. 운영체제는 프로세스를 관리하기 위해 프로세스의 생성과 동시에 고유한 PCB 를 생성 한다. 프로세스는 CPU 를 할당받아 작업을 처리하다가도 프로세스 전환이 발생하면 진행하던 작업을 저장하고 CPU 를 반환해야 하는데, 이때 작업의 진행 상황을 모두 PCB 에 저장하게 된다. 그리고 다시 CPU 를 할당받게 되면 PCB 에 저장되어있던 내용을 불러와 이전에 종료됐던 시점부터 다시 작업을 수행한다.

PCB 에 저장되는 정보

  • 프로세스 식별자(Process ID, PID) : 프로세스 식별번호 (크롬탭도 PID를 가짐)
  • 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
  • 프로그램 카운터(PC) : 프로세스가 다음에 실행할 명령어의 주소
  • CPU 레지스터
  • 프로세스 우선순위
  • 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
  • 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
  • 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등

스레드

프로세스의 실행단위. 프로세스 내의 주소공간이나 자원을 공유할 수 있다.
스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성된다.

스레드를 사용하면 프로세스에 비해 생성할때 오버헤드도 적고 공유된 자원에 대해서도 오버헤드가 적고, 병렬성을 높일 수 있다.

프로세스 & 스레드 차이점
프로세스는 자신만의 고유 공간과 자원을 할당받아 사용
스레드는 다른 스레드와 공간, 자원을 공유하면서 사용

하나의 프로세스를 다수의 실행 단위로 구분하여 자원을 공유하고 자원의 생성과 관리의 중복성을 최소화하여 수행 능력을 향상시키는 것을 멀티스레딩이라고 한다. 이 경우 각각의 스레드는 독립적인 작업을 수행해야 하기 때문에 각자의 스택과 PC 레지스터 값을 갖고 있다.

멀티스레딩의 장점

  • 멀티 프로세스에 비해 메모리와 자원의 소모가 줄어든다.
  • 힙 영역을 사용하면 프로세스간 통신에 비해 스레드간 통신이 훨씬 간단하다.
  • 스레드의 Context Switching은 캐시메모리를 비울 필요가 없어 프로세스의 Context Switching에 비해 더 빠르다.

단점

  • 힙 영역을 공유하기 때문에, 해당 자원을 사용할 때 동기화를 해주어야 한다.
  • 동기화를 위해 과도한 락 사용시 병목 현상때문에 성능이 저하될 수 있다.

Context Switching
CPU가 이전의 프로세스 상태를 PCB에 보관하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재하는 과정.
(CPU가 지속적으로 프로세스를 수행하도록 하기 위해 사용)
보통 인터럽트가 발생하거나, 실행 중인 CPU 사용 허가시간을 모두 소모하거나, 입출랙을 위해 대기해야 하는 경우에 Context Switching이 발생한다.
즉, 프로세스가 Ready → Running, Running → Ready, Running → Waiting처럼 상태 변경 시 발생!

스택을 스레드마다 독립적으로 할당하는 이유
스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이므로 스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다. 따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

멀티 스레드 vs 멀티 프로세스
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 안고 있다.

멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재한다.
따라서, 상황에 따라 적합한 방식을 택해야 한다.

멀티 프로세싱과 멀티 프로그래밍 멀티 태스킹
CPU 코어의 관점에서 생각
CPU 코어 여러개로 프로세스를 여러개 수행한다 -> 멀티 프로세싱
CPU 코어 하나로 프로세스를 여러개 수행한다 -> 멀티 프로그래밍
CPU 코어 몇 개를 쓰던 간에 작업을 수행한다 (프로세스보다 확장된 의미) -> 멀티 태스킹

데드락

멀티 프로그래밍 환경에서 CPU와 같은 한정되고 공동된 자원을 사용할 때 데드락이 발생할 수 있다.
예를 들어 프로세스 A가 자원 1을 사용 중인 상태에서 자원 2를 사용하려고 하지만 프로세스 B가 자원 2를 이미 사용하고 있어 대기중이다. 그런데 프로세스 B가 자원 2 사용을 끝내려면 자원 1이 필요한데, 프로세스 A가 이미 자원 1을 사용하고 있기 때문에 대기해야 한다. 즉 서로의 자원을 쓰고 싶은데 서로가 쓰지를 못하니 무한 대기상태가 걸리는데 이를 데드락, 교착상태라 한다.

데드락의 발생 조건 4가지(모두 만족해야 함)

  • 상호 배제(Mutual exclusion) : 자원은 한번에 한 프로세스만 사용할 수 있음
  • 점유 대기(Hold and wait) : 최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용하고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재해야 함
  • 비선점(No preemption) : 다른 프로세스가 사용 중인 자원을 강제로 가져올 수 없음
  • 순환 대기(Circular wait) : 프로세스의 집합에서 순환 형태로 자원을 대기하고 있어야 함

데드락 해결법

  • 예방 : 4가지 조건 중 하나라도 만족되지 못하게 함
    • 상호배제 부정 : 여러 프로세스가 공유 자원 사용
    • 점유대기 부정 : 프로세스 실행전 모든 자원을 할당
    • 비선점 부정 : 자원 점유 중인 프로세스가 다른 자원을 요구할 때 가진 자원 반납
    • 순환대기 부정 : 자원에 고유번호 할당 후 순서대로 자원 요구
  • 회피 : 교착상태를 회피하도록 알고리즘을 사용
    • 은행원 알고리즘(Banker's Algorithm)
      • 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래함
      • 프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 사전에 검사하여 교착 상태 회피
      • 안정 상태면 자원 할당, 아니면 다른 프로세스들이 자원 해지까지 대기
  • 회복 : 교착상태가 발생하도록 허용한 후에 교착상태를 해결함
    • 프로세스 종료
      • 교착 상태의 프로세스를 모두 중지
      • 교착 상태가 제거될 때까지 하나씩 프로세스 중지
    • 자원 선점
      • 교착 상태의 프로세스가 점유하고 있는 자원을 선점해 다른 프로세스에게 할당 (해당 프로세스 일시정지 시킴)
      • 우선 순위가 낮은 프로세스나 수행 횟수 적은 프로세스 위주로 프로세스 자원 선점

프로세스 동기화

Critical Section(임계영역)
멀티 스레딩에 문제점에서 나오듯, 동일한 자원을 동시에 접근하는 작업(e.g. 공유하는 변수 사용, 동일 파일을 사용하는 등)을 실행하는 코드 영역을 Critical Section 이라 칭한다.

Critical Section Problem(임계영역 문제)
프로세스들이 Critical Section 을 함께 사용할 수 있는 프로토콜을 설계하는 것이다.

Requirements(해결을 위한 기본조건)

  • Mutual Exclusion(상호 배제)
    프로세스 P1 이 Critical Section 에서 실행중이라면, 다른 프로세스들은 그들이 가진 Critical Section 에서 실행될 수 없다.
  • Progress(진행)
    Critical Section 에서 실행중인 프로세스가 없고, 별도의 동작이 없는 프로세스들만 Critical Section 진입 후보로서 참여될 수 있다.
  • Bounded Waiting(한정된 대기)
    P1 가 Critical Section 에 진입 신청 후 부터 받아들여질 때가지, 다른 프로세스들이 Critical Section 에 진입하는 횟수는 제한이 있어야 한다.

해결책

Lock

  • 하드웨어 기반 해결책으로써, 동시에 공유 자원에 접근하는 것을 막기 위해 Critical Section 에 진입하는 프로세스는 Lock 을 획득하고 Critical Section 을 빠져나올 때, Lock 을 방출함으로써 동시에 접근이 되지 않도록 한다.

한계

  • 다중처리기 환경에서는 시간적인 효율성 측면에서 적용할 수 없다.

Semaphores(세마포)
소프트웨어상에서 Critical Section 문제를 해결하기 위한 동기화 도구

종류
OS 는 Counting/Binary 세마포를 구분한다

  • 카운팅 세마포
    가용한 개수를 가진 자원 에 대한 접근 제어용으로 사용되며, 세마포는 그 가용한 자원의 개수 로 초기화 된다. 자원을 사용하면 세마포가 감소, 방출하면 세마포가 증가 한다.

  • 이진 세마포
    MUTEX 라고도 부르며, 상호배제의 (Mutual Exclusion)의 머릿글자를 따서 만들어졌다. 이름 그대로 0 과 1 사이의 값만 가능하며, 다중 프로세스들 사이의 Critical Section 문제를 해결하기 위해 사용한다.

단점

  • Busy Waiting(바쁜 대기)
    Spin lock이라고 불리는 Semaphore 초기 버전에서 Critical Section 에 진입해야하는 프로세스는 진입 코드를 계속 반복 실행해야 하며, CPU 시간을 낭비했었다. 이를 Busy Waiting이라고 부르며 특수한 상황이 아니면 비효율적이다. 일반적으로는 Semaphore에서 Critical Section에 진입을 시도했지만 실패한 프로세스에 대해 Block시킨 뒤, Critical Section에 자리가 날 때 다시 깨우는 방식을 사용한다. 이 경우 Busy waiting으로 인한 시간낭비 문제가 해결된다.

스케줄러

프로세스를 스케줄링하기 위한 Queue 에는 세 가지 종류가 존재한다.

  • Job Queue : 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready Queue : 현재 메모리 내에 있으면서 CPU 를 잡아서 실행되기를 기다리는 프로세스의 집합
  • Device Queue : Device I/O 작업을 대기하고 있는 프로세스의 집합
    각각의 Queue 에 프로세스들을 넣고 빼주는 스케줄러에도 크게 세 가지 종류가 존재한다.

장기 스케줄러(Long-term scheduler or job scheduler)
메모리는 한정되어 있는데 많은 프로세스들이 한꺼번에 메모리에 올라올 경우, 대용량 메모리(일반적으로 디스크)에 임시로 저장된다. 이 pool 에 저장되어 있는 프로세스 중 어떤 프로세스에 메모리를 할당하여 ready queue 로 보낼지 결정하는 역할을 한다.

메모리와 디스크 사이의 스케줄링을 담당.
프로세스에 memory(및 각종 리소스)를 할당(admit)
degree of Multiprogramming 제어
(실행중인 프로세스의 수 제어)
프로세스의 상태
new -> ready(in memory)

단기스케줄러(Short-term scheduler or CPU scheduler)

  • CPU 와 메모리 사이의 스케줄링을 담당.
  • Ready Queue 에 존재하는 프로세스 중 어떤 프로세스를 running 시킬지 결정.
  • 프로세스에 CPU 를 할당(scheduler dispatch)
  • 프로세스의 상태
    ready -> running -> waiting -> ready

중기스케줄러(Medium-term scheduler or Swapper)

  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄 (swapping)
  • 프로세스에게서 memory 를 deallocate
  • degree of Multiprogramming 제어
  • 현 시스템에서 메모리에 너무 많은 프로그램이 동시에 올라가는 것을 조절하는 스케줄러.
  • 프로세스의 상태
    ready -> suspended

동기 & 비동기

Sync vs Async
일반적으로 동기와 비동기의 차이는 메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기 라고 표현하고 그렇지 않은 경우에 대해서 비동기 라고 표현한다. 동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking되어 있다는 것을 의미한다. 비동기의 경우, blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task 를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.

출처
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/
https://gyoogle.dev/
https://velog.io/@hygoogi/%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-%EC%A4%80%EB%B9%84%ED%95%98%EA%B8%B0

반응형

'CS' 카테고리의 다른 글

kurento 용어집  (0) 2023.01.12
HTTP vs HTTPS / GET vs POST  (0) 2021.04.12
클린코드 / 리팩토링  (0) 2021.03.24

댓글