프로그램
프로그램은 보통 하드디스크나 보조기억장치에 저장된 실행가능한 코드를 말한다.
프로세스
프로세스란 CPU에 의해 처리되는 사용자 프로그램, 시스템 프로그램, 즉 실행중인 프로그램을 의미하고 작업(Job) 또는 태스크(Task)라고도 한다. 운영체제로부터 자원을 할당받는 작업의 단위라고도 할 수 있다. 프로세스가 여러 개가 된다면 멀티프로세스라고 한다.
프로세스 상태
- 하나의 프로세스는 여러가지 이벤트에 의해 일련의 서로 구분되는 상태 변화를 겪는다.
- 생성, 준비, 실행, 대기, 완료 상태를 가질 수 있다.
프로세스 상태 | 설명 |
생성(Create) 상태 | 사용자에 의해 프로세스가 생성된 상태 |
준비(Ready) 상태 | CPU를 할당 받을 수 있는 상태. 준비 리스트 : 각각 우선순위를 부여하여 가장 높은 우선순위를 갖는 프로세스가 다음 순서에 CPU를 할당받음 |
실행(Running) 상태 | 프로세스가 CPU를 할당받아 동작 중인 상태 |
대기(Waiting) 상태 | 프로세스 실행 중 입출력 처리 등으로 인해 CPU를 양도하고 입출력 처리가 완료될때까지 대기리스트에서 기다리는 상태. 대기리스트: 우선순위가 존재하지 않음. |
완료(Complete) 상태 | 프로세스가 CPU를 할당받아 주어진 시간 내에 완전히 수행을 종료한 상태. |
프로세스 구성
프로세스는 사용자 작성 코드, 사용자 사용 데이터, 스택, 프로세스 제어블록(PCB)으로 구성된다.
프로세스 구성요소 | 설명 |
사용자 작성 코드 | 사용자가 작성한 프로그램 코드 |
사용자 사용 데이터 | 사용자 작성 프로그램 코드에서 사용하는 데이터 |
스택(Stack) | 함수 호출(Procedure call) 및 인자 값 전송(Arguments Passing)에 사용 |
프로세스 제어 블록 (PCB; Process Control Block) |
운영체제가 프로세스 관리를 위해 필요한 자료를 담고 있는 자료구조. PCB는 프로세스 생성 시 만들어지고, 메인 메모리에 유지되며 운영체제에서 한 프로세스의 전체를 정의. PCB 구성요소 : PID(프로세스 식별자), 프로세스 상태, 프로그램 카운트, 레지스터 저장 영역, 프로세서 스케줄링 정보, 계정 정보, 입출력 상태 정보, 메모리 관리 정보. |
프로세스 메모리 구조
영역 | 설명 |
스택(stack) 영역 | 프로그램이 자동으로 사용하는 메모리 영역으로 함수 호출과 관계되는 지역 변수 및 매개변수와 함수의 리턴주소가 저장된다. 함수 호출 시에 생성이 되고 함수가 끝나면 반환된다. |
힙(heap) 영역 | 메모리를 동적으로 할당할 때 사용하는 영역. 스택과 힙은 사실 같은 공간을 공유하는데, stack이 높은 메모리 주소부터 할당된다면 heap은 낮은 메모리 주소 부터 할당되는 방식이다. 서로 영역을 침범하는 일이 생길 수 있는데 이를 stack overflow 혹은 heap overflow 라고 부른다. |
데이터 영역 | 프로그램의 전역변수, 정적변수 등이 저장된다. 데이터 영역은 BSS 영역과 data 영역으로 나눠지는데 BSS 영역은 초기화 되지않은 데이터가 저장되고, data 영역은 초기화 된 데이터가 저장된다. |
텍스트(코드) 영역 | 프로그램을 실행하는 코드(함수, 제어문 등)들이 들어가는 영역이다. 여기서 코드는 컴파일한 프로그램의 코드이기 때문에 기계어 형태이다. |
스레드
스레드는 프로세스보다 가벼운, 독립적으로 수행되는 순차적인 제어의 흐름이며 프로세스가 할당받은 자원을 사용하는 실행단위이다. 스레드는 프로세스에서 실행 제어만 분리한 실행 단위로 한 개의 프로세스는 여러 개의 스레드를 가질 수 있다. 이를 멀티 스레드라고 한다.
위 그림에서 볼 수 있듯이, 프로세스에서는 스택, 힙, 데이터(static), 코드영역 등 메모리 공간을 독립적으로 가지는 것과 다르게 스레드는 스택 영역을 제외한 메모리 공간을 프로세스와 공유한다. 따라서 스레드의 경우에는 메모리 영역을 공유하기 때문에 IPC(프로세스 간 통신) 없이도 통신이 가능하다.
이러한 이유로, 멀티 프로세스로 진행하게되면 각각 프로세스마다 자원을 할당하고 작업들 간의 통신비용이 큰 것을 멀티 스레드로 진행하면 프로세스내에 할당된 자원을 공유하고 상대적으로 스레드간 통신 비용이 적기 때문에 자원의 효율성이 증가한다.
하지만 멀티 스레드의 사용에서는 자원을 공유하는 만큼, 전역 변수에 있어서 서로 다른 스레드가 같은 변수를 예기치 못하게 건드리는 상황이 발생 할 수 있기때문에 이에 주의해야한다.
잘못된 부분에 대해서는 지적 부탁드립니다!
참조
https://iredays.tistory.com/118
https://brunch.co.kr/@kd4/3#comment
https://3dmpengines.tistory.com/2003
'programming > OS' 카테고리의 다른 글
[운영체제] 프로세스 스케줄링 (0) | 2021.06.20 |
---|