User <-> computer
: OS // 생성/종료
부모 > 자식 > 자식 // pid
: 순차적 tree 구조
> 자원공유 : All, 일부, NO
> virtual address space : 부모 address -> 자식 -> load // PCB 분리
> process 끼리 address process 독립
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 : reader) buffer 가 꽉찰때까지 send 후 다른 작업하다가 또 send ..
UnBoundedd : 무한대로 send > overflow..
/*
IPC memory share example > POSIX
(P) : process의 메모리 요소 할당 > 공간 할당 > ptr =mmap() : 포인터할당 > ptr ++ -> message ++
(C) : ptr = mmap( READ옵션) > printf
Multithread

ex) APP
display update + data update + network + ...
특징)
> Responsiveness : thread1사용중이여도 thread2, thread3 가능하다면 multi
> Resource Sharing : 1 prcoess 안에 code, file,, 을 thread들끼리 공유
<> IPC(process) : prcoess 끼리 code, file 등이 다 분리 되어있음
> Economy : thread 생성은 process 생성보다 가벼움
/*
Context Switching
process 전환 > 무거움
<> thread 전환 > 가벼움
*/
> Scalability : P1 에 thread 여러개, P2에도 여러개,, 확장
Multithread sever Architechre
client -(request) -> Server -> thread 생성 > 종료 > 다시요청받으면 생성 > 종료 반복... > 비용 up
> Server Thread :: Thread pool : server thread를 만들어 Request 처리 > thread pool 에서 wait
*/
MultiCore
1 core -> 1 process with multithread
특징)
> Dividing (분배) : thread와 달리 data 들까지 다 나눌수 있음 > 작업 splitt
> Parellelsim (병렬 // 멀티코어) : 병렬 처리로 동시에 여러개
/*
Data : d1,d2,d3,d4,,,d8
> C1 : d1,
> C2 : d2,
> C3 : d3, 를 동시에
Task 내의 1개의 Data
> C1, C2, C3, C4 가 나누어서도 가능
> but 설계 어려움
*/
> Concurency (동시성 // 싱글코어, 및 각 코어 Process의 Thread) : 한개의 core 로도 C/S 로 왔다갔다 하면서..
>> MultiCore 에서 Process들은 병렬로 동시에 하면서도
> 각 개인 Core의 Process 내의 MultiThreads 는 C/S 로 Concureny !
/*
CPU는 RAM에만 접근 !
> 싱글 코어의 경우 context switching 왔다갔다 // T1(P1) > T2(P2) > T1 > T2
> 그래야 빠르게 전환 가능!
<> HDD/SDD, ROM (느림, 저장용량큼)
*/
Amdal's Law

S : serial (직렬)
1-S : 직렬을 제외한 병렬
N : Core
>
Core 가 무한대로 많으면 빠를것같지만.. 1/S 로 직렬부분이 남아있음
> 직렬의 수가 Program의 속도를 크게 관여함!
Thread 의 특징 및 종류
User : 라이브러리로 자체 스케쥴링 , 자체 C/S > 커널개입x > 속도빠름
Kernel : OS 에이의한 스케쥴링 , User의 존재도 모름
모든 Process, Task, Thread 들이 실행 되려면 CPU에서 실행되어야함
> CPU는 RAM 에서 Data를 가져와 Cash, Regi 등에 올린 후동작 // Data를 가져옴 (MultiCore라면 D1, D2,D3,,)
> 1 Core는 1 Process 만을 가짐 (PCB) // C/S 로 멀티
> Process는 Kernel을최소 1개 이상을 가짐 (TCBs)
> OS는 Kernel Thread를 최소 단위로 스케쥴링
>> User는 힘이없어,, 그래서 Kernel 의 힘을 빌려서 CPU에 conect
1.Many to one :
(user) (kernel)
[User Space]
┌───────────┐ ┌───────────┐ ┌───────────┐
│ User Thread │ │ User Thread │ │ User Thread │
│ #1 │ │ #2 │ │ #3 │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
│ │ │
└──────────────┴───────┬──────┘
▼
[Kernel Space]
┌─────────────────┐
│ Kernel Thread │
│ #1 │
└─────────────────┘
갑자기 User 가 Kernel 에게 I/O 등 요청하면? // 파일읽기,네트워크 등 요청
Kernel) I/O 처리 > 잠깐 Blcok > User 들이 동작할 여분의 kernel 이없음 > 그 위에 놀던 다른 User들도 멈춤
> 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 : 구현 어려워 복잡해