스레드(Thread)

Brie·2023년 11월 6일
0

운영체제(OS)

목록 보기
1/6

스레드

운영체제는 코드와 데이터를 메모리에 가져오고, 프로세스 제어 블록을 생성하고, 작업에 필요한 메모리 영역을 확보한 후, 준비된 프로세스를 준비 큐에 삽입한다.

프로세스가 생성되면 CPU 스케줄러는 프로세스가 해야 할 일을 CPU에 전달하고 실제 작업은 CPU가 수행한다. 이때 CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다. 그러므로 CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드이다.

운영체제 입장에서의 작업 단위는 프로세스이고 CPU 입장에서의 작업 단위는 스레드인 것이다. 프로세스 입장에서는 스레드를 다음과 같이 정의할 수 있다.

💡 스레드는 프로세스의 코드에 정의된 절차에 따라 CPU에 작업 요청을 하는 실행 단위이다.

프로세스와 스레드의 차이

프로세스끼리는 약하게 연결되어 있는 반면, 스레드끼리는 강하게 연결되어 있다.

여러 개의 프로세스로 구성된 멀티태스크와 하나의 프로세스에 여러 개
의 스레드로 구성된 멀티스레드의 차이는 다음과 같다.

  • 멀티태스크 서로 독립적으로 작동하며 필요할 때 출력할 데이터를 주고받는다. 한 쪽 프로세스가 비정상적으로 종료되어도 다른 프로세스는 정상적으로 작동한다. 서로 독립적인 프로세스는 데이터를 주고받을 때 프로세스 간 통신(InterProcess Communication, IPC)를 사용한다.
  • 멀티스레드 스레드들은 강하게 연결되어 있으므로 프로세스가 종료되면 프로세스 내의 모든 스레드들도 강제 종료된다. 응용 프로그램을 예로 들면 워드프로세서 프로세스 내의 문서 편집, 문서 입출력, 맞춤법 검사, 그림판 같은 작업들이 각각의 스레드에 의해 이루어지는 것과 같다. 멀티스레드는 변수나 파일 등을 공유하고 전역 변수나 함수 호출 등의 방법으로 스레드 간 통신을 한다.

스레드 관련 용어

  • 멀티스레드 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 프로세스 운영 기법이다.
  • 멀티태스킹 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 방법이다. 이렇게 여러 스레드에 시간을 잘게 나누어주는 시스템을 시분할 시스템이라고 한다. 시분할 시스템에서 운영체제가 CPU에 전달하는 작업은 프로세스가 아니라 스레드이다.
  • 멀티프로세싱 멀티프로세싱은 CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업 환경을 말한다. 이는 병렬 처리에서 슈퍼스칼라 기법과 같다. 멀티프로세싱은 하나의 컴퓨터에 여러 개의 CPU 혹은 하나의 CPU 내 여러 개의 코어에 스레드를 배정하여 동시에 작동하는 것이다. 네트워크로 연결된 여러 컴퓨터에 스레드를 나누어 협업하는 분산 시스템도 멀티프로세싱이라고 부른다.
  • CPU 멀티스레드 CPU 멀티스레드는 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 처리 기법이다. 프로세스의 멀티스레드와 구분하기 위해 CPU가 사용하는 멀티스레드라는 뜻으로 CPU 멀티스레드라고 지칭한다.
    • 멀티스레드는 운영체제가 소프트웨어적으로 프로세스를 작은 단위의 스레드로 분할하여 운영하는 기법이다.
    • CPU 멀티스레드는 하드웨어적인 방법으로 하나의 CPU에서 여러 스레드를 동시에 처리하는 병렬 처리 기법이다.

멀티스레드의 구조와 예

프로세스를 여러 개 띄워놓고 여러 작업을 하려는 경우, fork() 시스템 호출로 문서 편집기 프로세스를 여러 개 만들게 된다. 하지만 이렇게 하면 프로세스의 코드 일부, PCB, 공유 변수가 메모리의 여러 곳에 중복되어 메모리가 낭비된다.

멀티스레드는 이러한 멀티태스킹의 낭비 요소를 제거하기 위해 사용한다. 비슷한 일을 하는 2개의 프로세스를 만드는 대신 코드, 데이터 등을 공유하면서 여러 개의 일을 하나의 프로세스 내에서 하는 것이다.

프로세스는 크게 정적인 영역과 동적인 영역으로 구분된다. 정적인 영역은 프로세스가 실행되는 동안 바뀌지 않는 영역이고, 동적인 영역은 스레드가 작업을 하면서 값이 바뀌거나 새로 만들어지거나 사라지는 영역이다.

