[OS]프로세스와 스레드

HeeSung Lee·2023년 4월 11일
0

프로세스란?

프로그램이 저장장치에 저장되어 있는 정적인 상태라면, 프로세스는 프로그램 실행을 위해 메모리에 올라온 동적인 상태라고 할 수 있다. 프로세스는 또한 가상메모리 공간, 코드, 데이터, 시스템 자원의 집합이라고도 할 수 있다. OS는 프로세스를 하나의 작업의 단위로 보고 자원들을 프로세스에 적적히 분배한다.

New

  • 프로세스가 생성되는 도중의 상태이다.

Ready

  • 프로세스가 생성된 후, 프로세서에 할당되기를 기다리는 상태이다.

Runing

  • instruction이 실행되는 상태이다.
    프로세서에 할당되어 있다.

Wait

  • 프로세스가 특정 이벤트를 기다리는 상태이다.
    프로세서에 할당되어 있지만 프로세서의 클락을 낮추거나 일시적으로 멈춤으로써 에너지 소비를 줄일 수 있는 상태이다.

Terminated

  • process 종료된 상태

프로세스의 상태

생성상태

- 프로그램이 메모리에 올라오고 운영체제로부터 PCB를 할당받은 상태
- 생성된 프로세스는 바로 실행되는 것이 아니라 준비 상태에서 자기 순서를 기다리며, PCB 도 같이 준비 상태로 옮겨짐

준비상태

- 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태
- PCB는 준비 큐에서 기다리며 CPU 스케줄러에 의해 관리
- CPU 스케줄러는 준비 상태에서 큐를 몇 개 운영할지, 큐에 있는 어떤 프로세스의 프로세스 제어 블록을 실행 상태로 보낼지 결정
- CPU 스케줄러가 어떤 프로세스 제어 블록을 선택하는 작업은 dispatch(PID) 명령으로 처리
- CPU 스케줄러가 dispatch(PID)를 실행하면 해당 프로세스가 준비 상태에서 실행 상태로 바뀌어 작업이 이루어짐

실행상태

- 프로세스가 CPU를 할당 받아 실행되는 상태
- 실행 상태에 있는 프로세스는 자신에게 주어진 시간, 즉 타임 슬라이스 동안만 작업할 수 있음
- 그 시간을 다 사용하면 timeout(PID)가 실행되어 실행 상태에서 준비 상태로 옮김
- 실행 상태 동안 작업이 완료되면 exit(PID)가 실행되어 프로세스가 정상 종료
- 실행 상태에 있는 프로세스가 입출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 block(PID)를 실행
- block(PID)는 입출력이 완료될 때까지 작업을 진행할 수 없기 때문에 해당 프로세스를 대기 상태로 옮기고 CPU 스케줄러는 새로운 프로세스를 실행 상태로 가져옴

대기상태

- 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태
- 대기 상태의 프로세스는 입출력장치별로 마련된 큐에서 기다리다가 완료되면 인터럽트가 발생하고, 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는데 이것이 wakeup(PID)
- wakeup(PID)로 해당 프로세스의 프로세스 제어 블록이 준비 상태로 이동

완료상태

- 프로세스가 종료되는 상태
- 코드와 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기
- 정상적인 종료는 간단히 exit( )로 처리
- 오류나 다른 프로세스에 의해 비정상적으로 종료되는 강제 종료를 만나면 디버깅하기 위해 종료 직전의 메모리 상태를 저장장치로 옮기는데 이를 코어 덤프(core dump)라고 함

휴식상태

프로세스가 작업을 일시적으로 쉬고 있는 상태
유닉스에서 프로그램을 실행하는 동중에 Ctrl + Z 키를 누르면 볼 수 있음
종료 상태가 아니기 때문에 원할 때 다시 시작할 수 있는 상태

보류상태

- 프로세스가 메모리에서 잠시 쫓겨난 상태
- 프로세스는 다음과 같은 경우에 보류 상태가 됨
	+ 메모리가 꽉 차서 일부 프로세스를 메모리 밖으로 내보낼 때
	+ 프로그램에 오류가 있어서 실행을 미루어야 할 때
	+ 바이러스와 같이 악의적인 공격을 하는 프로세스라고 판단될 때
	+ 매우 긴 주기로 반복되는 프로세스라 메모리 밖으로 쫓아내도 큰 문제가 없을 때
	+ 입출력을 기다리는 프로세스의 입출력이 계속 지연될 때

프로세스의 구성

프로세스는 프로그램 코드, 데이터, 스택, 힙 등의 구성 요소로 구성된다. 프로그램 코드는 실행할 명령어가 포함된 바이너리 파일이며, 데이터는 프로그램에서 사용하는 전역 변수 및 정적 변수와 같은 정보를 포함한다. 스택은 함수 호출에 필요한 지역 변수 및 매개 변수와 같은 정보를 저장하는 데 사용되며, 힙은 프로그램에서 동적으로 할당되는 메모리를 관리하는 데 사용된다.

스레드

스레드는 프로세스 내에서 실행되는 작은 실행 단위입니다. 즉, 프로세스는 스레드의 집합체로 이루어져 있다. 각 스레드는 별도의 스택을 가지며, 공통된 코드와 데이터를 사용한다.

