티스토리 뷰

반응형

🧠 UC Count란 무엇인가?

운영체제와 프로세스 사이에서 ‘자원 사용 상태’를 추적하는 방법


💡 운영체제가 자원을 관리할 때 생기는 질문 하나

컴퓨터에는 수많은 프로그램(= 프로세스)이 돌아갑니다.
이 프로세스들은 파일을 읽고, 데이터를 저장하고, 프린터를 쓰는 등
운영체제가 제공하는 자원을 사용합니다.

그런데 이때 아주 중요한 문제가 하나 생깁니다:

운영체제는 어떻게 “지금 어떤 프로세스가 어떤 자원을 사용하고 있는지” 기억할까?

  • 자원을 쓰는 도중에는 절대 정리하면 안 되겠죠.
  • 하지만 아무도 쓰고 있지 않다면 자원을 회수해야겠죠.

이 판단을 위해 운영체제는 각 자원에 대해
다음과 같은 두 가지 정보를 따로 추적합니다:

  1. Handle Count
    → “이 자원에 연결된 열쇠(핸들)가 몇 개나 존재하나?”
  2. UC Count (User Context Count)
    → “이 자원을 실제로 사용 중인 프로세스가 몇 개나 있나?”

이 글의 주인공은 바로 두 번째, UC Count입니다.


🧾 User Context(UC)란?

자원을 쓰고 있는 ‘상황 정보’ 전체

컴퓨터에서 어떤 프로세스가 자원을 쓰고 있을 때,
운영체제는 해당 프로세스가 어떤 상태로 자원을 사용 중인지 기억해야 합니다.

예를 들어,

  • 어떤 파일의 어디까지 읽었는지
  • 어떤 명령어를 실행 중인지
  • 어떤 데이터를 쓰고 있었는지

이런 정보 전체를 운영체제는 User Context(사용자 문맥) 라고 부릅니다.
즉, 프로세스가 자원을 쓰는 동안 운영체제는
“이 프로세스가 자원과 어떤 관계를 맺고 있는지” 전부 기억하고 있어야 하죠.


🔢 UC Count란 무엇인가?

운영체제가 기억하고 있는 “현재 자원을 사용 중인 프로세스의 수”

이제 UC Count를 정의할 수 있습니다.

UC Count는 특정 자원을 현재 사용 중인 프로세스(User Context)의 수를 나타내는 값입니다.

즉, 어떤 자원을 현재 사용 중인 프로세스가 하나라도 있다면
운영체제는 그 자원을 절대로 회수하지 않습니다.

반대로, UC Count가 0이라면
운영체제는 “이 자원을 지금 아무도 안 쓰고 있구나”라고 판단하고
자원을 해제하거나 재활용할 수 있습니다.


📦 단일 프로세스 상황에서의 예시

흔히 오해하듯 UC Count는 “동시 사용”만을 위한 게 아닙니다.
“동시든 아니든, 자원을 사용하고 있느냐”가 핵심입니다.

🎬 상황

  • 프로세스 A가 파일을 연다 → 운영체제는 파일 오브젝트를 생성
  • 프로세스 A는 파일 쓰기 작업을 시작한다 → 운영체제는 “이 자원을 사용 중”으로 인식
  • UC Count = 1 (현재 자원을 사용하는 문맥 1개)
  • 작업이 끝난 후 → UC Count = 0

이때 UC Count가 없다면?
운영체제는 그 파일을 아직 쓰고 있는지, 다 썼는지를 알 방법이 없습니다.

핸들만 봐서는 알 수 없어요.
핸들은 단순히 “접근 권한을 갖고 있다”는 뜻이기 때문입니다.


🔍 UC Count와 Handle Count는 어떻게 다를까?

항목 UC Count Handle Count

