운영체제 정리 (3)

2021년 08월 14일
제작기간 2021년 8월 10일 ~ 2021년 8월 14일
태그 CS

3-1. 프로세스의 개념과 상태 변화

프로세스의 개념

  • 등장배경
    • 병행 실행하는 프로그램들은 자원을 공유하기 때문에, 제어가 필요하다.
  • 실행 중인 프로그램
    • 디스크에 있던 프로그램을 메모리에 적재하여 OS의 제어를 받는 상태가 됨
  • asynchronous (비동기적) 행위
  • 실행 중인 프로시저 및 그의 제어 추작
  • OS에 들어있는 프로세스 제어 블록 (PCB)
  • 프로세서에 할당하여 실행할 수 있는, 개체 dispatch가 가능한 대상

프로세스의 메모리 구조

  1. Stack
    • 데이터를 일시적으로 저장
    • 지역변수에 사용
    • 함수를 호출할때 공간을 제공
    • 힙과 인접한 방향으로 커지는 경우가 많기 때문에 힙 포인터를 만나면 메모리가 소진되었다는 것
  2. Heap
    • 코드 영역과 별도의 자유 영역
    • 동적 메모리 할당시, 공간을 제공
  3. Data
    • 프로그램의 가상 주소 공간
    • 전역변수, 정적변수를 저장/할당
    • 초기화하지 않은 데이터는 데이터의 영역의 끝에서 시작
  4. Code
    • 실행 명령을 포함하는 메모리 / 목적 파일에 있는 프로그램 영역
    • 프로세서가 디스크에서 읽어 실행하는 컴파일한 프로그램 저장
    • 읽기 전용, 변경 불가능
    • 공유가 가능하기 때문에, 자주 실행하는 프로그램(재진입 프로그램) 사본은 메모리에 존재

프로세스의 종류

  1. 시스템 프로세스
    • 모든 시스템 메모리와 프로세서 명령에 액세스 가능
    • 프로그램 실행 순서, 커널 영역 관리, 프로세스 생성
  2. 사용자 프로세스
    • 코드 수행
  3. 독립 프로세스
    • 다른 프로세스에 영향 X
  4. 협력 프로세스
    • 다른 프로세스에 영향 O

프로세스의 상태 변화와 상태 정보

  1. 상태 변화
    • 실행 / 비실행 상태로 구분
    • 프로세스 생성 시, 비실행 상태로 초기화 됨
    • 자원을 할당 받기 위해서 비실행 상태가 되기도 함
    • dispatch: 종료/인터럽트에 의해 프로세스 실행 상태가 바뀌는 것
    • dispatcher: 스케줄러가 선택한 프로세스에 프로세서 할당하는 모듈
스케줄러
작업 스케줄러 스풀러가 디스크에 저장한 작업 중 실행할 작업 선정후, 준비 리스트에 삽입
프로세스 스케줄러 선정한 작업의 상태를 변화, 프로세스 생성부터 종료까지 수행
상태 변화
이름 상태변화 설명
dispatch 준비-실행 프로세스가 프로세서 점유하는 것
timeout 실행-준비 interrupt click에 의해 할당된 시간 소모 후 OS에게 프로세서 제어권을 넘김
block 실행-대기 할당된 시간 소모 이전에 연산/자원 요청의 문제로 프로세서 스스로 양도
wakeup 대기-준비 입출력 작업 후
  1. 프로세스 제어 블록
    • 운영체제가 프로세스 제어할 때 필요한 프로세스 상태 정보를 저장하는 곳
    • 특정 프로세스 정보를 저장하는 데이터 블록
    • TCB (Tack Control Block) 이라고도 함
    • 작동
      • 프로세스 생성 시, 메모리에 프로세스 제어 블록 생성
      • 프로세스 종료 시, 프로세스 제어 블록 삭제
  2. 프로세스 문맥 교환
    • interrupt, system call로 제어를 넘겨 다른 프로세스가 실행 상태가 되도록 하는 것
    • 교환 발생 시, 프로세서의 레지스터에 있던 내용을 PCB에 저장 (나중에 쓰게)

