[운영체제] 2. 프로세스

H.J.SHIN·2024년 10월 19일
0

운영체제

목록 보기
2/8

프로세스


1. 프로세스 개요

1.1. 프로세스란

  • 프로세스: 실행 중인 프로그램, 디스크에서 메모리에 올라오는 단위

  • 프로그램은 실행되기 전까지는 보조기억장치에 있는 데이터 덩어리에 불과하지만, 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간부터 그 프로그램은 프로세스가 된다.

  • 프로세스는 사용자가 볼 수 있는 공간에서 실행되는 포그라운드 프로세스(foreground process)와 사용자가 보지 못하는 뒤편에서 실행되는 백그라운드 프로세스(background process)로 나뉜다.

  • 백그라운드 프로세스 중 사용자와 상호작용하지 않는 프로세스를 데몬(daemon)이라고 부른다.

  • 모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU 자원은 한정되어 있기 때문에 프로세스들은 차례대로 돌아가며 한정된 시간만큼만 CPU를 이용한다.

  • 프로세스는 자신의 차례가 되면 정해진 시간만큼 CPU를 점유하고, 시간이 끝났음을 알리는 타이머 인터럽트가 발생하면 자신의 차례를 앙보하고 다음 차례가 올 때까지 기다린다.

※타이머 인터럽트(타임아웃 인터럽트): 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트

1.2. 프로세스 제어 블록(Process Control Block)

  • 프로세스 제어 블록(PCB): 프로세스와 관련된 정보를 저장하는 자료구조로, 해당 프로세스를 식별하기 위해 필요한 정보들이 저장된다.

  • 운영체제는 프로세스들의 실행 순서를 관리하고, 프로세스에 자원을 배분할 때 PCB를 사용한다.

  • PCB 작업은 매우 빈번하게 발생하기 때문에 메모리에 저장한다.

  • PCB는 메모리의 커널 영역에 생성되어 운영체제로 하여금 프로세스를 식별하고, 처리하는데 필요한 정보를 제공한다.

  • PCB는 프로세스와 생명주기를 공유한다. 즉, 프로세스 생성 시에 만들어지고, 실행이 끝나면 폐기된다.

PCB에는 프로세스ID, 레지스터 값, 프로세스 상태, CPU스케줄링 정보, 메모리관리 정보, 사용한 파일과 입출력장치 목록에 대한 정보 등을 담고 있다.


1.2.1. 프로세스ID (PID)

  • 프로세스를 식별하기 위한 고유 번호
  • 같은 일을 수행하는 프로그램이라 할지라도 두번 실행되면 PID가 다른 두 프로세스가 생성된다.

1.2.2. 레지스터 값

  • 레지스터 값은 프로세스가 CPU에서 처리되던 시점의 레지스터 상태를 나타낸다.

  • 레지스터 값을 통해 CPU는 해당 프로세스가 중단되기 전까지 사용했던 레지스터의 상태를 복원하여 진행하던 작업을 이어서 실행할 수 있다.


1.2.3. 프로세스 상태

  • 현재 프로세스의 상태    ex) 생성, 준비, 실행, 대기, 종료 등
  • 운영체제가 프로세스 간에 문맥 교환을 수행할 때 활용

1.2.4. CPU 스케줄링 정보

  • 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보

  • 운영체제가 CPU 스케줄링을 할 때 참조

  • 프로세스 우선순위, CPU 점유 시간, 대기 시간 같은 정보들이 포함된다.


1.2.5. 메모리 관리 정보

  • 프로세스가 메모리에 저장된 주소를 알기 위한 페이지 테이블 정보

  • 베이스 레지스터, 한계 레지스터 값과 같은 정보도 담긴다.


1.2.6. 사용한 파일과 입출력 장치(I/O) 목록

  • 운영체제가 프로세스의 자원 관리프로세스 상태 복원을 위해 참조한다.

  • 프로세스가 실행 중에 파일을 열거나 입출력 장치를 사용하고 있었을 경우, 해당 정보를 참조하여 이전 상태를 정확히 복원한다.

  • 파일이나 입출력 장치 같은 공유 자원을 사용 중인지 알고 있어야 충돌을 방지할 수 있다.

  • 프로세스가 종료되었다면 파일이나 입출력 장치의 할당을 해제하여 메모리 누수자원 낭비를 막을 수 있다.



1.3. 문맥 교환 (Context Switch)

  • 문맥(Context): 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보 (PCB에 표현되어 있다)

  • 문맥 교환(Context Switch): 기존 프로세스의 문맥을 백업하고, 새로운 프로세스를 실행하기 위해 문맥PCB로부터 복구하여 새로운 프로세스를 실행하는 것

  • 문맥 교환이 자주 일어나면서 프로세스가 빠르게 번갈아가며 수행되기 때문에 프로세스들이 동시에 실행된는 것처럼 느껴진다.

주의) 문맥교환이 너무 자주 일어나면 오버헤드가 발생할 수도 있음



