PintOS | 동시성 기초: 세마포어와 락으로 자원 지키기

맹쥐·2025년 5월 10일
13

kaist - PintOS

목록 보기
1/10
post-thumbnail

🖥️ 컴퓨터는 동시에 일할 수 있을까?

우리 눈에는 마치 여러 작업을 동시에 처리하는 것처럼 보이는 컴퓨터.
근데 컴퓨터 내부에서는 정말로 여러 작업이 동시에 실행될까?

사실은 “같이”가 아니라
"조금씩 번갈아가며" 일을 하고 있다.
이걸 컴퓨터 세계에서는 동시성(concurrency)이라고 부른다.


동시성(Concurrency)이란?

동시에 여러 작업을 처리하는 것처럼 보이지만,
사실은 CPU가 작업을 빠르게 바꿔가며 실행하는 것이다.

A작업  →  B작업  →  A작업  →  C작업 ...

그런데, 이때 문제가 하나 생긴다.

💥 공유 자원을 동시에 쓰면?

모든 작업이 자기만 쓰는 자원만 쓴다면 안전하다.
그런데 현실에서는 같이 쓰는 자원(공유 자원)이 많다.

예를 들어,

  • 하나의 전역 변수
  • 프린터 3대
  • DB 서버

이런 자원을 여러 스레드가 같이 쓰려 하면,
순식간에 꼬이고 망가질 수 있다.

이걸 Race Condition (경쟁 상태)라고 부른다.


🎢 그림으로 쉽게 이해하기

놀이공원에 비유해보자.

[1] 세마포어: 입장 제한

“놀이터(=공유 자원)”는 인기 많은 공간이다.
하지만 너무 많은 사람이 한꺼번에 들어가면 사고가 날 수도 있다.

그래서 안내자가 말한다.

“⛔️ 일단 5명만 들어가세요~!”

이게 바로 sema_init(&s, 5);
즉, 세마포어가 5라는 뜻이다.

세마포어 = 입장권 같은 것!

일단 이렇게 알아두고 넘어가자.

들어갈 때 sema_down()
나올 때 sema_up()


[2] 락(Lock): 하나씩만 쓴다 !

이제 놀이터 안으로 들어왔다. 여기에는 놀이기구(기구1, 기구2, 기구3)가 있다.

그런데,

❗️ 같은 놀이기구에 동시에 타면 위험하다.

그래서 각 놀이기구에는 자물쇠를 달아두었다.
이 자물쇠가 바로 lock이다.

lock_acquire(&기구1);
타는 중...
lock_release(&기구1);

끝나면 락을 넘겨줘서, 다음 사람이 사용할 수 있게 된다.


[3] 락이 걸렸다면? → 못 탄다!

이번엔 누군가가 기구1을 타고 있는 중이다. 그런데 또 다른 친구가 와서:

“나도 탈래요!”

하지만 락이 걸려있다.
타고 싶어도, 자리가 비어도, 타지 못한다.
락이 풀릴 때까지 대기한다.

이게 바로 BLOCKED 상태이다.


[4] 락이 풀리면? 다음 사람에게 넘김

기구1을 타던 사람이 다 타고 나왔다.
그러자 락을 풀었고, 기다리던 사람이 락을 획득했다.

락이 있어야 자원을 사용할 수 있다.


🔁 정리

🔐 세마포어는?

"동시에 들어갈 수 있는 최대 인원 수" 제한
입장권 같은 역할

🔒 락은?

"같은 자원은 한 명씩만 쓴다."
기구 1개에 1명만 타게 만드는 자물쇠!


💡 이게 왜 중요할까?

운영체제, 서버, DB, 웹, 병렬 프로그래밍에서
스레드가 자원을 공유하는 순간부터
꼭! 이런 동기화 장치가 필요하다.

안 그러면,

  • 데이터가 꼬이고
  • 버그가 터지고
  • 시스템이 멈춘다.

다음 이시간에 🐭

  • Condition Variable 조건이 충족될 때까지 잠시 기다리는 도구
  • Priority Inversion 낮은 우선순위가 높은 애를 막는 문제 (→ priority donation)
  • Optimization Barrier 컴파일러가 코드 순서 바꾸지 못하게 막는 장치
profile
이유민

3개의 댓글

comment-user-thumbnail
2025년 5월 10일

갓 맹 쥐

답글 달기
comment-user-thumbnail
2025년 5월 10일

🐭

답글 달기
comment-user-thumbnail
2025년 5월 11일

와 그림 예시 너무 좋아요.

답글 달기