Operating System 요약

이유석·2022년 3월 22일
0

CS - Operating System

목록 보기
20/20
post-thumbnail

Process VS Thread

프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다.

프로세스마다 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당받는다.

스레드는 Stack만 따로 할당받고 나머지 영역 (code, data, heap)은 스레드끼리 서로 공유한다.

[요약]
프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
스레드 : 다른 스레드와 공간과 자원을 공유하면서 사용


Context Switching

Dispatch : CPU가 이전의 프로세스 상태를 PCB에 저장하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재(CPU의 할당을 받음)하는 과정


멀티 프로세스로 처리 가능한 것을 굳이 멀티 스레드로 처리 하는 이유는?

프로세스를 생성하여 자원을 시스템 콜이 감소함으로써, 자원의 효율적 관리가 가능함
프로세스 간의 통신(IPC) 보다 스레드 간의 통신 비용이 적어 작업들 간 부담이 감소함

대신, 멀티 스레드를 사용할 때는 공유 자원으로 인한 문제 해결을 위해 '동기화'에 신경써야 한다.


Dead Lock(교착상태)가 무엇이며, 4가지 조건은?

프로세스가 자원을 얻지 못해서 다음 처리를 하지 못하는 상태를 말한다.
시스템적으로 한정된 자원을 여러 곳에서 공유(사용)하려고 할 때 발생하는 문제이다.

교착상태의 4가지 조건

  • 상호 배제 : 프로세스들이 필요로 하는 자원에 대하여 배타적 통제권을 요구함

    배타적 : 특정 프로세스가 사용중인 자원에 대해서, 다른 프로세스들이 해당 자원을 사용하지 못함

  • 점유 대기 : 프로세스가 자원을 점유하고 있으면서, 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 위해 기다림

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

  • 순환 대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있음

이 4가지 조건 중 하나라도 만족하지 않으면 교착상태는 발생하지 않음
(4가지 조건이 모두 만족하여야지 교착상태 발생)

순환대기는 점유대기와 비선점을 모두 만족해야만 성립한다. 따라서 4가지가 서로 독립적이지 않다.


교착상태 해결 방법 4가지

  • 예방 : 교착 상태 발생 조건 중 하나를 제거하면서 해결한다. (자원 낭비가 심함)
  • 회피 : 교착 상태 발생 시, 피해나가는 방법. (unsafe state에 집입하지 않도록 함)

    safe state : 모든 프로세스가 요청하는 최대 자원을 교착 상태를 야기시키지 않고, 차례대로 모두 할당해 줄 수 있는 상태

  • 탐지 후, 진입 시 회복
    • 탐지 : Wait for 그래프를 유지하며, 주기적으로 해당 그래프에 cycle이 존재하는지 확인
    • 회복 : 교착상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 해제시켜 회복

Race Condition (경합 상태)

공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 연산의 결과값에 영향을 줄 수 있는 상태

동시 접근 시 자료의 일관성을 해치는 결과가 나타남


Critical Section (임계 영역)

한번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역

프로세스간에 공유 자원을 접근하는데 있어서, 문제가 발생하지 않도록 하기 위함


Mutex Lock (뮤텍스 락)

Mutual Exclusion (상호 배제) Lock

Critical Section에 하나의 스레드만 허용하기 때문에, 해당 섹션에 접근하려는 다른 스레드들을 강제적으로 막음으로써 첫번째 스레드가 해당 섹션을 빠져나올 때 까지 기다리는 것

Busy Wait 필요 : Critical Section에 진입하고자 할 때, 대기하는 동안 CPU자원을 낭비한다.

Semaphore (세마포어)

Mutex Lock보다 더 정교한 방식을 제공하는 동기화 도구

운영체제에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호

공유 자원에 접근할 수 있는 최대 허용치만큼만 동시에 스레드들은 자원 접근 요청을 할 수 있다.
Semaphore는 스레드가 공유 자원에 접근 할 때 카운트가 하나씩 줄어들게 되며, 자원이 모두 사용중인 경우(카운트=0) 다음 작업은 대기하게 된다.

Mutex Lock VS Semaphore

  • 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없음
  • 세마포어는 소유 불가능하지만, 뮤택스는 소유가 가능함
  • 동기화의 개수가 다름

