본문 바로가기
CS/컴퓨터구조와운영체제

컴퓨터구조 + 운영체제_프로세스_01

by cariño 2023. 8. 12.
728x90
반응형

'실행 중인 프로그램' = 프로세스

프로그램이 실행되기 전까지는 그저 보조기억장치에 있는 데이터 덩어리 일뿐

보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간 해당 프로그램은 프로세스가 된다. 

그리고 이러한 과정을 프로세스를 생성한다 라고 표현한다. 

 

사용자가 보는 앞에서 실행되는 프로세스는 포그라운드 프로세스(웹브라우저, 워드프로세스, 메모장, 게임 등),

사용자가 보지 못하는 뒤에서 실행되는 프로세스는 백그라운드 프로세스라고 한다.

  • 사용자가 직접 상호작용이 가능한 백그라운드 프로세스
  • 사용자와 상호작용하지 않고 정해지 일만 수행하는 프로세스 (데몬, 서비스 등)

 

 

그렇다면 이러한 프로세스를 운영체제가 어떤식으로 관리하는 것일까?

 

 

 

[프로세스 제어 블록] -  PCB(Process Control Block)

모든 프로세스는 CPU가 필요 하지만 CPU의 자원은 한정되어 있다. 

모든 프로세스가 CPU를 동시에 사용할 수 없고 한정된 시간동안 프로세스는 차례대로 돌아가면서 CPU를 이용한다. 시간이 끝나면 타이머 인터럽트( 클럭 신호를 발생시키는 장치) 가 발생하고 자신의 차례를 양보하며  다음 차례의 프로세스가 CPU를 이용한다.  이렇게 프로세스에 CPU를 비롯한 자원을 배분하고 이를 위해서 운영체제는 프로세스 블록을 이용한다. 

 

  • pcb는 빠르게 번갈아 수행되는 프로세스들을 관리해야 한다. 이를 위해서 사용하는 자료구조(자료를 저장하는 하나의 형태라고 보면 됨) 가 프로세스 제어블록을 이용한다. 예를들어 프로세스 관련 정보를 부착해놓은 태그라고 생각하자. 
    • PCB는 프로세스 관련 정보를 저장하는 자료 구조로 마치 상품에 달린 태그와 같은 정보
    • 프로세스 생성 시 커널영 역에 생성, 종료시 폐기됨 (상품을 사용하면 태그를 잘라냄)

 

[PCB에 담기는 대표적인 정보]

* 운영체제마다 차이가 잇음

  • 프로세스ID: 특정 프로세스를 식별하기 위해 부여하는 고유한 번호 (회사 사번)
  • 레지스터 값: 모든 프로세스는 실행을 위해 CPU를 필요하고 CPU의 자원은 한정되어 있다. CPU안에 있는 여러가지 레지스터를 이용하는데  다시 자기 차례가 왔을 때 프로그램을 제개할 수가 있게 된다.  프로세스 1번이 실행이 끝난 후 프로그램 카운터 값을 잊어버리게 된다면 다음번에 사용할 메모리 주소를 모르게 된다. PCB는 이전까지 사용했던 레지스터 중간 값을 모두 복원해서 실행을 재게한다. 
  • 프로세스 상태 : 입출력 장치를 사용하기 위해 기다리는 상태 (생성, 대기, 준비, 실행 등) 프로세스 마다 상태값이 PCB에 담긴다. 
  • CPU 스케줄링 정보: 프로세스가 언제 어떤 순서로 CPU를 할당받아지에 대한 정보이다. 
  • 메모리 정보: 프로세스가 어느주소에 저장되어 있는지에 대한 정보이다. 페이지 테이블 정보 (메모리 주소를 알 수 있는 정보가 담기는 정보' 정도로 이해하고 넘어)
  • 사용한 파일과 입출력 장치 정보: 할당된 입출력장치, 사용 중인(열린) 파일 정보  /만약 프로세스가 실행과정에서 입출력장치나 파일을 사용했다면 (= 입출력장치가 어떠한 프로세스에게 할당됐는지) PCB에 해당 정보가 기록된다. 

 


 

CPU라는 자원은 한정되어 있지만, 모든 프로세스는 CPU를 원하고 있다. 그렇기 때문에 프로세스들은 CPU를 돌아가면서 사용하게 된다. 실질적으로 어떻게 이루어질까?

 

 

문맥교환 (Context switch) 

작업관리자에는 여러가지 프로세스 들이 동시에 실행 중이다. 여러 프로세스들이 끊임없이 빠르게 번갈아 가면서 실행되는 원리이다. 

기존에 실행 중인 프로세스 문맥을 백업해놓고 새로운 프로세스 실행을 위해서 문맥을 복구하는 과정을 문맥 교환이라고 한다. 그렇게 되면 자연스럽게 실행 중인 프로세스가 바뀌게 된다.

문맥에는 사용했던 레지스터들도 담기게 된다.

 

PCB는 커널 영역에 적재되어 . 특정 프로세스에 있는 태그와 같은 자료구조이다.

그렇다면 프로세스가 사용자 영역에는 어떻게 저장되는 것일까? 사용자 영역에 프로세스 특정 영역에 나눠서 저장이 된다. 

 

 

프로세스 메모리 교환 (Context switch) 

코드 영역(=텍스트 영역) 

  • 실행할 수 있는 코드, 기계어로 이루어진 명령어를 저장
  • 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역(read-only)

말그대로 코드(데이터와 명령어)가 이루어 짐

 

 

데이터영역 :

  • 프로그램이 실행되는 동안 유지할 데이터 저장하는 공간으로 대표적으로 전역변수가 있다.

전역변수( global variable)는  프로그램 전체 영역에서 사용할 수 있는 변수이다. 

코드영역과 데이터영역은 크기가 고정되어 있다. 정적 할당 영역 이라고 표현한다. 

 

 

힙 영역: 

  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간.
  • 프로그래밍을 하는 과정에서 힙 영역에 할당한 영역을 반환해야 한다. 

힙 영역, 메모리 공간에 할당을 했다면 힙 영역의 메모리 공간을 비워주는 작업도 해야한다. 

최근의 프로그래밍은 알아서 반환해주는 경우도 많다. = 가비지 컬렉션(garbage collection)

가비지 컬렉션을 해주지 않았다면 메모리 낭비를 초래한다. = 메모리 누수(memory leak) 

 

 

스택 영역

데이터가 일시적으로 저장되는 공간

  • 데이터 영역에는 프로그램이 실행되는 동안 계속 유지 되는 반면에 스택 영역은 잠시 사용하고 마는 값들이 저장되는 공간이다. 대표적으로 매개변수, 지역변수 등이 있다. 

사용자가 언제 메모리공간을 할당할 지 모른다. 그래서 힙 영역과 스택영역은 프로그램이 실행되는 과정에서 동적으로 크기가 변할 수 있다. 다른 말로 동적할당영역이라 표현한다. 

일반적으로 힙 영역은 낮은 주소 -> 높은 주소로 할당되는데 스택 영역은 높은 주소 -> 낮은 주소로 할당된다. 

만약 메모리영역이 서로 붙어있다면 메모리는 커질 수 있는 공간이 한계가 있기에 충돌될 수 있는 가능성이 높아진다. 

그러기에 힙 영역과 스택영역은 서로 반대되는 영역으로 차오르게 된다. (서로 겹칠일이 잘 없음)

 

 

 

 

728x90

댓글