3-2. 프로세스의 관리

프로세스의 구조

  • 실행 중 프로세스가 새로운 프로세스를 생성하면 계층적 구조를 가짐

프로세스의 생성

OS나, 응용 프로그램에서 요청을 받아 프로세스를 생성(fork)하면, OS는 해당 프로세스에서 PCB를 만들어 주소 공간 할당한다. 과정은 아래와 같다.

  1. 새로운 프로세스에 프로세스 식별자 할당
  2. 주소 공간과 PCB 공간 할당
  3. PCB 초기화
    • 프로세스 상태, PC 초기화, 자원 요청, 프로세스 제어 정보(우선순위) 포함
  4. 해당 큐에 삽입 (링크를 건다)
  • 자식 프로세스는 부모 프로세스나 운영체제에게서 자원을 할당 받을 수 있음
  • 부모 프로세스는 자식 프로세스가 쓰는 자원을 한정함

프로세스의 종료

  • 프로세스가 마지막 명령을 실행후, 운영체제에 프로세스 삭제 요청
  • 연속 종료: 부모 프로세스 종료 시, 자식 프로세스 또한 종료하는 것
  • 종료의 예
    • 정상종료: 프로세스가 운영체제 서비스 호출
    • 시간 초과:
    • 실패
    • 각종 오류
    • 메모리 부족, 액세스 위반

프로세스의 제거

  • 자원 반납, PCB 반납
  • 해당 프로세스는 시스템 리스트에서 제거
  • 그러나, 프로그램 자체는 디스크에 저장되어 있음
  • 부모 제거 시, 자식도 함께 제거

프로세스의 중단과 재시작

  • 시스템의 유휴시간 문제를 해결하기 위해 중단이 필요
  • 중단: 이벤트의 발생을 기다리는 대기 상태 / 자원이 부족한 상태
  • 재시작: 중단한 원인을 제거하여 다시 실행하는 것
  • 다중 프로그래밍 환경
    • 자원의 동적 할당 때문에 대기와 중단 발생
    • 대기: 자원 할당을 기다리는 것
    • 중단: 할당받은 자원을 기다리는 것
  • 중단된 대기 상태: 프로세스가 보조 메모리에 있고 이벤트 대기 중
  • 중단된 준비 상태: 프로세스가 보조 메모리에 있고 메인 메모리로 적재 가능한 상태
  • 중단된 프로세스는 다른 프로세서가 재시작하기 전에는 실행이 불가

프로세스의 우선순위 변경

  • Process scheduler는 PCB에 있는 우선 순위를 이용하여 준비 리스트의 프로세스 처리
  • 준비 리스트의 프로세스는 프로세서 중심/입출력 중심으로 구분
  • 입출력 중심은 프로세서를 짧게 여러번, 프로세서 중심은 길고 뜸하게 사용

