전공/운영체제

2장

twoweeks-within 2025. 3. 27. 17:14

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 

Process : code, data, files <> thread : regi, PC, stack

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 : 구현 어려워 복잡해

 

 

 

 

'전공 > 운영체제' 카테고리의 다른 글

6장  (0) 2025.04.05
4장  (0) 2025.03.31
3장  (0) 2025.03.31
2장-2  (0) 2025.03.30
1장  (0) 2025.03.08