티스토리 뷰

반응형
로킹 단위(Locking Granularity)

🔐 로킹 단위(Locking Granularity):

한번에 쓸 수 있는 범위를 어디까지로 정할까?

멀티스레드, 병렬 처리, 데이터베이스...
이런 환경에서 자주 듣는 말 중 하나가 바로 "락(Lock)"입니다.
공통된 데이터를 여러 작업이 동시에 만지면 충돌이 일어나니까,
먼저 쓰는 사람만 쓰도록 잠그는 장치가 필요한 것이죠.

그런데 이런 락(lock)을 걸 때 가장 중요한 선택이 있습니다.

🔍 “어디까지 잠글까?”

이 질문에 대한 답이 바로 오늘 이야기할 로킹 단위(Locking Granularity)입니다.




✅ 로킹 단위란?

로킹 단위

"한번에 쓸 수 있도록 허용할 범위"를 어디까지로 정할지를 말합니다.

조금 더 기술적으로는,

락을 통해 보호하는 데이터 범위의 크기입니다.



🧃 쉽게 이해하는 비유 – 편의점 냉장고 자물쇠

편의점에 큰 냉장고가 있다고 생각해보세요.
사람들이 안 부딪치게 하려면, 자물쇠를 걸어야겠죠?

🧊 1. 큰 자물쇠 하나

  • 냉장고 전체를 잠금
  • 한 사람이 사용하면, 나머지는 기다려야 함

굵은 락(Coarse-Grained Lock)
➡ 병행성 낮음, 단순하고 안전함




🧊 2. 칸마다 자물쇠

  • 콜라 칸, 사이다 칸, 주스 칸… 각각 자물쇠
  • 서로 다른 칸은 동시에 여러 사람이 꺼낼 수 있음

가느다란 락(Fine-Grained Lock)
➡ 병행성 높음, 빠르지만 구현 복잡




💻 프로그래밍에서의 로킹 단위

✔ 큰 단위로 잠그기


std::mutex mtx;

void insert(int value) {
    std::lock_guard lock(mtx);  // 전체 잠금
    my_vector.push_back(value);
}
  • 모든 작업이 같은 락을 사용 → 병렬 처리 어려움
  • 하지만 안전하고 단순



✔ 작은 단위로 잠그기


std::mutex locks[BUCKET_COUNT];

void insert(int key, int value) {
    int i = hash(key) % BUCKET_COUNT;
    std::lock_guard lock(locks[i]);  // 일부만 잠금
    buckets[i].insert(key, value);
}
  • 서로 다른 데이터는 동시에 처리 가능
  • 하지만 락이 많아지면 복잡하고 위험도↑



 


⚖️ 로킹 단위의 선택이 중요한 이유

  • 너무 크게 잠그면: 안전하지만 느려요
  • 너무 작게 잠그면: 빠르지만 복잡해져요



📘 시험에 나오는 표현으로 다시 보기

✔ 기출문제 예시


1. 로킹 단위가 크면 병행성 수준이 낮아진다. ✅
2. 로킹 단위가 크면 병행 제어 기법이 복잡해진다. ❌
3. 로킹 단위가 작으면 로크(lock)의 수가 적어진다. ❌
4. 로킹은 파일 단위로만 이루어지며, 레코드와 필드는 로킹 단위가 될 수 없다. ❌

👉 정답은 1번!

로킹 단위가 크면 동시에 쓸 수 있는 작업이 줄어들기 때문에
병행성(동시 처리 능력)이 낮아집니다.




🎯 요약

구분 설명 비유
로킹 단위 락이 보호하는 범위의 크기 "한번에 쓸 수 있는 범위"
굵은 락 (Coarse) 전체를 한꺼번에 잠금 → 단순, 느림 냉장고 전체 자물쇠
가느다란 락 (Fine) 작은 단위만 잠금 → 빠름, 복잡 칸마다 자물쇠



✍️ 한 문장으로 기억하기

“로킹 단위는, 한번에 쓸 수 있도록 허용하는 범위를 어디까지로 할지를 정하는 것”이다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함
반응형