4.프로세스

김현우·2024년 5월 2일
0

운영체제

목록 보기
4/10
post-thumbnail

💻 프로세스란?

- 수행중인 프로그램
- 컴퓨터 상에 수행 중인 프로그램의 인스턴스
- 프로세서에 할당되어 수행될수 있는 개체

등으로 정의할수있다.

📔 PCB(프로세스 제어 블록)

모든 프로세스가 프로세서를 필요로 하지만 프로세서 자원은 한정되어있다.
프로세스는 돌아가며 한정된 시간만큼 프로세서를 사용한다.
OS는 빠르게 번갈아 수행되는 프로세스의 실행순서 관리, 자원분배를 하는데.
이를 위해 PCB를 사용한다.

PCB는 프로세스와 관련된 다양한 정보들이 들어있다.

1.식별자(PID)
2.상태
3.우선순위
4.PC
5.문맥 데이터 - 수행중일때 프로세서의 레지스터에 존재하는 데이터
6.입출력 상태 정보 - 미해결 입출력 요청, 프로세스에 할당된 I/O모듈등의 정보
7.메모리 관리 정보

등등 다양한 값을 가지고 있으며 "커널영역"에 생성된다.

문맥교환

한 프로세스에서 다른 프로세스로 스위칭이 발생하는 경우 문맥이 교환된다.
PCB에 저장되는 정보들을 문맥이라 한다.

시간이 다되거나 예기치 못한 인터럽트 등의 상황으로 인해 프로세스를 교체해야한다면

1. 현재 문맥 저장
2. 다음에 실행할 문맥 복구

를 통해 프로세스를 교체한다.

이처럼 기존 프로세스의 문맥을 PCB에 저장하고
다음에 실행할 프로세스의 PCB를 복구하는 작업을 문맥교환이라 한다.

프로세스의 메모리 영역

PCB는 커널영역에 저장된다.
그렇다면 사용자 영역에는 어떤것들이 저장될까?

사용자 영역에는 크게 4가지가 존재한다.

- 코드 : 기계어로 쓰인 명령어 저장, 읽기전용
- 데이터 : 프로그램이 실행되는 동안 유지되며 프로그램 전체에서 접근가능한 변수들이 저장(전역변수)
- 힙 : 사용자가 직접 할당 가능한 저장공간, 할당후 반환을 해줘야하는데 이때문에 누수문제가 발생 
- 스택 : 로컬 변수들이 저장되는 공간이다. 매개변수, 지역변수등이 포함되며
        차곡 차곡 쌓이기에 스택이다.

프로세스 상태

보류 상태가 없는 5-상태 모델과 보류상태를 포함한 7-상태 모델을 알아보자

5-상태 모델

- New : 지금 막 생성이 되었지만 아직 ready 상태로 허가가 나지 않은 프로세스

- Ready : 디스패처가 디스패치를 한다면 수행가능한 프로세스들

- Running : 수행중인 프로세스

- Blocked : 입출력 연산 완료 등과 같은 특정 이벤트 발생전까지 수행될수 없는 프로세스(waiting 이라고도 함)

- Exit : 모종의 이류로 중단 되거나 프로세스 수행이 중지되어 OS에 의해 프로세스 풀에서 방출된 프로세스

위의 상태는 각각의 Queue를 가지고있다.

- 디스패처 : Ready Queue에서 실행할 프로세스를 하나 선택후 
            Running Queue로 넣어버리는 (실행시키는) 프로그램

***
1. 각 Queue들은 메모리 내에 저장된다. 이 Queue에는 각 프로세스의 포인터가 저장되어있다.
2. Blocked -> Running 으로의 전이는 불가하다.

Blocked Queue를 통째로 모아두는 것보다는 위와 같이 각 이벤트별로 분류하여 모아두는 것이 효율적이다.

Swapping의 필요성

7-상태 모델을 알아보기전 공부해야할 것이 있다.
바로 보류 상태이다. 가상메모리를 사용치 않는 시스템이 있다고 하자.
그렇다면 수행될 프로세스들은 "메인 메모리"에 완전히 적재되어야한다.
즉, 위에 있는 사진의 모든 프로세스가 "메인 메모리"에 적재되어야한다.

하지만, I/O 모듈의 연산은 프로세서의 처리속도에 비해 매우 느리기 때문에
Ready Queue가 비어버리고 Blocked Queue들은 새로는 Ready Queue들을 내보내지 못하는 상황이 발생한다.

이를 어떻게 해결해야하는가???
이에 대한 대답이 Swapping이다.

Swapping

