Process

Reference: 이화여대 운영체제 강의 - 반효경 교수님

프로그램의 실행 (Memory load)

  • 프로그램은 파일 시스템에 실행 파일 형태로 저장되어 있다가,

  • 실행시키면 해당 프로그램이 memory에 올라가서 process 가 된다

  • 이때, OS Kernel은 이미 memory에 올라가 있다

  • 프로그램이 실행될 때 해당 프로그램만의 독자적인 Address Space를 Virtual Memory에 갖는다

    • 그 중 당장 필요한 부분은 Physical memory에 올라가고,

    • Physical memory 에 올라가지 않은 부분은 Swap area 로 들어간다

    • 이 중 일부는 파일 시스템의 파일 형태로 존재한다

Address Translation

virtual memory에 올라가 있는 주소에서 physical memory 주소로 변환이 필요하다

Virtual Memory

  • stack

    • 함수 안에 있는 지역 변수가 위치한다

      → 함수의 호출과 return과 관련된 것

  • data

    • 전역 변수 / 프로그램이 시작될 때부터 종료될 때까지 있는 값이 위치한다

  • code

    • 실행 파일에 있던 code가 올라오는 것

    • CPU에서 실행할 기계어가 위치

      → 컴파일 된 기계어 코드

  • Kernel Address Space

    • Kernel도 함수 호출을 하기 때문에 동일하게 stack, data, code로 구성되어 있다

Kernel 주소 공간의 내용

구조

  • Kernel은 하나의 프로그램으로서 함수 구조로 이루어져 있다

  • 각 Process 의 Address Space는 Code, Data, Stack으로 구성된다

구성 요소

  • 운영체제의 Code

    주로 운영체제가 하는 일이 Kernel Code 안에 들어가 있다고 보면 된다

    • System call, Interrupt 처리 코드

    • 자원 관리를 위한 코드

    • 편리한 서비스 제공을 위한 코드

  • 운영체제의 Data

    • 모든 hardware, process 를 관리하기 위한 자료구조를 갖고 있다

      → 이것을 PCB (Process Control Block) 라고 한다

  • 운영체제의 Stack

    • 지금 누가 실행중인지를 알기 위해 process의 kernel stack은 각각 저장된다

      → Kernel로 들어오기 전에 (kernel이 호출되기 전에) 어떤 process에서 실행된 것인지에 따라 구분되어 저장된다

    • Kernel의 stack이기 때문에 kernel 함수와 관련된다

사용자 프로그램이 사용하는 함수

  • 사용자 정의 함수

    해당 process address space 내에 위치

    • 자신의 프로그램에서 정의한 함수

    • program counter 값만 바꾸어 다른 위치의 기계어를 실행하면 된다

  • 라이브러리 함수

    해당 process address space 내에 위치

    • 자신이 프로그램에서 정의하지 않고, 가져다가 쓴 함수

    • 자신의 프로그램의 실행 파일에 포함되어 있다

  • 커널 함수

    kernel address space 내에 위치

    • 운영체제 프로그램의 함수

      → 커널의 코드에 들어있는 함수

    • virtual memory의 주소 공간을 가로질러서 다른 program 의 영역으로 바뀌는 것

      → CPU 제어권을 OS에 넘긴 후 실행한다

    • 커널 함수의 호출 == System call

프로그램의 실행

User-Defined & Library Function Call

  • user mode (mode bit: 1)

  • 주소 공간에 있는 code가 user mode 로 실행된다

System Call

  • kernel mode (mode bit: 0)

  • CPU 제어권이 OS에게 넘어가서 Kernel mode에서 OS 주소공간에 있는 코드가 실행된다

Process의 개념

Process란?

실행중인 프로그램

Process is a program in execution

Process의 문맥 (context)

Process의 현재 상태를 나타냄 → 시간에 따라 바뀌는 개념

  • CPU 수행 상태를 나타내는 hardware context

    CPU에서 어디까지 수행했는가?

    • Program Counter

      → 현재 어디를 실행하고 있는가

    • 각종 register

      → Register에 어떤 값을 넣고 있었는가

  • Process의 주소 공간

    자신의 memory 공간에 무엇을 가지고 있는가?

    • code, data, stack

  • Process 관련 Kernel 자료 구조

    • PCB (Process Control Block)

      • CPU, memory 등을 얼마나 썼는지에 대한 정보를 갖고 있는 자료구조

      • PCB를 봐야 context를 알 수 있기 때문에 process를 관리하기 위한 자료구조라 할 수 있음

    • Kernel Stack

      • process 마다 다른 kernel stack을 갖는다

