OS - 질문 정리 Part2

marafo·2021년 1월 27일
0

∙ 세마포어(Semaphore) 뮤텍스(Mutex) 개념 및 차이점

1 ) 세마포어

다익스트라가 고안한 세마포어 알고리즘에서는 한 프로세스가 임계구역에 들어가기 전 스위치를 사용 중(잠금)으로 켜놓고 진입하게 된다. 그 뒤에 대기하는 프로세스는 임계구역을 사용하는 프로세스의 작업 종료를 기다리고 해당 차례가 되면 세마포어의 동기화 신호를 받고 임계구역에 진입한다. 따라서 프로세스 동기화, busy waiting을 생략할 수 있다.

Semaphore(n);

P();

 //  ∙∙∙
 // Critical Section
 //  ∙∙∙

V();

n : 세마포어에서 공유 가능한 자원의 수. RS(Reminder Section) 값
P( ) : 잠금 기능을 수행하는 함수나 코드. n이 0보다 크다면 n을 하나 차감시키고 프로세스를 임계구역에 진입시킨다.
V( ) : 특정 프로세스가 임계구역에서 작업을 마치고 나오면 잠금 해제 및 동기화를 수행하고 n을 1만큼 늘린다. 다음 프로세스는 세마포어 큐에 저장된 상태로 잠금 해제와 동기화를 기다린다.

P( ), V( ) 실행 중 다른 작업이 실행되면 상호 배제와 한정 대기를 지키지 못할 수 있다. 따라서 P( ), V( ) 내부 코드검사가 필요하다.

2 ) 뮤텍스(Mutex)

전역변수나 공유자원에 대한 데이터 일관성 문제가 임계구역에서 나타난다. 임계구역의 성립 조건 중 임계구역에 하나의 프로세스만 들어가서 자원을 공유하지 않는 상호 배제(Mutual Exclusion)를 의미한다. 대표적인 두 가지의 기능은 다음과 같다.

lock: 현재의 임계 구역에 들어갈 권한을 얻어온다. 만일 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할때까지 대기한다(entry section).

unlock: 현재의 자원을 사용중인 프로세스가 임계 구역을 모두 사용했음을 알린다. 대기중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다(exit section).

가장 큰 차이점으로 동기화 대상이 되는 공유 자원의 갯수이다. 뮤텍스(프로세스 범위)는 단 하나의 자원에 하나의 프로세스만 접근할 수 있지만 세마포어(주로 파일형태)는 복수의 공유 자원이 있다면 임계구역에 그 자원수만큼 프로세스가 진입할 수 있다.
이 부분은 다시 말해서 세마포어는 뮤텍스의 한 종류로 볼 수 있지만 반대로 뮤텍스는 세마포어라 할 수 없다.
또한, 뮤텍스에선 현재 임계구역이 있는 프로세스가 락을 해제해야 동기화가 되지만 임계구역이 있지 않은 프로세스(혹은 스레드)가 세마포어를 해제할 수 있다.

∙ 교착 상태(Deadlock)

2개 이상의 프로세스가 서로의 프로세스가 끝나기만을 기다리며 필요한 작업을 진행하지 못하는 상태를 의미한다. 교착 상태의 필요조건에는 4가지가 있다.

1) 상호 배제(mutual exclusion)
특정 프로세스의 자원은 다른 프로세스와 공유가 불가능한 배타적 자원이어야 한다. 이 배타적 자원은 임계 구역(critical section)에서 보호된다.

2) 비선점(nonpreemtion)
특정 프로세스의 자원은 다른 프로세스에 의해서 빼앗길 수 없다. 자원을 다른 프로세스가 선점할 수 있다면 교착 상태는 일어나지 않는다.

3) 점유와 대기(hold and wait)
특정 프로세스가 자원을 할당받으면서 다른 프로세스의 자원을 기다리는 상태.
즉 A는 B가 필요로하는 자원을 할당 받은 상태로 다른 자원을 기다리고, B는 A에게 필요한 자원을 가지고 또 다른 자원을 기다리게 된다.

4) 순환 대기, 원형 대기(circular wait)
프로세스들의 '점유와 대기' 관계가 마치 원순열의 탁자처럼 원형으로 꼬리에 꼬리를 무는 상태. 서로 양보하지 않는 원형 관계와 '점유와 대기'가 만나 교착 상태를 발생시킨다.

아사 현상과 교착 상태는 근본적으로 발생 원인이 다르다. 아사 현상은 정책상 오류로 프로세스가 cpu 할당을 못받아서 작업 진행이 안되는 것이고 교착 상태는 자연적으로 발생하기 때문에 Aging 기법으로 해결하기 어렵다.