동적인 영역의 대표적인 예는 레지스터 값, 스택, 힙 등이 있다.

💡 과거에는 프로세스 하나에 스레드가 하나였기 때문에 여러 작업을 하려면 fork()를 통해 여러 개의 프로세스를 만들어 사용했으나 오늘날에는 멀티스레드를 사용한다.

이미지와 같이 하나의 프로세스 내에 여러 개의 스레드를 생성하는 멀티스레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성을 향상한다.

멀티 스레드의 예

다음은 java로 작성된 스레드 코드의 예제이다.

class TH_test extends Thread {
	public void run() {
		for (int i=0; i<100; i++)
			System.out.println("Th_Test\n");
	}
}

public class test_main {
	public static void main(String[] args) {
		TH_test TH_print=new TH_test();
		TH_print.start();
		for (int i=0; i<100; i++)
			System.out,println("Test_Main\n");
	}
}

위의 코드가 스레드를 사용하지 않은 일반 코드라면 ‘testmain’이 백 번 출력된 후 ‘TH test’가 백 번 출력될 것이다. 그러나 위의 코드는 2개의 스레드가 독립적으로 실행되기 때문에 ‘TH_test’와 ‘test_main’이 섞여서 출력된다.

다음은 C언어에서 2개의 프로세스를 사용하는 코드의 예제이다.

#include <stdio.h>
#include <unistd.h>

int main()
{
	int i=0, pid;
	pid=fork();
	if(pid<0){
		printf("Error");
		exit(-1);
	}
	else if(pid==0){
		for(i=0; i<100; i++)
			printf("Th_Test\n");
		exit(0);}
	else {
		for(i=0; i<100; i++)
			/* parent */ 
			printf("Test_Main\n")exit(0);
	}
}

이 코드는 자바 코드와 작업 결과가 같지만, fork() 시스템 호출을 사용하여 프로세스 제어 블록, 코드, 데이터 등이 모두 2배가 됨으로써 스레드를 사용하는 것보다 낭비가 심하다.

멀티스레드의 장단점

멀티스레드의 장점

  • 프로세스 내 공유가 가능한 부분을 제외하고 실행과 관련된 부분을 스레드로 나누어 관리하면 자원의 중복 사용을 피함으로써 낭비를 막을 수 있다.
  • 하나의 프로세스에서 여러 스레드를 사용하면 작업의 효율을 높일 수 있다.

비디오 플레이어를 예로 들면, 재생할 파일을 저장장치로부터 가져오는 부분(입출력)과 데이터를 화면에 재생하는 부분으로 나뉜다.

이러한 기능을 단일 스레드로 구현하면 입출력을 요청한 프로세스는 입출력이 끝날 때까지 대기 상태로 전환된다. 단일 스레드는 프로세스 전체의 입출력이 끝날 때까지 대기 상태에 머무르며 요청한 입력이 끝나야만 다시 재생할 수 있다.

비디오 플레이어의 입출력과 재생을 멀티스레드로 구현하면 스레드가 독립적으로 작동하기 때문에 입출력 스레드가 대기 상태에 있더라도 재생 스레드는 실행 상태에 있게 된다. 따라서 멀티스레드의 경우 입출력과 상관없이 재생이 가능하다.

멀티스레드의 장점은 다음과 같이 요약할 수 있다.

  • 응답성 향상 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다.
  • 자원 공유 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원활하게 진행할 수 있다.
  • 효율성 향상 여러 개의 프로세스를 생성하는 것과 달리 멀티스레드는 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다.
  • 다중 CPU 지원 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스의 처리 시간이 단축된다.

멀티스레드의 단점

멀티스레드는 장점뿐만이 아니라 단점도 있다.

여러 개의 프로세스를 사용하는 것은 낭비 요소가 있어 멀티스레드를 사용한다고 설명했는데 이는 단점으로 작용하기도 한다. 멀티스레드의 경우 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향을 미친다.

반면 프로세스를 여러 개 만드는 방식의 경우 각 프로세스가 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스로 전달되지 않는다.

애플리케이션을 예로 들어 설명하면 마이크로소프트의 인터넷 익스플로러(IE)는 멀티스레드를 사용하기 때문에 특정 화면에 문제가 생겨 해당 화면을 강제로 종료하는 경우 인터넷 익스플로러 전체가 종료된다.

반면, 크롬은 각 화면이 독립적인 프로세스이므로 그 중 하나에 문제가 생겨 종료하더라도 다른 화면에 미치는 영향이 적다.