Process의 상태

Process는 state가 변경되며 수행된다

Running

  • CPU를 잡고 instruction을 수행중인 상태

  • CPU에서 기계어를 실행하는 process는 매순간 1개다

    • CPU를 잡고 있는 process를 running 상태라고 한다

Ready

  • CPU를 기다리고 있는 상태의 process

    (메모리 등 다른 조건은 모두 만족)

Blocked (wait, sleep)

  • CPU를 주어도 당장 instruction을 수행할 수 없는 상태

  • Process 자신이 요청한 event (e.g. I/O) 가 만족되지 않아 이를 기다리는 상태

    • e.g. disk에서 file을 읽어와야 하는 경우

  • Inturrupt 되면 진행중이던 event가 완료 되었다는 의미이므로 Ready 상태로 바꿔준다

New

process가 생성중인 상태

Terminated

수행(execution)이 끝난 상태

Process 상태 변화도

  • new

    • 생성중인 상태

      → 생성 시작이 안됐으면 process가 아님!

  • ready

    • CPU만 할당되면 바로 실행이 가능한 상태

    • CPU가 필요한 부분은 memory에 올라가 있어야 함

  • running

    • CPU scheduler가 dispatch를 하면 running 상태가 됨

    • running 상태가 끝나는 경우

      • Timer interrupt

        • 할당 시간 만료

        • ready queue의 제일 뒤로 가서 줄을 서야하는 상황

      • I/O or event wait

        • 오래 걸리는 작업 때문에 blocked 상태로 들어가는 경우

      • Exit

        • 종료되는 경우

  • waiting (blocked)

    • 오래 걸리는 작업이 끝나면 (보통 interrupt가 걸림) 해당 process의 상태를 ready로 바꿔서 다시 CPU가 해당 process를 실행할 준비를 시켜둔다

  • terminated

    • 종료중인 상태

      → 종료가 완료되면 process가 아님!

PCB (Process Control Block)

설명

OS가 각 process를 관리하기 위해 두는 자료구조로, process 당 유지하는 정보를 뜻한다

구성 요소

구조체로 유지한다

  • OS가 관리상 사용하는 정보

    • Process State, Process ID

    • Scheduling Information, Priority (가장 높은 process에 CPU가 할당된다)

  • CPU 수행 관련 hardware 값

    Context Switching에 대비하여 저장해 놓는 값

    • Program Counter, Registers

  • Memory 관련

    • code, data, stack의 위치 정보

  • File 관련

    • Open file descriptors

      • file 이나 I/O resource를 고유하게 식별하는데 사용된다 (0부터 시작하여 순차적으로 할당)

      • process는 oepn file descriptor를 사용하여 파일을 읽거나 쓸 수 있다

        • file에 대한 I/O를 수행할 수 있으며, file을 열거나 닫을 때 사용된다

Context Switching

설명

CPU를 한 process에서 다른 process로 넘겨주는 과정

필요한 이유

  • 다른 프로그램에서 CPU 그냥 빼앗아 가는게 아니라, 다시 CPU가 할당되었을 때 이어서 작업할 지점을 알 수 있게 Process Context를 설정해야 한다

  • e.g. CPU가 process A에서 process B로 넘어가게 하려면, 현재 기계어의 어디를 실행중인지 등의 정보를 CPU를 뺏기 전에 process A의 PCB에 저장한 후 process B에게 CPU를 넘겨준다

동작

CPU가 다른 process에게 넘어갈 때 OS는 아래의 동작을 수행한다

  • CPU를 내어주는 process의 상태를 해당 process의 PCB에 저장

    • 현재 기계어에서 어디까지 실행했는지, register에 어떤 값을 넣어 줬었는지를 PCB에 저장한다

  • CPU를 새롭게 얻는 process의 상태를 PCB에서 읽어오기

Context Switch 구분하기

System Call 이나 Interrupt 발생시 반드시 context switch 가 일어나는 것은 아니다

context switch인 것

