공부/운영체제

[ 운영체제 ] 프로세스와 스레드

haena02 2023. 1. 17. 17:30
반응형

1. 프로세스

 

프로세스란 실행 중인 프로그램이다.

프로그램은 실행되기 전까지는 데이터덩어리지만 프로그램을 메모리에 적재하고 실행하는 순간 프로세스가 된다.

 

1.1 프로세스 직접 확인하기

 

프로세스를 직접 확인해보면 내가 실행중인 프로세스 외에도 알 수 없는 프로세스가 실행되고있다.

사용자가 보는 앞에서 실행되는 프로세스는 포그라운드 프로세스라고하고,

뒤편에서 실행되는 프로세스는 백그라운드 프로세스라고 부른다.

이 중에서도 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스를

유닉스 체계의 운영체계에서는 데몬, 윈도우 운영체제에서는 서비스라고 부른다. 

 

1.2 프로세스 제어 블록

 

프로세스가 실행되려면 CPU가 필요하지만, CPU자원은 한정되어있다.

이때문에 프로세스들은 차례대로 돌아가면서 CPU를 이용하고 다 쓰면 인터럽트를 발생시켜 다음 프로세스에게 양보한다.

 

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행순서를 관리하고, 자원을 배분한다.

이를 위해 운영체제는 Process Control Block (PCB)을 이용한다.

 

PCB는 프로세스와 관련된 정보를 저장하는 자료구조이다.

이는 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장된다.

PCB는 커널 영역에 생성된다.

 

1.3 Context Switch

 

하나의 프로세스에서 다른 프로세스로 실행순서가 넘어가기전에 프로세스의 정보들을 백업해놔야 다음에 다시 차례가 왔을 때 이어서 다시 실행 할 수 있을 것이다.  이렇게 백업해놔야하는 정보를 Context라고 하고 이런 내용은 PCB에 저장되어있다. 그러고 다음 프로세스의 차례가 오면 운영체제는 PCB에서 정보들을 백업한다.

이런식으로 Context switch가 일어나게된다.

 

이러한 과정은 매우 빠르게 일어나기 떄문에 동시에 일어나는 것처럼 보인다. 

 

 

1.4 프로세스의 메모리영역

 

사용자 영역은 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나누어져있다.

 

코드영역과 데이터영역은 크기가 변하지 않는다.

명령어들이 바꿀 일이 없으니 코드영역은 변하지 않고 데이터영역의 저장된 내용은 프로그램이 실행되는 동안만 유지되기 때문에 변할일이 없다. 그래서 이 둘을 정적할당영역이라고 부른다.

하지만 뒤에 나올 힙과 스택은 프로세스 실행과정에서 크기가 변할 수 있기 때문에 동적할당 영역이라고 부른다. 

 

코드영역

이 곳에는 기계어로 이루어진 명령어가 저장된다.

코드영역에는 데이터가 아닌 CPU가 실행할 명령어가 담겨있기 때문에 쓰는 것이 금지되어있다.

 

데이터영역

데이터영역에는 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간이다.

대표적으로는 전역변수가 있다.

 

힙영역

힙 영역은 프로그램을 프로그래머가 직접 할당할 수 있는 저장 공간이다.

힙 영역에 메모리공간을 할당했다면 반환해야한다,

반환하지 않으면 메모리 누수가 난다. 

 

스택영역

스택영역은 데이터를 일시적으로 저장하는 공간이다.

대표적으로는 매개변수, 지역변수가 대표적이다. 

 

 

힙영역은 메모리의 낮은 주소에서 높은 주소로 할당되고, 스택 영역은 높은주소에서 낮은 주소로 할당된다.

그래서 스택영역과 힙 영역은 겹칠일이 없다. 

 

 

2. 프로세스 상태와 계층 구조

 

프로세스는 모두 저마다의 상태가 있다.

운영체제는 이런 프로세스의 상태를 PCB에 기록하고 관리한다.

2.1 프로세스 상태

 