∙ 교착 상태 해결책

예방(prevention)

1 ) 상호 배제 예방
특정 프로세스가 독점 사용이 가능한 상호 배타적인 자원을 제거한다. 즉 독점이 사라지고 모든 자원을 공유할 수 있다면 교착 상태는 발생하지 않지만 임계구역처럼 시스템 내에 필수적으로 공유할 수 없는 자원도 있기 때문에 상호 배제는 어렵다.

2 ) 비선점 예방
모든 자원에 대해 선점 가능성을 열어두는 것이다. 이것도 임계구역에서 공유 자원에 대해 lock을 걸면 자원 선점이 불가능하다. 선점이 가능한 기준을 마련하기 애매하고 우선순위가 높은 프로세스가 자원을 계속 선점하면 아사 현상이 발생한다.

3 ) 점유와 대기 예방
프로세스가 자원을 점유하고 다른 자원을 기다리지 못하게 예방한다. 프로세스의 시작 초기에 사용할 자원을 모두 점유하거나(all) 하나라도 점유하지 못하는 경우가 생기면 자원을 모두 반납한다(nothing).

하지만 이 방법은 일괄처리 방식으로 동작하고 자원을 많이 필요로 하는 프로세스일수록 자원 확보가 어려워 아사 현상의 가능성이 있다. 당장 사용하지 않는 자원도 모두 점유할 수 있기에 진행이 필요한 프로세스의 자원 결핍으로 이어질 수 있다. 마지막으로 필요한 자원이 추가되면 확보가 어렵다.

4 ) 원형 대기 예방
원형 관계를 깨고 한 방향으로 자원을 할당한다.(각 자원에 number 할당)
여기서 자원의 number를 어떤 기준으로 할당할지 결정해야 한다.

회피(Avoidance)

1) 교착 상태 회피 : 자원 할당을 통해 어느 수준에서 교착 상태가 발생하는지 체크하고 그 이하 수준으로 나누어준다.

∙ Multi Thread

한 프로세스의 작업 단위인 다수의 스레드로 분할하여 진행하는 프로세스 운영 기법을 의미한다.

비슷하거나 똑같은 목적을 필요로 하는 프로세스들이 있다면 자원의 중복과 메모리 낭비를 막아야 한다. 중복된 프로세스를 생성하지 않기 위해서 하나의 프로세스에서 데이터, 코드, 파일, 힙(공유는 되지만 동적할당) 영역을 공유하고 각각의 스레드에 따라 유동적으로 바뀌는 레지스터, 스택으로 구성된다.

장점
1 ) 응답성 향상 : 다른 스레드가 입출력 요청을 위해 작업을 하지 못해도 다른 스레드가 대체하여 사용자에 대한 응답을 보낼 수 있다.
2 ) 효율성 향상 : 자원 공유에서 불필요한 자원 중복 및 메모리 낭비를 방지해서 효율성이 좋아진다.
3 ) 다중 CPU 지원 : 복수의 CPU가 멀티스레드를 처리하면 CPU 사용률이 증가하고 프로세스 작업처리 시간이 줄어든다.

단점
1 ) 동기화 문제 : 공유 자원에 접근하는 스레드(혹은 프로세스)의 순서에 따라 결과가 달라지는 임계구역에 동기화 문제가 발생한다.
2 ) 자원 공유로 인해 하나의 스레드에 에러가 나면 같은 프로세스 내 다른 스레드에도 문제가 발생한다.

∙ Multi Thread Model

1) 사용자 레벨 스레드(User Level Thread)

커널에서 가능한 스케줄링, 동기화를 갖춘 사용자 라이브러리에 의해 구현된다.
사용자 스레드와 커널 스레드의 비율이 1 : N으로 구성되며 자원관리, 스케쥴링 작업에 따로 문맥 교환이 필요 없어 속도가 빠르다.

하지만 커널 스레드가 I/O 요청을 처리하면 사용자 스레드는 그 요청작업이 끝날 때까지 계속 대기해야 한다. 그리고 스레드는 1개 프로세스의 작업 단위이므로 다수의 사용자 레벨 스레드(모두 같은 프로세스로 인식됨)는 복수의 CPU를 사용할 수 없다.

2 ) 커널 레벨 스레드(Kernel Level Thread)

커널 스레드가 사용자 스레드수만큼 지원되어서 1 : 1 으로 구성된다. 이렇게 되면 각 사용자 스레드가 독립적으로 스케줄링될 수 있어서 다른 커널 스레드가 대기 상태에 들어가도 별다른 영향 없이 맡은 작업을 처리할 수 있다. 멀티 CPU 사용이 가능하며 보안성에 강점을 갖는다.

