[운영체제] 프로세스

Local Gaji·2023년 6월 17일
0

운영체제

목록 보기
2/15

보조기억장치에 있는 프로그램 데이터를 메모리에 적재하고 실행하면 프로세스가 된다


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

CPU는 이 프로세스를 잠깐 실행했다가 저 프로세스를 잠깐 실행했다가 돌아가면서 실행하는데, 그럼 프로세스 구분은 어떻게 할것이며,,, 그 프로세스에 지금까지 뭐를 했는지는 어떻게 알것이며,,, 프로세스마다 알아야 하는 정보들이 있는데 얘네를 프로세스 제어 블록 이라는거에 저장한다.

  • 프로세스와 관련된 정보를 저장하는 자료 구조
  • 커널 영역에 저장된다.
  • 번갈아 수행되는 프로세스의 실행순서를 관리하고 자원을 배부하기 위해 이용한다.
  • 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.
  • 각 프로세스마다 해당 프로세스의 정보를 담고 있는 프로세스 제어 블록이 있다.

🔰 PCB가 포함하고 있는 식별 정보

이름설명
프로세스 ID (PID)특정 프로세스를 식별하기 위해 부여하는 고유번호
레지스터 값프로그램 카운터 등 사용했던 레지스터들의 값을 백업
프로세스 상태어떤 자원을 사용하기 위해 기다리고 있는지, 어떤 자원을 이용하고 있는지 등
CPU 스케줄링 정보언제 어떤 순서로 CPU를 할당 받을지 기록
메모리 관리 정보해당 프로세스가 저장된 주소 (베이스 레지스터, 한계 레지스터, 페이지 테이블 등)
사용한 파일과 입출럭장치 목록



🎈 문맥 교환

기존 프로세스 문맥을 백업하고 새로운 프로세스 문맥을 복구하는 것

CPU가 이 프로세스를 실행하다가 시간이 다돼서 저 프로세스를 실행하려고 가버리면? 아니면 인터럽트가 발생하면? 이 프로세스에 대한 정보는 PCB에 저장해둬야 한다. 이 정보들을 어렵게 문맥 이라고 부른다. 문맥을 저장해두면 언제든 프로세스 실행을 재개할 수 있다.


🎈 프로세스의 메모리 영역

프로그램이 메모리에 적재되어야 프로세스가 된다고 했는데, 그럼 프로세스는 메모리에 어떻게 적재되는걸까?

실행하는데 필요한 정보, 또 실행하면서 생길 정보들을 실을 공간이 필요하다. 이 공간들을 용도에 따라 분리해서 적절한 자료구조를 사용할건데, 아래처럼 영역을 나눈다. 프로세스가 생성되면 PCB는 커널 영역에 생성되고, 이런 것들은 사용자 영역에 배치된다.

  • 코드 영역
    • 프로그램을 실행하기 위한 명령어, CPU가 이 명령어를 읽는다.
    • 코드는 바뀌지 않는다. 읽기 전용
  • 데이터 영역
    • 프로그램이 실행되는 동안 유지될 데이터가 저장되는 공간
    • 전역 변수가 대표적으로 저장
  • 스택 영역
    • 잠깐 쓸 데이터를 일시적으로 저장하는 공간
    • 매개변수, 지역변수 (다 쓰고 필요없어지면 POP 해서 치운다)
  • 힙 영역
    • 개발자가 직접 할당할 수 있는 저장공간
    • 다 쓰고 나서 필요가 없어지면 반환해야 한다. 반환 안하면 메모리 누수 발생

힙 영역과 스택 영역은 실행하면서 데이터가 생성됐다가 삭제됐다가 하는 곳이라 차지하는 범위가 계속 바뀐다. 그림처럼 힙 영역은 낮은 주소에서 높은 주소로, 스택 영역은 높은 주소에서 낮은 주소로 할당된다.


그런데 만약 얘네의 크기가 너무 커지면..?

함수가 너무 많이 실행되거나, 함수 크기가 커서 지역변수가 너무 많아지면 스택이 커지게 된다. 또 힙에 너무 많은 데이터를 집어넣어서 힙이 커질 수 있다. 지나치게 커버리면 당연히 안된다. 서로의 영역을 침범하면 오버 플로우가 발생하게 된다.

0개의 댓글