[운영체제] 03. Process

유니·2021년 10월 12일
0

운영체제

목록 보기
3/3

Process = 실행되고 있는 프로그램, OS의 처리 단위가 다 process
multiprogram 때문에 process를 만들어서 사용
process끼리 communication = IPC (Interprocess Communication)

🖥 Process

: OS에서 현재 수행중인 일의 단위로 프로그램과는 다르다 - 노트북에 설치된 모든 프로그램이 다 실행되고 있는게 아니기 때문
같은 chrome 프로그램에서 실행해도 다 다른 process일 수 있다.

multiprocessor VS multiprocess
multiprocessor는 칩이 여러 개 있는 거고 multiprocess는 여러 process를 동시 수행하는 것

✍️ memory

process는 메모리 안에 있다.
code를 compile하면 exe 파일이 만들어지는데 SSD 안에 있는 실행파일을 실행하면 main memory에 code와 함께 수행하기 위한 공간이 만들어진다.
이러한 작업 공간까지 포함한 것을 process라고 부른다.

📍 code

program code로 프로그램 코드가 복사된다.

📍 data

전역변수가 들어가는 공간으로 크기가 변하지 않는다.

📍 stack

code의 function에 관련된 것

📍 heap

dynamic memory로 memory allocation으로 할당 받는 메모리

📌 stack과 heap은 가변적이라 끝에서부터 시작해 남는 공간을 둘 중 필요한 것이 쓴다.

✍️ Program counter

코드에서 실행중인 위치를 나타내는 것으로 code에서 어디를 실행하는지 확인할 수 있는 pointer

🖥 PCB (Process Control Block)

: OS가 process를 관리하기 위해 별도의 정보를 가진 집합
process memory는 그저 저장 공간으로 여러 process를 관리하기 위해서는 process에 대한 정보가 필요하다.
👉🏻 이러한 정보로 어떤 process가 있고 특정 process가 어디에 있는지 파악하기 위함

PCB는 kernel memory에 있고 작업중인 process에 대한 모든 정보를 알고 있다.
👉🏻 만약 N개의 process가 있으면 N개의 PCB가 필요하다.

📌 PCB 안에는 process가 어디에 위치해 있는지, process가 사용하는 I/O device와 file이 포함되어 있다.
📌 PCB는 코드로 struct를 구성한다.

✍️ multiprocess 진행과정

multiprocess는 CPU를 번갈아 process에게 주어 동시에 실행되는 것처럼 보이는 것으로 process가 다른 것을 할 때 원래 하던 것 그대로 옆에 두고 다른 것을 가져온다.
👉🏻 CPU에서 작업하던걸 해당 process의 PCB register에 복사하고 실행되던 code 위치도 program counter에 복사한다
👉🏻 다시 실행하면 저장한 것을 CPU에 다시 복사한다

✍️ Process state

process의 상태로 동적으로 바뀐다.
👉🏻 효율적으로 process를 관리하고 CPU를 할당하기 위해서

📍 new

새로운 process로 PCB가 만들어지고 아직 memory 할당은 못 받은 상태

📍 ready

CPU를 할당 받을 자격이 있는 process

📍 running

실제 CPU를 사용하고 있는 process

📍 waiting

ready에 들어가지 못하고 있는 프로세스로 예를 들어 device를 사용하고 있는 경우

📍 terminated

끝난 process로 PCB를 지우고 memory도 지움

PCB에 state만 바뀐다.
📌 오직 하나의 process만 CPU를 할당하기 때문에 나머지는 ready나 waiting 상태에 있음
📌 OS가 process의 상태를 관리하고 이 state는 PCB에 저장되어 있음

🖥 Process Scheduling

: state를 다루는 것 + CPU를 할당하는 것
📌 우리는 느끼기에 동시에 (concurrently) 여러개의 process를 실행할 수 있음
📌 동시에 한개의 CPU core에 평행하게 (in parallel) 한 개의 process만 실행 가능

하나의 single core에 만약 하나의 process가 계속해서 CPU를 할당 중이면 다른 process는 아무것도 할 수가 없이 CPU를 기다리고 있다 - ready나 waiting 상태
CPU가 한 번에 처리할 수 있는 건 하나로 빠르게 움직여야 한다.
👉🏻 하나의 process에서 다른 process로 CPU가 할당되는 것 : context switch

context switch
process A에서 process B로 CPU를 할당할 때 PCB A의 register로 현재 하고 있는 상태 옮기고 PCB B register에 있는 대로 CPU에 옮긴다. 이런 과정을 OS에 있는 context switch가 한다.

언제 context switch를 하고 어떤 process로 switch할지 결정하는게 "process scheduling"

✍️ Objective of programming

📍 maximize CPU utilization

CPU를 놀지 않게끔 CPU를 다른 process로 옮김

📍 time-sharing

시간을 나눠서 process가 CPU를 번갈아서 사용

✍️ Process Schduling Queue

📍 Ready queue

