일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 이분탐색
- Kotlin
- java
- 알고리즘
- 수학
- 에라토스테네스의 체
- 그리디
- Effective Java
- CS
- 문자열
- BFS
- 동적계획법
- 세그먼트 트리
- 위상정렬
- Network
- 시뮬레이션
- mst
- JUnit 5
- 플로이드-와샬
- swea
- 유니온 파인드
- 구현
- 백준
- dfs
- 후니의 쉽게 쓴 시스코 네트워킹
- 스택
- 완전탐색
- 투 포인터
- 프로그래머스
- 백트래킹
반갑습니다!
[OS] Lock 본문
화장실에 가려하는데 누군가가 사용하고 있다면 사용할 수 없다. 화장실에 문을 잠근다면 (Locking) 다른 사람이 들어올 수 없어 기다려야한다(Waiting). 안에 있던 사람이 문을 열고 나온다면 (Unlocking), 다른 사람은 화장실을 이용할 수 있다.
Lock 이란 프로세스/쓰레드에서 데이터를 베타적으로 사용 또는 갱신하고 싶을 때 사용한다. 이 때, 각 프로세스/쓰레드에서 공유 데이터를 접근하는 프로그램 코드 부분을 임계 영역 (Critical Section) 이라고 한다.
일반적으로 사용하는 대부분의 OS는 선점형 시분할 운영체제이다. 예를 들어 인터넷 브라우저와 메모장을 동시에 실행시키면 각 프로그램은 일정 시간 동안만 CPU를 선점하여 사용한다. 이 때 할당되는 시간 단위를 타임 슬라이스(Time Slice)라고 한다. 이 동작 과정을 이해하기 위해선 프로세스와 쓰레드에 대해 알아야한다. 각 프로그램은 프로세스라는 단위로 움직인다. 그리고 프로세스 안에서 동작하는 실행 단위인 쓰레드가 존재한다.
인터넷 브라우저로 스포츠 영상을 보면 인터넷 브라우저가 프로세스가 되고 브라우저 안에서 영상을 처리해주는 부분과 네트워크로 영상을 받아오는 부분이 각각 쓰레드가 된다.
프로세스 혹은 쓰레드는 Wait라는 상태가 되는 경우가 있다. I/O는 CPU보다 느리다. 만약 디스크에서 데이터를 Read하는 작업을 한다면 CPU는 I/O 작업을 기다리지 않고 다른 작업을 진행하게 된다. 즉, CPU는 Read하는 명령을 요청하고 다른 프로세스에 CPU를 할당한다.(= Context Switch)
세마포어(Semaphore)
세마포어는 리소스의 상태를 나타내는 간단한 카운터라고 할 수 있다. 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용하며, 세마포어는 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 또는 동기화시키는 기술이다.
세마포어는 운영체제 또는 커널의 한 지정된 저장장치 내 값으로서, 각 프로세스는 이를 확인하고 변경할 수 있다. 확인되는 세마포어의 값에 따라 그 프로세스가 즉시 자원을 사용할 수 있거나, 또는 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야만 한다.
세마포어는 이진수 (0 또는 1)를 사용하거나 또는 추가적인 값을 가질 수도 있다. 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야한다.
- 프로세스 간 메시지를 전송하거나 혹은 공유 메모리를 통해서 특정 데이터를 공유하게 될 경우 발생하는 문제는 공유된 자원에 여러 프로세스가 접근하면서 발생하다. 하나의 프로세스만 접근을 가능하도록 해야할 때 세마포어를 사용한다.
- 바이너리 세마포어랑 세마포어의 값이 0과 1만을 지니도록 구현된 세마포어를 말한다.
화장실 예제로 다시 살펴보면, 세마포어는 1개 이상의 열쇠라고 할 수 있다. 만약 화장실 칸이 4개이고 열쇠가 4개라면, 4명까지는 대기없이 바로 사용할 수 있고 그 다음 부터는 대기를 해야한다.
뮤텍스 (Mutex)
뮤텍스는 공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것이다. 즉, 임계 영역을 가진 쓰레드들이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술이다.
다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 locking과 unlocking을 사용한다. 간단히 말해, 뮤텍스 객체를 두 쓰레드가 동시에 사용할 수 없다.
위 화장실 예제로 다시 살펴보면, 뮤텍스는 무조건 1개의 열쇠만 가질 수 있다. 그리고 열쇠가 있는 사람만 화장실(자원)을 사용할 수 있다.
뮤텍스와 세마포어의 차이점
- 세마포어는 뮤텍스가 될 수 있지만 뮤텍스는 세마포어가 될 수 없다.
- 세마포어는 소유할 수 없지만 뮤텍스는 소유가 가능하며 소유주가 책임을 진다
- 뮤텍스의 경우 소유하고 있는 쓰레드가 해제할 수 있지만, 세마포어의 경우 소유하지 않은 쓰레드가 세마포어를 해제할 수 있다.
- 세마포어는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재한다. 반면 뮤텍스는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 clean up된다.
- 뮤텍스는 동기화 대상이 오직 하나일 때, 세마포어는 동기화 대상이 여러 개일 때 사용한다.
모니터(Monitor)
동기화 문제를 해결하는 뮤텍스와 세마포어를 알아보았다. 하지만 뮤텍스와 세마포어 말도고 다양한 도구가 존재하는데, 현재 사용되는 도구 중 하나가 모니터이다. 특히 자바 프로그램에서는 모니터에 대한 활용이 높다. 세마포어가 어셈블리 언어에 적합한 도구라면 모니터는 그보다 고수준인 언어의 도구라고 할 수 있다.
모니터의 경우 내부에 2개의 큐가 있다. 이 큐들은 각각 배타 동기와 조건 동기의 역할을 한다. 배타 동기의 큐는 하나의 쓰레드만 공유 자원에 접근할 수 있도록 해주는 역할이다. 특정 쓰레드가 공유 자원을 사용하는 함수를 사용하고 있으면 다른 쓰레드는 공유 자원에 접근하지 못하고 대기하고 있어야한다. 조건 동기의 큐는 진입 쓰레드가 블록되면서 새 쓰레드를 진입 가능하게 하는 역할이다. 이 때 새 쓰레드는 조건 동기로 블록된 쓰레드를 깨울 수 있다. 깨워진 쓰레드는 현재 쓰레드가 임계 구역을 나가면 재진입할 수 있다. 아래의 그림을 보면서 이해해보자.
쓰레드 1이 임계 구역에 접근하였다. 이 때 synchronized를 사용하면 공유 자원에 Lock이 걸리게 되고, 다른 쓰레드들은 접근할 수 없으므로 배타 동기 큐에서 대기한다.
실행 중에 wait 함수로 쓰레드 1을 block시켜서 쓰레드 1은 조건 동기 큐로 이동한다. 그리고 공유 자원을 사용하는 쓰레드가 없으므로 배타 동기 큐에서 대기하던 다음 쓰레드가 진입한다.
쓰레드 2가 notify로 쓰레드 1을 다시 깨우면, 쓰레드 1은 block 상태에서 벗어나게 되고, 쓰레드 2가 임게 영역에서 나가면 다시 재진입하게 된다.
'CS' 카테고리의 다른 글
[Network] HTTPS (0) | 2020.05.25 |
---|---|
[Network] XML, JSON 비교 (0) | 2020.05.25 |
[Network] 프록시 서버 (0) | 2020.05.12 |
[Network] URL, URN, URI (0) | 2020.05.12 |
[Network] 쿠키와 세션 (0) | 2020.05.12 |