의미 현재 자원을 실제로 사용 중인 프로세스 수 자원을 참조하고 있는 핸들의 수
예시 파일을 열고 읽는 중 파일을 열었지만 아직 읽지 않음
카운트 증가 시점 작업을 시작할 때 핸들을 열 때 (OpenHandle 등)
카운트 감소 시점 작업 완료 후 핸들을 닫을 때 (CloseHandle)
사용 목적 자원 정리 타이밍 판단 참조 중 여부 확인

운영체제는 이 두 개의 수치를 모두 확인해서
“지금 자원을 없애도 되는지”를 정확하게 판단합니다.


📚 비유: 도서관 사물함

도서관에 개인 사물함이 있다고 해볼게요.

  • A학생이 사물함 열쇠를 받아갑니다 → Handle Count +1
  • 하지만 아직 사물함에 손을 대지는 않았습니다 → UC Count = 0

이후 A학생이 사물함에서 노트를 꺼냅니다 → UC Count +1

작업이 끝나고 다시 넣습니다 → UC Count -1

마지막으로 열쇠를 반납합니다 → Handle Count -1

🔐 사서 입장에서는 언제 사물함을 정리해야 할까요?

  • UC Count == 0 && Handle Count == 0
    → “진짜 아무도 안 쓰는구나!” → 사물함 정리 가능

이처럼 UC Count는
“지금 사용 중이냐 아니냐”를 명확하게 판단하기 위한 핵심 도구입니다.


🧠 왜 중요한가?

컴퓨터 운영체제는 수많은 자원을 효율적으로 관리해야 합니다.
불필요한 자원을 계속 들고 있으면 메모리 낭비가 되고,
반대로 쓰고 있는데 정리해버리면 프로그램이 오류를 일으킵니다.

이런 위험을 피하고,
자원을 정확히 언제 회수할지 결정하기 위해
운영체제는 핸들의 존재만으로는 부족하다고 판단합니다.

→ 그래서 등장한 것이 바로 UC Count입니다.


✅ 정리: UC Count는 운영체제의 '사용 중 추적기'

개념 설명

User Context 자원을 쓰고 있는 프로세스의 실행 정보
UC Count 이 자원을 실제로 사용 중인 문맥의 수
Handle Count 자원에 연결된 핸들의 수 (접근 권한 여부)
둘의 차이 “지금 쓰고 있는지” vs. “접근 가능한 상태인지”

UC Count는 단순한 숫자 이상의 의미를 가집니다.
운영체제가 자원을 정리할 수 있는 최종 시점을 결정하는 핵심 판단 도구이며,
단일 프로세스 상황에서도 반드시 필요한 정보입니다.


 


🔍 UC Count는 실제로 언제 증가하고, 언제 감소할까?


💡 UC Count는 무엇을 추적하는가?

복습 한 줄 요약:

UC Count란, "이 자원을 실제로 사용 중인 프로세스의 수"를 나타내는 카운터입니다.

즉,

  • 어떤 자원(예: 파일, 동기화 객체 등)을
  • 실제로 사용하기 시작하면 → UC Count 증가
  • 사용이 끝나면 → UC Count 감소

중요한 건,
단순히 핸들을 여는 것만으로는 UC Count가 증가하지 않는다는 점입니다.
사용자가 어떤 동작을 통해 "자원을 점유했다"고 인식되는 시점에만 카운트가 증가합니다.


🧭 예제 중심으로 이해하기

🎬 예시: 동기화 객체(Event Object)를 사용하는 상황

(단일 프로세스 기준, 동시 사용 없음)


🧱 준비: 동기화 객체 생성

HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  • 여기서 CreateEvent()는 커널 오브젝트인 Event를 생성하고
  • 핸들 하나를 리턴함 → 이 시점에서:

카운터 값

Handle Count 1
UC Count 0

→ 아직 이 자원을 사용한 건 아님.
→ 단지 "참조 가능한 열쇠(handle)"를 가진 상태.


⏳ 사용: 자원을 실제로 사용하기 시작

