[운영체제] 프로세스

승민·2022년 4월 19일
0

OS

목록 보기
2/7

📝 프로세스란?

운영체제는 커널과 인터페이스로 구성되어 있고 커널은 프로세스 관리와 같은 운영체제의 핵심적인 기능을 담당한다고 했었다. 그렇다면 프로세스는 뭘까?

프로세스란 프로그램이 실행을 위해 메모리에 올라온 동적인 상태이다. OS관점에서의 프로세스는 하나의 작업 단위이다. 프로그램이 프로세스가 된다는 것은 운영체제로부터 프로세스 제어 블록(PCB)를 얻는다는 뜻이고 프로세스가 종료된다는 것은 해당 프로세스 제어 블록이 폐기된다는 뜻이다.

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

프로세스 제어 블록..? 뭔가 중요해 보이는데 그건 뭐지?

🤔 프로세스 제어 블록(Process Control Block, PCB)

프로세스 제어 블록은 운영체제가 해당 프로세스를 위해 관리하는 자료 구조이다. 각 프로세스는 고유의 프로세스 제어 블록을 가지며 다음과 같이 구성 되어 있다.

이미지 출처 : https://math-coding.tistory.com/99

  • 포인터 : 준비 상태나 대기 상태의 큐를 구현할 때 사용
  • 프로세스 상태 : 프로세스가 현재 어떤 상태에 있는지를 나타내는 정보
  • 프로세스 구분자 : 운영체제 내에 있는 여러 프로세스를 구현하기 위한 구분자 -> Process Identification, PID라고 한다.
  • 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 프로그램 카운터의 값
  • 프로세스 우선순위 : 프로세스의 실행 순서를 결정하는 우선순위
  • 각종 레지스터 정보 : 프로세스가 실행되는 중에 사용하던 레지스터의 값
  • 메모리 관리 정보 : 프로세스가 메모리의 어디에 있는지 나타내는 메모리 위치 정보, 메모리 보호를 위해 사용하는 경계 레지스터 값과 한계 레지스터 값 등
  • 할당된 자원 정보 : 프로세스를 실행하기 위해 사용하는 입출력 자원이나 오픈 파일 등에 대한 정보
  • 계정 정보 : 계정 번호, CPU 할당 시간, CPU 사용 시간 등
  • 부모 프로세스 구분자와 자식 프로세스 구분자 : 부모 프로세스를 가리키는 PPID와 자식 프로세스를 가리키는 CPID 정보

뭔가 굉장히 복잡해 보이지만 일단 프로세스에 관련된 정보를 가지는 자료 구조라고 이해해보자! 그렇다면 프로세스와 PCB는 어떠한 상태로 존재하고 운영체제가 관리할까?

💻 프로세스의 상태

기본적으로 프로세스는 네 가지 상태로 존재하지만 운영체제가 발전함에 따라 한 가지 상태를 추가하여 다섯 가지 상태로 존재하는 경우가 많다. 네 가지 상태부터 살펴보자.

이미지 출처 : https://cch5980.github.io/process/2020/11/12/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%81%ED%83%9C.html
만든 사람 : cch

  • 생성 상태 : 프로세스가 메모리에 올라와 실행 준비를 완료한 상태(PCB 생성)
  • 준비 상태 : 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태
  • 실행 상태 : 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 실제 작업을 수행하는 상태
  • 완료 상태 : 실행 상태의 프로세스가 주어진 시간 동안 작업을 마치면 진입하는 상태(PCB 폐기)
  • 디스패치 : 준비 상태의 프로세스 중 하나를 골라 실행 상태로 바꾸는 CPU 스케줄러의 작업
  • 타임아웃 : 프로세스가 자신에게 주어진 하나의 타임 슬라이스 동안 작업을 끝내지 못하면 다시 준비 상태로 돌아가는 것

다음은 다섯 가지 상태를 알아보자.

