[혼공컴운] Chap 10. 프로세스와 스레드

반디·2023년 2월 5일
0

컴구/OS

목록 보기
7/9

프로세스

'프로세스를 생성한다' = 보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 것 (프로그램 \rightarrow 프로세스)

포그라운드 프로세스(foreground process)백그라운드 프로세스(background process)
사용자가 볼 수 있는 공간에서 실행되는 프로세스사용자가 보지 못하는 공간에서 실행되는 프로세스

Note. 데몬 (in unix)/서비스 (in window): 사용자와 상호작용하지 않는 백그라운드 프로세스

프로세스들은 차례대로 돌아가면서 한정된 시간만큼만 CPU를 이용
시간이 끝났음을 알리는 타이머 인터럽트(타임아웃 인터럽트)가 발생하면 자신의 차례를 양보하고 다음 차례가 올 때까지 기다림
\therefore 프로세스의 실행 순서를 관리, 자원을 배분해야 함 \rightarrow 프로세스 제어 블록

프로세스 제어 블록(PCB)

  • 프로세스를 식별하기 위해 필요한 정보들을 저장하는 자료 구조
  • 커널 영역에 생성
  • 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기
    - 새로운 프로세스가 생성 = 운영체제가 PCB를 생성
    - 프로세스가 종료 = 운영체제가 해당 PCB를 폐기
PCB 저장 정보내용
프로세스 ID (PID)프로세스의 고유 번호
같은 일을 수행하는 프로그램도 두 번 실행하면 PID가 다른 두 개의 프로세스가 생성
레지스터 값프로세스는 자신의 실행 차례가 돌아오면 이전까지 사용했던 레지스터의 중간값들을 모두 복원 (이전 작업을 이어서 실행)
\rightarrow 해당 프로세스가 실행하며 사용했던 프로그램 카운터 등의 레지스터 값들이 담김
프로세스 상태프로세스가 CPU를 사용하기 위해 기다리고 있는 상태인지 등의 상태정보
CPU 스케줄링 정보프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보
메모리 관리 정보베이스 레지스터, 한계 레지스터 값, 페이지 테이블 정보 등
사용한 파일과 입출력장치 목록프로세스가 실행 과정에서 사용한 특정 입출력장치나 파일 정보

문맥 교환

  • 문맥: 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보
    - 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현

프로세스 A의 CPU 사용 시간이 다 되거나 인터럽트가 발생하여 프로세스 B로 실행 순서가 넘어가는 상황
문맥 교환 프로세스 A의 PCB에 문맥을 백업 \rightarrow 실행할 프로세스 B의 문맥을 복구

https://www.javatpoint.com/what-is-the-context-switching-in-the-operating-system

프로세스의 메모리 영역

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

정적 할당 영역동적 할당 영역
코드 영역, 데이터 영역힙 영역, 스택 영역
  • 코드 영역(텍스트 영역): 기계어로 이루어진 명령어가 저장

    • 데이터가 아닌 CPU가 실행할 명령어가 담겨 있으므로 쓰기가 금지 (read-only)
  • 데이터 영역: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
    ex) 전역 변수

  • 힙 영역: 프로그래머가 직접 할당할 수 있는 저장 공간

    • 힙 영역에 메모리 공간을 할당했다면 언젠가는 해당 공간을 반환해야 함
      - 반환 X \rightarrow 메모리 낭비; 메모리 누수
    • 메모리의 낮은 주소 \rightarrow 높은 주소로 할당
  • 스택 영역: 데이터를 일시적으로 저장하는 공간 ex) 매개 변수, 지역 변수

    • 메모리의 높은 주소 \rightarrow 낮은 주소로 할당

프로세스 상태

https://www.javatpoint.com/os-process-states

  • 생성 상태: 프로그램이 막 메모리에 적재되어 PCB를 할당받은 상태
  • 준비 상태: 실행되지 않고 자신의 차례를 기다리고 있는 상태
  • 실행 상태: CPU를 할당받아 실행중인 상태
  • 대기 상태: 입출력장치의 작업을 기다리는 상태
    • 프로세스가 실행 도중 입출력장치를 사용하는 경우, 입출력 작업은 CPU에 비해 처리 속도가 느리므로, 입출력 작업을 요청한 프로세스는 입출력 장치가 입출력을 끝낼 때까지 기다려야함
  • 종료 상태: 프로세스가 종료된 상태, PCB와 프로세스가 사용한 메모리를 정리

프로세스 계층 구조

https://delightlylinux.wordpress.com/2012/06/25/what-is-pid-and-ppid/

프로세스는 실행 도중 시스템 호출을 통해 다른 프로세스를 생성할 수 있음

  • 부모 프로세스: 새 프로세스를 생성한 프로세스
  • 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
    - 자식 프로세스의 PCB에 부모 프로세스의 PID (PPID)가 기록되기도 함

ex) 사용자가 컴퓨터를 킴 \rightarrow 로그인 \rightarrow bash shell로 Vim 실행

최초의 프로세스 \rightarrow 로그인 프로세스 \rightarrow bash 프로세스 \rightarrow Vim 프로세스

  1. 사용자가 컴퓨터를 켠 순간에 생성된 최초 프로세스는 로그인을 담당하는 프로세스를 자식 프로세스로 생성
  2. 로그인 프로세스는 사용자 인터페이스(bash shell) 프로세스를 자식 프로세스로 생성
  3. 사용자 인터페이스 프로세스는 Vim 프로세스를 자식 프로세스로 생성

프로세스 생성 기법

Step 1. 부모 프로세는 fork{\color{red}fork}를 통해 자신의 복사본을 자식 프로세스로 생성
Step 2 만들어진 복사본(자식 프로세스)은 exec{\color{red}exec}를 통해 자신의 메모리 공간을 다른 프로그램으로 교체

  • fork: 자기 자신 프로세스의 복사본을 만드는 시스템 호출
  • exec: 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
    (새로운 프로그램 내용으로 전환하여 실행)
    - exec를 호출하면 코드 영역과 데이터 영역의 내용이 실행할 프로그램으로 바뀌고, 나머지 영역은 초기화

스레드

  • 스레드: 프로세스를 구성하는 실행의 흐름 단위
    • 하나의 프로세스는 여러 개의 스레드를 가질 수 있음
    • 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행 가능
    • 프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성

https://www.geeksforgeeks.org/multithreading-python-set-1/

확인문제
p.304
1번 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램 입니다. 1-5까지 올바른 상태를 적어보세요.

참고문헌
https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=299014282&start=slayer

profile
꾸준히!

0개의 댓글