[운영체제] 프로세스란?

.·2023년 4월 11일
0

가상화

CPU 가상화에 대해 먼저 얘기해보자.
CPU가상화를 하는 이유는 여러 프로세스를 동시에 실행시키고 싶어서이다.

예를 들어보면 하나의 복숭아를 먹고싶은 여러 사람이 있다. 이 사람들은 복숭아를 한 입 먹고 낮잠을 자거나 다른일을 하는데, 다른 일을 하는 잠시 동안 복숭아를 가져와서 다른 사람에게 줄 수 있다.

이런식으로 한 사람에게 하나씩 복숭아를 가진 것 같은 착각을 줄 수 있다.


프로세스는 다음 사이클을 반복하여 동작한다.
PC이 가리키는 명령어를 fetch, decode, execute그리고 PC update ... 반복

가상화 없이 여러 프로세스를 실행시키는 방법은

위와 같이 OS개입 없는 interleaving 방식이 있다. 이런 방식의 문제점은 각각의 코드가 서로의 프로세스를 알아야 한다.
예를 들어 codeA에서 codeB를 실행시키고 codeB에서 codeC를 실행시키는 코드가 포함되어야 한다.


가상화 방식을 이용하면 code A, B는 서로의 존재를 모르고 CPU는 OS의 코드만을 실행하게 된다.
그 결과 각각의 프로세스는 자신만의 CPU를 가진 착각을 주게 된다.

Process란?

실행중인 program의 인스턴스를 process라 한다.
Java로 비유를 들자면 Class는 program에 대응하고, Object는 process에 대응한다.
protection의 기본 단위이며 한 프로세스는 process ID(PID)를 가진다.
프로세스는 다음을 포함한다.
1. CPU context(registers)
ex)program counter, stack pointer
2. OS resources (address space, open file 등)
3. Other information(PID, state, onwer 등)

process 생성

프로세스 생성(프로그램의 실행)과정을 알아보자.

  1. 프로그램 코드를 메모리에서 프로세스의 address space라는 곳에 로드한다.
    address space는 뒤에서 다루겠지만, 각 프로세스마다 할당된 가상의 메모리 공간 정도로만 알고 있자.
    여기서 OS는 프로세스를 lazy loading 하는데, lazy loading이란 프로그램 실행동안에 필요한 코드와 데이터의 조각들만 로딩한다.

  2. 프로그램의 run-time 스택이 할당된다.
    지역변수, 함수 파라미터, 리턴 주소를 위한 스택을 할당하고 main함수에서 받은 argc와 argv 배열로 스택을 초기화한다.

  3. 프로그램의 heap이 할당된다.
    프로그램은 malloc()을 통해 heap 공간을 할당받고, free()를 통해 공간을 해제한다.

  4. OS는 다른 추가적인 초기화 작업을 한다.
    input/output setup
    각 프로세스는 기본적으로 3가지 open file descritiors를 가진다.(standard inut, ouput, error)

  5. main에서 프로그램을 실행한다.
    OS는 CPU 컨트롤을 새롭게 생성된 프로세스로 넘긴다.

생성 방법

1. fork()
부모 프로세스를 복제하여 새로운 프로세스 생성
자식 프로세스는 대부분의 자원과 권한을 상속받는다. (open files, UID 등)
자식 프로세스는 부모의 address space를 복제한다.

fork의 구현

뒤에 PCB와 queue 내용을 알아야 이해 할 수 있지만, fork를 설명하면서 같이 정리하였다. 이해 안가도 괜찮음

  1. 새로운 PCB를 생성한다. PCB는 Process Control Block로 뒤에서 설명한다. 지금은 프로세스에 대한 모든 정보를 담고 있는 것이라고 생각하면 된다.

  2. 새로운 address space를 생성하고 초기화 한다.

  3. 부모 address space의 전체 내용을 복사한다.
    heap, stack 등 자식에게 물려줌

  4. 커널 자원을 부모가 사용하는 자원을 가리키도록 초기화한다.

  5. PCB를 ready queue에 넣는다.
    ready queue의 경우도 뒤에서 다룬다

  6. 자식의 pid를 부모에게 return하고, 자식에게는 0을 return 한다.

