CS

프로세스

index.ys 2023. 7. 16. 21:34

프로세스

  • 실행중인 프로그램을 프로세스 
  • 포그라운드 프로세스 : 사용자가 보는 앞에서 실행되는 프로세스
  • 백그라운드 프로세스 : 사용자가 보지 못하는 곳에서 실행되는 프로세스  ex) 윈도우에서는 서비스라는 프로세스

프로세스 제어 블록 Process Control Block PCB

  • 운영체제가 프로세스의 실행순서를 관리하고 cpu에 자원을 효율적으로 분배하기 위한 프로세스가 가진 고유한 인식표
  • 프로세스와 관련된 정보를 저장한는 자료구조
  • PCB는 커널영역에 생성됨, PCB로 특정 프로세스를 식별하고, 해당 프로세스를 처리하는데 필요한 정보를 판단
  • PCB는 프로세스 생성시 생성되고 프로세스 종료시 PCB는 폐기됨

PCB에 담기는 정보

프로세스 ID

  • CPU가 특정 프로세스를 식별하고 실행시키기 위한 프로세스의 고유한 번호 , 다른 프로세스 ID와 겹칠 수 없음

레지스터 값

  • CPU는 문맥교환이 일어나면 실행중이던 프로세스의 정보를 레지스터에 저장함
  • 다음에 실행할 프로세스의 정보들을 레지스터에서 복원해서 이어서 실행함
  • PCB에는 이전까지 실행했던 작업들을 이어서 실행하기 위해 프로그램 카운터를 비롯한 레지스터 값들이 저장됨

프로세스 상태

  • 프로세스가 어떤 상태인지 PCB에 저장

CPU 스케줄링 정보

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

메모리 관리 정보

  • 프로세스가 어느 주소에 저장되어 있는지에 대한 정보필요 => 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담김
  • 메모리에 저장된 프로세스 주소를 알기 위해 페이지 테이블 정보도 담김 (메모리에 저장된 프로세스 주소를 알기 위한 정보)

사용한 파일과 입출력장치 목록

  • 입출력장치나 파일을 사용하면 PCB에 해당 내용이 기록

문맥교환 Context Switching

  • 문맥 = 프로세스가 CPU를 할당받아 작업하기 위한 정보들을 담은 곳 PCB에 담김 정보들
  • CPU가 실행하던 기존 프로세스의 문맥을 PCB에 백업하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로 복구하여 새로운 프로세스를 실행하는 것 => 문맥교환
  • 인터럽트 발생(프로세스야 CPU 그만써라 시간 다 됐다) => A 프로세스(네 알겠습니다.)의 문맥을 PCB에 저장 => B프로세스의 문맥을 PCB에서 복구 => B프로세스 작업 실행 => 인터럽트 발생 => B프로세스 문맥을 PCB에 저장 => C 프로세스의 문맥을 복구 => C프로세스 실행 => C 프로세스 문맥을 PCB에 저장

프로세스의 메모리 영역

  • 프로세스가 생성되면 커널영역에 PCB 생성
  • 하나의 프로세스는 사용자 영역에 코드 영역, 데이터 영역, 힙 영역, 스택 영역 으로 나뉘어 저장됨

코드 영역

  • 프로그래머가 작성한 코드가 저장되는 영역, 기계어로 컴파일 되어 저장
  • 쓰기 명령어가 금지되어 있고 Read only 전용 공간
  • ex) 함수 선언, 반복문 조건문
  • 정적 할당 영역

데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 영역
  • ex) 전역변수, 정적 변수
  • 정적 할당 영역

힙 영역

  • 프로그래머가 직접 할당할 수 있는 저장공간
  • 메모리에 공간을 직접 할당하고 할당된 공간은 프로그램이 종료되면 메모리 공간을 반환해야함, 반환하지 않음 => 메모리누수
  • 반환을 해주는 역할: 가비지 컬렉션
  • ex) 객체, 배열
  • 높은 주소에서 낮은 주소로 메모리주소가 할당됨 => 스택 영역과 메모리주소가 겹치지 않기 위해

스택 영역

  • 데이터를 일시적으로 저장하는 공간, 잠깐 쓰다가 말 값들이 저장되는 공간
  • ex) 지역변수, 매개변수, 함수 호출정보
  • 낮은 주소에서 높은 주소로 메모리 주소가 할당됨 => 힙 영역과 메모리주소가 겹치지 않기 위해
#include <stdio.h>
//데이터 영역에 저장
int globalVariable = 10;

//myFunction() 내에서 동적으로 할당된 메모리는 힙 영역에 저장됨
void myFunction() {
//스택 영역에 저장
    int localVariable = 20;
    //코드 영역에 저장
    printf("Hello, World!\n");
}

