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

디벨로퍼's·2023년 12월 26일
0

운영체제

목록 보기
1/1

프로세스의 개요

운영체제에서 프로세스는 하나의 작업 단위이다. 사용자가 마우스를 더블클릭하여 프로그램을 실행하면 그 프로그램은 프로세스가 된다.

프로세스의 개념

폰 노이만 구조에서 프로그램이 실행된다는 것은 해당 코드가 메모리에 올라와서 작업이 진행된다는 의미이다. 프로그램은 저장장치에 저장되어 있는 정적인 상태, 프로세스는 실행을 위해 메모리에 올라온 동적인 상태.

현대의 운영체제는 시분할 방식을 기본으로 사용한다. 따라서 프로세스가 여러 상태를 오가며 실행된다.

프로그램에서 프로세스로의 전환

프로세스는 컴퓨터 시스템의 작업단위로 태스크(task) 라고 부른다.

우선 운영체제는 프로그램을 메모리의 적당한 위치로 가져온다. 동시에 프로세스 제어 블록(PCB)를 만든다. 프로세스 제어 블록에는 프로세스를 처리하는 데 필요한 다양한 정보가 들어 있다. 프로세스 제어 블록이 없으면 프로그램이 전환되지 못한다.

  • 프로세스 구분자 : 각 프로세스를 구분하는 구분자
  • 메모리 관련 정보 : 프로세스의 메모리 위치 정보가 담겨 있다. 또한 메모리 보호를 위한 경계 레지스터와 한계 레지스터도 포함되어 있다.
  • 각종 중간값 : 프로세스가 사용했던 중간값이 저장된다.

하나의 프로세스를 실행하려면 프로세스 구분자, 메모리 관련 정보, 프로그램 카운터와 각종 레지스터 같은 중간값을 관리해야 하며, 이러한 정보를 보관하는 데이터 구조가 데이터 블록이다.

프로그램이 프로세스가 된다는 것은 운영체제로 부터 프로세스 제어 블록을 얻는다는 뜻이고, 프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻이다.

프로세스 = 프로그램 + 프로세스 제어 블록 프로그램 = 프로세스 - 프로세스 제어 블록

프로세스의 상태

일괄 작업 시스템의 프로세스 상태는 생성, 실행, 완료이다. 시분할 시스템에서의 프로세스 상태는 일괄 작업 시스템보다 복잡하다. CPU를 얻어 실행중인 프로세스가 중간에 다른 프로세스에 CPU를 넘겨주는 일이 빈번하기 때문이다.

프로세스의 네가지 상태

  • 생성 상태 : 프로세스가 메모리에 올라와 실행 준비를 완료한 상태
  • 준비 상태 : 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
  • 실행 상태 : 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태
  • 완료 상태 : 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 완료 상태

준비 상태에 있는 여러 프로세스 중 다음에 실행할 프로세스를 선정하는 일은 CPU 스케줄러가 담당한다. 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업을 디스패치라고 한다. CPU 스케줄러는 프로세스의 전 상태, 즉 생성, 준비, 실행, 완료에 관하여 모든 프로세스의 작업이 원만하게 이루어 지도록 관리한다.

프로세스의 다섯가지 상태

입출력을 요구한 프로세스가 입출력이 완료될 때까지 기다리는 상태를 대기 상태라고 한다. 이는 작업 효율성을 높이기 위해 입출력을 요청한 프로세스를 실행 상태로 두지 않고 대기 상태로 옮기는 것.

대기 상태의 프로세스는 요청한 입출력이 완료되면 입출력 관리자로부터 인터럽트를 받는다. 대기 상태에서 입출력이 끝는 프로세스는 실행 상태로 가지 않고 준비 상태로 돌아가 자기 차례를 기다린다.

프로세스 제어 블록과 문맥 교환

프로세스 제어 블록

프로세스 제어 블록은 프로세스를 실행하는 데 필요한 중요한 정보를 보관하는 자료구조로 TCP라고도 한다.

  • 포인터
  • 프로세스 상태
  • 프로세스 구분자
  • 프로세스 우선순위
  • 각종레지스터 정보
  • 메모리 관리 정보
  • 할당된 자원 정보
  • 계정 정보
  • 부모 프로세스 구반자와 자식 프로세스 구분자

문맥교환

문맥 교환의 의미

문맥 교환은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업을 말한다. 이때 두 프로세스 제어 블록의 내용이 변경된다. 이와 같이 두 프로세스 제어 블록을 교환하는 작업이 문맥 교환이다.