최근에는 과거와 달리 메모리가 넉넉하고 멀티코어 CPU가 다중화되어 여러 개의 프로세스를 여러 개의 CPU에서 동시에 실행할 수 있게 되었다. 크롬은 멀티스레드의 사용으로 인해 다른 스레드가 영향을 받는 것을 최소화하기 위해 낭비 요소가 있더라도 멀티스레드 대신 멀티태스킹을 이용한다.

멀티스레드 모델

프로세스는 커널 프로세스와 사용자 프로세스로 나뉘며 스레드에도 커널 스레드(kernel thread)와 사용자 스레드(user thread)가 있다.

  • 커널 스레드는 커널이 직접 생성하고 관리하는 스레드를 의미한다.
  • 사용자 스레드는 라이브러리에 의해 구현된 일반적인 스레드를 의미한다.

사용자 스레드가 커널 스레드를 사용하려면 시스템 호출로 커널 기능을 이용해야 한다.

사용자 스레드

사용자 스레드(user-level thread)는 운영체제가 멀티스레드를 지원하지 않을 때 사용하는 방법으로 초기의 스레드 시스템에서 이용되었다.

사용자 스레드는 사용자 레벨에서 스레드를 구현하기 때문에 관련 라이브러리를 사용해 구현하며 커널이 지원하는 스케줄링이나 동기화 같은 기능을 라이브러리가 대신 구현해준다.

  • 따라서 커널 입장에서 사용자 스레드는 하나의 프로세스처럼 보인다.

사용자 스레드는 커널 입장에서는 일반 프로세스이지만 커널이 하는 일을 라이브러리가 대신 처리하여 여러 개의 스레드를 작동한다.

  • 사용자 프로세스 내에 여러 개의 스레드가 존재하지만 커널의 스레드 하나와 연결되기 때문에 1 to N 모델이라고 불린다.

사용자 스레드의 장점

  • 사용자 스레드는 라이브러리가 직접 스케줄링을 하고 작업에 필요한 정보를 처리하기 때문에 문맥 교환이 필요 없다. 부가적인 작업이 줄어들어 속도가 빠르다.

사용자 스레드의 단점

  • 여러 개의 스레드가 하나의 커널 스레드와 연결되기 때문에 커널 스레드가 입출력 작업을 위해 대기 상태에 들어가면 연결된 모든 사용자 스레드가 같이 대기하게 된다.
  • 타임 슬라이스를 여러 스레드가 공유하기 때문에 여러 개의 CPU를 동시에 사용할 수 없다. 커널 입장에서 사용자 스레드는 하나의 프로세스로 인식되므로 작업을 나눌 수 없다.
  • 보안에 취약하다. 공유 작업 시 변수들을 보호하는 보안적 장치를 커널이 아닌 라이브러리 단에서 구현해야 하기 때문이다.

커널 스레드

커널 스레드는 커널이 멀티스레드를 지원하는 방식으로, 하나의 사용자 스레드가 하나의 커널 스레드와 연결되어 1 to 1 모델이라고도 부른다.
커널 스레드는 독립적으로 스케줄링이 되므로 특정 스레드가 대기 상태에 들어가도 다른 스레드는 작업을 계속할 수 있다.
또한 커널이 제공하는 보호 기능과 같은 모든 기능을 사용할 수도 있다.
커널 스레드의 장단점은 사용자 스레드의 장단점과 정 반대라고 볼 수 있다.

커널 스레드의 장점

  • 멀티 CPU를 사용할 수 있다.
  • 어떤 스레드가 대기 상태에 있어도 다른 스레드들은 작업을 계속할 수 있다.
  • 보안에 강하고 안정적으로 작동한다.

커널 스레드의 단점

  • 문맥 교환 시 오버헤드로 인해 느리게 작동한다.

멀티레벨 스레드

멀티레벨 스레드multi-level thread 또는 하이브리드 스레드hybrid thread는 사용자 스레드와 커널 스레드를 혼합한 방식이므로 M to N 모델이라고 부른다.
멀티레벨 스레드는 사용자 스레드와 커널 스레드의 장단점을 모두 가지고 있다.

멀티레벨 스레드의 특징

  • 스레드가 대기 상태에 들어가면 다른 커널 스레드가 대신 작업을 하여 사용자 스레드보다 유연하게 작업을 처리할 수 있다.
  • 커널 스레드를 같이 사용하기 때문에 여전히 문맥 교환 시 오버헤드가 있어 사용자 스레드만큼 빠르지는 않다.

0개의 댓글

관련 채용 정보