OS에 대한 기초 지식
Example
-
화장실에 일을 보러 가야 하는데
누군가가 사용하고 있다면 다른 사람은 사용할 수 가 없다.
이 때 문을 잠금다면(=Locking) 다른 사람이 들어가고 싶어도 못 들어(=Waiting) 간다.
안에 있던 사람이 문을 열고(=UnLocking) 나와야 다른 사람이 들어갈 수 있게 된다.
-
락킹은 내가 베타적으로 데이터를 갱신 & 사용하고 싶을 때 사용된다.
= 내가 사용하는 데이터를 그 누구도 못건드리게 하고 싶을 때 사용한다.
-
이런 부분을 임계 영역(Critical section)이라고 한다.
-
일반 유저가 사용하는 대부분의 OS는 선점형 시분할 운영체제이다.
-
그렇기 때문에 Chrom과 메모장을 동시에 실행시키면
각 프로그램은 일정 시간 동안만 CPU를 선점하여 사용한다.
-
이 때 할당되는 시간 단위를 타임 슬라이스(Time Slice)라고 한다.
-
이 동작 과정을 이해하기 위해선
프로세스와 쓰레드에 대해 알아야한다.
-
각 프로그램은 프로세스라는 단위로 움직인다.
-
그리고 프로세스 안에서 동작하는 실행 단위인 쓰레드가 존재한다.
-
Chrom으로 스포츠 영상을 보면 크롬이 프로세스가 되고
Chrom안에서 영상을 처리해주는 부분과 네트워크로 영상을 받아오는 부분이 각각 쓰레드가 된다.
-
그런데 프로세스 혹은 쓰레드가 Wait라는 상태가 되는 경우가 있다.
-
일반적으로 H/W는 CPU보다 느리다.
-
만약 디스크에서 데이터를 Read하는 작업을 한다면
CPU는 H/W의 Read 작업을 기다리지 않고 다른 작업을 진행하게 된다.
즉 CPU는 Read하는 명령을 요청하고 다른 작업을 진행한다. (= Context Switch)
Sleep 가능한 락
Example
대학 입학 채용 인원이 k명인데 n명이 지원을 했다. (k < n)
이 경우 k명을 제외한 사람은 예비 번호를 받고 기다리게 된다.
안타깝게도 A와 B는 k명에 포함되지 않아 예비 번호를 받게 됐다.
기다리다 지친 A는 핸드폰 연락이 오기를 기다리며 잠을 청했고
언제 연락올지 모르기 때문에 불안한 B는 자지 않고 기다리기로 했다.
-
락 중에는 이런식으로 자원(=입학)에 접근 하는 락이 있다.
-
이게 바로 세마포어(Semaphore) 개념이다.
-
세마포어는 보통 자원에 관계된 락이다.
-
그래서 락을 걸 때 특정 수 만큼의 카운트(=k)로 접근을 제어한다.
-
이런 락을 슬립(Sleep)가능한 락이라고 한다.
-
또한 뮤텍스(Mutex)라는 락이 있는데
이는 Mutualy Exclusive라는 락이다.
-
결국 이것도 세마포어긴 한데
세마포어인데 카운트가 1인 락으로 봐도 무방하다.
스핀락 (Spin Lock)
-
대학 입학 예를 다시 보자.
-
B는 자지 않고 전화를 기다리고 있다.
-
이처럼 자원을 획득하기 위해 Sleep 하지 않고 계속해서 Try하는 락을 스핀락이라 한다.
-
좀 더 OS스럽게 이야기하자면
스핀락은 만약 다른 쓰레드가 Lock을 소유하고 있다면
Sleep하지 않고 그 Lock이 반환될 때까지 계속 확인하며 기다린다.
-
일반적으로 프로세스를 컨트롤 하는 입장에서
데이터를 Memory에 쓰고 Sleep하고 있는 프로세스를 깨워
Context Switching을 하는 작업은 비싼 Cost를 필요로 한다.
-
그렇기 때문에 아주 작은 작업에 대해서는
스핀락이 세마포어 혹은 뮤텍스 보다 효율적이라고 할 수 있다.
특징
-
스핀락을 잘 사용하면 Context Switching을 줄여 효율을 높일 수 있다.
= 운영 체제의 스케줄링 지원을 받지 않기 때문에 Context Switching이 일어나지 않는다.
-
Lock을 얻을 수 없다면 얻을 때까지 기다린다.
= Busy Wating
바쁘게 기다린다는 것은
무한 루프를 돌면서 다른 쓰레드에게 CPU를 양보하지 않는 것이다.
그렇기 때문에 Lock이 오랫동안 유지된다면
그 Lock을 기다리면서 오히려 CPU 시간을 많이 소모할 가능성이 있다.
-
단일 CPU 혹은 단일 코어인 경우에는 유용하지 않다.
Lock을 갖고 있는 쓰레드를 풀어주려면
싱글 CPU 시스템에서는 어차피 Context Switching이 일어나야 하기 때문이다.
-
스핀락을 잘못 사용하면 CPU 사용률이 100%가 된다.
스핀락은 기본적으로 무한 루프를 돌며 Lock을 기다리므로
획득하려는 Lock을
하나의 쓰레드가 Lock을 오랫동안 가지고 있다면 CPU를 낭비하게 된다.
Summary
-
스핀락은 Lock 해제 시
Context Switching에 대한 오버헤드 없이 임계 구역에 접근을 한다.
-
스핀락은 Lock을 획득하기 위해 CPU 자원을 점유하므로
임계구역 진입을 위한 대기 시간이 짧을 때 사용하는게 바람직하다.
= CPU를 비효율적으로 사용할 위험이 낮아진다.