#10. 컴퓨터 구조 및 운영체제

Maengkkong·2023년 12월 26일
0

스터디

목록 보기
10/14

프로세스(Process)

프로세스는 프로그램 실행 전에는 보조기억장치에 있는 데이터 덩어리일 뿐이다.
보조기억장치에 저장된 프로그램을 메모리에 적재 및 실행하는 순간 프로그램은 프로세스가 된다.

  • 프로그라운드 프로세스(forground process)
    : 사용자가 볼 수 있는 공간에서 실행되는 프로세스
  • 백그라운드 프로세스(background process)
    : 보이지 않는 공간에서 실행되는 프로세스
    : 백그라운드 프로세스 중 사용자와 직접 상호작용 가능 프로세스 존재
    : 상호작용 불가한 프로세스를 유닉스 체계 운영체제에서 '데몬(daemon)',
    윈도우 운영체제에서 '서비스(service)'
    라고 한다.

프로세스 제어 블록(PCB : process control block)

프로세스 제어 블록은 프로세스와 관련된 정보를 저장하는 자료 구조이다.
PCB는 커널 영역에 생성된다.

  • 프로세스 실행 순서를 관리하고 프로세스에 CPU를 비롯한 자원을 배분하는 운영체제는 프로세스 제어 블록을 이용한다.
    : 운영체제도 수많은 프로세스 사이에서 PCB로 특정 프로세스를 식별하고 행당 프로세스르 처리하는데 필요한 정보를 판단한다.
  • PCB는 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.
    : 새로운 프로세스 생성 = 운영체제가 PCB 생성
    : 프로세스 종료 = 운영체제가 해당 PCB 폐기

1. 프로세스 ID (PID : process ID)
특정 프로세스 식별을 위해 부여하는 고유 번호

  • 같은 일을 수행하는 프로그램이여도 두번 실행 시 PID가 다른 두 개의 프로세스가 생성

2. 레지스터 값
프로세스는 이전까지 진행했던 작업들을 이어 실행하기 위해 본인 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값을 모두 복원한다.

  • PCB 안에는 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레시스터 값들이 담긴다.

3. 프로세스 상태
PCB는 프로세스 상태를 기록한다.

4. CPU 스케줄링 정보
PCB는 프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보를 기록한다.

5. 메모리 관리 정보
프로세스마다 메모리에 저장된 위치가 다르기 때문에 PCB는 프로세스가 어느 주소에 저장되어 있는지 알아야 한다.
PCB에는 베이스 레지스터, 한계 레지스터 값과 같은 정보들이 담긴다.

6. 사용한 파일과 입출력장치 목록
PCB는 프로세스가 실행 과정에서 특정 입출력장치나 파일을 사용한 내용을 기록한다.


문맥 교환(context swithching)

기존 프로세스의 문맥을 PCB에 백업 및 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교환(context swithching)이라고 한다.

  • 문맥 교환은 여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리
    : 문맥 교환이 발생하면, 프로세스는 그만큼 빨리 번갈아 가며 수행되기 때문에 프로세스들이 동시에 실행되는 것처럼 보인다.
  • 하나의 프로세스 수행 재개를 위해 기억해야 할 정보를 문맥(Context)라고 한다.
  • 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있다.
  • PCB에 기록되는 정보들을 문맥이라고 할 수 있다.
  • 실행 문맥을 기억하여 언제든 해당 프로세스의 실행을 재개할 수 있기 때문에, 프로세스가 CPU를 사용할 수 있는 시간이 다 되거나 예기치 못한 상황이 발생하여 인터럽트가 발생하면 운영체제는 해당 프로세스의 PCB에 문맥을 백업한다. 그리고 다음 실행할 프로세스의 문맥을 복구하여 실행되는 프로세스를 자연스럽게 변경한다.

프로세스의 메모리 영역