하지만 잦은 문맥 교환으로 인해 오버헤드가 발생할 수 있다. 사용자 레벨 스레드가 늘어남에 따라 커널 스레드를 무한정 늘릴 수 없다.

3 ) 멀티 레벨 스레드(Multi Level Thread)

커널 레벨 스레드와 사용자 레벨 스레드를 적절히 믹스한 유연한 스레드이다. 사용자 스레드와 커널 스레드가 M : N (M > N)으로 구성된다. 스레드의 작업 속도를 중시할 땐 사용자 레벨 스레드로, 안정성과 독립성에선 커널 레벨 스레드로 동작한다.

∙ System Call

운영체제 듀얼모드에서 사용자 Application이 컴퓨터 내 시스템 자원, 하드웨어 자원에 직접 접근하는 것을 커널이 막아서 보호한다. 이 때, 직접 접근을 막는 대신 System Call이라는 인터페이스를 통해 간접 접근을 허용한다. System Call은 커널이 제공하는 시스템 관련 서비스와 함수를 통해 컴퓨터 자원을 조회하고 가져올 수 있는 것이다.

사용자 모드에서 필요한 데이터에 접근하기 위해 커널 모드에 시스템콜 요청을 하면 Trap이 발생하고 커널모드에서 Trap에 대한 instruction을 리턴해서 자원 (간접) 접근을 허용한다.

∙ Kernell의 기능과 종류

기능

1 ) 프로세스 관리 : 프로세스에 cpu 할당 및 환경 셋팅
2 ) 메모리 관리 : 프로세스에 메모리 공간 배치 + 가상메모리 제공
3 ) 파일 시스템 관리 : 데이터 저장 및 접근 가능한 인터페이스
4 ) 입출력 : 입출력 기능
5 ) 프로세스 간 통신 : 공동 작업용 IPC 환경

종류

1 ) 단일형 커널 : 커널 핵심 기능을 가진 모듈들을 구분 없이 하나로 모아놓은 커널. 모듈 간 통신 비용이 별로 없어서 효율적이다. 버그 및 오류 처리, 수정이 어렵다.

2 ) 계층형 커널 : 비슷한 기능의 모듈끼리 묶어 계층화한 커널. 계층 간 통신으로 운영체제를 구현한다. 에러는 해당 계층에 대한 디버깅만 실시하면 돼서 오류 에러 잡기가 수월하다

3 ) 마이크로형 커널 : 커널 영역에선 가장 필수적이고 기본적인 기능(프로세스 관리, 메모리 관리, IPC 통신)만을 제공하고 나머지 부분은 사용자 영역에서 구현된다. 각 모듈의 독립성을 기반으로 한 모듈의 에러가 운영체제 전체에 오류를 발생시키지 않는다. 호환성이 뛰어나다.

∙ 내부 단편화, 외부 단편화

1 ) 내부 단편화

고정 분할 방식(paging)에서 발생한다. 일정한 크기로 분할된 메모리의 크기보다 작은 프로세스가 배치돼서 낭비 공간이 생긴다. 조각모음이 불가능하기 때문에 이 남는 공간을 다른 프로세스에 할당할 수 없다. 분할되는 크기를 조절하면서 내부단편화를 줄여갈 수 있다.

2 ) 외부 단편화

가변 분할 방식(segmentation)에 따라 메모리에 하나의 프로세스를 온전하게 연속적으로 배치한다. 만약 프로세스 중 일부가 종료되고 다른 프로세스가 들어갈 프로세스 사이에 빈 메모리 공간이 부족할 때 생기는데 이것을 외부 단편화라고 정의한다.

∙ LRU 캐싱


세마포어, 뮤텍스
∙ 쉽게 배우는 운영체제 258p, 268p
https://namu.wiki/w/뮤텍스
https://velog.io/@conatuseus/OS-세마포어와-뮤텍스
https://sycho-lego.tistory.com/11

교착 상태 해결책
∙ 쉽게 배우는 운영체제 302p

Multi Thread
∙ 쉽게 배우는 운영체제 167p

Multi Thread Model
∙ 쉽게 배우는 운영체제 175p

System Call
∙ 쉽게 배우는 운영체제 51p
https://devowen.com/215?category=715657

Kernell의 기능과 종류
∙ 쉽게 배우는 운영체제 55p

내부 단편화, 외부 단편화
∙ 쉽게 배우는 운영체제 355p

LRU 캐싱
https://doublesprogramming.tistory.com/254

profile
프론트 개발자 준비

0개의 댓글