프로세스의 문맥 교환 (context switching)

  • 이전 프로세스의 상태 레지스터 내용을 보관, 다른 프로세스의 레지스터를 적재하여 교환하는 것
  • 문맥 교환 시, 오버헤드가 발생 (
    • 메모리 속도, 레지스터 수, 특수 명령어의 유무에 따라 다름
  • 레지스터/작업/스레드/프로세스 문맥 교환
  • 불필요한 문맥 교환은 줄이는 것이 좋음
  • 스레드를 이용해 문맥교환을 효율적으로 처리할 수 있음

인터럽트 유형

입출력 입출력 동작 감지 후, 이벤트를 기다리는 프로세스를 준비 상태로 전환, 실행할 프로세스 결정
클록 현재 실행 중인 프로세스의 할당 시간 조사 후, 준비 상태로 전환, 다른 프로세스 실행
  • trap
    • 부적절한 파일 접근, 실행 중인 프로세스의 오류나 예외 상황으로 발생.
    • 심각하면 프로세스 종료

3-3. 스레드의 개념과 상태 변화

Thread의 개념

  • 프로세스는 자원과 제어로 구분하고, 이 중 제어만 분리한 실행 단위를 스레드라 칭함
  • 스레드는 다른 프로시저를 호출하고 다른 실행을 기록함
  • 별도의 스택이 필요하고, PC가 독립적
  • 동일한 주소 공간 공유
  • 경량 프로세스(Light weight process):프로세스 속성 중 일부가 들어 있음
  • 중량 프로세스(Heavy -): 프로세스 하나에 프로세스 하나

단일/멀티 스레드

  • 하나의 프로세스에 있으면 코드와 전역 데이터, 힙을 공유
  • 스레드 실행 환경 정보, 지역 데이터, 스택은 스레드 각각이 제어

스레드의 상태 변화

  • 한 프로세스에 있는 스레드는 순차적으로 실행
  • 해당 스레드의 정보를 저장하는 레지스터와 스택이 존재
  • 스레드 생성에는 공유 자원 초기화가 필요 없음 (프러세스가 스택과 래지스터 제공)

스레드의 제어 블록

  • TCB(Thread Control Block)에 정보를 저장
  • Process는 스레드를 한 개 이쌍 가지기 때문에 PCB는 TCB의 리스트를 말함
  • 레지스터 값, PC, 스택 포인터, 스케줄링 상태 + 스레드 ID, 스레드를 포함하는 프로세스 포인터
  • 스레드 간의 보호 X

3-4. 스레드의 구현

사용자 수준 스레드(user-level)

  1. n:1 mapping
    • 다수의 사용자 수준 thread : 커널 수준 스레드 1개
  2. 커널이 스레드의 존재를 모름
    • 스레드 간의 보호X
  3. 사용자 영역의 스레드 라이브러리로 구현
    • 생성/종료, 스레드 간의 메시지 전달, 스케줄링과 문맥 등의 정보
    • ex) POSIX 표준안의 스레드 확장판인 Pthread, Win32 thread, java thread API
  4. 커널은 스레드가 아닌 프로세스를 한 단위로 인지 후, 프로세서 할당
    • 오버헤드가 적음
    • 시스템 동시성 지원 X

커널 수준 스레드(kernel-level)

  1. 1:1 maping
    • 사용자 수준 thread가 각각 커널 수준 thread와 1:1 매핑
    • 사용자 수준 thread 생성 시, 커널 수준 thread 자동 생성
  2. 커널이 스레드 작업 모두 관리
    • PCB, TCB 유지
    • 오버히드가 커짐
    • 시스템 동시성 지원

혼합형 스레드(multiplexed)

  1. n:m mapping
    • 사용자 수준 스레드는 커널 수준 스레드와 비슷한 경량 프로세스에 n:m 매핑
    • 경량 프로세스는 커널 수준 스레드와 1:1 매핑
  2. 구성
    • 프로세스 하나에는 경량 프로세스가 하나 이상
    • 경량 프로세스에는 이에 대응하는 커널 스레드가 1개
    • 입출력 대기는 경량 프로세스 단위로 대기하기 때문에 완료까지 대기 X
    • thread pooling을 이용하여 1:1 매핑으로 오버헤드 줄일 수 있음
  3. thread pooling
    • 시스템이 관리하는 스레드의 pool을 이용
    • 즉, 미리 생성한 스레드를 재사용하여 생성 시간 줄임
    • 동시 생성 수에 제한을 두어 자원 소비 절약

용어 정리

  1. multiprocessing(다중 처리)
    • 프로세서 하나 이상이 서로 협력 (병렬 처리)
  2. multiprogramming(다중 프로그래밍)
    • 프로세서가 IO 응답 대기할 동안 다른 프로그램 실행할 수 있도록 하는 것
    • 프로세서 하나에서 프로세스 여럿을 교대로 수행
  3. multitasking(다중 작업)
    • 프로세서 하나에서 스케줄링에 따라 작업을 조금씩 번갈아 수행하는 것
    • 정해진 시간 동안 교대로 작업
    • 서로 자원 공유 X, 자원 전달에 별도의 IPC(Inter-Process Communication) 필요 → 메모리 독립적
  4. multithread(다중 스레드)
    • 프로세스 하나에서 스레드 복수를 동시에 실행
    • 스레드는 메모리 하나를 공유