Process란 무엇인가? OS에 의해 추상화된 수행단위이다. 쉽게 말하자면, 메모리위에 올라가 있는 Program이다.
Process의 주소공간을 보면, 우리가 익히 알고있는 text,stack,heap등으로 구성되어있다.
우리가 사용하는 메모리위에 저런 Process들이 올라가 있는 상태이다 (실제로는 paging등으로 쪼개져 있지만,그건 나중에...).
OS는 각 프로세스의 관리를 위해 PID(Process ID)를 각 Process에 부여한다. OS는 PCB(Process Control Block)을 이용해서 (PCB는 프로세스들의 구체적인 실행정보 등을 저장한 Table이다) 각 프로세스를 관리한다.
각 프로세스들은, 다른 프로세스들에 의해 생성되거나 삭제될 수 있다. 이때, child process는 parent process의
많은 권한과 기능을 가져오게된다.
프로세스 생성을 야기하는 경우
1. 시스템 초기화
2. system call (ex: UNIX의 fork()명령어)
3. user의 process 생성 요청
각 프로세스들은 상태(State)를 가지게 된다.
노트 필기에서 선점형,비선점형등이 나오지만 지금은 신경쓰지 말자. 나중에 Process Scheduling에서 다루도록 하겠다.
위의 상태표는, 각 process의 상태가 어떻게 전이되는지 간단히 나타낸 모식도이다.
Process는 cpu에 할당되어 연산을 진행하다가, 특정 event로 인해 block되게 된다. 그럴경우, cpu 스케쥴러가
효율성을 위해 block된 process의 현재 정보를 PCB에 저장한다. ( 예를 들면, 현재 변수값 레지스터 값 등등...)
이 후, cpu에는 다른 waiting중인 process가 할당되게 된다. 이후 , event가 끝난 후 아까전 프로세스가 다시
cpu에 할당되기 위해 대기 queue에 들어오게 되고 cpu 스케쥴러의 정책에 따라 스케쥴링되게 된다.
프로세스는 아래와 같이 구성된다.
프로세스는 위의 요소들의 집합으로 표현될 수 있다.
Process란 CPU에 할당되는 연산의 단위이자. 하나의 독립적인 개체라고 생각해도 무방하다. 각 process들은 각기 다른
주소공간을 가지게 된다. 이로 인해, 각 연산값들을 주고 받기가 힘든 문제가 발생한다.
예를 들어, Process A에서 연산한 값을 Process B에서 사용하고 싶다면 이는 쉽지 않을 것이다. 애초에, 서로 독립적인
메모리 영역을 사용중이기 때문이다. 우리가 옆집 사람과 소통하기 위해서는, 전화나 문자등을 할 수 있듯이
이러한 문제를 해결하기 위해 IPC(Inter Process Comunication), Socket등이 존재한다. 하지만 이러한 방법에도 한계가
존재한다. 이 문제를 극복하기 위해, Thread라는 최소의 CPU 실행단위를 만들었다.
다음 포스팅에서는 Thread에 대해 알아보도록 하자.