실행중인 프로그램을 의미 (program in execution)
운영체제에서 작업의 단위가 된다
프로세스는 다음과 같은 자원들을 필요로 한다
프로세스를 관리하는 것이 OS의 기본이다.
- Text(Code) Section:
- 명령어 / 코드- Data Section:
- 전역 변수 (Uninitialized, Initialized 데이터 구분)- Heap Section:
- 프로그램 실행 중 동적으로 할당한 자원- Stack Section:
- 함수 호출 시 (인자, 리턴 주소값, 지역 변수)
- New: 프로세스가 생성된 상태
- Running: 프로세스가 CPU를 점유하여 명령어를 실행하고 있는 상태
- Waiting: I/O나 이벤트가 완료될 때까지 기다리고 있는 상태
- Ready: 다른 프로세스가 CPU를 점유하고 있어 할당을 기다리는 상태
- Terminated: 프로세스가 종료된 상태
- Suspend: 프로세스가 중지된 상태
- time out: 정해진 CPU 사용시간이 지나 CPU 반납하게 됨
- interrupt: CPU 스케쥴링에 의해 우선순위가 높은 프로세스가 들어오게 된다면 CPU를 반납하고 Ready Queue에 들어감
하나의 구조체로 선언하여 운영체제가 관리하도록 한다
- 프로세스 포인터
- 프로세스 상태
- Program Counter (다음 실행할 명령어를 가리키고 있다)
- CPU Register
- CPU 스케쥴링 정보
- 메모리 관리 정보
- 생성한 유저 정보
- I/O 정보 등...
Register == Context(문맥)
CPU가 하나의 프로세스를 실행하고 있는 상태에서 인터럽트에 의해 다음 우선 순위에 있는 프로세스를 할당해야 될 때 현재 실행중인 프로세스의 상태, 레지스터 값을 저장한 후 새로운 프로세스의 프로세스 상태와 레지스터 값으로 교체하는 작업을 말한다.
이러한 정보들을 담은 문맥들은 PCB에 저장된다.
[인터럽트 요청이 들어오는 경우]
- I/O 요청 (다른 Interrupt가 일어날 시 문맥교환이 일어나지 않는다. 오직 I/O)
- Time Out
- fork()
프로세스는 프로그램이 하나의 thread로 실행된 상태이다.
프로세스간 CPU 점유를 빈번하게 바꾸는 과정
사용자 입장에서는 동시에 실행되는 것 처럼 보인다.
CPU 스케쥴링이 필요하다
프로세스가 할당 받은 자원을 이용하는 실행 단위
프로세스 안에서 실행되는 여러 흐름 단위
- 프로세스 내에서 각각 stack만 할당 받고 나머지 자원(code, data, heap)은 공유된다
- 중복된 자원 활용을 최소화하기 때문에 프로세스를 여러개 실행 시키는 것보다 수행 능력을 향상시킬 수 있다
- 각각의 쓰레드는 독립적인 작업을 수행하기 때문에 별도의 레지스터 값과 스택을 가진다
하나의 프로세스에 여러개의 쓰레드로 나누어 서로 자원을 공유하며 작업을 수행하는 것
[장점]
- 프로세스를 새로 생성하는 것보다 자원을 효율적으로 관리할 수 있다.
- 자원을 공유하기 때문에 통신 비용이 절감되며 메모리를 효율적으로 사용할 수 있다
- context switching 비용이 적다
[단점]
- 여러 개의 쓰레드가 동일한 데이터 공간을 공유하기 때문에 동기화 문제가 발생할 수 있다
- 하나의 스레드에 문제가 생겼을 때 전체 프로세스가 영향을 받는다
critical section: 임계 구역. 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원을 접근하는 코드의 일부를 말한다
하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 다수의 프로세서(CPU)가 각 프로세스를 병렬적으로 처리 하는 것
- 각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 하는 경우 활용
- IPC를 통해 프로세스간 통신이 이루어진다
[장점]
- 각 프로세서가 자원을 공유하며 프로세스를 처리하기 때문에 하나의 프로세서가 고장나더라도 작업은 정지되지 않는다
- 동기화 작업이 필요하지 않다
[단점]
- 멀티 스레드 방식보다 많은 메모리 공간과 CPU 시간을 차지한다
- context switching 오버헤드가 발생한다
ex) 여러 사용자가 로그인을 요청하는 상황