int main() {
//데이터 영역에 저장
    static int staticVariable = 30;
    myFunction();
    return 0;
}

*스택 오버 플로우

  • 스택 메모리 영역에 할당된 공간을 넘어서 데이터를 쓰는 경우 발생하는 에러

*스택 오버 플로우 발생 상황

  • 재귀 호출의 깊이 제한을 초과할때 : 재귀 함수가 무한히 호출되거나 너무 깊게 호출 되는 경우, 스택에 쌓이는 호출 정보의 수가 스택의 용량을 초과하여 오버플로우 발생
  • 지역 변수의 과도한 할당 : 함수 내에서 큰 크기의 지역변수를 선언하거나, 많은 지역 변수를 동시에 선언하여 스택의 용량을 초과하는 경우 스택 오버플로우가 발생가능
  • 버퍼 오버플로우 : 배열이나 버퍼에 입력된 데이터가 버퍼의 크기를 초과하여 스택 영역을 침범하는 경우에 발생, 입력 데이터를 제한 없이 받거나 입력의 검증이 제대로 이루어지지 않은 프로그램에서 발생

프로세스 상태와 계층구조

프로세스 상태

  • 문맥교환이 일어날때 프로세스는 여러 상태를 거치며 실행됨
  • 운영체제는 프로세스의 상태를 PCB를 통해 인식하고 관리

생성 상태

  • 프로세스를 생성 중인 상태
  • 메모리에 적재되어 PCB를 할당받은 상태
  • 생성 상태를 거쳐 준비상태가 되어 CPU의 할당을 기다림

준비 상태

  • 당장이라도 CPU를 할당받아 실행할 수 있는 있지만, 자신의 차례가 아니기에 기다리고 있는 상태
  • 준비 상태인 프로세스가 실행상태로 전환 되는것 => 디스패치

*디스패치 : 프로세스가 준비상태에서 실행 상태로 전환되는 것 

실행 상태

  • CPU를 할당받아 실행중인 상태
  • 프로세스는 할당된 시간동안만 CPU를 할당받아 사용하고 시간이 지나면 타이머 인터럽트가 발생하여 다음 프로세스로 CPU의 제어권을 넘기고 준비상태로 돌아감
  • 실행도중 입출력 장치를 사용하여 입출력 장치의 작업일 끝날때 까지 기다려야 한다면 대기상태로 전환됨

대기 상태

  • 입출력장치 작업은 CPU에 비해 처리속다가 느리기때문에 입출력 작업을 요청한 프로세스는 입출력 작업이 끝날때까지 대기 상태로 전환되어 기다림
  • 입출력장치의 작업을 기다리는 상태 대기상태

종료 상태

  • 프로세스가 종료된 상태, PCB를 폐기하고 메모리에 적재된 프로세스의 자원들을 정리

프로세스 계층구조

  • 프로세스 실행도중 시스템 콜을 통해 다른 프로세스 생성가능
  • 생성한 새 프로세스를 부모 프로세스, 부모 프로세스에 의해 생성된 프로세스를 자식 프로세스라고함

프로세스 생성기법

fork 복제

  • 부모 프로세스가 fork를 통해 자신의 복사본을 자식 프로세스로 생성하는것
  • 시스템 호출

exec 옷갈아입기

  • 자식 프로세스로 생성된 프로세스가 자신의 메모리 공간을 다른 프로그램으로 교체하는 것
  • 시스템 호출

스레드

  • 프로세스를 구성하는 실행의 흐름단위
  • 하나의 프로세스는 여러개의 스레드를 가질 수 있음 => 하나의 프로세스에서 여러 부분을 동시에 실행 할 수 있음
  • 프로세스의 스레드들은 스레드 실행에 필요한 최소한의 정보(프로그램 카운터, 레지스터, 스택)을 유지한채 프로세스의 자원(코드, 데이터, 힙)을 공유하며 실행됨

멀티프로세스

  • 여러 프로세스들을 동시에 실행하는것
  • 프로세스끼리는 자원을 공유하지 않지만 스레드끼리는 프로세스의 자원을 공유함

멀티스레드

  • 1개의 프로세스 내에서 여러 스레드를 동시에 실행 하는것
  • 스레드들은 각기 다른 스레드 ID, 레지스터 값, 스택을 가지고 프로세스가 가지고 있는 자원을 공유
  • 1개의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있음

파이썬으로 프로세스 제어하기

소스코드

출력 결과

 

파이썬으로 스레드 제어하기

소스코드

출력 결과

소스코드 출처

https://github.com/kangtegong/self-learning-cs/blob/main/thread/thread_python.md