프로세서와 I/O 작업의 처리속도 차이로 인해서 Ready Queue가 모두 비어버린다면
우리는 새로운 프로세스를 가져와야한다.

이를 위해 현재 메모리의 공간을 비워줘야하는데 Swapping을 사용하여 비워준다.
Swapping은 현재 Blocked Queue에 존재하는 프로세스를 하드디스크의 Swapping area에 넣고
Suspended Queue에 넣어준다.(Queue에는 포인터 area에는 진짜로 프로세스를)
Swapping area에 존재하는 또는 새로운 프로세스 요청을 받아들인후 작업을 시작한다.

이때 Swapping 작업 또한 I/O 작업이라 오히려 문제가 해결이 안될수도 있으나
디스크 입출력의 경우 시스템에서 가장빠른 I/O 작업이기에 일반적으로는 성능이 향상된다.

7-상태 모델

그렇다면 5-상태 모델에서 Suspended 상태가 추가 되어야 할것이다.
이때 Suspended에는 2가지 상태(ready,blocked)가 존재하기에 7상태가 된다.

5-상태 모델에서 2가지가 추가된것으로
Blocked/suspend와 Ready/suspend가 추가되었다.

중요한것은 Blocked와 Blocked/suspend, Ready/suspend가 교환된다는 것이다.
이때 Blocked/suspend를 Blocked로 가져오는이유가 궁금할수 있다.
이는 현재 Ready/suspend에 있는 어떤 프로세스보다 우선순위가 빠르며
이벤트가 곧 발생될것 같은 경우에는 Blocked/suspend Queue에서 가져온다.

***
1. Queue들은 모두 메모리 내에 존재한다.
2. Swapped Out이 된다면 물리적으로 메모리 -> 하드디스크로 이동된다.
***


<보류상태의 특성>

1. 즉시 수행될수 없다. 반드시 메모리 내로 돌아온후 실행이 가능하다.
2. Blocked/Suspend의 경우 이벤트가 발생하더라도 Swapped Out이 된 상태라면 수행될수가 없다.
3. 특정 이유로 프로세스의 수행을 막기위해 보류 상태로 만들었다.
4. 명시적인 해제 명력 전까지 보류상태에서 벗어날수 없다.

프로세스 Description

"OS가 프로세스들을 제어하고, 할당될 자원 관리를 위해 필요한 정보는 무엇인가?"

운영체제 제어구조

OS가 자원을 관리하기 위해서는 프로세스와 자원에 대한 정보가 필요하다.
보통 이를 테이블로 구성해서 관리한다.

<테이블로 관리되는 자원>

1. 메모리 테이블
	- 메인메모리와 보조기억장치,가상 메모리를 어떻게 잘라서 할당할지에 대한 이야기
2. 입출력 테이블
	- 어떤 입출력 장치가 사용가능한지, 어떤 프로세스에 할당되어있는지에 대한 이야기
3. 파일 테이블
	- 파일의 존재여부와 저장된 위치등에 대한 이야기
4. 프로세스 테이블
	- 제일 중요, 프로세스 관리를 위한 이야기

프로세스 제어구조

프로세스를 관리,제어하기 위해 알아야할 정보들
프로세스 위치
프로세스는 최소한 수행될 하나 이상의 프로그램 집합을 가지고 있어야 하며
그 포르그램에 대한 전역 및 지역 변수 등에 대한 데이터 위츠들의 집합으로 구성되어야 한다.

프로세스는 프로그램과 데이터가 저장될 충분한 메모리 공간이 필요하다.
또한 실행중 프로시저들 간에 전달되는 매개변수 등을 위한 스택(시스템 스택)
프로세스를 제어하기 위한 속성들의 집합(PCB)가 필요하다

위에서 언급된 프로그램,데이터,스택,속성 들의 집합을 프로세스 이미지 라고 한다.

이 프로세스 이미지는 보조 기억장치에 저장되어 있으며 
그 일부분만 가상메모리 또는 메인 메모리에 저장되에 포인터로 전체를 가르킨다.
PCB
프로세스의 주요한 속성은 다음과 같다.

- 프로세스 식별
- 프로세서 상태정보
- 프로세스 제어정보

<식별자>
- 말 그대로 프로세스를 구분하기 위한 것이다. 

<프로세서 상태정보>
- 프로세스가 수행되는 동안에는 그 정보들이 레지스터에 존재한다.
- 따라서 프로세스가 중단된다면 그때의 레지스터 값들이 저장되어야하는데 이를 저장하는 영역이다.


