[혼공컴운] 4주차_ 운영체제1(with. 미션)

·2024년 1월 28일
0

컴퓨터공학

목록 보기
4/6
post-thumbnail

09. 운영체제 시작하기

운영체제의 역할

자원(시스템 자원, 리소스) : 프로그램 실행에 마땅히 필요한 요소

운영체제 : 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램

  • 커널 영역 : 운영체제가 적재되는 메모리 영역
  • 사용자 영역 : 사용자가 이용하는 응용 프로그램이 적재되는 영역

    응용 프로그램 (application software) :
    사용자가 특정 목적을 위해 사용하는 일반적인 프로그램. 일상적으로 사용하고 있는 워드프로세서, 인터넷 브라우저, 메모장 등

응용 프로그램에 자원을 효율적으로 배분하고, 실행할 프로그램들이 지켜야 할 규칙을 만들어 컴퓨터 시스템 전체를 관리한다.

만약, 운영체제가 없다면 개발자가 직접 하드웨어를 조작하는 코드를 작성해야한다.

구현한 프로그램은 하드웨어가 실행하고, 그 하드웨어를 조작하는 것은 운영체제이기 때문에, 운영체제로 현재 하드웨어의 상태, 코드가 어떻게 실행되었는지, 하드웨어 상에 어떤 문제가 있었는지에 대한 문제 해결의 실마리를 얻을 수 있다.

  • 소스 코드에 대한 오류 메시지

커널

운영제제의 핵심 기능을 담당

  • 커널이 아닌 것 : 사용자 인터페이스 - 컴퓨터와 상호작용하기 위한 통로일 뿐
    • 그래픽 유저 인터페이스 : 그래픽을 기반으로 컴퓨터와 상호작용
    • 커맨드 라인 인터페이스 : 명령어를 기반으로 컴퓨터와 상호작용

운영체제는 사용자가 실행하는 응용프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다.

운영체제를 통해서만 자원에 접근할 수 있으며, 문지기 역할을 한다.

이중모드

CPU가 명령어를 실행하는 모드를 두가지 모드로 구분

플래그 레지스터 속 슈퍼바이저 플래그를 통해 CPU가 어떤 모드인지 알 수 있다.

  • 커널 모드
    • 운영체제 서비스를 제공받을 수 있는 모드 (입출력 가능)
    • 자원에 접근하는 명령어를 비롯한 모든 명령어 실행 가능
  • 사용자 모드
    • 운영체제 서비스를 제공받을 수 없는 모드 (입출력 불가능)
    • 커널 영역의 코드를 실행할 수 없는 모드
    • 일반적인 응용 프로그램이 실행되는 모드

시스템호출(시스템 콜)

사용자 모드로 실행되는 프로그램이 자원에 접근하는 운영체제의 서비스를 제공받기 위해 커널 모드로 전환하는 방법

  • 소프트웨어 인터럽트
  • 커널 영역 내에 시스템 호출을 수행하는 코드를 실행 한뒤 기존에 실행하던 응용 프로그램으로 복귀하여 계속 실행 진행

  1. 응옹 프로그램에서의 작업(하드 디스크에 데이터를 저장)에 대한 시스템 호출을 발생시켜 커널 모드로전환
  2. 운영체제 내의 ‘응옹 프로그램에서의 작업에 대한 코드’(하드 디스크에 데이터를 저장하는 코드)를 실행함으로써 자원(하드디스크)에 접근가능
  3. 자원(하드디스크)에 접근이 끝났다면 다시 사용자 모드로 복귀하여 실행을 계속 해나감

운영체제 핵심 서비스

  • 프로세스 관리
    • 프로세스 : 실행 중인 프로그램
    • 일반적으로 하나의 CPU는 한 번에 하나의 프로세스만 실행할 수 있기 때문에 관리가 필요
  • 자원 접근 및 할당
    • CPU : 하나의 CPU는 한 번에 하나의 프로세스만 실행 가능, CPU 스케줄링
    • 메모리
    • 보조기억장치 & 입출력장치 : 인터럽트 서비스 루틴은 운영체제가 제공하는 기능으로 커널 영역에 존재
  • 파일 시스템 관리

