사용자가 특정 차트를 고르면, 전 종목의 과거(10년) 차트들을 모두 탐색하여 가장 유사한 차트 10개를 골라 사용자에게 보여줍니다.
비슷한 차트 검색기
전 종목의 최근 10년간 모든 차트를 탐색합니다. 내 종목의 차트는 과연 상승하는 차트일까요?
www.similarchart.com
동기화
작업들 사이의 수행 시기를 맞추는 것
프로세스 동기화
실행 순서 제어를 위한 동기화
: 프로세스를 올바른 순서대로 실행상호 배제를 위한 동기화
: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
공유 자원과 임계 구역
여러 프로세스가 공동의 자원(공유 자원)을 두고 작업을 하는데, 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역이라고 합니다.
두 개 이상의 프로세스가 임계구역에 진입하고자 하면 둘 중 하나는 대기해야 합니다.
만약 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생할 수 있는데, 이를 레이스 컨디션이라고 합니다.
예를 들어 고급 언어는 실행 과정에서 저급 언어로 변환되어 실행되는데, 이때 실행 도중 문맥 교환이 일어날 수 있습니다.
운영체제는 상호 베제를 위한 동기화를 위해 이러한 임계 구역 문제를 세 가지 원칙 하에 해결합니다.
상호 배제
: 한 프로세스가 임계구역에 진입했다면 다른 프로세스는 들어올 수 없다.진행
: 임계 구역에 어떤 프로세스도 없다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.유한 대기
: 임계 구역에 진입하고 싶은 프로세스는 언젠간 들어올 수 있어야 한다.
동기화 기법
1. 뮤텍스 락(Mutex lock)
상호 배제를 위한 동기화 도구
임계 구역에 진입하는 프로세스는 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어둘 수 있고, 다른 프로세스는 임계 구역이 잠겨 있으면 기다리고, 열려 있으면 진입할 수 있습니다.
acquire(){
while(lock == true) // 임계 구역이 잠겨 있다면
; // 잠겨 있나 반복적으로 확인
lock true; // 잠겨 있지 않다면 임계 구역 잠금
}
release() {
lock = false; // 임계 구역 작업이 끝났으니 잠금 해제
}
이는 마치 탈의실 문이 잠겨 있는지 쉴 새 없이 반복하며 확인해 보는 것과 같은데, 이런 대기 방식을 바쁜 대기(busy wait) 라고 합니다.
2. 세마포(semaphore)
공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구.
한 사람만 들어갈 수 있는 탈의실이 3개 있어 3명이 동시에 탈의실 이용을 할 수 있는 것과 같습니다.
락과 세마포는 문제점이 있는데, 바쁜 대기를 반복하며 CPU 주기가 낭비됩니다.
이를 위해 자원이 없을 경우 프로세스를 대기 상태로 만들고, 다른 프로세스가 작업이 끝나면 대기 중인 프로세스를 준비 큐로 옮깁니다.
wait(){
S--; // 사용 가능한 공유 자원의 개수 S
if (S < 0) {
add this process to Queue; // PCB를 대기 큐에 삽입
sleep(); // 대기 상태로 접어듬
}
}
signal() {
S++
if(S <= 0) {
remove a process p from Queue // 대기 큐에 있는 프로세스 p를 제거
wakeup(p) // 프로세스 p를 대기 상태에서 준비 상태로 만듬
}
}
세마포를 이용하면 동시에 실행되는 프로세스의 실행 순서도 제어할 수 있습니다.
세마포의 변수 S
를 0으로 두고 먼저 실행할 프로세스 뒤에 signal
함수, 다음에 실행할 프로세스 앞에 wait
함수를 붙이면 됩니다.
3. 모니터
세마포는 매번 임계 구역에 앞뒤로 wait
와 signal
함수를 명시하는 문제점이 있습니다.
이에 최근에 등장한 동기화 도구가 모니터 입니다. 모니터는 공유 자원과 자원에 접근하기 위한 인터페이스를 묶어 관리합니다. 프로세스는 반드시 인터페이스를 통해 공유 자원에 접근할 수 있습니다.
인터페이스에 접근하기 위한 큐를 이용해 하나의 프로세스만 들어오도록 합니다.
조건 변수
특정 조건을 바탕으로 프로세스를 실행하고 일시 중단하기 위해 모니터는 조건 변수를 사용합니다.
모니터에 진입한 어떤 프로세스가 x.wait()
를 호출하면, 그 프로세스는 조건 변수 x에 대한 큐에 삽입되고 모니터는 다시 비게 됩니다.
wait
연산으로 일시 중지된 프로세스는 다른 프로세스의 signal
연산을 통해 실행이 재개될 수 있습니다. 어떤 프로세스가 x.signal()
을 호출하면, 대기 상태에 있던 프로세스가 깨어나 모니터 안으로 다시 들어올 수 있습니다.
- 특정 프로세스가 아직 실행될 조건이 되지 않았을 경우
wait
를 통해 실행을 중단 - 특정 프로세스가 실행될 조건이 충족되었을 경우,
signal
을 통해 실행을 재개
'운영체제' 카테고리의 다른 글
혼자 공부하는 운영체제 읽고 면접 준비 - 파일 시스템(23.2.15) (0) | 2024.02.15 |
---|---|
혼자 공부하는 운영체제 읽고 면접 준비 - 가상 메모리(페이징 기법)(23.2.14) (0) | 2024.02.15 |
혼자 공부하는 운영체제 읽고 면접 준비 - 교착상태(23.2.13) (0) | 2024.02.15 |
혼자 공부하는 운영체제 읽고 면접 준비 - CPU 스케쥴링(23.2.11) (0) | 2024.02.15 |
혼자 공부하는 운영체제 읽고 면접 준비 - 프로세스와 스레드 (0) | 2024.02.15 |