사용자 process A ↔ 사용자 process B

context switch가 아닌것

사용자 process A → OS → (다시) 사용자 process A

context switch와 overhead의 관계

  • user mode에서 kernel mode로 가는건 context switch보다 상대적으로 overhead가 적은 작업이다

  • CPU 수행 정보 등 context의 일부를 PCB에 저장해야 하지만, context switch 하는 경우 그 부담이 훨씬 크다 (eg. cache memory flush)

Process를 Scheduling 하기 위한 Queue

Process들은 각 queue들을 오가며 수행된다

Job queue

현재 system 내에 있는 모든 process의 집합

Ready queue

현재 memory 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 process의 집합

Device queues (I/O Queue)

  • 오래 걸리는 작업

  • I/O device의 처리를 기다리는 process의 집합

Process Scheduling Queue 의 모습

  • fork a child

    • 자식 process를 만드는 것

      → 복제 생성을 함

    • 자식에게 cpu를 넘기는게 효과적이라 자식에게 보통 할당함

Scheduler

OS 안에 들어있는 code의 일부다

Long-Term Scheduler (job scheduler)

OS 내에서 memory scheduling을 하는 역할

  • 시작 process 중 어떤 것들을 ready queue로 보낼지 결정

  • process에 memory (및 각종 자원)을 주는 문제

    • process가 실행될 때 memory에 올라오도록 하는 역할을 담당

  • Degree of Multi-programming 을 제어

    • Degree of Multi-programming 이란?

      • memory에 올라가 있는 program의 수를 뜻한다

    • memory에 올라간 program이 몇개인지를 조절하는 역할을 장기 스케줄러가 담당한다

  • Time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready status)

Short-Term Scheduler (CPU scheduler)

CPU scheduling을 하는 역할

  • 어떤 process를 다음번에 running 시킬지 결정

  • process에 CPU 를 주는 문제

  • 충분히 빨라야 함 (millisecond 단위)

Medium-Term Scheduler (Swapper)

Time sharing system은 장기 스케줄러를 두지 않고 중기 스케줄러를 둔다

  • 여유 공간 마련을 위해 process를 통째로 memory에서 disk로 쫓아냄

  • process에게서 memory 를 뺏는 문제

    → 일단 다 주고, memory가 부족해서 전체 시스템 성능이 떨어지면 memory에서 쫓아낸다

  • Degree of Multi-programming 을 제어

Process의 상태

Suspended (stopped)

  • 외부적인 이유로 process의 수행이 정지된 상태

  • process는 통째로 disk에 swap out 된다

  • ex)

    • 사용자가 프로그램을 일시 정지시킨 경우 (by break key)

    • system이 여러 이유로 process를 잠시 중단시킨 경우

      (memory에 너무 많은 process가 올라와 있을 때)

      → 중기 스케줄러가 여유 공간 마련을 위해 process를 통째로 memory에서 disk로 쫓아낸다

Blocked vs Suspended

  • Blocked

    • 자신이 요청한 event가 만족되면 Ready

  • Suspended

    • 외부에서 resume 해 주어야 Active

Process 상태도

Suspended를 포함한 상태도

Suspended Blocked

  • I/O 작업을 하다가 suspended 로 들어가면,

    • I/O 작업은 그대로 진행하고 Suspended Blocked 로 들어간다

    • I/O 작업이 끝나면 Suspended Ready로 간다

      • 오래 걸리는 작업이 끝나면 Blocked → Ready로 가는 것 처럼 Suspended Blocked → Suspended Ready로 간다

Swap Out / Swap In

  • Swap out

    • memory에서 통째로 쫓겨나는 것

  • Swap in

    • 다시 memory에 올라가는 것

Running (User mode / Monitor mode)

  • Running (User mode)

    • process에서 자기 code를 실행할 때

  • Running (Monitor mode)

    • OS에 system call을 해서 OS의 code가 실행중일 때

    • 해당 program은 CPU를 빼앗긴게 아니므로 CPU를 사용중인 것으로 간주한다

      • System call을 호출한 경우

        • process가 kernel mode에서 running이다

      • Interrupt를 받은 경우

        • e.g. CPU running 중 I/O controller가 다른 interrupt를 발생시켜 OS에 CPU가 넘어가는 경우

        • 해당 program과 관련 없는 이유로 interrupt 를 받았음에도, Running 중인 것으로 간주한다

          → OS 가 Running 중이라고는 표현하지 않는다

          → Interrupt 받기 전 process가 Running 중인 것으로 간주한다