스레드와 프로세스의 차이점

스레드는 프로세스 내에서 실행되는 작은 실행 단위이고, 프로세스는 실행 중인 프로그램의 인스턴스다. 스레드는 프로세스 내에서 공유되는 메모리 영역을 사용하여 데이터를 주고 받으며, 각각의 스레드는 독립적인 실행 흐름을 가진다. 프로세스는 각각의 인스턴스가 독립적인 메모리 영역을 가지고 실행되며, 프로세스 간의 통신을 위해서는 IPC(Inter-Process Communication) 방법을 사용해야 한다.

스레드의 장단점

장점

  1. 빠른 처리: 스레드는 프로세스 내에서 각각 병렬적으로 실행되므로, 멀티스레드 프로그램은 단일 스레드 프로그램보다 빠른 처리 속도를 보일 수 있다.
  2. 자원공유: 스레드는 프로세스 내에서 공유된 메모리 영역을 사용하므로, 데이터를 주고 받는 데 있어서 별도의 IPC 메커니즘이 필요하지 않는다.

단점

  1. 동기화: 멀티스레드 프로그램에서는 스레드 간에 공유된 자원에 대한 동기화 문제를 해결해야 한다. 이를 제대로 처리하지 않으면 데이터 불일치 문제가 발생할 수 있다.
  2. 디버깅: 멀티스레드 프로그램에서는 스레드 간의 상호작용을 디버깅하기가 어렵다.

스레드의 종류

1. 사용자 수준 스레드

- 사용자 수준에서 관리되며, 운영 체제에서는 스레드가 존재하지 않는 것으로 처리한다.
- 유연성이 높아서 스레드를 생성하고 스케줄링하는 데 소요되는 오버헤드가 적다.
- 그러나, 사용자 수준에서 관리되기 때문에, 스레드의 입출력 작업 등이 블로킹되면 전체 프로세스가 멈출 수 있다.
그러나, 사용자 수준에서 관리되기 때문에, 스레드의 입출력 작업 등이 블로킹되면 전체 프로세스가 멈출 수 있다.

2. 커널 수준 스레드

- 운영 체제에서 관리되며, 각 스레드는 개별적인 PCB(Process Control Block)를 가지고 있다.
- 입출력 작업 등의 시스템 호출 시, 블로킹되더라도 다른 스레드가 계속 실행될 수 있다.
- 그러나, 스레드 생성 및 스케줄링에 대한 오버헤드가 커서, 스레드 생성 수의 제한이 있을 수 있다.

3. 하이브리드 스레드

- 사용자 수준 스레드와 커널 수준 스레드의 장점을 모두 결합한 것이다.
- 스레드 생성 시, 사용자 수준 스레드와 커널 수준 스레드 중 선택하여 생성할 수 있다.
- 사용자 수준 스레드처럼 유연하게 생성 및 스케줄링할 수 있으면서도, 입출력 작업 등의 블로킹 시 다른 스레드가 실행될 수 있어서, 높은 처리 성능을 보인다.

멀티스레드

멀티스레드란 운영체제가 소프트웨어적으로 프로세스를 작은 단위의 스레드로 분할하여 운영하는 기법

멀티태스킹과 멀티스레드의 차이

- fork( ) 시스템 호출로 여러 개의 프로세스를 만들면 필요 없는 정적 영역이 여러 개가 됨
- 멀티스레드는 코드, 파일 등의 자원을 공유함으로써 자원의 낭비를 막고 효율성 향상

멀티스레드의 장점

- 응답성 향상
- 자원 공유
- 효율성 향상
- 다중 CPU 지원

멀티스레드의 단점

- 모든 스레드가 자원을 함께 공휴하기에 한 스레드의 영향이 생기면 전체 스레드에 문제가 발생.
	+ ex) 인터넷 익스플로러

커널스레드와 사용자스레드

커널스레드

커널스레드란 커널이 직접 생성하고 관리하는 스레드다.

사용자 스레드

사용자스레드란 라이브러리에 의해 구현된 일반적인 스레드다.

프로세스의 구조


코드영역: 프로그램의 본체가 존재하는 곳
데이터 영역: 프로그램이 사용하려고 정의한 변수와 데이터가 있는 곳
스택 영역, 힙 영역: 프로세스가 실행되는 동안 만들어지는 영역으로, 그 크기가 늘어났다 줄어들기도 하는 동적 할당 영역

스택 영역

- 스레드가 작동하는 동안 추가되거나 삭제되는 동적 할당 영역
- 스레드가 진행됨에 따라 그의 따라 크기가 변하는 영역

예시

힙 영역

- 프로그램이 실행되는 동안 할당되는 변수 영역
- 포인터, malloc( ) 함수, calloc( ) 함수 등은 메모리를 효율적으로 사용하기 위해 만들어진 것으로 어쩌다 한 번 쓰는 큰 배열을 처음부터 선언하고 끝까지 놔두는 일이 없어야 함 
- 새로운 프로세스가 생성되면 malloc( ) 함수를 만들어 해당 큐에 사이 가능
profile
프론트엔드 개발자를 꿈꾸는 고등학생입니다⌨️💻

0개의 댓글