stemmmm / cs-study

컴퓨터 공학을 모의 면접으로 학습하는 스터디
2 stars 0 forks source link

6주차 #6

Open stemmmm opened 2 months ago

stemmmm commented 2 months ago
jihojivenchy commented 1 month ago

독자 - 저자 문제에 대해 설명하세요.

독자-저자 문제의 기본 개념

핵심

문제 해결 방법

[우선순위가 없는 방식]

[저자 우선 방식]

생산자 - 소비자 문제에 대해 설명하세요.

생산자

소비자

공유 버퍼

[필요한 이유]

생산자 - 소비자 문제

웹 서버 예시

[생산자]

[소비자]

[대기큐]

조건 동기화의 필요

코드 예시

let bufferCapacity = 5  // 버퍼의 용량
var buffer: [Int] = []

let semaphoreFull = DispatchSemaphore(value: 0)                // 소비자 대기 신호
let semaphoreEmpty = DispatchSemaphore(value: bufferCapacity)  // 생산자 대기 신호
let accessQueue = DispatchQueue(label: "bufferAccess")

func producer(item: Int) {
    // 버퍼에 빈 공간이 있는지 확인 (세마포어 감소)
    semaphoreEmpty.wait()

    // 버퍼에 데이터 추가하기
    accessQueue.sync {
        buffer.append(item)
    }

    // 소비자에게 버퍼에 데이터가 있음을 알림 (세마포어 증가)
    semaphoreFull.signal()
}

func consumer() {
    // 버퍼에 데이터가 있는지 확인
    semaphoreFull.wait()

    var item: Int?

    accessQueue.sync {
        item = buffer.removeFirst()
        print("소비 아이템 \(item)")
    }

    // 버퍼 카운트를 증가 -> 생산자가 저장할 공간이 늘어남
    semaphoreEmpty.signal()
}

DispatchQueue.global().async {
    for i in 1...10 {
        producer(item: i)
    }
}

DispatchQueue.global().async {
    for _ in 1...10 {
        consumer()
    }
}