Process_운영체제(3)

조권휘·2022년 12월 29일
0

운영체제

목록 보기
3/14

Process

  • program이 실행하는 경우
  • encapsulation
  • dynamic, active 객체이다.
  • memory에 있는 process들의 scheduling을 관리
  • process는 process ID(PID)를 부여받고 식별자로 사용된다.
  • task, sequential process로도 불린다.
  • process의 정보 안에는 CPU contexts(registers), OS resource(memory, open files...), Other information(PID, state, owner...)

Process Address Space

  • Code : ROM에 저장되며 Read only constanct
  • Data : Global initialized data + Global uninitialized data(BSS)
  • Heap : Dynamic Memory Allocation
  • Stack : Function Call ← 함수가 호출될 때 지원하기 위한 공간을 제공, 사용을 다 한 뒤에는 사라진다.
  • 각 process는 자신만의 address space, open files를 가진다.
  • 개인 virtual CPU를 가진 것처럼 사용하지만 실제로는 아니다.
  • 각 process에서 사용하는 주소는 해당 process에서만 의미가 존재하는 주소이다.
  • 각 process는 개별적이지만 상호작용을 하는 경우도 있다.
    • emacs edits file, gcc compiler... → IPC

Machine Cycle/Instruction Cycle : 한 명령어가 처리되는 cycle


Process States

  • new/Embryo : 준비 작업을 하는 상태(memory..)
  • ready(ready to run) : 실행이 가능한 상태, CPU가 주어진 것이 아닌 기다리는 상태
  • running : scheduler dispatch로 CPU가 주어진 상태, timer interrupt가 걸려서 CPU가 없어지면 ready로 돌아간다.
  • waiting(blocked) : I/O call을 실행하거나 event, msg 등을 wait하고 완료될 때까지의 상태 → CPU를 잠시 반납 → I/O가 완료되면 ready 상태로 바뀐다.
  • terminated(zombie process) : exit call을 받아 process가 종료되는 것을 기다리는 상태(resource를 정리하는 동안)
  • CPU가 1개라면 running상태는 1개이고 대부분 나머지는 ready 상태 or waiting 상태이다.
  • ready 상태의 process는 scheduling queue 상태로 관리한다. waiting 상태의 process는 waiting queue가 별개로 존재해서 해당 queue에 위치한다.
  • 장치마다 waiting queue가 존재한다. → waiting queue per device

Waiting(Blocked) State

  • block 상태가 되면 process는 CPU를 반납해야한다.
  • 반납을 하면 프로세스는 일시정지가 되고, CPU는 다른 프로세스에게 넘어간다. 하지만 I/O는 진행되기 때문에 concurrent하게 진행이 된다.
  • 요청한 I/O가 끝날 때까지 run할 수 없다. 즉, CPU를 scheduling할 수 없다.
  • waiting이 끝나면 ready 상태로 변한다. 바로 CPU를 줘서 run하지 않는다.
  • foreground process : 사용자와 상호작용을 하는 process
  • background process : 사용자와 상호작용을 하지 않는 process

Linux Process States

  • ready 중에서 current라는 변수가 가리키는 process만 실제로 running이고 다른 process는 runable 상태이다.
  • block 상태
    • TASK_INTERRUPTIBLE : signal이 왔을 때 깨어날 수 있는 Task, (ex. getchar())
    • TASK_UNINTERRUPTIBLE : I/O가 완료될 때 까지 signal이 와도 깨어날 수 없는 Task, disk와 같이 high speed I/O를 할 때 사용

Process Data Structures

PCB(Process Control Block)

  • process를 관리하기 위해서 정보를 관리하기 위한 block
  • process가 만들어지면 그 때 PCB도 함께 만들어진다.
  • pid, user id, file info, priority, state, event waiting(block reason), open FDT, 할당된 자원, working dir, memory mng info, pending signals, machine(CPU) context

PCBs and Hardware State

  • 어떤 process가 running할 때 hardware state는 CPU 내부에 있다.
  • process가 OS에 의해 일시정지 되었을 때, register value(context)는 PCB에 저장해야 한다.
  • OS가 다시 process를 실행하고 싶다면, PCB 내에 있는 register value를 이용하여 복구하여야 한다.

Context Switch

  • 사용자에게 응답성(서비스 품질)을 높이기 위해 multitasking을 할 때 사용을 한다.
  • 다른 프로세스로 넘어갈 때 자신의 CPU상태(hardware context)를 PCB에 저장하는 것
  • PCB에서 context를 reload하는 것은 CPU에 reload하는 것이다.
  • context switch는 항상 kernel 안에서 진행된다.
  • process가 block되는 것도 kernel 안에서 block되고, resume도 kernel에서 resume된다.
  • Administrative overhead
    • register, mmap의 save 및 load
    • memory cache
    • 다양한 table, lists의 update
  • 초당 100s / 1000s번 일어난다.

Process State Queues

State queues

  • OS가 process의 상태를 관리하기 위한 자료구조
  • Job queue, Ready queue, wait queue...
  • PCB가 여러 queue를 다녀가며 실행된다.

