프로세스는 메모리 상에서 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다.
프로세스마다 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당받는다.
스레드는 Stack만 따로 할당받고 나머지 영역 (code, data, heap)은 스레드끼리 서로 공유한다.
[요약]
프로세스 : 자신만의 고유 공간과 자원을 할당받아 사용
스레드 : 다른 스레드와 공간과 자원을 공유하면서 사용
Dispatch : CPU가 이전의 프로세스 상태를 PCB에 저장하고, 또 다른 프로세스의 정보를 PCB에 읽어 레지스터에 적재(CPU의 할당을 받음)하는 과정
프로세스를 생성하여 자원을 시스템 콜이 감소함으로써, 자원의 효율적 관리가 가능함
프로세스 간의 통신(IPC) 보다 스레드 간의 통신 비용이 적어 작업들 간 부담이 감소함
대신, 멀티 스레드를 사용할 때는 공유 자원으로 인한 문제 해결을 위해 '동기화'에 신경써야 한다.
프로세스가 자원을 얻지 못해서 다음 처리를 하지 못하는 상태를 말한다.
시스템적으로 한정된 자원을 여러 곳에서 공유(사용)하려고 할 때 발생하는 문제이다.
교착상태의 4가지 조건
상호 배제 : 프로세스들이 필요로 하는 자원에 대하여 배타적 통제권을 요구함
배타적 : 특정 프로세스가 사용중인 자원에 대해서, 다른 프로세스들이 해당 자원을 사용하지 못함
점유 대기 : 프로세스가 자원을 점유하고 있으면서, 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 위해 기다림
비선점 : 다른 프로세스에 할당된 자원을 사용이 끝날 때까지 강제로 빼앗을 수 없음
순환 대기 : 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있음
이 4가지 조건 중 하나라도 만족하지 않으면 교착상태는 발생하지 않음
(4가지 조건이 모두 만족하여야지 교착상태 발생)
순환대기는 점유대기와 비선점을 모두 만족해야만 성립한다. 따라서 4가지가 서로 독립적이지 않다.
safe state : 모든 프로세스가 요청하는 최대 자원을 교착 상태를 야기시키지 않고, 차례대로 모두 할당해 줄 수 있는 상태
공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 연산의 결과값에 영향을 줄 수 있는 상태
동시 접근 시 자료의 일관성을 해치는 결과가 나타남
한번에 하나의 프로세스만 이용하게끔 보장해줘야 하는 영역
프로세스간에 공유 자원을 접근하는데 있어서, 문제가 발생하지 않도록 하기 위함
Mutual Exclusion (상호 배제) Lock
Critical Section에 하나의 스레드만 허용하기 때문에, 해당 섹션에 접근하려는 다른 스레드들을 강제적으로 막음으로써 첫번째 스레드가 해당 섹션을 빠져나올 때 까지 기다리는 것
Busy Wait 필요 : Critical Section에 진입하고자 할 때, 대기하는 동안 CPU자원을 낭비한다.
Mutex Lock보다 더 정교한 방식을 제공하는 동기화 도구
운영체제에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호
공유 자원에 접근할 수 있는 최대 허용치만큼만 동시에 스레드들은 자원 접근 요청을 할 수 있다.
Semaphore는 스레드가 공유 자원에 접근 할 때 카운트가 하나씩 줄어들게 되며, 자원이 모두 사용중인 경우(카운트=0) 다음 작업은 대기하게 된다.
메모리를 필요에 따라 여러가지 종류로 나누어 둠을 의미한다.
이때 필요한 대부분의 경우 CPU가 메모리에 더 빨리 접근하기 위함이다.
Hole : 물리 메모리 상의 가용 메모리 공간, 다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있음
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로 지정합니다.
전체 메모리 공간에는 프로세스 할당이 가능하지만, 메모리가 너무 세분화 되어있어서 할당이 불가능하여 발생하는 문제
Contiguous Allocation의 주요 문제
Contiguous Allocation : 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 하는 것
종류
External Fragmentation (외부 단편화)
전체 메모리 공간은 새 프로세스의 요청을 만족 하지만, 너무 세분화 되어있어서 할당이 불가능한 상황
Internal Fragmentation (내부 단편화)
작업에 필요한 공간보다 많은 메모리의 공간을 할당받음으로써 발생하는 내부의 사용 불가능한 공간
External Fragmentation의 해결책
프로그램 전체가 아닌 당장 실행에 필요한 부분만 실제 메모리에 올려서 실행하는 기법
장점
프로세스의 Virtual Memory를 동일한 사이즈의 Page로 나누어 Physical Memory에 불연속적으로 배치합니다.
프로세스의 Virtual Memory공간이 하나의 연속적인 Physical Memory 공간에 들어가야 하는 제약을 해결하기 위한 기법
특징
사용자/프로그래머 관점의 메모리 관리 기법
원리는 Paging과 크게 다르지 않습니다.
차이점은 "Segmentation은 모두 고정된 크기가 아닌 일련의 논리적 구조 단위로 나누어진다" 입니다.
논리적 구조 단위 : Main Program, Function, Method, Object, Stack, Symbol Table, etc...
특징