전공/운영체제

2장

러비코스믹 2025. 3. 27. 17:14

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 

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

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 느낌 

 

 

 

 

 

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

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