10. 프로세스와 스레드

프로세스

프로그램은 실행되기 전에는 보조기억장치에 있는 데이터, 메모리에 적재하고 실행하는 순간 프로세스가 된다.

실행 중인 프로그램 (같은 프로그램도 별도의 프로세스가 될 수 있다.)

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

프로세스 제어 블록 (PCB)

모든 프로세스는 실행을 위해 CPU를 피료로 하지만 CPU 자원은 한정되어있다.

차례를 돌아가면서 CPU를 이용하고, 시간이 끝날떄 타이머 인터럽트가 발생하면 교체한다.

운영체제는 빠르게 번갈아 수행되는 프로세스의 실행 순서를 관리하고, 프로세스에 CPU를 비롯한 자원을 배분한다.

프로세스 제어 블록은 프로세스(PCB)와 관련된 정보를 커널 영역에 저장하는 자료구조이며, 운영체제는 이(PCB)를 통해 여러 프로세스를 관리한다

  • PID (PPID) : 프로세스 ID, 특정 프로세스를 식별하기 위해 부여하는 고유한 번호
    • 같은 일을 수행하는 프로그램이라도 두번 실행하면 다른 두개의 프로세스 생성
  • 레지스터 값 : 해당 프로세스가 실행하며 사용했던 프로그램 카운터를 비롯한 레지스터 값들이 담긴다.
  • 프로세스 상태 : 현재 프로세스의 상태
  • 스케줄링 정보 : 프로세스가 언제, 어떤 순서로 CPU를 할당 받을지에 대한 정보
  • 메모리 정보 : 프로세스마다 메모리에 저장된 위치가 다르다.
    • 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보(프로세스의 메모리 주소를 알 수 있는 정보) 담긴다.
  • 사용한 파일 정보
  • 입출력 장치 정보

문맥 교환

문맥(context) : 실행을 재개하기 위해 기억해야 할 정보

  • PCB에 기록되는 정보들을 문맥이라고 봐도 무당.

문맥 교환 : 여러 프로세스들이 번갈아 가면서 실행되는 원리

  • 문맥 교환이 자주 일어나면 프로세스가 그만큼 빨리 번갈아 수행되기에 프로세스가 동시에 실행되는 것처럼보임

    문맥 교환을 너무 자주하면 오버헤드 발생 가능. 좋은 것만은 아니다.

프로세스의 메모리 영역

프로세스가 생성되면 커널 영역에 PCB 생성

프로세스가 생성되면 사용자 영역에 크게 4가지로 나뉘어 배치된다.

  • 코드 영역(텍스트 영역)
    • 실행할 수 있는 코드, 기계어로 이루어진 명령어
    • 읽기전용 공간
  • 데이터 영역
    • 프로그램이 실행되는 동안 유지할 데이터
      (e.g. 전역 변수:프로그램이 실행되는 동안 유지되며, 프로그램 전체에서 접근할 수 있는 변수)
    • BSS 영역 : 프로그램 실행 동안 유지할 데이터 중 초기값이 없는 데이터
  • 힙 영역
    • 사용자(개발자)가 직접 할당 가능한 저장 공간
    • 프로그래밍 과정에서 할당했다면 언젠가는 해당 공간을 반환해야함 (자동으로 헤제 : 가비지 컬렉터 )
      : 더이상 해당 메모리 공간을 사용하지 않겠다.
      • 반환하지 않고 남아있을 경우 메모리 낭비 초래 = 메모리 누수(memory leak)
  • 스태 영역
    • 데이터를 일시적을 ㅗ저장하는 공간 (e.g. 매개변수, 지역변수)

주소 중복 방지

힙 영역 : 낮은 주소에서 높은 주소로 할당

스택 영역 : 높은 주소에서 낮은 주소로 할당

정적 할당 영역 : 코드 영역, 데이터 영역

동적 할당 영역 : 힙 영역, 스택 영역

프로세스 상태

운영체제는 프로세스의 상태를 PCB에 기록하여 관리한다.

