그런디 세마포어의 경우 사용 이유가 하나의 스레드가 아닌 다중스레드가 동시접근 가능토록 하는 것으로 알고 있습니다
근데 락 개념 자체가 한번에 하나의 스레드만 접근해서 컨디션 레이스를 막으려고 하는건데
세마포어를 쓰면 컨디션 레이스가 발생하는 것이 아닌가요?
어디에 사용하는 것인가요?
댓글 12
카운트가 1 초과인 세마포어( != 뮤텍스 ) 사용처를 솔직히 난 본 적 없음
익명(125.129)2023-04-11 09:11
답글
그건 너가 - dc App
익명(220.94)2023-04-11 22:01
세마포어는 hold and wait 전략씀. 공유자원을 쓰레드 여러개가 접근하려고 할 때, .wait()이랑 .notify()로 critical section 보장. 근데 문제가 .wait()이랑 .notify() 서순이 어긋나거나 둘 중 하나라도 생략되면 바로 데드락 걸림. 이걸 정교하게 컨트롤하기 어려워서 이 문제를 해결하고자 나온게 모니터이고, 모니터는 wait()이랑 notify() 관리해주는 솔루션. 자바에 synchronized 키워드 내부가 모니터로 만들어짐.
익명(125.190)2023-04-11 09:27
세마포어는 레이스 컨디션 막기위해 있는게 아니라 쓸데없이 많은 스레드가 일 하는걸 막기 위함이라고 보면 됨
익명(211.114)2023-04-11 09:54
답글
만들어진 목적을 말하는게 아니라 실제 쓰일때의 용처 말하는거임
익명(211.114)2023-04-11 09:56
답글
이미 스레드 세이프티가 보장된 공유 리소스가 있지만 너무 많은 스레드가 접근하면 효율이 떨어진다 할때 세마포어를 쓰면 되겠지
익명(211.114)2023-04-11 09:58
위에 나와있듯이 세마포어는 신호기반이라 운영체제 시그널을 통해 구현되었고. 이는 단일 프로세스 내에선 성능이 나쁘지만 여러프로세스 간 동기화할때 써먹을수 있었기 때문에 “옛날에”는 세마포어를 프로세스간 동기화에 쓰고 단일 프로세스내에서 멀티스레드간 동기화에는 성능이 좋은 뮤텍스를 쓴거임. 이건 “옛날” 기준이고 요즘은 다 추상화 시켜놔서 프로세스간에도 뮤텍스 쓸수 있을거임.
익명(118.235)2023-04-11 10:06
나도 운체 배울때 이런 질문을 좀 했어야됐는데
부드러운곰탱이(sjobs66)2023-04-11 11:51
작업10000개를 스레드10개에서 처리하는거 세마포어로 만듬
익명(110.70)2023-04-11 17:38
세마포어 활용용도 3가지: 세마포어의 값을 1로 잡으면 락을 걸 수 있고, 0으로 잡으면 쓰레드의 실행순서를 보장할 수 있으며, 코어의 개수만큼 잡으면 멀티코어를 효율적으로 사용할 수 있음. 매우 유연한 솔루션임
카운트가 1 초과인 세마포어( != 뮤텍스 ) 사용처를 솔직히 난 본 적 없음
그건 너가 - dc App
세마포어는 hold and wait 전략씀. 공유자원을 쓰레드 여러개가 접근하려고 할 때, .wait()이랑 .notify()로 critical section 보장. 근데 문제가 .wait()이랑 .notify() 서순이 어긋나거나 둘 중 하나라도 생략되면 바로 데드락 걸림. 이걸 정교하게 컨트롤하기 어려워서 이 문제를 해결하고자 나온게 모니터이고, 모니터는 wait()이랑 notify() 관리해주는 솔루션. 자바에 synchronized 키워드 내부가 모니터로 만들어짐.
세마포어는 레이스 컨디션 막기위해 있는게 아니라 쓸데없이 많은 스레드가 일 하는걸 막기 위함이라고 보면 됨
만들어진 목적을 말하는게 아니라 실제 쓰일때의 용처 말하는거임
이미 스레드 세이프티가 보장된 공유 리소스가 있지만 너무 많은 스레드가 접근하면 효율이 떨어진다 할때 세마포어를 쓰면 되겠지
위에 나와있듯이 세마포어는 신호기반이라 운영체제 시그널을 통해 구현되었고. 이는 단일 프로세스 내에선 성능이 나쁘지만 여러프로세스 간 동기화할때 써먹을수 있었기 때문에 “옛날에”는 세마포어를 프로세스간 동기화에 쓰고 단일 프로세스내에서 멀티스레드간 동기화에는 성능이 좋은 뮤텍스를 쓴거임. 이건 “옛날” 기준이고 요즘은 다 추상화 시켜놔서 프로세스간에도 뮤텍스 쓸수 있을거임.
나도 운체 배울때 이런 질문을 좀 했어야됐는데
작업10000개를 스레드10개에서 처리하는거 세마포어로 만듬
세마포어 활용용도 3가지: 세마포어의 값을 1로 잡으면 락을 걸 수 있고, 0으로 잡으면 쓰레드의 실행순서를 보장할 수 있으며, 코어의 개수만큼 잡으면 멀티코어를 효율적으로 사용할 수 있음. 매우 유연한 솔루션임
0이면 왜 순서가보장돼? 0이면 아무도 못쓰는 리소스아님?? - dc App
음수가 아닌한 작동하니까 대기큐에 넣어놓고 뽑아오면서 하나씩 post하면 되지