우리 눈에는 마치 여러 작업을 동시에 처리하는 것처럼 보이는 컴퓨터.
근데 컴퓨터 내부에서는 정말로 여러 작업이 동시에 실행될까?
사실은 “같이”가 아니라
"조금씩 번갈아가며" 일을 하고 있다.
이걸 컴퓨터 세계에서는 동시성(concurrency)이라고 부른다.
동시에 여러 작업을 처리하는 것처럼 보이지만,
사실은 CPU가 작업을 빠르게 바꿔가며 실행하는 것이다.
A작업 → B작업 → A작업 → C작업 ...
그런데, 이때 문제가 하나 생긴다.
모든 작업이 자기만 쓰는 자원만 쓴다면 안전하다.
그런데 현실에서는 같이 쓰는 자원(공유 자원)이 많다.
예를 들어,
이런 자원을 여러 스레드가 같이 쓰려 하면,
순식간에 꼬이고 망가질 수 있다.
이걸 Race Condition (경쟁 상태)라고 부른다.
놀이공원에 비유해보자.
“놀이터(=공유 자원)”는 인기 많은 공간이다.
하지만 너무 많은 사람이 한꺼번에 들어가면 사고가 날 수도 있다.
그래서 안내자가 말한다.
“⛔️ 일단 5명만 들어가세요~!”
이게 바로 sema_init(&s, 5);
즉, 세마포어가 5라는 뜻이다.
세마포어 = 입장권 같은 것!
일단 이렇게 알아두고 넘어가자.
들어갈 때 sema_down()
나올 때 sema_up()
그런데,
❗️ 같은 놀이기구에 동시에 타면 위험하다.
그래서 각 놀이기구에는 자물쇠를 달아두었다.
이 자물쇠가 바로 lock
이다.
lock_acquire(&기구1);
타는 중...
lock_release(&기구1);
끝나면 락을 넘겨줘서, 다음 사람이 사용할 수 있게 된다.
“나도 탈래요!”
하지만 락이 걸려있다.
타고 싶어도, 자리가 비어도, 타지 못한다.
락이 풀릴 때까지 대기한다.
이게 바로 BLOCKED
상태이다.
기구1을 타던 사람이 다 타고 나왔다.
그러자 락을 풀었고, 기다리던 사람이 락을 획득했다.
락이 있어야 자원을 사용할 수 있다.
🔐 세마포어는?
"동시에 들어갈 수 있는 최대 인원 수" 제한
입장권 같은 역할
🔒 락은?
"같은 자원은 한 명씩만 쓴다."
기구 1개에 1명만 타게 만드는 자물쇠!
운영체제, 서버, DB, 웹, 병렬 프로그래밍에서
스레드가 자원을 공유하는 순간부터
꼭! 이런 동기화 장치가 필요하다.
안 그러면,
갓 맹 쥐