하나의 프로세스는 사용자 영역에서 코드, 데이터, 힙, 스택으로 나뉘어 저장

  • 코드(Code Segment)
    : 텍스트 영역(Text Segment)이라고도 한다.
    : 코드가 저장
    : 읽기 전용(read-only)

  • 데이터(Data Segment)
    : 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
    : 전역 변수 (global variable)

코드 및 데이터 = 정적 할당 영역
: 영역의 크기가 변동되지 않기 때문

  • 힙(Heap Segment)
    : 프로그래머가 직접 할당할 수 있는 저장 공간
    : 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 해당 공간을 반환해야 한다.(운영체제에 '더 이상 해당 메모리 공간을 사용X' 전달)
    반환하지 않는다면 메모리 누수(memory leak)가 발생한다.
    : 메모리가 낮은 주소 > 높은 주소로 할당

  • 스택(Stack Segment)
    : 데이터를 일시적으로 저장하는 공간
    : 매개 변수, 지역 변수
    : 메모리가 높은 주소 > 낮은 주소로 할당

PUSH : 저장할 데이터를 스택에 PUSH
POP : 필요하지 않은 데이터 스택에서 POP

힙 및 스택 = 동적 할당 영역
: 프로세스 실행 과정에서 크기가 변할 수 있기 때문


프로세스 상태

운영체제는 PCB를 통해 프로세스의 상태를 인식하고 관리한다.

1. 생성 상태 (new)
프로세스 생성 중인 상태
: 메모리에 적재되어 PCB를 할당받은 상태
: 생성 상태를 거쳐 실행 준비가 완료된 프로세스는 곧바로 실행X > CPU할당 준비 상태

2. 준비 상태 (ready)
당장 CPU를 할당받아 실행 가능하지만 자신의 차례가 아니기에 대기 상태
: CPU를 할당받아 살행 상태가 된다.

  • 디스패치(dispatch)
    : 준비 상태인 프로세스가 실행 상태로 전환되는 것

3. 실행 상태 (running)
CPU를 할당받아 실행 중인 상태
: 실행 중인 프로세스는 할당된 일정 시간 동안만 CPU 사용 가능
: 프로세스가 할당된 시간을 모두 사용한다면(타이머 인터럽트 발생) > 준비 상태로 변환
: 실행 도중 입출력장치를 사용하여 입출력 장치의 작업이 끝날 때까지 기다려야 한다면 > 대기 상태로 변환

4. 대기 상태 (blocked)
입출력 작업은 CPU의 속도에 비해 느리기 때문에 입출력 작업을 요청한 프로세스는 입출력을 끝낼 때까지 대기
: 입출력 작업이 완료 > 프로세스 준비 상태로 변환

5. 종료 상태 (terminated)
프로세스가 종료된 상태
: 운영체제는 PCB와 프로세스가 사용한 메모리를 정리

프로세스 상태 다이어그램(process state diagram)
: 프로세스는 생성, 준비, 실행, 대기, 종료 상태를 거치며 실행
: 운영체제는 이 상태를 PCB에 기록하며 프로세스를 관리

  • 298P

프로세스 계층 구조

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스 생성 가능하다.

  • 부모 프로세스(parent process) : 새로 생성한 프로세스
  • 자식 프로세스(child process) : 부모 프로세스에 의해 생성된 프로세스

부모와 자식 프로세스는 다른 프로세스이기에 각 PID를 가진다.
일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID(Parent PID)를 기록한다.

자식 프로세스는 실행 과정에서 또 다른 자식 프로세스를 생성할 수 있다.
컴퓨터 부팅 시 실행되는 최조의 프로세스가 자식 프로세스들을 생성, 자식 프로세스가 새로운 프로세스를 생성하는 형식으로 여러 프로세스가 동시에 실행된다.
이 과정은 트리 구조를 띄는데, 이를 프로세스 계층 구조라고 한다.


프로세스 생성 기법

부모 프로세스를 통해 생성된 자식 프로세스들을 복제와 옷 갈아입기를 통해 실행

부모 프로세스 fork > 자신의 복사본을 자식 프로세스로 생성 > 자식 프로세스 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체

