본문 바로가기
학부/Operating System

병행성(1) - 락(LOCK)

by ulqaef 2019. 12. 14.
728x90

/*

본 내용은 학교 수업내용을 바탕으로 하고 OSTEP(Operating Systems: Three Easy Pieces) 교재를 참고하여 정리한 내용입니다.

*/

 

프로세스는 디스크에 저장되어 있던 프로그램이 메인메모리에 올라와 CPU를 할당받기를 대기하고 있거나 이미 CPU를 할당받아 실행중인 프로그램을 의미한다.
쓰레드는 프로세스내에서 일련의 명령어를 실행하는 흐름의 단위를 의미한다.

각각의 프로세스들은 서로 다른 메모리 공간(코드, 데이터, 힙, 스택)을 할당받아 실행되지만 쓰레드는 프로세스 내부에서 스택영역을 제외한 나머지 메모리 영역을 공유하게 된다.

 

락(LOCK)을 공부하기 전에 그와 관련된 개념들을 우선 알아야 한다.

 

프로세스 내에는 여러 쓰레드가 존재할 수 있다. 이 때 각각의 쓰레드들은 프로세스내의 같은 자원에 접근하기 때문에 의도치 않은 결과과 나올 수 있다. 이러한 낭패를 방지하기 위해서는 몇 가지의 조건이 필요하다.

 

임계영역이란 공유자원을 접근하는 코드의 일부분을 말한다.
경쟁조건이란 여러 쓰레드가 임계영역에 거의 동시에 접근하여 그 코드영역을 실행하려 하는 상황을 말한다.
상호배제란 이러한 경쟁조건이 발생하지 않도록 하나의 쓰레드만 임계영역에 접근하도록 하는 것을 말한다.

여러 쓰레드들이 임계영역에 동시에 접근하려할 때 개발자가 의도한 바와 다른 결과가 나올 수 있다. 그렇기 때문에 이러한 경쟁조건이 발생할 수 있는 임계영역에 접근하기 위해서는 먼저 쓰레드가 락(LOCK)을 획득하게 하고 그 임계영역을 빠져나올 때 락을 반납하도록 해주어야 한다.

 

락을 만들기 전에 고려해야할 기준이 몇 가지 있다. 첫째, 상호배제이다. 즉, 한 쓰레드가 임계영역내로 진입한 상황에서 다른 쓰레드가 임계영역내로 접근하지 못하도록 해야한다는 것이다. 둘째, 공정성이다. 쓰레드들이 락을 보유하는 기회가 공정해야 한다는 것이다. 셋째, 기아상태가 발생하지 않도록 해야한다. 그리고 성능부분이다. 락을 획득하고 반납하는 과정에서 오버헤드가 발생할 수가 있기 때문이다.

위와 같은 기준을 고려하여 락의 구현을 신중히 해야할 것이다.

 

초창기 시스템에서는 상호배제를 구현하기 위해서 인터럽트를 비활성화하는 방식을 택했다. 임계영역에 진입하기 전에 특별한 처리를 하여 임계영역 내에서는 인터럽트가 발생하지 않도록 하면 이는 원자적으로 실행되는 것을 보장할 수 있게 된다. 하지만 이는 큰 문제가 있다.

인터럽트를 활성, 비활성화하는 것은 특권연산이다. 커널영역의 권한이기 때문에 이 권한을 개발자에게 부여하게 되면 엄청난(?)문제(예를 들면  CPU를 독점)가 발생할 지도 모른다.

또한 위와 같이 인터럽트를 비활성화 하는 방식은 다른 프로세서에서 실행중인 프로그램에는 영향을 주지 않기 때문에 멀티프로세서 시스템에서는 효과가 없다. 

그리고 인터럽트를 비활성화 하게 되면 아주아주(?)중요한 인터럽트를 할 수가 없게 된다.

 

 

728x90
반응형

댓글


`