반응형



이전 소켓 프로그래밍 게시물에서는 fork를 통한, alarm을 통한 다중 통신을 해보았다.


이번에는 스레드를 이용한 Concurrent Programming을 해보고자 한다.


이 내용을 기술하기에 앞서 Thread가 뭔지, 잠깐 짚고 넘어가보고자 한다.



Thread란?


- 프로세스의 일부분으로써 적어도 하나의 스레드는 프로세스에 존재한다.

(즉, int main()이 메인 스레드이고, 프로세스에 스레드가 하나도 없을 순 없다.)


- 스레드는 자신의 프로세스 내부의 자원을 공유하기도 하고, 자신만의 영역을 가지기도 한다.

  레지스터 내용, PC(Program Counter), Stack pointer, 코드내용, 스레드가 따로 가지는 스택(Stack),

  Thread ID 등이 있다.


  스레드가 공유하는 것은 프로세스의 메모리 주소를 공유한다.

- 또한 스레드는 스케줄러에 의해 관리되기 때문에 스레드 프로그래밍을 할 시, 어떤것이 먼저 돌지 모른다.


 프로세스 VS 스레드 - 공통점


  - PID(Process ID), TID(Thread ID)를 가지고 있다.

  - 컨트롤 플로우가 있다.

  - stack 및 SP가 있다.

  - concurrently하게 실행 할 수 있다.

  - 컨텍스트 스위칭이 일어난다.


 프로세스 VS 스레드 - 차이점


  - 스레드는 프로세스의 리소스를 공유 할 수 있다. (프로세스도 가능하긴하나(IPC를 이용) 어렵다.)

  

  - 프로세스가 가지는 것

  - 주소공간, 프로그램 코드, 전역 변수, 힙, 스택, OS 자원(files, I/O devices 등등)을 가지고 있다.


  - 스레드가 공유 하는 것

  - 주소공간, 프로그램 코드, 전역 변수, 힙, OS resources(files, I/O device)


  - 스레드 자신이 가지고 있는것 :

  - 레지스터, PC, Stack, SP(Stack Pointer)  등


  - 프로세스보다 스레드가 더 가벼워서(가볍다는 느낌) 더 빠르게 만들고 지울 수 있다.






프로세스 vs 스레드 - 스레드의 특성


- 스레드는 특정 프로세스에 묶인다.

  - 프로세스는 그것 내부 컨트롤하는 많은 스레드들을 가지고 있다. 

  - 스레드는 block, create children 등등을 할 수 있다.


- 프로세스 속 스레드들의 모든 것

  - 주소공간, 프로그램 코드, 전역 변수, 힙, os 자원을 공유한다.

  - 동시에(concurrently) 실행한다 (스레드 자신만의 레지스터, PC, SP등등 값을 가지고)



이렇듯, 프로세스 단위가 아닌 스레드 단위를 만들어 서버를 제공하면, 훨씬 더 효과적인 서버를 제작 할 수 있게 된다.


다음 게시물에서는 유닉스/리눅스에서 쓰이는 Posix Thread에 대해 알아본다.


반응형