fork와 exec는 시스템 호출

  • fork
    : 자기 자신의 프로세스 복사본 만드는 시스템 호출
    : 자식 프로세스는 부모 프로세스의 내용을 상속받음(PID값과 저장 메모리 위치는 다르다.)

  • exec
    : 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
    : 새로운 프로그램 내용으로 전환하여 실행하는 시스템 호출
    : 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용을 변경, 나머지 영역은 초기화

프로세스 계층 구조 과정은 fork와 exec가 반복되는 과정이다.

  • 부모 프로세스가 자식 프로세스를 fork한 뒤 부모 및 자식 프로세스 중 누구도 exec를 호출하지 않는 경우
    : 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.

스레드(thread)

프로세스를 구성하는 실행 흐름의 단위

  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
  • 스레드를 이용하면 하나의 퍼로세스에서 열어 부분을 동시에 실행할 수 있다.
  • 단일 스레드 프로세스
    : 프로세스(process)는 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스이기에 단일 스레드 프로세스라고 할 수 있다.
  • 스레드
    : 프로세스가 한 번에 여러 일을 동시에 처리(프로세스를 구성하는 실행 단위)
    : 스레드는 실행에 필요한 최소한의 정보(프로그램 카운터 포함 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행
    : 운영체제는 CPU에 처리할 작업을 전달할 때 스레드 단위로 전달
    : 스레드는 프로세스 자원을 공유한 채 실행에 필요한 최소한의 정보만으로 실행

멀티프로세스와 멀티스레드

  • 멀티프로세스(multiprocess)
    : 여러 프로세스를 동시에 실행

  • 멀티스레드(multithread)
    : 여러 스레드로 프로세스를 동시에 실행

프로세스끼리 자원을 공유 하지 않는다.
스레드는 프로세스내 자원을 공유한다.

프로세스는 fork항 동일한 프로세스를 동시에 실행하면 PID, 저장된 메모리 주소를 제외하고 코드, 데이터, 힙, 스택 영역 등 모든 자원이 복제되어 메모리에 적재된다. 이는 동일한 프로세스가 통째로 메모리에 적재되는 것이다. 이는 메모리 낭비이다.

fork한 직후 쓰기 시 복사 (copy on write) 기법을 통해 프로세스를 통째로 메모리에 중복 저장하지 않으면서 동시에 프로세스끼리 자원을 공유하지 않도록 하는 방법도 있다.

스레드는 각 PID, 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질뿐 프로세스가 가지고 있는 자원을 공유한다.
: 여러 프로세스를 병행 실행하는 것보다 메모리를 효율적으로 사용할 수 있다.
: 프로세스는 자원을 공유하지 않기 때문에 독립적으로 실행
: 스레드는 자원을 공유하기 때문에 서로 협력과 통신에 유리

멀티프로세스 환경에서는 하나의 프로세스에 문제가 생겨도 다른 프로세스에 지장이 적거나 없다.
멀리스레드 환경에서는 스레드가 프로세스의 자원을 공유하기 때문에 하나의 스레드에 문제가 생기면 프로세스 전체에 문제가 생길 수 있다.

프로세스 간 통신)IPC : Inter-Process Communication)
: 프로세스 간의 자원을 공유하고 데이터를 주고받는 것
: '통신'이라는 말을 들으면 네트워크를 통해 데이터를 주고 받는 방식만을 떠올리기 쉽지만, 같은 컴퓨터 내의 서로 다른 프로세스나 스레드끼리 데이터를 주고 받는 것도 통신으로 간주한다.
ex) 파일을 읽는 프로세라면 파일 속 데이터를 주고받으므로 프로세스 간의 통신이 이루어져야 한다. 이는 파일을 통한 프로세스 간 통신이라고 할 수 있다.

  • 공유 메모리(shared memory)
    : 프로세스들이 공유할 수 있는 메모리 영역

혼자 공부하는 컴퓨터구조 + 운영체제
10. 프로세스와 스레드 (284p - 312p)

0개의 댓글