goal
쓰레드(thread)에대해서 이해한다.
keyword
쓰레드(thread) & 멀티쓰레드(multi-thread)
1 ] thread란?
1. thread란?
스레드란, 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스는 한 개 이상의 스레드가 존재하여 작업을 수행한다.
그리고, 프로세스 내에서 실행되는 흐름의 단위
라고 스레드를 말하기도 한다.
2. multi-thread란?
멀티스레드란, 프로세스 내부에서 작업을 주체하는 스레드가 두 개 이상인 것을 말한다.
또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 한다.
2 ] 나의 정리 <뇌피셜>
1. thread를 알아야하는 이유
(메모리에 올라간) 프로세스는 목적을 갖고 동작을 수행하게 된다.
이 동작을 수행하기 위해서는 동작을 위해 작업을 해주는 주체가 필요한데,
프로세스를 동작하게 하는 주체는 스레드이고 스레드는 프로세스의 동작을 위해 일을 하게된다.
잠깐 단일스레드
와 멀티스레드
를 언급하자면 아래와 같다.
- 단일스레드 : 스레드 하나가 프로세스를 작업하는 경우
- 멀티스레드 : 두 개 이상의 스레드가 하나의 프로세스를 작업하는 경우
2. thread가 단일스레드던 멀티스레드던 뭐가 중요해?
중요하다. 단순히 일반적인 상황에서 에어컨을 만들 때, 한 명이 작업하는 것과 두 명이 작업을 하는 것중에 무엇이 빠르겠는가? 당연히 두 명이 작업을 하는게 빠르다.
그러면 하나의 프로세스를 두 개 이상의 스레드로 작업을 하면 더 좋겠구나
맞는 말이다. 그러면 멀티스레드를 처리하는 프로그램을 만든다고 할 때 어떻게
할 것인가?
아니, 어떻게
를 생각해보기 이전에 프로세스 내에서 스레드가 어떻게 동작하는지 알아야 설계를 하던가 말던가 하는것이 아닌가? 그래서 멀티스레드를 어떻게 설계할 것인가
라는 문제를 해결하기 위해서 스레드가 프로세스 내에서 어떤 방식으로 동작하고, 어떤 제한이 있는지, 그럼으로써 어떤 부분을 고려해야하는지
를 알 필요가 있다.
3. java에서 쓰레드는 어떻게 동작할까? 멀티쓰레드인 경우는 쓰레드끼리 규칙이 있을까?
[1] 잠깐만, 먼저 프로세스를 보고 가자
프로세스란, 메모리에 실제로 로드되어(적재되어/올라가서) 동작하는 것을 말한다.
메모리에 올라간 프로세스는 작업이 실행되는 시점에 jvm에 의해서 동적인 메모리
를 할당 받게 되는데, 메모리에 올라간 프로세스들 끼리는 서로 관여하지 못한다. (표현이 맞는지 모르겠다.)
※ jvm의 메모리 구조는 static, stack, heap영역이 있는데 간략히 정리하면 아래와 같다.
static : 정적인 메모리가 저장되는 곳
stack : 컴파일할 때 생성되는 부분 (stack에는 여러 stack프레임으로 쌓이게 된다)
heap : 동적으로 할당되는 부분 (사용하지 않는다면 gc에 의해서 처리된다)
[2] 하지만 스레드는?
스레드는 다르다. 스레드는 !! 프로세스의 내부 자원 !!들을 공유할 수 있다.
이를 이용해 프로세스(들)의 내부 자원들을 여러 스레드가 넘나들며 작업을 처리할 수 있다.
[3] 스레드의 규칙
프로세스의 내부 자원은 둘 이상의 스레드가 동시에 처리할 수 없다. 내부자원은 한 스레드가 점유해 처리해야하며 둘 이상의 스레드가 동시에 점유하고 작업을 하려고 할 때 규칙에 어긋나 문제가 발생하게 된다.
[4] 두 개 이상의 스레드가 프로세스 자원을 동시에 작업처리 한다면?
시스템이 다운되거나, 말도 안되는 결과 값이 나오게 된다.
가령, 자동차의 색깔을 정하는 프로그램이 있을 때, 두 쓰레드가 동시에 접근하여 A쓰레드는 "빨강"을 주입하고 B쓰레드는 "노랑"을 주입하게 된다면 어떤 색으로 자동차의 색깔을 입힐것인가? 이와같이 쓰레드가 프로세스의 자원을 동시에 처리하게 된다면 사용자가 원하지 않는 출력으로 이어질 수 있다는 것이다. (예시일 뿐이다. 아마, 동시에 접근하기 이전에 운영체제나 jvm에서 막을 것. 앞선 예시를 최근 이슈에 대입해보아 생각해본다면 S은행에서 일어났던 문제가 이런 비슷한 경우가 아니었을까? -> 물론 아닐거다.)
[5] 스레드의 규칙을 어긋나지 않게 하는 방법
A프로세스의 내부자원의 처리가 필요한다고 가정하겠다.
[1번]스레드가 A프로세스 내부자원을 처리하도록하고 [2번]스레드는 B프로세스의 내부 자원을 처리하도록 만든다. 그리고 각각의 수행된 작업을 동기화 시킨다. 이는 동기화를 처리함과 동시에 교착상태(deadlock)상태를 방지하는 것과 같다. 교착상태와 동기화는 추후에 포스팅하려고 한다. 아직 제대로 이해하고 있지않다.
'CS > 운영체제' 카테고리의 다른 글
운영체제 + java관련(?) + 개발자라면? :) 쓰레드를 알기전에, 멀티프로세싱/멀티프로그래밍/멀티태스킹 (3) | 2022.05.10 |
---|