대표 적인 프로세스 상태 :

  • 생성 상태 (new)
    • 프로세스 생성 중
    • 이제 막 메모리에 적재되어 PCBB를 할당 받은 상태
    • 생성 상태를 거쳐 준비상태가 되어 CPU할당을 기다린다.
  • 준비 상태 (ready)
    • 차례를 기다려 자신의 차례에서 CPU를 할당받아 실행 상태가 된다.
    • 디스패치 : 준비 상태인 프로세스를 실행 상태로 전환 시킨다.
  • 실행 상태 (running)
    • CPU를 할당받아 실행 중인 상태
    • 일정 시간동안만 CPU를 사용할 수 있으며,
      • 타이머 인터럽트가 발생하면 다시 준비 상태가 된다.
      • 입출력 장치를 사용한다면 입출력 장치의 작업을 기다리기위해 대기상태가 된다.
  • 대기 상태 (blocked)
    • 실행 도충 입출력 장기를 사용하면 입출력 장치의 작업을 기다리는 대기상태가 된다. 완료되면 준비상태로 CPU 할당을 기다린다.
    • 입출력 장치는 CPU에 비해 처리 속도가 느리기 때문에, 입출력 완료 인터럽트를 받을 때까지 기다려야한다.
  • 종료 상태 (terminated)
    • 프로세스가 종료된 상태
    • 프로세스가 종료되면 운영체제는 PCB와 프로세스가 사용한 메모리를 정리한다.

부모 프로세스 : 프로세스가 다른 프로세스를 생성한 경우 프로세스를 생성한 프로세스

자식프로세스 : 생성된 프로세스

프로세스 계층 구조

부모 프로세스 : 새 프로세스를 생성한 프로세스

자식 프로세스 : 부모 프로세스에 의해 생성된 프로세스

각기 다른 PID를 가진다.

일부 운영체제에서는 자식 프로세의 PCB에 부모 프로세스읜 PID인 PPID가 기록되기도한다.

사용자가 컴포트럴 켜고 로그인 창을 통해 성공적으로 로그인하여 bash 셸로 Vim이라는 문서 편집기 프로그램을 실행한다.

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

최초의 프로세스

PID가 항상 1번, 모든 프로세스의 최상단에 잇는 부모 프로세스

pstree 명령어를 통해 프로세스 걔층구조 확인 가능

  • 유닉스 운영체제 int
  • 리눅스 systemd
  • macOs launchd

프로세스 생성 기법

계층적 구조로 프로세스가 생성되는 원리

  • fork : 자기 자신 프로세스의 복사본을 자식 프로세스로 생성하는 시스템 호출
  • exec : 자신의 메모리 공간을 새로운 프로그램으로 덮어쓰는 시스템 호출
forkexec

fork 한 뒤에 부모 프로세스와 자식 프로세스가 exec를 호추하지 않을 경우, 부모/자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 된다.

쓰레드

  • 프로세스를 구성하는 실행 흐름 단위
  • 각기 다른 스레드 ID, 프로그램 카운터, 레지스터, 스택
단일 스레드 프로세스멀티 스레드 프로세스
모든 프로세스가 하나의 실행 흐름을 가지고 한 번에 하나의 부분만 실행되는 프로세스프로세스의 스레드들은 실행에 필요한 최소한 정보만을 유지한 채 프로세스 자원을 공유하며 실행된다.

멀티프로세스 : 여러 프로세스를 동시에 실행

멀티스레드 : 여러 스레드로 프로세스를 동시에 실행하는 것

세 개의 별도 프로세스 vs 스레드 세 개

  • 가장 주된 차이점은 자원 공유 여부
    • 프로세스 간에는 기본적으로 자원을 공유하지 않는다.
    • 스레드 간에는 프로세스의 자원을 공유한다.

멀티 프로세스멀티 스레드

멀티스레드 환경 : 프로세스의 자원을 공유할 경우, 하나으 ㅣ스레드에 문제가 생기면 프로세스 전체에 문제가 생길수 있다.

프로세스 간에도 자원 공유 가능

프로세스 간 통신 (IPC ;Inter -Process Communication)

  • 공유 메모리를 통한 통신
  • 파이프를 통한 통신
  • 네트워크 소켓을 통한 통신

