CH10) 프로세스와 스레드 - 1

Jobmania·2023년 6월 2일
0

운영체제

목록 보기
2/13
post-thumbnail

10-1) 프로세스 개요

실행중인 프로그램 == 프로세스이며, 프로그램이 실행되기 전까지는 보조기억장치에 있는 데이터 덩어리일 뿐이다.

  • 저장된 프로그램이 메모리에 적재되고 실행하는 순간 그 프로그램은 프로세스가 되는 것이며, 이를 프로세스를 생성한다라고 표현한다.

< 프로세스 직접 확인하기 >

  • 현재 실행중인 프로세스 확인(작업관리자)

포그라운드 프로세스(foreground process)

  • 사용자가 보는 공간에서 실행되는 프로세스

백그라운드 프로세스(background process)

  • 사용자와 직접 상호작업이 가능한 백그라운드 프로세스
  • 사용자와 상호작용 하지 않고 그저 정해진 일만 수행하는 프로세스 (리눅스에선 데몬(demon), 윈도우에선 서비스(service))

< 프로세스 제어 블록 >

  • 모든 프로세스는 CPU가 필요하다, 하지만 CPU자원은 한정되어 있다.
    (타이머 인터럽트 : 클럭 신호를 발생시키는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트이며, 타임아웃 인터럽트 라고도 한다)

  • 한정된 시간에 프로세스는 이용하고 타이머 인터럽트가 프로세스가 다음 프로세스에게 CPU를 할당한다.

🤑 그래서 빠르게 번갈아 수행되는 프로세스들을 관리해야한다. 그래서 운영체제는 프로세스 제어블록(Process Control Block, PCB) 를 이용한다.

  • PCB는 프로세서 관련 정보를 저장하는 자료구조이다.

  • 프로세스 생성시 커널영역에 PCB가 생성되고 종료시 폐기됨.

  • 수많은 프로세스에서 PCB로 특정프로세스를 식별하고 처리하고 정보를 판단한다.

    PCB에 담기는 대표적인 정보 (운영체제 마자 차이는 있다.)

  • PID : 프로세스 ID
    특정 프로세스를 식별하기 위해 부여하는 고유한 번호(학교의 학번, 회사의 사번)

  • 레지스터 값
    자신의 실행차례가 돌아오면 이전까지 사용했던 레지스터의 중간값을 모두 복원합니다. PCB안에는 프로세스가 사용했던 프로그램 카운터(다음 수행해야할 메모리주소)를 비롯한 레지스터 값들이 담깁니다.

  • 프로세스 상태값
    프로세스 상태정보 저장하는 공간,

    EX) 현재 프로세스가
    입출력 장치를 사용하기 위해 기다리고 있는 상태인지,
    CPU를 사용하기 위해 기다리고 있는 상태인지,
    CPU를 이용하고 있는 상태인지

  • CPU 스케줄링 정보
    프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
    ** 모든 프로세스가 동일한 시간으로 CPU를 사용하지 않기 때문!

  • 메모리 정보
    프로세스가 어느 메모리 주소에 저장되에 있는지에 대한 정보(베이스 레지스터, 한계레지스터와 같은 값들)
    페이지 테이블 정보

  • 사용한 파일과 입출력 장치 정보
    할당된 입출력 장치, 사용중인 (열린) 파일 정보

< 문맥교환 (컨텍스트 스위칭: Context Switching) >

  • 하나의 프로세스(프로세스 A)가 다른 프로세스 (프로세스 B)로 실행순서가 넘어가면?

  • 기존에 실행되던 프로세스 A는 지금까지의 정보를 중간정보를 백업해야함!

  • 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어있다.

    프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력 장치등....
    이러한 중간 정보를 문맥(Context)이라고 한다. 그래서 다음 차례가 왔을 때 실행을 재개하기 위한 정보들이다. 🤓 즉!실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다.

  • 뒤이어 실행할 프로세스 B의 문맥을 복구
    자연스럽게 실행 중인 프로세스가 바뀜!

🤗 여러 프로세스가 끊임없이 빠르게 번갈아가며 실행되는 원리!!

  • 즉, 프로세스 교환이 일어난 후 프로세스가 바로 실행하는 것이 아니라 컨텍스트 스위칭이 일어난 후에 프로세스가 실행된다.

프로세스 메모리 영역

  • 사용자 영역에는 프로세스가 어떻게 배치가 되는가??

  • 하나의 프로세스는 사용자 영역에 크게 1. 코드 영역(텍스트영역) , 2. 데이터 영역, 3. 힙 영역, 4. 스택 영역 으로 나뉘어 저장된다.

코드영역

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

데이터 영역

  • 프로그램이 실행될 동안 유지할 데이터가 저장되는 공간 (static, 전역변수, 클래스 변수 )

🥺 코드영역과 데이터 영역은 그 크기가 변하지 않는다.
프로그램의 구성하는 명령어나,코드영역의 크기가가 변할리 없고,데이터 영역은 프로그램 실행동안에만 유지될 데이터이기때문..
그래서 '크기가 고정된 영역'이라는 점에서 정적 할당 영역 이라고 한다.!
그렇다면 힙영역과 스택영역은 실행과정에서 크기가 변할 수 있기 때문에 '동적 할당영역'이라 한다.

힙 영역

  • 프로그램을 만드는 사용자, 프로그래머가 직접 할당할 수 있는 저장 공간
  • 이러한 공간이 할당했다면 언젠간 반환해야한다. 언어자체가 GC를 통해 반환할 수도 있지만, C언어는 아니다.
  • 그래서 계속 메모리공간을 차지한다면 메모리누수(Memory leak)가 발생한다

스택 영역

  • 데이터를 일시적으로 저장하는 공간
  • 매개변수(parameter), 지역 변수(local)

🤪힙, 스택 영역의 크기는 가변적

  • 그래서 일반적으로 힙 영역은 낮은주소 -> 높은주소로 할당
  • 스택영역은 높은 주소-> 낮은 주소로 할당한다.
  • 같은 주소로 올라간다면 데이터 주소가 겹칠 수 있어서
profile
HelloWorld에서 RealWorld로

0개의 댓글