문맥 교환의 절차

  1. 실행 상태에 있는 프로세스 P1이 자신에게 주어진 시간을 다 사용하여 타임아웃 되면 P1의 프로세스 제어 블록에 현재 까지의 작업결과가 저장되고 P1은 준비상태로 쫒겨난다
  2. 준비 상태에 있던 프로세스 P2가 실행 상태로 가면 CPU의 레지스터가 P2의 프로세스 제어 블록 값으로 채워져 다음 작업을 하게 된다.

프로세스의 연산

프로세스의 구조

프로세스는 코드 영역, 데이터 영역, 스택 영역으로 구성된다.

  • 코드영역 코드 영역은 프로그램의 본문이 기술된 곳으로 텍스트 영역이라 한다. 프로그래머가 작성한 프로그램은 코드영역에 탑재되며 탑재된 코드는 읽기 전용으로 처리된다
  • 데이터 영역 데이터 영역은 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳이다.
  • 스택 영역 스택 영역은 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다.

프로세스의 생성과 복사

fork() 시스템 호출의 개념

fork() 시스템 호출은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 커널에서 제공하는 이함 수는 프로세스를 복사하는 일종의 시스템 호출이다. 프로세스를 복사할 때 기존의 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 되며, 두 프로세스는 부모-자식 관계로 연결된다.

fork() 시스템 호출의 동작 과정

fork() 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다.

fork() 시스템 호출의 장점

  • 프로세스의 생성 속도가 빠르다
  • 추가 작업 없이 자원을 상속할 수 있다
  • 시스템 관리를 효율적으로 할 수 있다

프로세스의 전환

exec() 시스템 호출의 개념

기존의 프로세스를 새로운 프로세스로 전환하는 함수이다.

fork() : 새로운 프로세스를 복사하는 시스템 호출

exec() : 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출이다.

exec() 시스템 호출을 사용하는 목적은 프로세스의 구조체를 재활용하기 위함이다.

exec() 시스템 호출의 동작 과정

exec() 시스템 호출을 하면 코드 영역에 있는 기존의 내용을 지우고 새로운 코드로 바꿔버린다. 또한 데이터 영역이 새로운 변수로 채워지고 스택영역이 리셋된다. exec() 시스템 호출은 기존의 프로세스 구조를 그대로 둔 채 내용만 바꾸어 새로 실행하는 것이다.

스레드

스레드의 개념

스레드의 정의

프로세스는 요리 작업 전체와 같고, 스레드는 요리를 완성하기 위해 수행하는 각각의 조리에 해당하는 것이다. CPU 스케줄러가 CPU에 전달하는 일 하나가 스레드이다. 그러므로 CPU가 처리하는 작업의 단위는 프로세스로 부터 전달받은 스레드이다. 운영체제의 입장에서 작업 단위는 프로세스이고 CPU 입장에서의 작업단위는 스레드이다.

프로세스와 스레드의 차이

프로세스끼리는 약하게 연결되어 있는 반면 스레드끼리는 강하게 연결되어 있다.

스레드 관련 용어

  • 멀티스레드 프로세스 내 작업을 여러 개의 스레드로 분할함으로 써 작업의 부담을 줄이는 프로세스 운영기법
  • 멀티태스킹 운영체제가 CPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법이다. 스레드에 시간을 잘게 나누어주는 시스템을 시분할 시스템이라 한다.
  • 멀티프로세싱 CPU를 여러개 사용하여 여러개의 스레드를 동시에 처리하는 작업 환경을 말한다
  • CPU 멀티스레드 CPU 멀티스레드는 한 번에 하나씩 처리해야 하는 스레드를 파이프라인 기법을 이용하여 동시에 여러 스레드를 처리하도록 만든 병렬 기법이다.

멀티스레드의 구조와 예

멀티스레드의 구조

비슷한 일을 하는 2개의 프로세를 만드는 대신 코드, 데이터 등을 공유하면서 여러개의 일을 하나의 프로세스 내에서 하는 것이다. 정적인 영역은 프로세스가 실행되는 동안 바뀌지 않는 영역이고, 동적인 영역은 스레드가 작업을 하면서 값이 바뀌거나 새로 만들어지거나 사라지는 영역이다.

멀티스레드의 장단점

멀티스레드의 장점

프로세스 내 공유가 가능한 부분을 제외하고 실행과 관련된 부분을 스레드로 나누어 관리하면 자원의 중복 사용을 피함으로써 낭비를 막을 수 있다. 또한 하나의 프로세스에서 여러 스레드를 사용하면 작업의 효율을 높일 수 있다.

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

멀티스레드의 단점

멀티스레드의 경우 모든 스레드가 자원을 공유하기 때문에 한 스레드가 문제가 생기면 전체 프로세스에 영향을 미친다. 반면 프로세스를 여러개 만드는 방식의 경우 각 프로세스가 독립적이기 때문에 한 프로세스의 문제가 다른 프로세스로 전달 되지 않는다.

0개의 댓글