User <-> computer
: OS
부모 -> 자식(부모) > 자식 // pid
: 순차적 tree 구조
> PCB/메모리 별도 관리
> virtual address space : 부모 address -> 자식 : Copy On Wirte(COW)
> 수정하기 전까진 동일/ 수정하면 COW > 별도
fork() -> exec() -> exit() -> return 0 : OS에 의해 memory 해제
-> abort() // 강제 종료 if) 부모쪽 -> 자식은 OS 에서 자동해제
> pid = wait(&status) : 자식의 staus 및 pid받아옴
// 좀비 : 자식 X > 계속 wait
// orphan : wait X (부모X)
InterProcss Comunication (IPC)
1. memory share : Read/Write // 편리
2. message passing : Send/Recieve // 까다로움
P(producer) -> buffer -> C (consumer)
> unbounded : 크기제한 X > P) 게속넣음 -> C) data 없을 시 대기
> bounded : 크기제한 O > P) 꽉차면 대기 -> C) " " "
1. Memory share : Users ,Process 에서 이루어짐 (OS : X)
> C language
P 변수 in (넣음) , counter++
C 변수 out (받음), counter--
<> Assembly
/*
regi1 = counter
regi1 += regi1 + 1
counter = regi1
// assembly 는 regi 로 값 변경
*/
Race Condition
> P 에서의 regi1 = 5 (counter) ++ > regi1 = 6 > counter = 6
> C 에서의 regi2 = 5 (counter) -- > regi2= 4 > counter = 4
> 공유된 메모리에서 공유변수를 각각의 process 에서 동시에 접근시 손실 발생 가능성 존재!
> "동기화"
2. Messae Passing
: 공뮤메모리x > send/recieve
P ---통신링크---> Q
> 링크 는 어떤 형태? , 연결은? , 데이터는얼마나? , 양방향? 에대한
및 물리적(HW bus, 네트워크) <> 논리적 (직접/비, 동기/비, 자동/비) 고민필요
a) 직접/비
Direct
send(P, message) -> recieve(P,message) // P : process_name
> 2개의 process 간의 One_Link 및 자동연결 (api)
Non_Direct
mailbox(~= port) : link > many Process 끼리 send, recieve >> many link
> send(M ,message) // M : Mailbox name
>> 누가 보내고 받을거야?
> Timming 맞추기 or system 에 의한 결정> 누구인지 알려줌
b) 동기화
blocking : send > recive 할때까지 wait
Non_blocking : send > send > send 그냥 계속 보내고 받고
>> 두개의 혼합이 가능하며, 둘다 blocking > 랑데뷰
c) buffering : buffer의 용량
Zero capacity : link 에 queue 없이 send -> recive 할때까지 대기 // 동기화 > 랑데뷰
Boundeded : : 유한개의 queue : buffer 가 꽉찰때까지 send 후 다른 작업하다가 또 send ..
UnBoundedd : 무한대로 send > overflow 가능성..
/*
IPC memory share ex) POSIX
(P) : process의 메모리 요소/공간 할당 > ptr =mmap() : 포인터할당 > message 넣으면 ptr ++
(C) : ptr = mmap(READ옵션) > printf
Multithread

ex) APP
display update + data update + network + ...
특징)
> Responsiveness : thread1사용중이여도 thread2, thread3 가능하다면 multi
> Resource Sharing : process의 code, file,,을 thread들끼리 공유
// prcoess 끼리는 code, file 들 분리
> Economy : thread 생성은 process 생성보다 가벼움
> Scalability : P1 에 thread 여러개, P2에도 여러개,, 확장
Multithread sever Architechre
client 가 server에 thread 생성 요청
> 미리 만들어둔Thread pool로 처리
MultiCore
1 core -> 1 process with multithread 가 여러개
특징)
> Dividing (분배) : thread와 달리 data 들까지 다 나눌수 있음 > 작업 splitt
> Parellelsim (병렬 // 멀티코어) : 병렬 처리로 동시에 여러개
>>
여러 Data를 Core 당 하나씩 or 한개의 큰 Data를 여러 코어가 나눠서
> Concurency (동시성)
> MultiCore : Parallelism(병렬)로 data 4개(4 core)를 동시에
+ 각 Process별 MultiThreads들이(1개의 big data를) C/S 하면서 small data들을 Concurency!
CPU는 RAM에만 접근 !
: C/S 할때 ROM, HDD 까지 갔다오면 느리자나
Amdal's Law

S : serial (직렬)
1-S : 직렬을 제외한 병렬
N : Core
>
Core 가 무한대로 많으면 빠를것같지만.. 1/S 로 직렬부분이 남아있음
> 직렬의 수가 Program의 속도를 크게 관여함!
Thread 의 특징 및 종류
User Thread : 라이브러리로 자체 스케쥴링 , 자체 C/S > 커널개입x > 속도빠름
// OS 의 힘이 필요없는 간단한 작업은 매우 빠르게 가능
//<> OS 가 필요하면 Kernel Thread 를 거쳐 힘을 빌려옴
Kernel Thread : OS 의 스케쥴링 단위 , User의 존재도 모름
모든 Process, Task, Thread 들이 실행 되려면 CPU에서 실행되어야함
> CPU는 RAM 에서 Data를 가져와 Cash, Regi 등에 올린 후동작
> 1 Core는 1 Process 만을 가짐 (PCB) // C/S 로 멀티
> Process는 Kernel을 최소 1개 이상을 가짐 (커널 Thread TCB)
1.Many to one :
(user) (kernel)
User 가 OS가 필요해 Kernel 에게 I/O 등 요청하면? // 파일읽기,네트워크 등 요청
Kernel) I/O 처리 > 잠깐 Blcok
> 다른 User 들이 동작할 여분의 kernel 이없음 > 안정성을 위해 다른 User들 멈춤
// 안정성.. Race Condition 발생 가능성
// 다른 user가 요청했을때랑 kernel therad가 돌아왔을때의 스택,값,주소가 달라질수있음
> MultiThread의 의미 X > I/O를 요청한 User만을 실행하는 SingleThread가 됨
>
2. One to One
// Linux , Windows
여러개의 Kernel,User > 1개씩 연결
어짜피 1:1인데 굳이 Kernel 에 User를 또 연결하는 이유
> OS, Kernel 이 개입할수록 무겁고 느려짐..
PCB : 메모리, Process 상태, Regi, Thread정보,,,
TCB : Thread regi, SP,,,,,
UCB ( UTL // UserLevel_Thread) : Kernel의 개입,전환없이 자체적으로 regi,stack 처리
속도,가벼움 : UCB > TCB > PCB
3,4 Many to Many , Two-Level Model 도 있지만 사용X : 구현 어려워 복잡해
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
: tid 가 null(종료) return 할때까지 대기 후 쓰레드 종료상태를 join(return, code 들)
fork() library with MultiThread
// fork()는 자식 process생성
: 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에서..
USER 단에서 ctrl+c 입력
Kernel 단에서 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 느낌