이미지 출처 : https://cch5980.github.io/process/2020/11/12/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%EC%83%81%ED%83%9C.html
만든 사람 : cch

  • 생성 상태 : 프로그램이 메모리에 올라오고 운영체제로부터 프로세스 제어 블록을 할당받은 상태, 생성된 프로세스는 바로 실행되는 것이 아니라 준비 상태에서 자기 순서를 기다리며, 프로세스 제어 블록도 같이 준비 상태로 옮겨짐
  • 준비 상태 : 실행 대기 중인 모든 프로세스가 자기 순서를 기다리는 상태, 프로세스 제어 블록은 준비 큐에서 기다리며 CPU 스커줄러에 의해 관리. CPU 스케줄러가 어떤 프로세스 제어 블록을 선택하는 작업이 dispatch(PID)이고 dispatch(PID)를 실행하면 해당 프로세스가 준비 상태에서 실행 상태로 바뀌어 작업이 이루어짐
  • 실행 상태 : 프로세스가 CPU를 할당받아 실행되는 상태, 실행 상태에 있는 프로세스는 타임 슬라이스 동안만 작업할 수 있음. 시간이 끝나면 timeout(PID)가 실행되어 실행 상태에서 준비 상태로 옮겨짐. 실행 상태 동안 작업이 완료되면 exit(PID)가 실행되어 프로세스가 정상 종료됨. 실행 상태에 있는 프로세스가 입출력을 요청하면 CPU는 입출력 관리자에게 입출력을 요청하고 block(PID)를 실행. block(PID)는 입출력이 완료될 때까지 작업을 진행할 수 없기 때문에 해당 프로세스를 대기 상태로 옮기고 CPU 스케줄러는 새로운 프로세스를 실행 상태로 가져옴
  • 대기 상태 : 실행 상태에 있는 프로세스가 입출력을 요청하면 입출력이 완료될 때까지 기다리는 상태. 대기 상태의 프로세스는 입출력 장치별로 마련된 큐에서 기다리다가 입출력이 완료되면 인터럽트가 발생하고 대기 상태에 있는 여러 프로세스 중 해당 인터럽트로 깨어날 프로세스를 찾는데 이것이 wakeup(PID)이고 wakeup(PID)로 해당 프로세스의 프로세스 제어 블록이 준비 상태로 이동함
  • 완료 상태 : 프로세스가 종료되는 상태로 코드와 사용했던 데이터를 메모리에서 삭제하고 프로세스 제어 블록을 폐기함. 정상적인 종료는 exit(PID)로 처리

문맥 교환이란 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 작업으로 실행 상태에서 나가는 프로세스 제어 블록에는 지금까지의 작업 내용을 저장하고 반대로 실행 상태로 들어오는 프로세스 제어 블록의 내용으로 CPU가 다시 세팅 된다. 두 프로세스의 PCB를 교환하는 작업이다. 인터럽트나 타임 아웃이 발생하면 일어난다.

💻 프로세스의 구조


이미지 출처 : https://zeichi.tistory.com/27

  • 코드 영역 : 프로그램의 본문이 기술된 곳으로 프로그래머가 작성한 코드가 탑재되며 탑재된 코드는 읽기 전용으로 처리된다.
  • 데이터 영역 : 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳으로 데이터는 변하는 값이기 때문에 이곳의 내용은 기본적으로 읽기와 쓰기가 가능하다.
  • 스택 영역 : 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳으로 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장한다. 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.

💻 프로세스의 복사

프로세스는 fork()라는 함수의 호출에 의해 복사된다. fork()가 무슨 함수인지 자세히 알아보자!

fork()는 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수이다. 이 때 실행하던 프로세스는 부모 프로세스, 새로 생긴 프로세스는 자식 프로세스로서 부모-자식 관계가 된다. 단 프로세스 제어 블록의 내용 중 프로세스 구분자, 메모리 관련 정보, 부모 프로세스 구분자와 자식 프로세스 구분자의 내용은 변경된다.

fork() 시스템 호출의 장점은 프로세스 생성 속도가 빠르고 추가 작업 없이 자원을 상속할 수 있으며 시스템 관리를 효율적으로 할 수 있다.

profile
안녕하세요 승민입니다

0개의 댓글