Scheduling queue

  • priority에 따라 PCB를 할당한다. priority는 0~99까지 할당된다.
  • running 상태는 current 변수가 위치한 process이다.

Process Creation

Process creation events

  • System call 호출
    • fork() / CreateProcess()
  • System initialization
    • init process : 제일 먼저 생성되는 최초의 process

Background processes

  • user와 상호작용 없이 혼자 작동하는 process
  • Daemons

Resource sharing

  • User ID, open files, 등 resource를 parent가 child에게 inherit(상속)한다.

Execution

  • 동등하게 같이 작동하거나 parent가 child가 끝날 때 까지 기다리거나

Address space

  • child는 parent의 address space(code 부분)를 duplicates한다.

Linux Process Creation

fork()

  • child는 부모로부터 대부분의 resource를 inherit한다.
    • Same text(code + read-only data) : 사실은 같은 주소공간을 가리킨다.
    • Real/effective user id, group id
    • Working, root directory
    • Open files
    • open file의 r/w offset
  • 하지만 별도의 다른 process로 인지해야한다.
  • pid, PCB도 별개로 할당된다.
  • 독립적으로 scheduling을 해야하고, private resource도 별개로 가진다.
  • data/stack도 처음에는 복제가 되지만 이후는 child의 control에 의해 사용된다.

Linux exec()

  • int exec(char prog, char argv[])
  • exec을 call한 process는 잠시 멈춘다.
  • hardware context를 초기화하고, ready queue에 넣고 실행을 대기한다.
  • exec()이 정상적으로 작동했다면 return을 하지 못한다.
  • exec()은 새로운 process를 생성하는 것이 아니라 기존 프로그램을 다른 것으로 바꾸는 것이다.

wait() system call

  • status는 1byte 이내의 값(0~255)만 사용이 가능하다.
  • 어떤 process가 종료되면 그 process의 정보를 즉시 제거하지 않는다. - zombie process
  • status는 4byte int 형이고, control 정보등 다른 정보도 encoding이 되어있다.
  • waitpid(pid, opt) : pid에 해당하는 process를 wait / opt = 0 : blocking, opt = WNOHANG : non blocking

process creation system calls


Policy vs Mechanism

Policy

  • system을 사용하는 사용자 입장에서 설정하는 부분
  • mechanism을 기반으로 관리자, 사용자가 선택하는 사항들
  • ex) 자원을 얼마나 할당할 것인가, 어떤 process에게 어떤 우선순위를 줄 것인가

Mechanism

  • 실제로 기술적으로 해당하는 기능을 제공하는 부분
  • Kernel에 구현되어있는 부분을 말함
  • 어떤 일을 “어떻게” 해야 하는지 방법에 대한 것

Seperating policy from mechanism

  • 두 가지를 잘 분리해야 한다.
  • 만일 같이한다면 system의 확장성이 떨어진다.
  • mechanism은 어디서든 동작하게 일반적으로 만들어야한다.
  • policy는 실제 사용되는 장소, workload에 따라 변화에 적응하는 방식으로 정해야 한다.

Inter-process Communications

  • 각 process는 독립적이며, 자신의 영역에만 접근할 수 있고 다른 영역에는 접근하지 못한다.
  • process끼리 정보를 주고 받을 때는 OS의 도움을 받아야한다.

a) kernel을 통해 message를 주고받기
b) OS에게 memory 영역을 할당받아서 두 process가 함께 영역을 공유 – shared region attach
c) signals, alerts로 사건을 전달

  • 한 개의 machine 내에서 정보 교환 방법
    • sharing files
    • sharing file pointer between parent and child
    • message queue
    • semaphores
    • signals
    • pipe : circular queue b/w processes
      • unnamed pipe : parent, children 사이에 사용
      • named pipe : 서로 독립적인 processes 사이에 사용 – mkfifo
  • machine 사이의 정보 교환 방법 → network로 주고받는다.
    • Sockets
    • RPCs(Remote Procedure Calls) : 복잡성↓, 마치 procedure를 호출하는 것과 같이 인터페이스 제공
    • Java RMI(Remote Method Invocation) : 복잡성↓, 마치 procedure를 호출하는 것과 같이 인터페이스 제공

PIPE

업로드중..

  • memory buffer를 제공하여 file과 같이 사용할 수 있도록 하는 방식
  • 2개의 r/w pointer가 할당된다. → offset
    • 1개는 reading을 할 때 사용되고, 나머지 1개는 writing을 할 때 사용된다.
  • pipe는 둘 사이의 동기화를 system이 자동으로 support를 해주기 때문에 mutual exclusion이 된다.
  • pipe에 data가 없는데 read를 시도하면 해당 process는 새로운 data가 들어올 때까지 block이 된다.
  • pipe에 data가 가득 차 있는데 write를 시도하면 빈자리가 생길 때까지 block이 된다.
profile
안녕하세요 :) Data/AI 공부 중인 한국외대 컴퓨터공학부 조권휘입니다.

0개의 댓글