본문으로 이동

A2호스팅 자체 업데이트 기능이 활성화되어 미디어위키 엔진이 1 45오 올랐습니다 호환성 확보를 위한 안정화를 끝낼 예정이니 양해해주셨으먄 좋겠습니다..

  1. 큰숲백과:청사진에서 위키 발전의 대략적인 방향성을 제시했습니다. 의견이 있으신 분은 큰숲백과토론:청사진에서 의견을 남겨주시면 좋겠습니다.
  2. 기능상의 오류로 지원하지 않고 있는 기능에 대해서는 큰숲백과토론:이슈 트래커에 요약했습니다. 참고하시기 바랍니다.
  3. 데이터베이스 덤프 받고싶으신 분은 큰숲백과 가입 후에 사용자토론:Bigforest에 의견 남겨주시면 ftp 주소, 계정, 비밀번호를 특수:EmailUser를 통해서 공개할 예정입니다.

세마포어

큰숲백과, 나무를 보지 말고 큰 숲을 보라.


세마포어운영체제에서 서로 다른 태스크들이 동시에 하나의 장치 내의 실행 시간, 작업 권한 등의 자원(Resource)을 사용하려고 할 경우 작업 충돌을 피하기 위해 개발된 개념이다. 다익스트라 알고리즘으로 유명한 에츠허르 다익스트라가 처음 제시했다.

세마포어는 특정한 전역 정수 변수(카운터)가 0이 될 때 특정 자원을 사용 중인 태스크(또는 태스크들) 외의 태스크들은 자원에 접근하지 못하게 한다. 세마포어에 접근하는 락 메서드는 카운터가 0이 아니라 1만큼 내릴 수 있으면 카운터를 내리고 접근한 프로세스를 기록하며, 이미 0이어서 내릴 수 없는 경우 해당 태스크의 실행을 일시 중지하고 기다린 다음 다시 락을 잡게 한다. 락을 걸기만 하고 풀지 않으면 자원 관리 체계가 꼬이는 참사가 나기 때문에 락 메서드를 건 태스크는 작업 종료 전 카운터를 다시 올려주는 해제 메서드를 반드시 호출해야 한다.

세마포어 락의 기준이 되는 카운터의 최대값이 1인 이진 세마포어의 경우(즉 한 번 잡으면 즉시 자원에 대한 접근이 막히는 경우)를 Mutual Exclusion의 약칭인 Mutex(뮤텍스)라고도 한다. 보통 단일 자원에 세마포어 락을 필요로 하는 경우가 많아 아예 이런 별칭까지 나올 정도로 자주 쓰인다.

교착 상태(Deadlock)

[편집 | 원본 편집]

서로 의존성이 있는 둘 이상의 자원에 둘 이상의 태스크가 동시 접근하는 경우 자원들에게 임의의 순서로 세마포어를 걸었다가 작업 완료를 위해 사용해야 하는 또 다른 자원을 서로 걸은 세마포어 락 때문에 사용하지 못하는 데드락(교착 상태)가 발생한다.

교착 상태의 경우 상호 배제로 한 번에 하나만 자원을 쓸 수 있으며, 자원을 쓰는 동안 또 다른 자원을 잡아야 하며, 강제로 자원을 빼앗아올 방법이 없고, 서로가 서로가 가진 자원을 가져가야 하는 순환 대기가 있어야 발생한다. 따라서 4가지 중 하나를 부수어야 교착 상태가 풀린다.

가장 좋은 방법으로 여러 개의 같은 자원를 잡는 태스크들은 반드시 자원의 세마포어 락을 잡고 푸는 순서를 일치시키는 조치를 취할 수 있다. 이건 교착 상태에 대한 대책 중 prevent 방식에 해당한다. 다만 실제 상황에서는 복잡한 환경 변화를 감지해야 하는 등의 이유로 작업 우선순위가 꼬이거나 사람이 오류가 있는 프로그램을 만들기 쉬운 경우도 있어 여전히 이런 부분이 발생할 가능성은 있다. 그래서 사람 생명이 중요한 고성능 임베디드 시스템(예: 항공 시스템 등)은 비상 상황을 대비해 핵심 기능을 제외한 각종 추가 기능들에 적용할 데드락 대책을 추가로 붙인다.

Detect 방식은 운영체제가 소프트웨어들을 분석해서 데드락이 일어날 법한 요청을 탐지하는 것이다. 주로 자원 할당에 관한 그래프들을 그리는 종류가 많다.

Prevent 방식은 앞서 말한 AB-BA 패턴 금지 이외에도 프로세스가 일정 시간 자원 점유를 하지 못하도록 코드를 짜는 방법 등도 포함한다.

Avoid는 은행원 알고리즘[1] 등으로 최대한 교착 상황에 접근하지 않는 별도의 알고리즘을 탑재하는 방식이다.

Recovery는 그냥 문제가 발생했을 때에 문제의 원인을 없애버리는 방법이다. 지나치게 오래 실행된 프로세스를 죽이거나 할당되었는데 아무리 기다려도 해제가 되지 않는 자원을 특정 기준 시간 이후 강제로 회수해버리는 방법이 있다.

  1. 각 프로세스의 현재 자원 사용량, 각 프로세스의 종료까지 필요한 추가 자원 요청량, 그리고 현재 시스템에 남은 자원의 양을 알고 있을 때 현재 남은 자원에서 요청한 자원을 줄 수 있으면서 프로세스 종료 시 회수할 수 있는 자원이 가장 큰 프로세스를 찾아 먼저 자원을 주는 알고리즘.