컴퓨터를 사용할 때 여러 프로세스들이 빠르게 번갈아가면서 실행된다.

그 과정에서 하나의 프로세스는 여러 상태를 거치며 실행된다.

 

생성 상태

프로세스를 생성 중인 상태 상성 상태라고 한다.

이제 막 만들어져서 PCB를 할당받은 상태라고 하라 수 있다.

생성상태를 거쳐 준비가 다됐다면 실행되는것이 아니라 준비상태로 간다.

 

준비 상태

준비상태는 당장이라도 CPU를 할당받아 실행할 수 있지만, 차례가 안와 기다리고 있는 상태이다,

 

실행 상태

준비상태에 있다가 차례가 오면 CPU를 할당받아 실행상태가 된다.

실행 상태인 프로세스들은 일정 시간동안만 CPU를 사용 할 수 있고 모두 사용하면 다시 준비상태가 된다.

 

대기 상태

프로세스 실행 도중 입출력 장치를 사용할 때, 입출력 작업이 끝날 떄까지 기다려야한다. (Blocked)

이렇게 작업을 기다리는 상태를 대기 상태라고한다.

입출력 작업이 완료되면 다시 준비 상태로 CPU할당을 기다린다. 

 

종료 상태

프로세스가 종료된 상태이다.

종료되면 운영체제는 PCB와 메모리를 정리한다. 

프로세스 상태 다이어그램

 

2.2 프로세스 계층 구조

 

프로세스는 실행 도중 시스템 호출을 총해 다른 프로세스를 생성할 수 있다.

이때 새 프로세스를 생성한 프로세스를 부모 프로세스, 생성 된 프로세스를 자식 프로세스라고 한다. 

 

자식 프로세스는 또 부모가 되어 프로세스를 생성할 수도 있다.

이렇게 운영체제들은 프로세스가 프로세스를 낳는 계층적인 구조로 프로세스를 관리한다. 

 

*최초의 프로세스는 무엇일까??

유닉스 체계에서는 init, 리눅스 체계에서는 systemd, mac에서는 launchd 하고한다,

이들의 PID는 1번이다.

 

2.3 프로세스 생성 기법

 자식 프로세스들은 fork와 exec으로 실행된다.

fork는 자신의 복사본을 자식 프로세스로 생성해내고, exec을 통해 자신의 메모리 공간을 다른 프로그램으로 교체한다.

fork를 하면 부모의 모든것이 상속되기 때문에 exec를 통해 새로운 프로그램을 덮어쓴다.

exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행하라 프로그램의 내용으로 바뀌고 나머지 영역은 초기화 된다.

 

 

3. 스레드

 

스레드는 프로세스를 구성하느느 실행의 흐름 단위이다.

하나의 프로세스는 여러개의 스레드를 가질 수 있다.

스레드를 이용하면 하나의 프로세스에서 여러부분을 동시에 실행할 수 있다.

 

3.1 프로세스와 스레드

 

한번에 하나의 일만을 처리하는 프로세스를 단일 스레드 프로세스라고한다. 

하지만 스레드라는 개념이 도입되면서 하나의 프로세스가 여러개의 일을 동시에 처리할 수 있게 되었다. 

이런 프로세스를 멀티스레드 프로세스라고 한다.

 

스레드는 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값, 스택 등을 갖기에 각 다른코드를 실행할 수 있다.

여기서 중요한 점은 프로세스의 스레드들은 실행에 필요한 최소한의 정보를 유지한채 프로세스 자원을 공유한다.

 

 

3.2 멀티프로세스와 멀티스레드

여러 프로세스를 동시에 실행하는 것을 멀티 프로세스,

여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드라고한다,.

 

프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내의 자원을 공유한다.

스래들 끼리는 같은 자원을 쓰기 때문에 스레드끼리의 협력과 통신에 유리하다.

이는 하나에 문제가 생기면 다른 스레드에도 문제가 생길 수 있다는 점에서 단점이 될 수도 있다.

반응형