9장 운영체제 시작하기

prana·2024년 1월 15일
0

chapter 09 운영체제 시작하기

09-1 운영체제를 알아야 하는 이유

운영체제

  • 모든 프로그램은 하드웨어를 필요로 함

  • 시스템 자원, 자원: 프로그램 실행에 마땅히 필요한 요소들 가리킴

    • ex) CPU, 메모리, 보조기억장치, 입출력장치 등 모든 컴퓨터 부품들
    • 모든 프로그램들은 실행되기 위해 반드시 자원 필요하다.
  • 😋운영체제: 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램

  • 운영체제 또한 프로그램과 마찬가지로 메모리에 적재되어야 한다.

  • 메모리 내 커널 영역에 따로 적재되어 실행된다.

  • 사용자 영역: 응용 프로그램 적재되는 영역

운영체제는 커널 영역에 적재되어, 사용자 영역에 적재된 프로그램들에 자원을 할당, 올바르게 실행되도록 돕는다.

  • 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당,
  • 응용 프로그램이 올바르게 실행되도록 관리하는 역할
  • 내가 만든 프로그램은 결국 하드웨어가 실행하고, 그 하드웨어를 조작하는 프로그램이 운영체제이다.
  • 그래서 운영체제는 내 프로그램이 하드웨어 상에서 어떻게 작동하는지 먼저 잘 알고 있다.

09-2 운영체제의 큰 그림

  1. 커널
  2. 이중 모드와 시스템 호출
  3. 운영체제가 응용 프로그램에 제공하는 서비스 종류
  • 운영체제: 사용자가 실행하는 응용 프로그램을 올바르게 실행되도록 돕고 필요한 자원을 할당해주는 프로그램
  • 커널: 운영체제의 핵심 기능
  • 커널에 포함되지 않는 서비스 -> 사용자 인터페이스
    • ex) 윈도우 바탕화면
    • 사용자가 컴퓨터와 상호작용할 수 있는 통로

이중 모드와 시스템 호출

  • 운영체제는 응용 프로그램의 자원 접근을 대행하는 일종의 문지기 역할

  • 이중 모드(dual mode): CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 / 커널 모드로 구분하는 방식

    • 사용자 모드
      • 운영체제 서비스를 제공받을 수 없는 실행 모드
      • 커널 영역의 코드를 실행할 수 없는 모드
      • CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다.

    • 커널 모드
      • 운영체제 서비스를 제공받을 수 있는 실행 모드
      • 커널 영역의 코드 실행할 수 있는 모드
      • CPU가 커널 모드로 명령어를 실행하면, 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다.
  • 시스템 호출(시스템 콜): 사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면
    시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받는다.

  • 소프트웨어 인터럽트: 인터럽트를 발생시키는 특정 명령어에 의해 발생하기도 한다.

    1. 시스템 호출을 발생시키는 명령어 실행
    2. CPU는 지금까지의 작업 백업
    3. 커널 영역 내 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴) 실행
    4. 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행 계속

운영 체제의 핵심 서비스

  • 프로세스 관리

    • 실행 중인 프로그램
  • 자원 접근 및 할당

    • 모든 프로세스는 실행을 위해 자원을 필요로 함
    • 운영체제는 프로세스들이 사용할 자원에 접근하고 조작함으로써 프로세스에 필요한 자원을 할당해줌
    • CPU, 메모리, 보조기억장치, 입출력장치
    • 프로세스 동기화(12장), 교착상태(13장)
  • CPU(11장)

    • 메모리에는 여러 프로세스 적재, 하나의 CPU에 한 번에 하나의 프로세스만 실행
    • CPU 스케줄링: 프로세스들에 공정하게 CPU를 할당하기 위해 결정
  • 메모리(14장)

    • 운영체제는 새로운 프로세스가 적재될 때마다 어느 주소에 적재해야 할지를 결정
  • 입출력장치

    • 입출력장치가 CPU에 하드웨어 인터럽트 요청 신호를 보내면 CPU는 하던 일을 잠시 백업한 뒤, 커널 영역에 있는 인터럽트 서비스 루틴을 실행

    • 인터럽트 서비스 루틴을 제공함으로써 입출력 작업을 수행한다.

  • 파일 시스템 관리(15장)

정리

  • 커널: 운영 체제의 핵심 서비스 제공하는 부분
  • 사용자 프로세스가 커널의 서비스를 제공받기 위해서는, 사용자 모드에서 커널 영역으로 전환, 이는 시스템 호출을 통해 이루어진다.
    • 커널의 대표적인 서비스
      • 프로세스 관리
      • 자원 접근 및 할당
      • 파일 시스템 관리
  • 가상 머신: 소프트웨어적으로 만들어낸 가상 컴퓨터
    • 새로운 운영체제와 응용 프로그램 설치하고 실행할 수 있다.
    • 가상화 지원하는 CPU는 커널 모드와 사용자 모드 이외에 가상머신을 위한 모드인 하이퍼바이저 모드를 따로 둔다.

  • 가상 머신 상에서 작동하는 응용 프로그램들은 하이퍼바이저 모드로써 가상 머신에 설치된 운영체제로부터 운영 체제 서비스를 받을 수 있게 된다.