2. exec()
새로운 프로그램으로 현재 프로세스를 대체한다.
exec의 구현

뒤에 PCB와 queue 내용을 알아야 이해 할 수 있지만, exec를 설명하면서 같이 정리하였다. 이해 안가도 괜찮음

  1. 현재 프로세스를 멈춘다.

  2. 현재 프로세스의 address space에 프로그램 "prog"를 로드한다.

  3. 새로운 프로그램을 위한 hardware context와 "args"로 초기화한다.

  4. PCB를 ready queue에 놓는다.

exec()는 새로운 프로세스를 생성하지 않는다.

프로세스의 상태

Running
프로세스가 동작중인 상태

Ready
프로세스가 시작할 준비는 되었지만, 어떠한 이유에서 OS에서 실행을 선택하지 않은 상태

Blocked
프로세스가 다른 연산을 수행하는 상태
예를 들어 프로세스가 디스크에 I/O 요청을 하면, blocked 상태가 되고 다른 프로세스가 CPU를 사용할 수 있게 됨.

그림을 보면 이해하기 쉽다. 각 transition 을 유의깊게 보자.

프로세스의 구현

이제 PCB에 대한 이야기가 나온다.
PCB는 Process Control Block으로 process descriptor라고 한다.
즉 프로세스를 설명하는 것
프로세스에 대한 모든 정보 포함
-CPU registers
-PID, PPID, process group, priority, process state, signals
-CPU scheduling information
-Memory management information
-Accounting information
-File management information
-I/O상태 정보
-credeintials



앞서 말한 정보를 포함하고 있다.

Context Switch

CPU를 여러 프로세스가 번갈아 사용하는데, 이때 한 프로세스에서 다른 프로세스로 전환하는 것을 Context Switch라 한다

이 context switch 작업에는 overhead가 따라온다.
이유는
스위칭 과정에서 현재 실행중인 프로세스의 정보를 레지스터와 메모리에 저장하고
실행할 프로세스의 정보를 레지스터와 메모리로 가져와야 한다.
그리고 이전 프로세스의 메모리 캐시를 비우고, 새로운 프로세스의 메모리 캐시를 가져와야 한다.
또 다양한 테이블과 리스트를 업데이트 하는 과정이 필요하닫.

이 overhead는 하드웨어에 의해 support 된다.
다수의 레지스터 셋을 사용 => 이 방법은 비용 문제가 발생 할 수 있음
전형적으로 1초에 100s or 1000s의 스위치 발생
context switch 과정
다음 포스팅에서 설명
업로드중..

Process State Queues

OS는 시스템에서 모든 프로세스의 상태를 나타내는 큐들을 가지고 있음.
ready queue, run queue, wait queue(device, timer, message...) 등

각 큐에는 PCB가 들어간다. 각 프로세스의 state에 맞게
프로세스의 state가 변경되면, PCB가 다른 큐로 이동

마지막으로 앞으로 cpu 가상화를 위한 policy와 mechanism이 나오는데 policy와 mechanism의 차이를 알아보자.

Policy vs Mechanism

policy
무엇이 수행 되어야 하는지?
정책은 자원 할당과 스케줄 문제를 처리한다.
예를 들어 다음번에 어떤 프로세스를 수행할지?와 같이 무엇에 초점

Mechanism
어떻게 할 것인가?
정책을 구현하기 위한 도구!
예를 들어 어떻게 다수의 프로세스를 동시에 수행할지?와 같이 어떻게에 초점

Separating Policy from Mechanism
-OS 디자인의 핵심은 policy와 mechanism을 분리하는 것이다.

-정책은 workloads와 장소, 시간에 따라 변할 수 있다

-정책과 분리된 mechanism을 general하다고 하고, 더 바람직하다

-modular OS를 설계하도록 한다.

-시스템을 확장 가능하게 만들 수 있다. user-specific policies

다음 포스팅에서는 CPU를 효울적으로 가상화하기 위한 방법을 알아보자.

profile
공부하고 정리하는 블로그

0개의 댓글