인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

영욱님의 프로필 이미지

작성한 질문수

그림으로 쉽게 배우는 운영체제

세마포어

세마포어에 관련해 질문입니다

작성

·

68

1

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

세마포어를 사용하는 이유로 공유자원을 동시에 여러 프로세스가 사용하려할때 생기는 오류를 방지하는데 세마포어를 wait(1) 이렇게 1개의 프로세스만 공유자원을 사용할수있다 가정한 후 동시에 여러 프로세스가 공유자원을 사용하려할때 어떤 기준으로 먼저 실행할 프로세스를 선택하나요?

답변 2

0

감자님의 프로필 이미지
감자
지식공유자

안녕하세요 영욱님!
세마포어에 대해서 궁금증이 있으시군요.

세마포어를 사용해서 세마포어(s)를 1로 설정한 상태에서 별다른 설정 없이 여러 프로세스에서 어떤 프로세스가 먼저 실행될 지는 운영체제의 스케줄링 알고리즘에 따릅니다.
운영체제 스케줄링의 높은 우선순위로 선택된 프로세스가 먼저 실행합니다.

 

"그러면 프로그래머가 원하는 프로세스가 먼저 실행되도록 선택은 못하나요?"라는 질문이 나올 수 있을 것 같습니다.
이 부분은 세마포어 연산을 이용해 원하는 프로세스가 먼저 실행되도록 할 수 있습니다.

프로세스 A가 실행할 코드와 프로세스 B가 실행할 코드가 나눠져있고 프로세스 A가 먼저 실행되도록 하고 싶다는 상황으로 예를 들어보겠습니다.

그렇다면 세마포어의 초기값을 아래와 같이 0으로 설정합니다.

s = 0; // 세마포어 선언

프로세스 A가 실행할 코드에는 아래와 같이 signal() 연산을 추가해줍니다.

// 프로세스 A가 실행할 코드
프로세스 A 동작
.
.
.
signal(s); // 세마포어 변수가 1이 됨.

프로세스 A가 실행할 코드는 wait()함수가 없으므로 바로 실행할 수 있습니다.

 

반면 프로세스 B가 실행할 코드에는 wait() 함수를 추가해 프로세스 A의 동작이 끝나고 나서 시작되도록 컨트롤 합니다.

// 프로세스 B가 실행할 코드
wait(s) // 세마포어 변수가 0이면 대기큐에서 기다리고, 1이상이면 바로 실행
프로세스 B 동작
.
.
.
signal(s); // 세마포어 변수에 1을 더해(0+1 = 1) 1로 설정 

만약 운영체제 CPU 스케줄링에 따라 프로세스 B가 실행할 코드가 먼저 실행했더라도 wait() 함수가 호출될 때는 세마포어 변수가 0이기 때문에 대기큐로 들어갑니다.
결국 프로세스 A가 먼저 실행될 수 있습니다.

 

영욱님의 프로필 이미지
영욱
질문자

와 진짜 원하던 답변이였습니다 감사합니다!

영욱님의 프로필 이미지
영욱
질문자

갑자기 생각나서 질문 하나 더 드립니다.

위에 예시로 보여진 코드를 해석하면 프로세스 A는 wait()없이 signal(s)만 선언되어 세마포어의 초기값이 0일경우 세마포어 값이 1이 추가되는데 그럼 프로세스 A가 실행할때마다 세마포어의값이 1씩 계속 추가되서 계속 늘어나게 되나요

그리고 세마포어의 값이 1이되면 다시 A와 B 프로세스가 동시에 실행될때 세마포어의 값이 1이여서 B도 실행이 가능해져 A를 먼저 실행할수 없을거같은데 B가 종료될때 조건구문같은걸 따로 적어줘야 하나요??

감자님의 프로필 이미지
감자
지식공유자

signal() 연산을 계속하면 연산을 할 때마다 1이 늘어나게됩니다.
만약 프로세스 A의 반복문 안에 signal() 연산을 넣어줘 세마포어값이 1이상이 되어
프로세스 A와 B를 동시에 실행된다면 A, B 둘 중 어느 프로세스가 먼저 실행될 지 예측이 힘들 수 있습니다.
이럴땐 반복문 밖에 signal() 연산을 넣어 예측이 가능하도록 해주면 되겠죠?

세마포어는 이렇게 여러 상황을 신경써야하는 복잡성이 있기 때문에 프로그래머가 버그를 만들어 낼 가능성이 크다는 단점이 있습니다.
상황을 잘 분석해 wait()과 signal()을 사용하는 것이 중요합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 영욱님.

세마포어는 여러 프로세스가 공유 자원에 접근할 때 동시 접근으로 인한 문제를 방지하고자 사용됩니다. 세마포어의 wait 함수가 호출될 때, 세마포어의 카운트 값은 감소하고, 값이 0이 되면 다른 프로세스는 자원이 여유로워질 때까지 대기 상태가 됩니다. 이를 통해 한 번에 한 프로세스만 공유 자원에 접근할 수 있도록 합니다.

어떤 프로세스가 먼저 실행되는지에 관한 기준:

  1. 대기 큐: 보통 세마포어가 관리하는 대기 큐가 있어서, wait 호출 시 자원이 여유롭지 않다면 프로세스는 이 큐에 들어가게 됩니다. 이후 자원이 여유로워질 때 (signal이 호출될 때) 큐에 있는 프로세스들이 순차적으로 자원 접근 기회를 얻게 됩니다.

  2. 스케줄링 정책: 운영체제의 스케줄링 정책에 따라 대기 큐에 있는 프로세스가 선택되어 실행될 수 있습니다. 기본적으로는 FIFO (First In, First Out) 방식이 자주 사용되지만, 시스템마다 다를 수 있습니다.

  3. 우선순위: 특정 운영체제나 시스템에서는 우선순위를 가지고 프로세스를 스케줄링하기도 합니다. 높은 우선순위를 가진 프로세스가 대기 중이면 먼저 자원을 할당 받게 됩니다.

유사 질문 탐색

세마포어와 관련된 더 깊은 이해를 위해서 운영체제 강의에서 다루는 우선순위 스케줄링 및 프로세스 관리를 참고하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

영욱님의 프로필 이미지

작성한 질문수

질문하기