Chapter 10 프로세스와 스레드

10-1 프로세스 개요

  • 프로세스
  • 프로세스 제어 블록
  • 문맥 교환
  • 프로세스 사용자 영역
  • 프로세스: 실행 중인 프로그램
    • 프로그램 실행 전: 보조기억 장치에 있는 데이터 덩어리
    • 보조기억 장치에 저장된 프로그램을 메모리에 적재, 실행하는 순간 프로그램은 프로세스가 된다.

프로세스 직접 확인하기

  • [윈도우]-[작업 관리자]-[프로세스]

  • 유닉스 운영체제: ps

  • 포어그라운드 프로세스: 사용자가 보는 앞에서 실행되는 프로세스

  • 백 그라운드 프로세스: 사용자가 보지 못하는 뒤에서 실행

    • 유닉스 운영체제에서의 데몬 : 사용자와 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스
    • 윈도우 운영체제에서의 서비스: 위 내용과 동일

프로세스 제어 블록

  • CPU자원은 한정적이다.
  • 운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.
    • 운영체제는 프로세스 제어 블록(PCB)을 이용한다.
      • 프로세스와 관련된 정보를 저장하는 자료구조
      • PCB는 커널 영역에 생성
      • PCB로 특정 프로세스를 식별, 해당 프로세스를 처리하는 데 필요한 정보를 판단한다.
      • 프로세스 생성 시에 만들어지고, 실행이 끝나면 폐기된다.
  • PCB에 담기는 정보들
    • 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
    • 레지스터 값
    • 프로세스 상태(11장): 현재 프로세스가 어떤 상태인지도 기록
    • CPU 스케줄링 정보: 프로세스가 언제, 어떤 순서로 CPU를 할당 받을지에 대한 정보
    • 메모리 관리 정보: 어느 주소에 저장되어있는지에 대한 정보가 있어야 한다.
      • 베이스 레지스터
      • 한계 레지스터
      • 페이지 테이블 정보도 PCB에 담김(14장)
    • 사용한 파일과 입출력장치 목록

문맥교환

  • 문맥(context): 하나의 프로세스 수행을 재개하기 위해 기억해야 할 정보

    • 하나의 프로세스 문맥은 해당 프로세스 PCB에 표현되어 있다.
    • 실행 문맥을 잘 기억해두면, 언제든 해당 프로세스의 실행을 재개할 수 있게 된다.
  • 문맥교환(context switching) : 기존 프로세스의 문맥을 PCB에 백업, 새로운 프로세스를 실행하는 것

프로세스의 메모리 영역

  • 커널 영역

    • PCB
  • 사용자 영역

    • 코드 영역: 텍스트 영역

      • 기계어로 이루어진 명령어가 저장
      • 쓰기가 금지(CPU가 실행할 명령어가 담겨있음), 읽기 전용
    • 데이터 영역: 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간

      • 전역변수(12장): 프로그램이 실행되는 동안 유지, 프로그램 전체에서 접근할 수 있는 변수

        👨정적 할당 영역: 코드 영역, 데이터 영역
        👩‍🦰 동적 할당 영역: 힙, 스택 영역

    • 힙 영역

      • 프로그래머가 직접 할당할 수 있는 저장 공간
      • 프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면, 언젠가는 해당 공간을 반환해야 한다.
      • 더 이상 해당 메모리 공간을 사용하지 않겠다고 운영체제에 말함
      • 반환하지 않으면 메모리 누수문제 발생
    • 스택 영역

      • 데이터를 일시적으로 저장하는 공간
        • 매개변수, 지역변수
        • 저장할 데이터: PUSH, 더이상 필요하지 않은 데이터는 POP
  • 힙 영역: 메모리의 낮은 주소에서 높은 주소로 할당
  • 스택 영역: 높은 주소에서 낮은 주소로 할당

10-2 프로세스 상태와 계층구조

프로세스 상태

  • 생성 상태(new): 막 메모리에 적재되어 PCB를 할당받은 상태

    • CPU의 할당을 기다림
  • 준비 상태(ready): 차례가 되면 CPU 할당받아 실행 상태가 됨

    • 실행상태로 전환되는 것을 dispatch디스패치라고 한다.
  • 실행상태(running)

    • CPU를 할당받아 실행 중인 상태

    • 할당된 일정 시간 동안만 PCU 사용

    • 모두 사용하게 되면(타이머 인터럽트 발생하면) 다시 준비 상태가 되고, 실행 도중 입출력 장치를 이용하여 입출력 장치의 작업 끝날 때까지 기다려야 한다면 대기 상태가 된다.

  • 대기 상태(blocked): 프로세스는 실행 도중 입출력 장치를 사용하는 경우가 있다.

    • CPU에 비해 처리 속도가 느리기에, 프로세스는 입출력장치가 입출력을 끝낼 때까지(입출력 완료 인터럽트 받을 때까지) 기다려야 한다.
    • 입출력 장치의 작업을 기다리는 상태
    • 특정 이벤트가 일어나길 기다랠 때 프로세스는 대기상태가 된다. 👉 대부분의 원인이 입출력 작업
  • 종료 상태(terminated): 프로세스 종료

    • 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.
  • 프로세스 상태 다이어그램

  • 프로세스는 생성, 준비, 실행, 대기, 종료 상태를 거치며 실행된다.

