Process
: an instance of a running(or suspended) program
A single process may have multiple threads
of execution
light-weight
processes that share access to a single memory space.global한 data, files descriptor는 모든 thread 간의 공유가 되고 있음.
하지만 각각의 thread들은 각각의 register, stack segment가 있음.
Kernel 영역은 똑같고, User 영역이 다름.
multi-thread process의 경우, Stack 영역에 각각의 thread별로 따로따로 존재한다.
각기 다른 function들을 호출해가기 때문.
병렬적인 처리를 위해 여러 process를 쓰면 되는데, 왜 여러 thread를 이용할까?
process를 안 쓰는 이유
:
fork()를 통해 process를 생성하는데,
overhead가 너무 크다 (복제하기 위해 time, memory 소요가 큼)
또한 process가 생성되면, 두 process 간에 data를 주고받기 어렵다.
thread를 사용하는 이유
:
thread는 process 내에 여러 개의 thread가 동시에 존재하면서
하나의 memory space를 공유하기 때문에 data 공유(global, static)가 쉽다.
thread를 생성한다는 것은 stack 영역을 하나만 더 추가하는 것이므로 time, memory를 절약할 수 있다.
Creating and Destroying Threads
:
Using Pthreads
:
gcc -o <threaded_program.c> -lpthread : "pthread library와 link하여 compile하라"
pthread_create(3)
: Create a new thread of control
void* (*start_routine)(void*)
:error codes
:pthread_t type
:pthread_self(3), pthread_equal(3)
:pthread_exit(3)
: Thread termination
4가지 방법
The thread function performs return with a return value
:
The thread calls pthread_exit() with a return value
:
Any of the threads calls exit() or the main thread performs a return
:
그 어떠한 thread라도 exit()를 call하면 해당 process가 종료.
process가 종료되니까 그 안에 있는 모든 thread들도 종료.
The thread is canceled using pthread_cancel(3)
:
하나의 thread가 다른 thread를 종료시킬 수 있다.
pthread_join(3)
: waiting for threads
만약 여러 thread를 기다리려면 각각의 thread에 대해서 join해줘야 한다.
pthread_detach(3)
:
명시된 thread가 종료되었을 때, 그 thread는 join하는 thread 없이 바로 갖고 있는 resource들을 release.
pthread_create 예제 1
:pthread_create 예제 1 + pthread_exit(3)
:pthread_create 예제 1 + pthread_join(3)
:
pthread_create 예제 2
:
scheduler간 차이 때문에
thread가 생성되었을 때, main thread와 생성된 thread의 진행과정을 알 수 없다.
global variable sharing 예제
:
Optimization Option 예제
:volatile
을 선언함으로써thread handler에 data 넘겨주기
:Critical section 문제
:
우리의 예상과 달리 10,000이 아니라 더 작은 숫자가 출력되었다...
두 thread 간의 synchronization이 되지 않아 cnt라는 global variable을 동시에 처리하게 되어 문제가 발생한 것이다.
Critical section 문제 + mutex
:
mutex 사용시 주의사항
: 너무 많이 호출하면 안된다.
single thread -> about 11s4 threads -> about 59s
1개의 thread만 이용한 것이 훨씬 빠르게 나왔다.
왜 single thread programming이 더 빠른 수행 결과를 보였을까?
➡️ lock을 사용하면 overhead와 delay가 발생한다.
따라서 for문 안에서 lock을 1,000,000,000번 부르는 것은 multi-thread programming 효과가 오히려 떨어지게 되어 성능과 속도가 떨어지게 되는 것이다.
따라서 for문에서는 local variable로 part_sum을 선언하여 해당 thread별 구간만큼 더하고
for loop 이후에 global variable sum에 합산할 때에만(critical section) lock을 사용함으로써
overhead와 delay를 최소화하여 아래와 같이 programming해야 한다.
single thread -> 1.234s
4 threads -> 0.334s