Server를 만들기 전에 가장 기본이 되는 기초 Thread에 대해 공부해보았다. 예전에 OS수업 때 Thread를 들어서 기본지식은 있지만 직접 코드로 구현해보며 실습을 해보았다.
Thread 이론

오른쪽 그림을 보면 하나의 process에서 여러 개의 Thread가 code,data,files은 공유하지만, 독자적으로 register, stack을 가지고 있는 것을 알 수 있다.
그 이유는
사실 cpu는 한 번에 하나의 작업밖에 진행할 수 없다. 하나의 작업밖에 할 수 없다면 효율이 너무 구리기 때문에 짧은 시간내에 cpu를 여러 개의 작업에 돌려가며 할당함으로써 마치 작업들이 동시에 수행되는 것처럼 보이게 하는것이 context switching이다. 그러기 위해선 register에 현재 작업의 정보를 담아 놓아야 다음 번에 cpu를 받았을 때 register에 있던 작업 정보를 받아와 작업을 진행할 수 있다.
Thread private Data: stack안에 있는 variable들을 thread-private data라고 한다.
예를 들어
double func(double a){
double b;
}
라는 함수가 thread내에 있으면 a와 b는 thread-private data이다. 왜냐 thread는 독자적인 stack을 갖고 있기 때문이며 a와 b는 stack에 저장되어 있기 때문이다.
Thread Local variables: global data들을 말하며, 모든 thread에서 visible하지만, 각각의 thread는 이 data의 복사본을 보는 것이다.
예를 들어
_thread void * mydata;
void * threadFunction(void *param){
mydata = param;
...
에서 mydata는 모든 thread가 가지고 있는 data지만 각각의 thread에서 그 value는 다르다.
User Thread
user-level에서 작동하는 thread이며 kernel의 도움을 받지 않는다.(존재자체도 모른다.)
장점 : kernel의 개입이 없기 때문에 빠르고 성능이 좋다.
단점 : 여러 user thread중 하나가 시스템 호출등으로 중단되면 다른 스레드 들도 같이 중단된다는 단점이 있다.
Examples : POSIX Pthreads, Math C-thread등이 있다.
Kernel Thread
장점 : kernel에 의해 직접적으로 관리된다.
단점 : 유저 thread보다 생성과 관리에 느리다.
Examples : Windows 95/98/NT/2000, Solaris, Linux 등
Threading Issues - fork
하나의 thread가 fork를 call하면 두 가지 상황이 가능하다.
1. 새로운 process가 모든 thread를 복제한다.
2. 새로운 process가 해당 thread만을 복제하여 single-thread가 된다.
대부분의 시스템에선 두가지 모드의 fork를 제공한다고 한다.
Threading Issues - shared file descriptors
fork를 하면 file descriptor도 같이 복제가 되어 하나의 fd를 각기 다른 thread가 접근할 수 있게 된다. 이때 1번 thread에서 fd를 통해 write을 하고 있는데 2번 thread에서 close를 하면 문제가 발생할 수 있다. file locking protocol이 필요하다. -> refcnt를 통해 관리를 할 수 있다.
Threading Issues - Stack Overflow
여러 개의 thread를 사용하다보면 한 thread의 stack이 다른 thread것을 침범 할 가능성이 존재한다. 다행히 운영체제에서는 사전에 방지하고 있다.
user Thread의 경우에 문제가 될 수 있는데 이것을 library에서 잘 관리해주어야 한다.
Threading Issues - Shared resource
같은 자원을 여러개의 thread에서 접근할 때 발생할 수 있는 문제이다.