프로세스 계층 구조

  • 부모 프로세스: 새 프로세스를 생성
    • (일부 운영체제에서 PPID가 자식 프로세스의 PCB에 기록되기도 함)
    • 자식 프로세스: 부모 프로세스에 의해 생성된 프로세스
    • 서로 각기 다른 PID
  • 데몬이나 서비스 또한 최초 프로세스의 자식 프로세스이다.
  • 최초의 프로세스
    • 유닉스 운영체제: init
    • 리눅스 운영체제: systemd
    • mac OS : launchd
    • 최초의 PID는 항상 1번.

프로세스 생성 기법

  • 부모 프로세스가 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행

  • 부모 프로세스르 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기

  • 부모 프로세스는 fork 통해 자신의 복사본을 자식 프로세스로 생성

  • 만들어진 복사본(자식 프로세스)은 exec를 통해 자신의 메모리 공간을 다른 프로그램으로 교체

  • fork와 exec 는 시스템 호출

    • 부모 프로세스의 자원들: 메모리 내 내용, 열린 파일 목록 등 자식 프로세스에 상속됨.
  • 부모 프로세스로부터 자식 프로세스가 복사(fork)

  • 자식 프로세스는 새로운 프로그램으로 옷을 갈아입고

    • 자식 프로세스로부터 자식 프로세스가 복사
    • 옷을 갈아입고
    • 여러 프로세스가 계층적으로 실행

  • 1) 생성 2) 준비 3) 실행 4) 종료 5) 대기

  • 로그인 프로세스

  • vim 프로세스

  • bash 프로세스

  1. 1
  2. 4

10-3 스레드

  • 스레드(thread) : 실행의 단위
  • 프로세스 구성하는 실행의 흐름 단위
  • 하나의 프로세스는 여러 개의 스레드를 가질 수 있다.
  • 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에
    실행할 수 있다.

프로세스와 스레드

  • 단일 스레드 프로세스

  • 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스를 가정


  • 스레드

  • 멀티 스레드 프로세스

  • 프로세스를 구성하는 실행 단위

    • 프로세스 내 각기 다른 스레드 ID, 프로그램 카운터 값을 비롯한 레지스터 값, 스택으로 구성된다.
  • 각자 프로그램 카운터 값을 비롯한 레지스터 값, 스택을 가지고 있기에 스레드마다 각기 다른 코드를 실행할 수 있다.

  • 프로세스의 스레드들은 실행에 필요한 최소한의 정보(프로그램 카운터를 포함한 레지스터, 스택)만을 유지한 채 프로세스 자원을 공유하며 실행된다는 것이다.
  • 프로세스의 자원을 공유: 스레드의 핵심

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

  • 컴퓨터는 실행 과정에서 여러 프로세스가 동시에 실행, 프로세스를 이루는 스레드는 여러 개 있을 수 있다.

    • 여러 프로세스를 동시에 실행 : 멀티프로세스
    • 여러 스레드로 프로세스를 동시에 실행하는 것을 멀티스레드
  • 프로세스끼리는 기본적으로 자원을 공유하지 않지만, 스레드끼리는 같은 프로세스 내 자원을 공유한다는 점이다.

    • 동일한 프로세스 두 개 동시에 실행하면..
    • PID, 저장된 메모리 주소를 제외하면 모든 것이 동일한 프로세스 두 개가 통째로 메모리에 적재된다.
  • 같은 프로세스 내 모든 스레드는 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하고, 열린 파일과 같은 프로세스 자원을 공유한다.

프로세스 간 통신

  • 프로세스끼리도 충분히 자원을 공유, 데이터를 주고받을 수 있다.
  • IPC; Inter-Process Communication
  • 같은 컴퓨터 내의 서로 다른 프로세스나 스레드끼리 데이터를 주고받는 것도 통신으로 간주한다.
    • 파일을 통한 프로세스 간 통신
  • 공유 메모리: 프로세스들이 공유할 수 있는 메모리 영역
    • 데이터를 주고받음
  • 이 외에도 소켓, 파이프 등을 통해 통신할 수 있다.

315p
1. 2

  • 프로세스 내 스레드들은 각기 다른 코드/데이터/힙 영역을 가지고 있지 않습니다.
  1. 공유하지 않지만, 공유합니다.

0개의 댓글