메모리 계층

메모리를 필요에 따라 여러가지 종류로 나누어 둠을 의미한다.
이때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함이다.


가변 분할 방식으로 메모리에 프로그램 할당 시, 할당할 Hole을 결정하는 방법

Hole : 물리 메모리 상의 가용 메모리 공간, 다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있음

  • First Fit : 메모리의 처음부터 검사하여, 크기가 충분한 첫번째 Hole 사용
  • Best Fit : 순서와 상관없이 가장 작은 Hole부터 검사하여 크기가 맞는(내부 단편화 최소) hole 사용
  • Worst Fit : 가장 크기가 큰 Hole 사용

Page Replacement 알고리즘

Physical Memory에 Free Frame이 존재하지 않을 시, Victim Frame을 찾는 과정입니다.

  • FIFO : 가장 오래된 Frame을 Victim Frame으로 지정합니다.

  • Optimal : 앞으로 가장 오랫동안 사용되지 않을 Frame을 Victim Frame으로 지정합니다.
    (실형 가능성 희박)

  • LRU : 가장 오랫동안 사용되지 않은 Page의 Frame을 Victim Frame으로 지정합니다.

  • LRU Approximation : LRU를 H/W의 지원 없이, Reference Bit를 이용하여 구현한 알고리즘입니다.

  • LFU : Reference 횟수가 가장 적은 Page를 Victim Page로 지정합니다.

  • MFU : Reference 횟수가 가장 많은 Page를 Victim Page로 지정합니다.

  • NUR : Reference 횟수가 0인 Page를 Victim Page로 지정합니다.


Fragmentation (단편화)

전체 메모리 공간에는 프로세스 할당이 가능하지만, 메모리가 너무 세분화 되어있어서 할당이 불가능하여 발생하는 문제

Contiguous Allocation의 주요 문제

Contiguous Allocation : 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 하는 것

종류

  • External Fragmentation (외부 단편화)
    전체 메모리 공간은 새 프로세스의 요청을 만족 하지만, 너무 세분화 되어있어서 할당이 불가능한 상황

  • Internal Fragmentation (내부 단편화)
    작업에 필요한 공간보다 많은 메모리의 공간을 할당받음으로써 발생하는 내부의 사용 불가능한 공간

External Fragmentation의 해결책

  • Compaction
    사용중인 모든 프로세스들의 메모리 영역을 한군데로 몰고, hole들을 다른 한곳으로 몰아, 큰 가용 공간을 확보

Virtual Memory (가상 메모리)

프로그램 전체가 아닌 당장 실행에 필요한 부분만 실제 메모리에 올려서 실행하는 기법

장점

  • 프로그램이 전체 다 올라가지 않기 때문에, 더 많은 프로그램들을 동시에 메모리에 올려 작업을 수행할 수 있습니다.
    즉, 물리 메모리 공간에 놀고 있는 공간이 없게 계속 일을 시키는 것. 이를 도와주는 것이 '가상 메모리'

Paging (페이징)

프로세스의 Virtual Memory를 동일한 사이즈의 Page로 나누어 Physical Memory에 불연속적으로 배치합니다.

프로세스의 Virtual Memory공간이 하나의 연속적인 Physical Memory 공간에 들어가야 하는 제약을 해결하기 위한 기법

특징

  • Physical memory의 block들의 크기가 동일하므로, External Fragmentation이 발생하지 않습니다.
  • Page의 크기가 커질 수록, Internal Fragmentation 문제가 심각해집니다.

Segmentation (세그멘테이션)

사용자/프로그래머 관점의 메모리 관리 기법

원리는 Paging과 크게 다르지 않습니다.
차이점은 "Segmentation은 모두 고정된 크기가 아닌 일련의 논리적 구조 단위로 나누어진다" 입니다.

논리적 구조 단위 : Main Program, Function, Method, Object, Stack, Symbol Table, etc...

특징

  • 이렇게 논리적인 단위로 나누어 진다면, 사용자는 메모리의 상태를 이해하는데 더욱 도움이 됩니다.
profile
https://github.com/yuseogi0218

0개의 댓글