ready는 queue에 기다리고 있다 👉🏻 CPU를 기다리는 process 집합
CPU 할당 받은 process가 나가면 CPU를 다른 ready 상태 process에 할당한다 : dispatch
ready queue의 크기만큼 한번에 ready 상태인 것이 여러개일 수 있음 - OS가 크기를 정함

📍 I/O device queue

device를 사용하고자 하는데 할당받을 때까지 기다림
queue는 linked list로 구현되어 있어 PCB의 주소값이 연결되어 있음

📌 ready queue에 있는 process를 scheduler에 의해 dispatch된 process는 CPU를 할당받음

✍️ Process Scheduler

누구한테 CPU를 할당할지 결정하는 코드

📍 long-term scheduler

  • CPU를 할당하는 게 아님
  • ready queue가 제한되어 있을 때 ready queue에 자리가 나면 어떤 process를 ready queue에 넣을지 결정하는 것
  • ready queue에 들어가는 순간 memory를 할당받는다
  • 동시에 실행되는 정도를 결정한다
    • I/O bound process : I/O를 더 많이 쓰는 process
    • CPU bound process : CPU를 더 많이 쓰는 process
      👉🏻 적절히 섞는게 long-term scheduler의 역할

📍 short-term scheduler

  • CPU를 할당
  • ready queue에서 누가 CPU를 쓸지 결정한다

✍️ Context Switch

CPU가 process를 다른 process로 바꿔야 할 때
process와 관련되어 있는 PCB register에 있는 값으로 계산한다
code이기 때문에 CPU를 할당해야 하는데 time limit이 있고 Context Switch를 자주하면 시간이 많이 걸려서 빠르게 바꾼다고 좋은 것은 아님
👉🏻 Process 1 → context switch → Process 2

🖥 Operations on Processes

모든 process는 다른 process로부터 만듦 - 자기 process를 그대로 복사해서 만들어 메모리를 그대로 복사한다
👉🏻 관리적인 측면에서 매우 용이하다

만든 process : parent process
만들어진 process : child process

첫번째 process만 새롭게 부팅할 때 만들어짐

📌 process는 proccess identifier로 구분하고 관리한다

✍️ Creation

fork()라는 system call로 생성하며 이는 OS가 제공하는 함수로 kernel이 이행한다.

📍 Example : UNIX

parent process와 child process는 fork()의 return value만 다르다
📌 parent는 자기가 새로 만든 process pid를 리턴하고 child는 0을 리턴받음

execlp
복사된 메모리의 code가 초기화 뒤 code가 실행됨
👉🏻 exec()은 새로운 program으로 교체하는 것

부모가 죽으면 자식도 죽어서 부모가 자식이 끝날 때까지 기다린다

exit() 프로그램이 끝남
kill() 부모가 자식 process를 끝낼 수 있다 cascading + termination

📌 새로운 process 만들었으면 연관이 없고 남이 된다

🖥 IPC (Interprocess Communication)

: process간 통신
multiprocess는 잘못해서 다른 process 공간에 쓸 수 있기 때문에 위험 요소가 생긴다
👉🏻 이를 해결하기 위해 하나의 process가 다른 process에 접근하는 것을 금지시키는 protection이 생겼지만 이 때문에 process끼리 데이터를 줄 수 없게 되었다

IPC : process간 통신 기능을 제공하고 관리는 OS가 한다

✍️ Shared memory

새로운 메모리 공간을 제공해 여기에 process가 읽고 쓸 수 있게 한다.
user memory에 있으며 process가 파괴되어도 이 메모리 공간은 계속 유지되기에 원래 process에 영향을 받지 않는다.

📍 Producer-consumer Problem

memory는 항상 값으로 차 있으므로 지워지지 않는다.
이러한 속성 때문에 아무것도 안써도 consumer는 계속 데이터를 가져갈 수 있고 producer는 안 읽었는지 모르고 계속 덮어쓸 수 있다.

Synchronized
문제를 해결할 수 있는 방법으로 buffer로 in, out을 만들어 쓰면 in을 늘리고 읽으면 out을 늘려 데이터를 일반적으로 유지한다

📌 또 다른 문제점으로는 cache coherence problem이 있다

✍️ Message Passing

kernel 공간에 message queue를 만들어 이 공간에 데이터를 제공하고 원하는 사람이 여기서 가져간다.
데이터를 보낼 process는 OS에 send를 요청하고 받을 process는 OS에 recieve를 요청한다.
📌 communication link를 만들어 send/recieve 한다

📍 Message Passing Synchronization

blocking 끝날 때까지 기다리는 것으로 synchronous
non-blocking 끝나는 것을 확인하지 않는 것으로 asynchronous

  • Send
    • Blocking : 보낸 것을 전송완료까지 확인하는 것
    • Non-Blocking : 보내고 받는 것을 확인하지 않고 다른 일 함
  • Recieve
    • Blocking : 메세지 올 때까지 기다리고 받는 것을 확인
    • Non-Blocking : 메세지 달라고 요청하고 받는 것 확인 안하고 다른 일 함

0개의 댓글