컴퓨터(Computer Science)/운영체제(Operation System)

스레드,Thread [운영체제]

게임이 더 좋아 2020. 5. 30. 20:53
반응형
728x170

 

 

스레드를 프로세스에 대해 공부하다보면 알게 되는데,, 그리고

 

뭐 맨날 컴퓨터 성능보면 8코어 16스레드뭐시기 하는데 뭘까 싶기도 하고

 

그래서 알아보자

 


 

우선 스레드는 CPU 이용의 기본 단위다. 

 

다시 더 나누면 스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 그리고 스택으로 나눠진다.

 

스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션

그리고 열린 파일이나 신호화 같은 운영체제 자원들을 공유한다.

 

단일 스레드가 기본이지만 당연히 다중 스레드도 있다.

 

차례대로 알아보자

** 그냥 프로세스 여러개 돌리면 되는거 아냐??? 라고 할 수 있기도 하지만..

 


 

 

1. 멀티 프로세스 -> 멀티 스레드로 실행할 경우

프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리가능

 

2. 프로세스 간의 Context Switching 시

단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬 메모리에 대한 데이터까지 초기화되므로

오버헤드가 큼 // 손해가 큼

 

3. 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 자원 효율성 굿굿

 

 


 

 

현재의 모든 컴퓨터들은 다중 스레드를 이용한다. // 거의 다 그렇다.

 

 

**스레드는 프로세스 안에 있는 거다?? 

여러개의 프로세스가 있을때 각각의 프로세스는 독립적인 메모리영역을 가진다.

반면에 쓰레드는 다른 쓰레드와 프로세스의 Stack을 제외한 Data, Code, Heap영역을 공유한다.

 

 

 

** 단일 스레드와 다중 스레드의 차이이다.

 

 

하나의 응용프로그램이 여러 개의 비슷한 작업을 수행할 필요가 있는 상황들이 있는데,

예를 들자면 웹 서버는 클라이언트로부터 웹 피이지나 이미지, 소리 등에 대한 요청을 받는다.

하나의 분주한 웹 서버는 여러 개의 클라이언트들이 병행하게 접근할 수 있다.

++ 당연히 웹페이지에는 많안 다른 사용자들이 있겠지??

 

만약 웹 서버가 단일 스레드 프로세스로 작동된다면

한 번의 하나의 클라이언트만 서비스할 수 있어서 클라이언트는 요구가 서비스 되기까지 시간이 오래 걸린다.

++ 내 차례 오지 않을 수도 있다...

 

그래서 서버가 요청을 받아들이는 하나의 프로세스로 동작하게 함으로 해결한다.

다시 말해서, 서버에게 서비스 요청이 들어오면 프로세스는 그 요청을 수행할 별도의 프로세스를 생성하는 것이다.

 

**하지만 프로세스 생성 작업은 매우 많은 시간을 소비하고 많은 자원을 필요로 하는 일이다. 

 

새 프로세스가 해야할 일이 기존 프로세스와 동일하다면 만들필요가 있을까??

**그래서 프로세스를 만드는 대신에 차라리 프로세스 안에 여러 스레드를 만드는 것이 더 효율적이다. 

 

다시 말하자면, 웹 서버가 다중 스레드화 되면

서버는 클라이언트의 요청을 listen하는 별도의 스레드를 생성하고

요청이 들어오면 다른프로세스를 생성하는 것이 아니라,

요청을 서비스할 새로운 스레드를 생성하고 추가적인 요청을 listen 하기 위한 작업을 다시 계속 한다. 

 

 

그림으로 보자면??

 

 


 

 

그렇다면 다중 스레드, multi threads의 장점은 뭘까??

 

보통 4가지라고 말한다.

 

1. 응답성

대화형 응용을 다중 스레드화하면 으용 프로그램의 일부분이 봉쇄되거나, 응용프로그램이 긴 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용함으로써, 사용자에 대한 응답성을 증가시킨다.

 

** 사용자 인터페이스를 설계하는 데 있어 유용함**

++만약 시간 많이 걸리는 연산 버튼 누르면 그 버튼 누르는 순간 그 작업외의 모든 작업이 중지됨

 

 

2. 자원공유

프로세스는 공유 메모리와 메시지 전달기법을 통해서 자원을 공유한다. 

스레드는 자동으로 프로세스의 자원들과 모리를 공유한다.

**코드와 데이터 공유의 이점은 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다.

 

3. 경제성

프로세스 생성을 위해 메모리와 자원을 할당하는 것은 비용이 많이 든다. 스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에 스레드를 생성하는 것이 정말 경제적이다. 

 

**경제성: 스레드 생성 > 프로세스 생성 (스레드 생성이 자원을 덜먹음)

문맥 교환: 스레드 속도> 프로세스 속도

 

4. 규모 적응성

다중 스레드의 이점은 다중 처리기(Multi-processor) 구조에서 더욱 증가.

 

단일 스레드 프로세스는 처리기가 많아도 오직 한 처리기에서만 실행가능

 

 

 

단점

 

 

** 오히려 보안성은 떨어지는 경우가 있다.

 

++ 여러개의 스레드가 프로세스의 자원(Code, Data, Heap)을 같이 사용하기 때문에

이 부분에 대해 적절한 제어가 필요함.

// 동시에 자원접근같은거

 

++데이터에 대한 일관성에 문제가 생길 수 있는데 그래서 접근하는 공유자원에 대해서는

동기화(Synchronization) 해줘야함

728x90
반응형
그리드형