안녕하세요! 플루토입니다. 이전 시간에서는 컴퓨터 시스템에서의 운영체제의 동기화 기법에 대해서 알아보는 시간을 가졌었습니다!
컴퓨터 시스템의 공유자원에 대해서 두 개 이상의 스레드나 프로세스가 접근하여 동시에 사용하는 문제를 Sharing Problem(공유 문제)라고 칭하고 이렇게 되면 데이터의 일관성이 저해된다 설명을 한 바 있습니다.
이를 막기 위해서 운영체제가 프로세스/스레드 간의 동기화(공유자원에 대해 순서를 지켜 임계 영역을 실행할 수 있도록 제어)를 사용하고 그 방법의 하나로 Lock(Sprin Lock)에 대해서 설명을 했습니다.
혹시 해당 포스트를 먼저 보신분이라면 다음의 포스팅을 읽고 오시길 권장드립니다.
2022.02.21 - [Computer Science/Operating System] - [Pluto의 컴퓨터이야기] 운영체제의 동기화 기법
[Pluto의 컴퓨터이야기] 운영체제의 동기화 기법
안녕하세요 플루토입니다! 오늘은 운영체제의 동기화 기법에 대해서 알아보는 시간을 갖도록 하겠습니다. 이 글을 읽고 난 뒤 여러분은 1. 컴퓨터 시스템의 공유자원에 대해 설명할 수 있습니다
ys-log.tistory.com
오늘은 위의 포스팅에서 다루었던 Lock방식의 동기화의 한계와 그 해결책에 대해서 알아보도록 하겠습니다
이 글을 읽고 난 뒤 여러분은
1. 기존의 락 방식의 동기화의 문제점과 한계에 대해 이해하고 설명할 수 있습니다.
2. 락 방식의 문제점을 개선한 다양한 방법에 대해 이해할 수 있습니다.
1. Lock 문제점과 한계
이전 시간에서 락 방식은 두 가지 함수를 사용해 락을 획득하고 임계 영역 코드를 실행한 뒤 잡은 락을 자시 free 하게 변경해 놓는다!라고 설명을 했습니다.
위의 그림과 같이 여러 프로세스나 스레드에 대해서 이런 방식을 사용하면 문제없이 동기화가 잘 되려나 싶었지만 문제가 있었습니다.
바로 파란색 부분인 락을 획득하는 부분과 릴리즈 하는 부분 또한 임계 영역에 포함이 되어버리는 문제가 발생하기 때문입니다.
만약 스레드 A와 B가 동시에 acquire() 함수를 실행한다면, 임계 영역에 하나 이상의 스레드가 실행되는 문제가 발생합니다.
acquire / release 함수는 반드시 atomic opteration이어야 합니다. 따라서 이를 해결하고자 여러 방식의 솔루션이 등장합니다.
atomic opteration : 명령어 여러 개를 실행하는 데 있어서 인터럽트에 방해받지 않아야 하는 특성입니다. 즉, 명령어가 모두 실행이 되거나 아예 실행이 되지 않아야 하는 것을 보장해야 하는 뜻입니다. 임계 영역에 들어간 스레드는 해당 영역의 코드를 전부 정상 실행하고 나오거나, 아예 하나도 실행하지 못하도록 보장되어야 합니다.
- S/W-only algorithms: 대표적으로 피터슨 알고리즘이 있습니다. 2개의 스레드 간의 컨택스트 스위치에 따른 임계 영역의 동기화 문제점을 turn과 flag라는 전역 변수를 두어 추가해 운용함으로 문제없이 동작할 수 있도록 소프트웨어 관점으로 개선한 것입니다. 예를 들어, flag가 true이라면 프로세스가 임계 구역에 들어가려고 하는 것을 나타내 표시합니다. 이를 확인하고 상호 배제를 할 수 있습니다. 이 외에도 데커 알고리즘, 램 포트 알고리즘 등이 있습니다.
- H/W atomic instructions: 하드웨어가 기존의 acquire() 함수가 실행해서 락을 잡으면 락을 획득하는 것에 해당하는 flag를 바꾸어 주는 것을 소프트웨어가 아닌 하드웨어가 하나의 CPU사이클에 동작할 수 있게 만듦으로써 해당 영역이 실행되는 동한 다른 인터럽트의 영향을 받지 않을 수 있도록 지원합니다. (이를 Test-and-set이라고 합니다.) Compare-and-swap이라는 것도 존재하지만, 중요한 것은 하드웨어가 한 번에 실행(위에서의 플래그 바꾸기)할 수 있도록 지원한다는 것입니다. acquire() 함수를 하드웨어가 지원한다 생각하면 됩니다.
- Disabling interrupts: Timer하드웨어로부터 넘어오는 정기적인 인터럽트를 임계 영역 코드가 실행되는 동안에는 무시해 버리면서 콘택스트 스위칭이 일어나지 않도록 하는 전략이지만, 여러 가지 문제점을 지닙니다. 이는 단순히 인터럽트를 무시하는 식 이므로 ㄱ동기화를 해결하기 위한 근본적인 방법이 아닙니다.
2. Lock방식으로는 부족하다!! 새로운 뭔가가 필요해!
위에서 락 방식을 개선하고자 많은 노력과 시도가 있었지만 이를 충족시키기에는 부족한 부분이 있었습니다.
그래서 Higer-level Synchronization 방법이 등장합니다.
2-1 특징
CPU사이클을 계속 사용하지 않으면서 임계 영역에 들어갈 준비를 한다는 것이 특징입니다. 임계 영역 내부에 있는 상태라도 인터럽트를 enable 한 상태로 두고 싶은 요구사항을 반영해 개선된 동기화 기법이 생깁니다.
- Semaphores : 이진 세마포어는 보통 Mutex라는 별칭으로 불립니다. 이외의 세마포어는 counting semaphore라 부릅니다.
- Monitors: 프로그래머가 작성하는 코드가 아닌 컴파일러가 동기화 코드를 자동으로 추가하고 프로그램 실행 시 강제화 하는 방식입니다.
2-2 장점 및 특징(Semaphores)
2-1의 설명처럼 Cpu자원을 계속 사용하는 busy wating이 아닌 작업 Queue에 들어가 block 되는 형식입니다. 따라서 세마포어는 프로세스나 스레드에 대해 큐 형태의 자료구조로 관리하여 동기화를 실행합니다.
큐를 운용하기 때문에 counter라는 세마포어의 history를 저장할 수도 있는 요소가 존재합니다. wait(), signal() 두 함수는 counter변수를 증/감 시키며 카운터를 사용하게 됩니다.
- wait(): 특정 공유 변수의 값을 감소시킵니다. 세마포어가 열릴 때까지 block 상태를 유지시키는 역할입니다.
- signal(): 공유변수의 값을 증가시킵니다. 다른 스레드가 임계 영역에 들어갈 수 있도록 하는 역할입니다.
2-3 장점 및 특징(Monitors)
위에서의 설명처럼 프로그래머가 직접 동기화 코드를 작성해야 하는 세마포어와 다르게 컴파일러가 동기화 코드를 자동으로 추가해주는 프로그래밍 언어 레벨에서 지원하는 동기화 방식입니다.
모니터 방식은 컴파일러에 의해 캡슐화된 소프트웨어 모듈로서 생각될 수 있으며, 보통 shared data를 포함합니다 그리고 해당 데이터들을 동작/조작할 수 있는 함수의 개념으로 작동됩니다. 따라서 여러 개의 동시 실행하는 프로세스들에게 동기화 기능을 제공합니다.
오늘은 전통적인 동기화 방식인 락 방식의 한계와 문제점 등을 알아보고 이를 개선한 대안과 다른 방식의 동기화 기법에 대해서 알아보았습니다.
다음 글에서 세마포어의 문제점과 이진 세마포어, 카운팅 세마포어의 차이점에 대해 알아보는 시간을 가지도록 하겠습니다.
긴 글 읽어주셔서 감사합니다!
사진 출처 :https://prepinsta.com/(이진 세마포어, 카운팅 세마포어) / 인프런 공룡책 운영체제 강의(Monitor) [무료] 운영체제 공룡책 강의 - 인프런 | 강의 (inflearn.com)
'Computer Science > Operating System' 카테고리의 다른 글
[Pluto's 컴퓨터 이야기] Mutex와 Semaphore의 차이? (0) | 2022.02.28 |
---|---|
[Pluto의 컴퓨터 이야기] Process의 생성과 종료 (0) | 2022.02.24 |
[Pluto의 컴퓨터이야기] Thread의 종류 (0) | 2022.02.23 |
[Pluto의 컴퓨터이야기] 운영체제가 인지하는 두 가지 Events (0) | 2022.02.21 |
[Pluto의 컴퓨터이야기] 운영체제의 동기화 기법 (0) | 2022.02.21 |