1.4. 프로세스의 메모리 영역

  • 프로세스가 생성되면 메모리의 커널 영역에 PCB가 저장되고, 사용자 영역에 프로세스가 배치된다.

  • 사용자 영역에 배치된 프로세스의 메모리 영역은 정적 할당 영역동적 할당 영역으로 나뉜다.

  • 정적 할당 영역: 크기가 고정된 영역 - 코드 영역, 데이터 영역

  • 동적 할당 영역: 크기가 변할 수 있는 영역 - 힙 영역, 스택 영역


1.4.1. 코드 영역 (code segment) - 정적 할당 영역

  • 텍스트 영역이라고도 부른다.

  • 실행할 수 있는 코드, 즉 기계어가 저장된다.

  • CPU가 실행할 명령어가 담겨 있기 때문에 쓰기가 금지되어 있다.(read-only)


1.4.2. 데이터 영역 (data segment) - 정적 할당 영역

  • 프로그램이 실행되는 동안 유지할 데이터가 저장된다. 대표적으로 전역 변수(global variable)

1.4.3. 힙 영역 (heap segment) - 동적 할당 영역

  • 프로그래머가 직접 할당할 수 있는 저장 공간

  • 힙 영역에 할당한 메모리는 언젠가는 반환해야 한다. 그렇지 않으면 할당한 공간이 메모리 내에 계속 남아 메모리 누수가 발생한다.

  • 대표적으로 동적 배열, 클래스, 연결 리스트, 문자열 등


1.4.4. 스택 영역 (stack segment) - 동적 할당 영역

  • 데이터를 일시적으로 저장하는 공간

  • 데이터 영역에 담기는 값과는 달리 잠깐 쓰다가 말 값들이 저장된다. ex) 함수가 종료되면 pop

  • 대표적으로 매개 변수, 지역 변수



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

2.1. 프로세스 상태

운영체제는 여러 프로세스를 빠르게 번갈아 가며 실행시킨다. 그 과정에서 하나의 프로세스는 여러 상태를 거치며 실행된다.

프로세스 상태 다이어그램


2.1.1. 생성 상태 (new)

  • 프로세스를 생성 중인 상태
  • 이제 막 메모리에 적재되어 PCB를 할당받은 상태이다.
  • 생성 상태의 프로세스는 준비 상태가 되어 CPU 할당을 기다린다.

2.1.2. 준비 상태 (ready)

  • CPU를 할당받기를 기다리는 상태
  • 준비상태의 프로세스는 자신의 차례가 되면 CPU를 할당받아 실행 상태가 된다.

2.1.3. 실행 상태 (running)

  • CPU를 할당받아 실행 중인 상태
  • 실행 상태인 프로세스는 할당된 일정 시간동안만 CPU를 사용할 수 있다.
  • 할당된 시간을 모두 사용하면(타이머 인터럽트 발생 시) 다시 준비 상태가 된다.
  • 만약 실행 도중 입출력장치(I/O)를 사용하여 입출력 작업이 끝날 때까지 기다려야 한다면 대기 상태가 된다.

2.1.4. 대기 상태 (wait or blocked)

  • 입출력장치(I/O)는 CPU에 비해 처리 속도가 느리기 때문에 입출력 작업이 끝날 때(입출력 완료 인터럽트 발생 시)까지 기다린다.
  • 입출력 작업이 완료되면 해당 프로세스는 준비 상태가 되어 다시 CPU 할당을 기다린다.
  • 입출력 작업 뿐만 아니라 특정 이벤트가 발생하기를 기다리는 상황에서 프로세스는 대기 상태가 된다.

2.1.5. 종료 상태 (exit)

  • 프로세스가 종료된 상태
  • 프로세스 종료 시 운영체제는 PCB프로세스가 사용한 메모리를 정리한다.



2.2. 프로세스 계층 구조

  • 프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있다.
  • 이때 새 프로세스를 생성한 프로세스를 부모 프로세스, 생성된 프로세스를 자식 프로세스라고 한다.
  • 부모 프로세스자식 프로세스는 엄연히 다른 프로세스이기 때문에 각기 다른 PID를 갖는다.
  • 자식 프로세스PCB에는 부모 프로세스의 PIDPPID로 기록된다.
  • 이렇게 프로세스가 프레세스를 낳으면서 트리구조를 갖게되는데, 이를 프로세스 계층 구조라고 한다.



2.3. 프로세스 생성 기법

2.3.1. fork()

  • 자신의 복사본을 자식 프로세스로 생성하는 시스템 호출
  • fork()를 통해 생성된 복사본은 부모 프로세스의 메모리 내용, 열린 파일 목록 등을 상속받는다.
  • 이때 복사된 자식 프로세스라고 할지라도 PID나 저장된 메모리 주소는 다르다.

2.3.2. exec()

  • 자신의 메모리 공간에 새로운 프로그램으로 덮어쓰는 시스템 호출
  • exec()를 통해 새로운 프로그램으로 전환된다.
  • exec()를 호출하면 코드 영역데이터 영역의 내용이 새로운 프로그램의 내용으로 바뀌고, 나머지는 초기화된다.

0개의 댓글