<프로세스 제어정보>
- 스케줄링, 우선순위, 이벤트, 프로세스 상태 등과 같이 프로세스를 제어하기 위한 정보들을 다룬다.

<PCB의 역할>
- 운영체제에서 가장중요한 자료구조로 OS의 상태를 정의한다고 할수있다.
- OS내의 다양한 루틴들은 PCB에 있는 정보들에 접근해야 하는데 
  이때 PCB의 정보들을 보호하기 위해서 핸들러 루틴을 통하도록 요구한다.
  
  
  
***
프로세스 이미지의 정보들은 이전에 실행했던 프로세스의 상태를 저장한것  
프로세스를 레디큐로 끌고와서 실행할때 이전의 정보들을 로드해야하는데
이때 사용할것이 프로세스 이미지
***

사용자 메모리 공간

앞서 잠깐 언급한 사용자 영역을 자세히 얘기해보자
코드, 데이터, 힙, 스택 으로 구성된 사용자 메모리 공간에 대해서 알아보자

프로세스의 메모리는 2개로 나뉜다.

1. 커널 영역 

- 운영체제의 핵심 코드와 데이터가 저장된다.
- 커널 모드에서 실행되며, 
  일반적인 어플리케이션은 직접 접근이 불가하고 시스템 콜을 통해 커널 제공서비스를 이용가능하다.
  
2. 유저 영역

- 어플리케이션의 코드와 데이터가 저장된다.
- 코드,데이터,힙,스택으로 나뉘어진다.

프로세스가 실행될때 OS는 메모리를 잘라 프로세스에게 할당한다.
할당 된 메모리는 4개로 나뉜다.

- 코드 : 프로그램의 코드를 저장하는 공간, CPU는 코드영역에서 명령어를 한줄씩 가져간다.
- 데이터 : 전역,static 변수 저장되는 공간, 프로그램 시작시에 생성되어 프로그램 종료시 소멸된다.
- 힙 : 사용자가 직접 할당해 사용하는 영역, FIFO 구조이며 낮은주소에서 높은주소로 쌓인다.
- 스택 : 프로그램이 자동으로 저장하는 지역변수 영역, LIFO 구조를 가지고 있으며 높은주소에서 낮은주소로 쌓인다.

***
힙과 스택은 같은 공간을 공유한다.
힙이 증가한 만큼 스택이 감소하고 스택이 증가한 만큼 힙이 감소하는 구조

그렇기에 힙은 낮은주소->높은주소로 쌓이며
스택은 반대로 저장되어 공간을 낭비없이 쓰게 해준다.

Q)왜 스택이 주소가 높은주소->낮은주소로 만들어 놨을까??
  하나하나 쌓이는 구조라면 낮은주소->높은주소로 만드는것이 더욱 쉽게 기억할수 있을텐데?
  
A)두가지 이유가 있다고 한다.

1. 그림에는 안나와 있지만 주소가 높아지다가 스택 윗부분(스택보다 윗주소)은 커널영역으로 구성되어 있다.
   그렇기에 스택을 높은주소->낮은주소로 저장하여 커널영역을 건들이지 못하게 만든다.
   
2. 힙영역은 할당될때 낮은주소->높은주소로 할당된다. 따라서 스택을 반대로 만들어 공간을 알뜰살뜰 쓰게한다.

내 생각에는 사실 그냥 힙을 높->낮으로 하고 스택을 반대로 해도 됬을거 같다.
그냥 첨에 그렇게 만들었어서 하는듯
***
<요약>
OS는 프로세스를 실행할때 메모리를 할당하고 다시 반환받고를 반복한다.
이때 프로세스 이미지 내의 정보를 통해 얼마만큼 할당하고 나눌지, 이전의 값은 뭐였는지 등을 복구한다.


PCB는 보조기억장치에서 넘어와 프로세스가 될때 만들어져 커널 영역에 저장된다.
프로세스 이미지는 보조 기억 장치에 저장되어있으면 프로세스가 만들어질때
사용자영역을 로드한다.

계속 헷갈렸던 부분이 그렇다면 PCB는 보조기억장치에서는 어디에 저장되는가 였는데
PCB자체가 프로세스가 만들어지지않으면 없다.

하지만 swap out이 되어 보조기억장치에 저장되어 있는 프로세스는 PCB를 가지고 있다.

Q) 보류 상태가 되었더라도 계속 프로세스 상태를 유지하는 이유는?
A) 보류 상태의 프로세스는 다시 사용될 가능성이 높다. 
   따라서 프로세스 상태를 유지하여 사용하는것이 해제했다가 다시 할당하는 것 보다 효율적
profile
학생

0개의 댓글