11. CPU 스케줄링

모든 프로세스(및 스레드)는 실행되기 위해 CPU(자원)을 필요로 한다.
운영체제가 공정하고 합리적으로 CPU(자원)을 배분하는 방법을 CPU 스케줄링이라 한다.
CPU자원은 한정되어있으며 실행 중인 프로세스는 여러 개이다.
프로세스는 우선순위를 가지고 있고, 이는 PCB에 명시된다.

  • PRI, NI : 낮을수록 높은 우선순위

대부분 프로세스들은 CPU와 입출력 장치를 모두 사용하며 실행된다.

즉, 프로세스는 실행 상태오 ㅏ대기상태를 반복하며 실행된다.

우선순위의 차이를 보이는 대표적인 프로세스 유형으로는 입출력 집중 프로세스(I/O bound process)와 CPU 집중 프로세스(CPU bound process)가 존재한다.

  • 입출력 집중 프로세스 : 비디오 재생이나 디스크 백업 작업을 담당하는 프로세스와 같이 입출력 작업이 많은 프로세스
    • 실행 상태보다는 입출력을 위한 대기 상태에 더 많이 머무르게 된다.
  • CPU 집중 프로세스 : 복잡한 수학 연산, 컴파일, 그래픽 처리 작업을 담당하는 프로세스와 같이 CPU작업이 많은 프로세스
    • 대기 상태보다는 실행 상태에 더 많이 머무르게 된다.

스케줄링 큐

운영체제는 효율적인 스케줄링을 위해 스케줄링 큐를 사용한다.

  • 운영체제는 메모리로 새로 생성되는 프로세스, CPU를 이용하고싶은 프로세스, 특정 입출력 장치를 이용하고 싶은 프로세스들을 큐에 삽입항 하여 줄을 세우는 것을 말한다.

준비 큐 : CPU 할당을(이용하기위해) 기다리는 프로세스들을 위한 큐를 의미한다.
대기 큐 : 입출력 장치를 기다리는 프로세스들을 위한 큐를 의미한다.

  • 우선순위가 낮은 프로세스가 먼저 큐에 삽입되었어도, 우선순위가 높은 프로세스가 먼저 처리될 수 있다.

스케줄링 큐까지 반영한 프로세스 상태 다이어그램

선점형과 비선점형 스케줄링

선점형 스케줄링 : 프로세스가 이용 중인 자원을 빼앗을 수 있다. (타임아웃 기반 문맥 교환)

  • 현재 실행 중인 프로세스의 자원을 빼앗아 해당 프로세스에게 할당
  • 프로세스에 자원을 고루 할당 가능
  • 문맥 교환 과정의 오버헤드

비선점형 스케줄링 : 프로세스가 이용 중인 자원을 빼앗을 수 없다.

  • 현재 실행 중인 프로세스 실행이 끝날 때까지 해당 프로세스 대기
  • 고르지 않은 자원 분배
  • 문맥 교환 과정에서의 오버헤드 적음

4주차 미션

진도: Chapter 09 ~ 11
기본 미션: p. 304의 확인 문제 1번 풀고 인증하기
선택 미션: Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기

기본 미션 :p. 304의 확인 문제 1번 풀고 인증하기

선택 미션: Ch.11(11-2) 준비 큐에 A,B,C,D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당받는지 풀어보기

선입 선처리 스케줄링은 준비 큐에 삽입된 순서대로 프로세스들을 처리한다.
준비 큐에 A, B, C, D 순으로 삽입되었기 때문에 A, B, C, D 순서로 CPU를 할당 받게된다.

4주 회고

아 이번주는 사실 개인 프로젝트 기능 추가한다고 정말 시간을 많이 썼다.
그래도 혼공컴운은 잊지 않으려고 노력은했는데..크흠!

운영체제 학습 회고글에 개인프로젝트 내용이 웬말이냐 싶지만 너무 뿌듯해서 지금 따로 여기에다가 기록해놓고 싶었다.
혼공컴운 작성 글들도 보완작업을 시작해야겠다.

profile
성실하게

0개의 댓글