윈도우의 프로세스와 스레드 (4)
윈도우의 프로세스와 스레드 (4)
스레드 상태구하기
크게 사용되지않겠지만 스레드의 상태를 구하는 몇가지 함수들이 존재합니다.
그러한 함수들은 스레드의 종료상태를 반환하고 BOOL 형이 때문에 종료되었는지 실행중인지 둘중 하나만 등장하게 됩니다.
스레드는 기본적으로 운영체제에 의해 소멸이 결정되므로 실제 스레드를 종료시키는 명령을 사용하는것과 스레드가 자연히 소멸하는것은 약간의 시간 간극이
존재합니다.
실제로 스레드의 종료 상태를 구하는 함수의 용도는 그렇게 많지 않습니다.
스레드는 여러 다양한 상태를 가지며 사실 이부분은 운영체제의 소관입니다.
그래서 API 레벨에서는 크게 언급될 부분은 아닙니다.
하지만 상태변화에 따른 정보를 개발자가 받아 처리할수있습니다.
Race Condition
하나의 전역 변수를 다수의 스레드가 동시에 사용할경우 경쟁 상태라는 문제가 발생합니다.
이는 변수를 여러 스레드가 같이 사용하다보니 해당 변수가 엉뚱한 값으로 계속변경되는것입니다.
또한 한번에 입출력이 이루어 져야하는 여러장비와 관계된것도 마찬가지입니다.
가령 텍스트 콘솔로 출력되는 프로그램을 멀티스레드로 작성한 경우 콘솔 출력 화면은 각각 스레드가 출력하는
메세지로 뒤덮이는 사태가 벌어집니다.
따라서 스레드는 컨텍스트 전환이 이루어질때마다 자신이 변수를 가지고 있는 유일한
스레드라고 착각하게 되며 공용변수나 공용장치등을 장악하는 스레드는 멋대로
공용자원을 처리해버리곤 맙니다.
따라서 순차적 프로그램과 같은 방법으로 공용변수를 주었다고 한다면 실제 실행은 순차적 프로그램처럼 호출된 스레드 순서대로 일어나는것이 아니라,
동시에 전체 발생된 스레드 및 주 스레드가 동시에 Race 를 시작합니다.
결국 먼저 자원을 점유한 측에서 먼저 멋대로 사용할 권한이 주어지게 되고,
프로그램이나 출력결과는 전혀 예상한대로 나타나지 않고 프로그램을 실행할때마다 결과가 달라지는 일이 벌어지게 됩니다.
Race Condition 을 막기 위해서는 하나의 스레드가 자원을 점유하고 있을때
해당 자원을 스레드가 점유하고 있다는 사실을 다른 스레드에게 알려주는것이 중요합니다.
따라서 점유된 자원에 사용금지 조처가 필요하며, 이러한 방법으로 보통 사용되는것이
Critical Section 입니다. 그러나 이역시 이것만으로 다음 제세되는 교착상태와 관계된 문제를 해결할수없습니다.
철학자의 만찬
다음 그럼은 유명한 철학자의 만찬에 관한것입니다. 운영체제론을 다루는데 있어서 아주 고전적인 문제입니다.
철학자들이 하는일이라고는 생각하고 밥먹는 일밖에 없으며, 다섯명의 철학자들이 식탁에 앉아있습니다.
이들은 항상 밥을 먹는 시간과 양이 동일하지만 언제 밥을 먹고싶어하는지는 아무도 모릅니다.
철학자들은 자기가 내킬때마다 식탁위의 포크를 들어 밥을 먹게 됩니다.
철학자들은 좌우 포크중 임의로 하나를 사용할수있습니다.
만약 밥을 먹는다면 끝까지 밥을 먹어야합니다.
문제는 동시에 많은 철학자가 밥을 먹고싶을때 발생합니다, 포크를 한개만 사용할경우 그림에서 플라톤과, 니체, 헤겔이 동시에 밥을 먹고싶은
상황을 한번 가정해 보겠습니다.
이경우 플라톤은 자신의 오른쪽포크를 사용하고 헤겔은 자신의 완쪽 포크를 집고자할때 니체는 갑자기 밥을 먹을 포크가 사라져버린
결과가 생기고 맙니다, 그결과 니체는 밥을 먹을수없을것입니다.
포크를 두개 사용할때를 가정해보겠습니다, 모든 사람은 자신의 좌우 포크를 다 사용할수있습니다.
플라톤과 니체가 동시에 배가고플경우 플라톤은 모든 포크를 다들고 니체는 오른쪽 포크만 들고있는 상황을 가정해볼수있습니다.
니체는 배가 고프긴 하겠지만 플라톤이 밥을 다먹고 난뒤 왼쪽포크를 확보할수있습니다.
그런데 모든 철학자가 동시에 배가 고파 자신의 오른쪽 포크를 들었을 가정을 해보겠습니다.
이때 철학자들은 모두 오른쪽 포크 사용이 끝나길 기다리게 됩니다.
그러나 오른쪽 포크는 모든 왼쪽 포크가 사용중인 까닭에 하나도 사용가능 상태가 되지않고 모든 철학자들은 배고픔을 견디다 못해 굶어죽고맙니다.
이러한 상황을 DeadLock 이라고 합니다.
Reference
https://karfn84.tistory.com/entry/%ED%8E%8C%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C