Thread lib
User : lib 에서 생성
// Kernel : OS
> POSIX : Thread 생성/동기화 , standard 문서 > 여러회사에서 implement > 대표적으로 UNIX > LINUX/MAC
init -> create(&tid , &attr, runner , arrgc[]) -> join(tid, NULL)
>
create
1. tid : 쓰레드 아이디를 넣고
2. &attr (속성) : 옵션 넣고
3. runner ,, : 실행할 행동 // 함수포인터
4. arrg[] : 거기에 들어갈 매개변수
>
join
1. tid 가 끝날때 까지 기다림
2. 그 tid의 return 으로 NULL 을 받음 // 반환값 X
> tid가 NULL을 줄때까지 기다림!
fork() library with MultiThread
: P1 with Thread 1,2,3,4 가 있을때
> fork() 할때 P2 가 1,2,3,4 를 다받는것 X
> fork를 생성한 Thread만 살아남음
> 그후 exec() 를 하면 T1이든 T2 이든 기존 Threads 싹 사라짐
> exec() 를 호출한 New process (단일 Thread) 로 replace
Signal Handling
> Every Handler -> kernel 로 전달, 기본적으로 USER에서 실행
1. default handler (by OS)
ex) Linux Terminal : ctrl+c : SIGINT(interrupt) signal 발동 -> 해당 process 종료
2. user-defined handler : 내가만든것
Single T , Multi T
1. Single T : 받은대로 P에서 처리
2. Multi T : T1,T2,T3,, 누가처리할거임??
>> Scheduling!
: 기본 단위 Thread // ULT : 자체 스케쥴링<> KLT : OS
Thread 가 끝나기 전에 종료..
1. 동기식 Cancellation : 즉각
2. Defferd Cancellation : 주기적으로 cancel 이있는지 확인
> Thread Default : Disable <> Enalble : 캔슬
// linux 에서 signal
// kill -9 pid
TLS : Thread_Local_Storage
// 기본적으로는 따로 없고 Process의 Code, Data, File 등을 가져다씀
> 자기만의 data 공간할당가능하며 그공간은 해당 Thread 전체임
// 지역변수 가아니라 static 느낌