Thread

“A thread (or lightweight process) is basic unit of CPU utilization” → CPU 실행의 단위이다

  • Process에서 CPU 수행에 실행에 필요한 부분만 별도로 가지고 있는 것이 Thread이다

  • Process는 공유하고, Thread는 작업에 따라 각자 갖는다

Thread의 구성

  • program counter

  • register set

  • stack space

    • 주소 공간에서는 thread가 함수 호출과 관련된 stack 만을 갖는다

    • 그 외에는 process 내에서 다른 thread들과 공유한다

Thread가 동료 thread와 공유하는 부분 (= task)

  • code section

  • data section

  • OS resources

→ 전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다

Thread의 장점

  • Responsiveness

    • 다중 thread로 구성된 task 구조에서는, 하나의 server thread가 blocked (waiting) 상태인 동안에도 동일한 task 내의 다른 thread가 실행(running) 되어 빠른 처리를 할 수 있다

  • Resource Sharing

    • 여러개의 thread는 process의 binary code, data, resource를 공유할 수 있다

  • Economy

    • creating & CPU switching thread (rather than a process)

    • solaris의 경우, 위 두 가지 overhead가 각각 30배, 5배이다

  • Throughput & Performance

    • 동일한 일을 수행하는 다중 thread가 협력하여 높은 처리율(throughput)성능 향상을 얻을 수 있다

  • Utilization of Multi-Programming Architectures

    • thread를 사용하면 병렬성을 높일 수 있다

Implementation of Threads

  • Kernel Threads

    supported by kernel

    • OS가 thread의 존재를 알고 있는 경우

    • OS가 서로 다른 thread 간의 CPU를 넘기는 작업을 할 수 있다 (like proces)

  • User Threads

    supported by library

    • OS가 thread의 존재를 모르는 경우

      • OS가 보기에는 thread가 없는 하나의 process로 보이는 경우

    • OS가 thread 간의 CPU를 넘기는 작업을 할 수 없다

      • process 내부에서 OS에 비동기식 I/O를 요청해서 바로 다시 받아 다른 thread로 CPU를 넘기는 등 사용자 프로그램단에서 관리하는 것을 의미한다

Process Creation

  • Parent process가 child process를 생성

    • parent process와 똑같은 process를 복제하여 child를 생성한다

    • 직접 만들지는 못하고, system call을 통해 OS에 만들어 달라고 요청해서 child 를 생성한다

      → fork()

  • process의 tree (계층 구조) 형성

  • process는 자원을 필요로 한다

    • OS로부터 받는다

    • parent process와 공유할 수 있다

      • but, 사실은 parent와 child process는 별개의 process이므로 자원을 할당받기 위해 경쟁 한다

  • 자원의 공유

    • parent와 child가 모든 자원을 공유하는 모델

    • 일부를 공유하는 모델

    • 전혀 공유하지 않는 모델

  • Execution

    • parent와 child는 공존하며 수행되는 모델

    • child가 terminate 될 때 까지 parent가 기다리는 모델

  • Address space

    • child는 parent의 공간을 복사한다 (binary & OS data)

    • child는 그 공간에 새로운 프로그램을 올린다

  • Unix의 예

    • fork() system call이 새로운 process를 생성

      • parent를 그대로 복사 (OS data except for PID + binary)

      • 주소 공간 할당

    • fork 다음에 이어지는 exec() system call을 통해 새로운 프로그램을 메모리에 올린다

Process Termination

  • process가 마지막 명령을 수행한 후 OS에게 이를 알려줌 → exit

    • child가 parent에게 output data를 보낸다 (via wait)

    • process의 각종 자원들이 OS에게 반납된다

  • parent process가 child 의 수행을 종료시킴 → abort

    • child가 할당된 자원의 한계치를 넘어섬

    • child에게 할당된 task가 더 이상 필요하지 않음

    • parent가 exit 하는 경우

      • OS는 parent process가 종료하는 경우, child가 더 이상 수행되도록 두지 않는다

      • tree 에서 가장 하위부터 단계적으로 종료한다

