프로그래밍 기초/OS

쓰레드와 멀티쓰레드

godsangin 2019. 12. 12. 13:03
반응형

안녕하세요. 오늘은 쓰레드와 멀티 쓰레드에 관하여 글을 써볼까 합니다.

혹시 이런 Exception을 보신 적이 있나요 ??

main이라는 쓰레드에서 ArrayIndexOutOfBoundsException이 발생한 경우입니다.

 

 쓰레드는 독자적으로 실행 가능단 작업의 최소 단위입니다. 위의 경우 자바의 main이라는 쓰레드를 생성하고 그 안에서 이루어지는 어떤 독자적인 코드의 흐름에 의해서 발생한 예외상황이기 때문에 해당 쓰레드는 Exception과 함께 종료됩니다.

 하지만 우리가 알고있는 대부분의(OS라던지, PC 프로그램, 소켓 통신, 애플리케이션) 프로그램은 하나의 쓰레드로만 동작하지는 않습니다. RPG 게임을 한다고 가정해볼까요 ?? 나의 캐릭터는 서버와 통신하고 승인이 되면 게임에 '접속'이 됩니다. 이 접속이라는 부분이 중요합니다. 게임에 접속하게 되면 나는 서버의 동작방식과는 상관 없이 '독자적'으로 움직이고 상황을 결정할 수 있습니다. 이것이 바로 새로운 쓰레드(어쩌면 프로세스일지도 모릅니다...)가 생겨나는 것입니다. 이처럼 여러가지 독자적인 쓰레드를 함께 관리하는 '게임'은 멀티쓰레드 환경이라고 할 수 있습니다. 하지만 게임과 같이 규모가 큰 프로그램의 경우 여러 사람들이 독자적인 쓰레드 환경을 가지고 있고 채팅, 아이템, 몬스터 등의 '공유자원'이 존재하게 됩니다. 여기서 독자적인 쓰레드가 공유자원에 읽고 쓰는데 발생하는 문제점이 있습니다. 이를 운영체제 에서는 생산자, 소비자 문제라고 정의합니다.(생산자 소비자 문제는 인터넷에 많은 예시가 존재합니다.)

다음 코드를 살펴볼까요 ?

public class Test {
	static int a = 0;
	public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for(int i = 0; i < 1000; i++) {
					System.out.println(++a);
				}
			}
		});
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				for(int i = 0; i < 1000; i++) {
					System.out.println(a);
				}
			}
		});
		t1.start();
		t2.start();
	}
}

 

a라는 공유자원이 있습니다. 이 공유자원에 접근하는 두개의 스레드를 생성하고 각각 ++연산과 --연산을 반복해보겠습니다. 그런 뒤에 실행을 시켜보면

 

위와 같이 읽고 쓰는데 발생하는 문제점이 생깁니다. 갑자기 생긴 -22라는 값은 context swicth가 발생하여 다른 쓰레드를 실행하는 과정에서 두 쓰레드가 공유자원의 값을 다르게 알고 있다는 것을 의미합니다. 잠깐 뿐이지만 이는 실시간으로 데이터를 처리하는 작업에서는 상당히 치명적일 수 있습니다. 그래서 멀티 쓰레드 환경에서의 공유자원의 신뢰성을 보장하기 위하여 mutax, semaphore라는 개념이 등장합니다. 이는 데이터를 참조할 경우 다른 쓰레드의 참조는 block시키고 잠시 뒤에 데이터 참조가 끝나면 다시 unblock시켜 데이터를 동시에 접근하지 못하도록 막는 기법입니다. 이를 데이터를 가져오는 과정에서 더욱 신뢰성 있는 데이터를 가져오기 위해 '동기화'한다고 할 수 있습니다.

 

 

 

프로세스와 스레드의 차이점

https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html

 

[OS] 프로세스와 스레드의 차이 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

스레드와 멀티스레드

https://m.blog.naver.com/rja1104/220551216367

 

멀티쓰레드란?

정의 : 하나의 프로그램에 동시에 여러개의 일을 수행할수 있도록 해주는것입니다. 쓰레드란 프로세스 내에...

blog.naver.com