WaitForSingleObject(hEvent, INFINITE);
  • 이 함수는 현재 쓰레드를 hEvent가 신호 상태(signaled)가 될 때까지 기다리게 합니다.
  • 이 동작은 커널 오브젝트를 점유하고 사용하는 행동입니다.

→ 이 순간 UC Count가 1 증가합니다.

카운터 값

Handle Count 1
UC Count 1

운영체제는 "이 프로세스가 이 자원을 실제로 사용하고 있다"고 판단합니다.


✅ 사용 완료: 자원 사용 종료

// hEvent가 신호 상태로 바뀌고 기다림이 끝남 → 내부적으로 대기 해제
  • 이 시점에서 OS는 이 쓰레드가 자원 사용을 끝냈다고 간주합니다.
  • 자동으로 UC Count가 1 감소합니다.

카운터 값

Handle Count 1
UC Count 0

이제 자원은 다시 사용 가능한 상태이며,
운영체제는 "아무도 이 자원을 사용하지 않는다"고 판단할 수 있습니다.


❌ 핸들을 닫을 때

CloseHandle(hEvent);
  • 이건 단순히 핸들을 닫는 작업입니다.
  • 즉, “접근 권한을 반납”하는 것이지, “사용 중단”이 아닙니다.

→ 이 시점에서 Handle Count는 1 감소,
→ 하지만 UC Count에는 아무 영향 없음 (이미 0이었으므로)

최종적으로 두 카운터 모두 0이 되면:

카운터 값

Handle Count 0
UC Count 0

→ 운영체제는 이 커널 오브젝트를 **메모리에서 완전히 제거(삭제)**합니다.


🔁 전체 흐름 정리

단계 호출 함수 Handle Count 변화 UC Count 변화 의미

자원 생성 CreateEvent() +1 0 참조 가능, 사용 전
자원 사용 시작 WaitForSingleObject() 0 +1 실제 사용 시작
자원 사용 완료 (대기 종료됨) 0 -1 사용 종료
핸들 닫기 CloseHandle() -1 0 참조 해제

📌 또 다른 예: 파일 읽기 흐름

파일을 읽는 흐름에서도 동일한 로직이 적용됩니다.

HANDLE hFile = CreateFile(...);   // Handle Count +1
ReadFile(hFile, ...)              // UC Count +1
// 읽기 완료 후 내부적으로 UC Count -1
CloseHandle(hFile);               // Handle Count -1
  • ReadFile() 호출 시 UC Count 증가
  • 작업 완료 시 UC Count 감소
  • CloseHandle()은 핸들만 닫고, UC Count에는 영향 없음

🧠 왜 자동으로 감소하는가?

UC Count는 개발자가 직접 관리하지 않습니다.
→ 운영체제 커널이 “자원을 사용 시작”하는 지점과 “사용 종료” 지점을 감지해서
자동으로 증가/감소 처리합니다.

이유는 다음과 같습니다:

이유 설명

신뢰성 프로그래머 실수 없이 자원 회수 가능
안정성 사용 중인 자원 정리 방지
정확성 실제 사용 중인 프로세스만 계산 가능

✅ 마무리 요약

행동 UC Count 변화 Handle Count 변화

자원 생성 0 +1
자원 점유 (Wait, Read 등) +1 0
자원 사용 종료 (대기 해제, 읽기 완료 등) -1 0
핸들 닫기 (CloseHandle) 0 -1
  • UC Count는 자원 “사용 여부”를 추적
  • Handle Count는 자원 “참조 여부”를 추적
  • 둘 다 0이 되어야 자원이 운영체제에 의해 완전히 정리됨

 

반응형

'프로그래밍 > 시스템 프로그래밍' 카테고리의 다른 글

IPC 방법 - 메일슬롯  (0) 2025.03.24
IPC는 왜 필요할까?  (0) 2025.03.24
커널 오브젝트와 핸들  (0) 2025.03.24
프로세스(Process)란?  (0) 2025.03.21
주소 참조 방식(Direct vs Indirect)  (0) 2025.03.21
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함