프로세스(Process)
실행 파일(.exe)이 실행되어 메모리에 적재된 인스턴스이다. 쉽게 말해 컴퓨터 내에서 실행중인 프로그램을 일컫는 용어이다. 프로세스는 반드시 하나 이상의 스레드로 구성된다. 프로세스가 밧줄이라면 스레드는 밧줄을 이루는 실이라고 할 수있다.
*프로그램과 프로세스의 차이 : 프로그램은 하드디스크에 저장되어있는 물리적인? 실행 코드를 뜻하고 프로세스는 프로그램을 구동하여 메모리상에서 실행되고 있는 작업단위를 지칭한다.
프로세스 분류
포그라운드 프로세스 : 사용자가 보는 앞에서 실행되는 프로세스
*데몬(daemon) :
유닉스 체계에서 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 서비스,
윈도우 운영체제에서는 서비스라고 부릅니다.
백그라운드 프로세스 : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
프로세스 제어 블록(Process Control Block, PCB)
- 프로세스와 관련된 정보를 저장하는 자료구조
- 커널 영역에 생성
- 특정 프로세스를 식별하고 처리하는데 필요한 정보 판단
- 프로세스 생성시 만들어지고 실행이 끝나면 폐기
PCB에 담기는 정보
- 프로세스 ID(PID)
- 특정프로세스를 식별하기 위해 부여하는 고유한 번호
- 같은 프로그램이라도 두번 실행하면 PID가 다른 두 개의 프로세스가 생성됨
- 레지스터 값
- 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들
*레지스터(register) : CPU 내부에 있는 작고 빠른 메모리로, 특정한 목적으로 외부 정보를 일시적으로 기억하는 장치
*프로그램 카운터 : 다음에 실행할 명령어의 주소를 기억하고 있는 중앙처리장치(CPU)의 레지스터 중 하나,
메모리에 있는 명령어들을 주기에 따라 순차적으로 실행될 수 있게 한다.
- 프로세스 상태
- CPU 스케줄링 정보
- 메모리 관리정보
- 프로세스가 메모리에 저장된 주소를 알기 위한 베이스 레지스터, 한계 레지스터 값, 페이지 테이블 정보
- 사용한 파일과 입출력장치 목록
문맥 교환
기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환(Context Switching)이라고 한다.
문맥 : 하나의 프로세스수행을 재개하기위해기억해야 할 정보로, 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표되어 있다.
프로세스의 메모리 영역
코드 영역
- 텍스트 영역 이라고도 부른다
- 기계어로 이루어진 명령어 저장
- 데이터가 아닌 CPU가 실행할 명령어가 담겨 있기 때문에 쓰기 금지
- 읽기 전용 공간
데이터 영역
- 전역 변수
- 정적 할당 영역
힙 영역
- 사용자가 직접 할당할 수 있는 저장 공간
- 메모리 누수
- 동적 할당 영역
스택 영역
- 데이터를 일시적으로저장하는 공간
- 매개 변수, 지역변수
- 동적 할당 영역
프로세스 상태
생성 상태(new)
프로세스를 생성 중인상태를 생성 상태라고 한다. 이제 막 메모리에 적재되어 PCB를 할당 받은 상태로
실행할 준비가 완료된 프로세스는 곧바로 실행되지 않고 준비상태가 되어 CPU의 할당을 기다린다.
준비 상태(ready)
자신이 실행될 차례를 기다리고 있는 상태이다. 준비 상태 프로세스는 자신의 차례가 되면 CPU를 할당받아 실행 상태가 되는데 이 전환 과정을 디스패치(dispatch)라고 한다.
실행 상태(running)
CPU를 할당받아 실행 중인 상태를 의미한다. 이 때의 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다. 할당된 시간을 모두 사용한다면( 타이머 인터럽트 발생 시 ) 다시 준비 상태가 되고, 실행 도중 입출력 장치를 사용하여 입출력 장치의 작업이끝날 때까지 기다려야 한다면 대기 상태가된다.
대기 상태(blocked)
프로세스 실행 도중 입출력장치를 사용하거나 특정 이벤트가 발생한 경우, 해당 작업이 끝날 때까지 기다려야 하는데 이를 대기 상태라고 한다. 작업이 완료되면 해당 프로세스는 다시 준비상태로 전환된다.
종료 상태(terminated)
프로세스가 종료된 상태이다. 이 때 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
프로세스 계층 구조
프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다. 이 때 생성된 프로세스를 자식 프로세스라 하고 자식 프로세스를 생성한 프로세스를 부모 프로세스라고한다. 두 프로세스는 엄연히 다른 프로세스이기에 각각 다른 PID를 가진다. 일부 운영체제에서는 자식 프로세스의 PCB에 부모프로세스의 PID인 PPID(Parent PID)가 기록되기도 한다. 많은 웅영체제가 이처럼 프로세스가 프로세스를 낳는 계층적인 구조로써 프로세스들을 관리한다.
프로세스 목록을 확인하는 법(윈도우)
- 명령 프롬프트(cmd)에 tasklist 명령어 입력
- [ Ctrl + Shift + Esc 단축키를 통해 작업 관리자 실행 ] - [ 자세히 메뉴 클릭 ]
프로세스 생성 기법
1. 부모 프로세스는 fork()를 통해 자신의 복사본을 자식 프로세스로 생성
2. 이후 자식 프로세스는 exec() 시스템 호출을 통해 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰기
스레드(Thread)
프로세스 안에서 실행되는 흐름의 단위를 말한다. 스레드를 추가 생성하게 되면 멀티 스레드 환경이 된다.
단일 스레드 프로세스
하나의 실행 흐름을 가지고 한번에 하나의 부분만 실행되는 프로세스
멀티 스레드(Multi Thread)
두개 이상의 쓰레드를 이용해서 프로세스를 구성하는 것을 말한다. 스레드는 서로 프로세스 내의 Heap, Data, Code 영역을 공유하고, 각각의 스레드는 독립적으로 Stack과 PC Register 할당 받는다.
스레드의 구성
스래드는 서로 프로세스 내의 힙, 데이터, 코드영역을 공유하고, 프로세스 내에서 각기 다른 스레드ID, 프로그램 카운터 값을 비롯한 레지스터값, 스택으로 구성되어 있다. 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고있기에 스레드마다 각기 다른 코드를 실행할 수 있다.
요점은 프로세스의 스래드들은 실행에 필요한 최소한의 정보(레지스터, 스택) 만을 유지한 채 프로세스 자원을 공유하며 실행된다.
스택을 독립적으로 할당하는 이유
스택은 함수 호출 시 생성되는 지역 변수와 매개 변수가 저장되는 영역으로 스레드 각각에 독립적으로 할당할 경우, 독립적인 함수 호출을 가능하게 하여, 스레드의 정의에 따라 독립적인 실행 흐름을 가지기 위한 최소 조건으로 독립된 스택을 할당한다.
[ 참조 ] : https://blog.naver.com/ojoo2107/222836564245
멀티프로세스와 멀티스레드
같은 작업을 수행하는 것에 있어서 여러 프로세스를 실행하는 것과 여러 스레드로 실행하는 것의 차이는 자원을 공유하는 가의 차이에 있다. 여러 프로세스로 병행 실행 할때엔 동일한 내용들을 각각의 프로세스가 가지고 있기에 같은 자원을 공유하는 멀티 스레드로 병행 실행 할때보다 메모리의 낭비가 크다. 허나 프로세스의 자원을 공유한다는 특성은 하나의 스레드에 문제가 생기면 자원을 공유하는 다른 스레드도 영향을 받기때문에 프로세스 전체에 문제가 생길 수 있다는 단점이 있다.
*프로세스 간 통신(Inter-Process Communication : IPC) : 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 공유 메모리(shared memory) 나 소켓, 파이프 등을 통해 통신 할 수 있다.
'OS' 카테고리의 다른 글
가상 메모리 (0) | 2024.01.20 |
---|---|
데드락(Deadlock, 교착 상태) (0) | 2024.01.20 |
프로세스 동기화[240222 - Spinlock추가] (2) | 2024.01.14 |
CPU 스케줄링 (2) | 2024.01.14 |
1. 운영체제(OS, Operating System) (0) | 2024.01.07 |