fork() system call

  • Process는 fork() system call에 의해 생성된다

    • caller를 복제해 새로운 address space를 생성한다

Parent process와 Child process 구분

  • fork() 를 수행했을 때, parent process는 child process의 pid를 return 값으로 받게 된다

    • child process는 0을 반환한다

exec() system call

  • process는 exec() system call에 의해 서로 다른 여러개의 program을 실행할 수 있다

  • caller의 memory image를 새로운 program으로 바꾼다

  • 하나의 process 를 완전히 새로운 process로 덮어 씌워서 실행한다

  • execlp()

    • 해당 함수 내에서 exec system call을 호출한다

    • parameter

      • 1st: program 이름

      • 2nd: program에 전달할 argument

fork() 와 exec()

child process를 생성하여 다른 program을 돌리고 싶을 때,

  • fork()를 실행하여 복제한 후

  • child process에는 exec()을 실행하여

    • parent process는 원래 실행하던 program을 이어서 실행하고

    • child는 새로운 program을 실행할 수 있게 한다

wait() system call

  • Process A 가 wait() system call을 호출하면,

    • kernel은 child가 종료될 때 까지 process A를 sleep 시킨다 → block 상태

      • 오래 걸리는 작업을 기다리도록 하는 blocked 외에, 공유 되는 자원에 대해 자식 process

    • child process 가 종료되면, kernel은 process A 를 깨운다 → ready 상태

  • linux에서 command를 입력할 때, 입력 받는 한 줄이 하나의 process 다

    • shell process 가 하나 떠있는 것!

  • command 를 실행하면, 해당 command의 자식 process 형태로 실행된다

    • 부모 process는 blocked status이므로, sleep 상태가 된다

      • ex) vi 명령어로 editor를 열었을 때 terminal이 block 상태가 되는 것

    • 부모 process는 자식 process가 종료될 때 까지 wait 상태가 된다

exit() system call

Process의 종료

  • 자발적 종료

    • 마지막 statement 수행 후 exit() system call을 통해서 종료

    • program에 명시적으로 적어주지 않아도 main 함수가 return되는 위치에 compiler가 넣어줌

  • 비자발적 종료

    • 부모 process가 자식 process를 강제 종료시킴

      • 자식 process가 한계치를 넘어서는 자원 요청

      • 자식에게 할당된 task가 더 이상 필요하지 않음

    • 키보드로 kill, break 등을 친 경우 → interrupt

    • 부모가 종료하는 경우

      • 부모 process가 종료하기 전에 자식들이 먼저 종료됨

Process 와 관련한 system call

  • fork()

    • create a child (copy)

  • exec()

    • overlay new image

  • wait()

    • sleep util child is done

  • exit()

    • frees all the resources, notify parent

Process 간 협력

Independent Process

process는 각자의 주소 공간을 가지고 수행되므로, 원칙적으로 하나의 process 는 다른 process의 수행에 영향을 미치지 못함

→ 독립적이다!

Cooperating Process

Process 협력 메커니즘을 통해 하나의 process가 다른 process의 수행에 영향을 미칠 수 있음

IPC: Interprocess Communication

  • message passing

    • 설명

      • 메시지를 전달하는 방법

      • kernel을 통해 메시지를 전달한다

    • Message System

      • process 사이에 shared variable을 일체 사용하지 않고 통신하는 system

    • Direct Communication

      • 통신하려는 process의 이름을 명시적으로 표시

      • 메시지를 누구한테 보낼지를 명시하여 양자간에 합의된 명시적 메시지 전달 방식

    • Indirect Communication

      • mailbox (or port)를 통해 메시지를 간접 전달

      • 타겟을 명시하지 않고 전달하면, 협력하는 process 중 하나가 꺼내가도록 하는 방식

  • shared memory

    • 주소 공간을 공유하는 방법

    • 서로 다른 process 간에도 일부 주소 공간을 공유하게 하는 shared memory 메커니즘이 있음

    • 단, 서로 신뢰할 수 있을 때만 공유해야 함

  • 참고) thread

    • thread는 사실상 하나의 process 이므로 process 간 협력으로 보기는 어렵지만, 동일한 process를 구성하는 thread들 간에는 주소 공간을 공유하므로 협력이 가능하다

Last updated