Written by coh at home

[혼공컴운] 4주차 본문

Etc/도서

[혼공컴운] 4주차

och 2024. 8. 2. 14:55

8장 입출력장치

8-1 장치컨트롤러와 장치드라이버

등장배경 : 각 입출력장치 별 데이터 전송 형식이나 속도(전송률)이 다름.

→ 장치 컨트롤러를 통해 이런 문제를 해결하자

장치컨트롤러

  • CPU와 입출력장치 통신중개와 오류검출 → 데이터 전송 형식 맞춰줌
  • 데이터 버퍼 → 전송률을 맞춰줌

장치 컨트롤러는 세 개의 레지스터를 갖는다.

데이터레지스터 → 버퍼역할

상태레지스터 → 상태정보

제어레지스터 → 수행할 제어정보와 명령 저장

장치드라이버

장치컨트롤러를 제어하는 프로그램. 즉, 장치컨트롤러가 하드웨어고 장치드라이버는 소프트웨어.

8-2 다양한 입출력 방법

장치컨트롤러와 CPU가 데이터를 주고받는 방식. 총 세가지 방식을 학습. 프로그램입출력, 인터럽트 기반 입출력, DMA 입출력.

프로그램 입출력

프로그램 명령어 중 입출력 함수를 만나면(System call) 장치컨트롤러와 상호작용하여 입출력.

e.g)

CPU:write() 함수 → 모니터 컨트롤러의 제어레지스터: 쓰기

모니터 → 상태레지스터 :준비완료

CPU → 상태레지스터 확인 후 데이터 레지스터 : 출력할 데이터

Q. CPU가 장치컨트롤러의 레지스터의 주소를 어떻게 알지?

→ 2가지 방식으로 파악. 메모리 맵 입출력과 고립형 입출력

메모리 맵 입출력

메모리에 접근하기위한 주소공간과 입출력 레지스터에 접근하는 주소공간을 하나의 주소공간으로 간주.

고립형 입출력

메모리 주소공간과 입출력 주소공간을 분리.

인터럽트 기반 입출력

CPU는 각 장치에게 요청을 하고 요청을 다하면 인터럽트 요청을 받게되는 방식.

만약 인터럽트 요청이 많다면 어떻게 해결해야할까?

→ 우선순위를 기준으로 판별

PIC는 여러 장치컨트롤러의 인터럽트 요청의 우선순위를 판별하여 CPU에게 전달한다

DMA입출력

프로그램입출력, 인터럽트입출력은 모두 CPU가 데이터 이동을 주관한다. 이는 CPU에 오버헤드가 발생할 수 있다. 따라서 입출력을 주관하는 하드웨어를 사용하자! → Direct Memory Access Controller 등장!

DMA에게 요청하면 입출력을 처리한 후 인터럽트 요청을 CPU에게 보냄으로서 역할이 끝났음을 알린다.

단, 이때 시스템버스에 따른 오버헤드가 있으므로 입출력버스를 따로 만들어서 시스템버스의 사용빈도를 줄이게 된다.

9장 OS

9-1 OS개요와 배우는 목적

운영체제 : 프로세스의 자원을 관리하고 올바르게 실행될 수 있도록 돕는 프로그램

메모리 = 커널영역 + 사용자영역. 운영체제는 시스템부팅 시 커널영역에서 실행된다.

왜 배우는가 : 운영체제를 이해해야 에러메세지를 이해하고 문제를 해결할 수 있다.

9-2 운영체제의 큰 그림

  1. 커널
  2. 이중모드, 시스템콜
  3. OS가 제공하는 서비스

3가지를 학습해보자

커널

운영체제의 핵심 서비스를 담당하는 부분.

단, 사용자 인터페이스 CLI, GUI는 커널이 담당하는 서비스가 아니다.

이중모드와 시스템콜

프로세스는 반드시 커널을 통해 자원을 요청해야한다. 따라서 커널을 이용하려면 시스템콜을 써야한다.

이중모드는 명령어 실행을 사용자모드와 커널모드로 구분하는 방식이다.

일반적인 애플리케이션은 사용자모드로 명령어가 실행되고 시스템콜을 처리할 때는 커널모드로 명령어가 실행된다.

시스템콜에 대해 조금 더 알아보자.

Signal함수를 사용하지 않아도 시스템콜 자체는 소프트웨어 인터럽트이다. 그래서 시스템콜을 처리할 때는 인터럽트를 처리하는 과정과 비슷하다.

1.작업을 벡업하고

2.인터럽트 서비스 루틴(시스템콜)을 실행하고

3.기존의 애플리케이션으로 복귀하게 된다.

OS의 핵심서비스

  • 프로세스 관리 : PCB, Dead Lock
  • 자원 관리 : CPU(Scheduling), Mem, I/O(시스템콜, 하드웨터 인터럽트 서비스 루틴)
  • 파일시스템 관리

++ 가상머신과 운영체제

가상화를 지원하는 CPU는 사용자모드, 커널모드, 가상머신을 위한 하이퍼바이저 모드가 있습니다.

따라서 가상머신에 설치된 운영체제는 하이퍼바이저 모드로 동작하여 Host OS로부터 커널을 제공받게 됩니다.

 

10장 프로세스

프로세스는 실행중인 프로그램입니다. 백그라운드 프로세스 중 사용자와 상호작용 할 수 없다면 데몬이라 부릅니다. cron프로세스가 이에 해당되겠네요.

10-1 프로세스 개요

PCB

프로세스와 관련된 정보 저장. 커널이 관리한다.

  • PID
  • register값 : 프로그램카운터, 각종레지스터 값들..!
  • 프로세스 상태 : ready, run, wait
  • CPU스케줄링정보
  • 메모리 정보 : 베이스레지스터, 한계레지스터, 페이지 테이블 정보
  • 사용한 파일과 입출력장치

Context Switching

프로세서가 실행할 프로그램을 변경할 때 PCB정보를 벡업하고 갈아끼우는 것을 의미.

프로세스와 메모리

하나의 프로세스는 코드, 데이터, 힙, 스택 영역을 메모리에 갖게 된다.

코드영역 : 기계어로된 명령어가 저장

데이터영역 : 전역변수가 저장. C로 따지면 static

힙영역 : 동적할당한 메모리가 저장.

스택영역 : 지역변수, 매개변수, 함수 호출 시 사용되는 공간

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

내가 들었던 강의의 교안을 가져왔다.

created

  • 메모리 할당 : active
  • 메모리 할당x : suspended

ready : processor 자원을 기다리고 있는 상태. 할당받으면 dispatch된다고 한다.

running

  • preemption : CPU자원을 뺏긴 상태
  • block : 입출력작업을 기다려야하는 상태.

asleep

  • wakeup: 작업 완료 시 인터럽트 요청을 받으면 ready Queue에 들어가게 된다.

프로세스 계층구조

프로세스는 fork()를 통해 자식 프로세스를 생성할 수 있다.

OS는 보통 이렇게 fork()를 통해 계층구조로 프로세스를 관리한다.

부팅 시 최초의 프로세스 → 자식프로세스들 생성 : 트리구조

e.g) 부팅 시 최초의 프로세스 → 로그인 프로세스 → bash쉘 → vim프로세스

프로세스 생성기법

fork() : 자식프로세스 생성 → 부모의 모든 것을 상속받는다. 단, PID나 베이스 레지스터 위치는 다르다.

exec() : 자신의 메모리 공간을 다른 프로그램으로 교체. 즉, 코드, 데이터영역은 실행할 프로그램. 힙, 스택은 초기화

e.g) bash쉘에서 ls명령어실행 → fork → exec (ls명령어) : ls 명령어를 실행하기 위한 자식프로세스를 생성한다!

즉, 프로세스 계층구조는 fork와 exec이 트리구조로 이루어져 있는 것.

프로세스간 통신

IPC (Inter-Process Communication) : 같은 컴퓨터 내의 서로 다른 프로세스나 스레드끼리 데이터를 주고받는 것.

  • 파일을 통한 통신 : hello.txt 에 쓰는 프로세스. 읽는 프로세스.
  • 메모리를 통한 통신 : 공유 메모리의 데이터를 통해 프로세스간 데이터 전달.
  • 소켓, 파이프를 통한 통신 : 파이프(|)를 통해 통신.

10-3 Thread

들어가기 앞서 5장의 내용을 리마인드 해보자.

코어 : 명령어 실행 부품

하드웨어 스레드 : 코어가 한번에 처리할 수 있는 명령어의 수

멀티코어 : 코어가 여러개

멀티스레드 프로세서 : 하나의 코어가 동시에 처리할 수 있는 명령어의 수


소프트웨어 스레드 : 프로세스에서 실행의 단위. 즉, 프로세스를 구성하는 여러 명령어를 동시에 처리한다.

우리는 소프트웨어 스레드를 배우며 보통 스레드라 하면 소프트웨어적 스레드를 의미한다.

스레드는 프로세스의 자원(힙, 코드, 데이터)을 공유한다. 스레드는 각각 TID, 프로그램카운터 같은 레지스터값, 스택으로 구성된다.

11 스케줄링

CPU자원을 프로세스에게 어떻게 배분할 것인가.

11-1 우선순위

프로세스의 우선순위는 어떻게 매길 수 있을까?

보통 입출력작업은 대기 상태로 자주 들어가게 되므로 우선순위가 높습니다. 그 외에도 실시간 프로세스, 일부 벡그라운드 프로세스도 우선순위가 높습니다.

PCB에 우선순위를 명시하고 먼저 처리할 프로세스 결정.

스케줄링 큐

매번 실행할 때마다 PCB를 확인해서 우선순위를 확인하는 것은 비용이 많이 든다.

  • Ready Queue : CPU자원 사용 큐
  • Waiting Queue : 입출력관련 인터럽트를 기다리는 큐
    • 특정IO Queue : 입출력관련 자원을 사용해야하는 큐 e.g)프린트큐, 하드디스크큐

특징

  1. 큐는 FIFO지만 우선순위에 따라 먼저 처리되는 PCB가 있을 수 있다.
  2. 입출력이 완료되어 완료 인터럽트가 발생하면 Waiting Queue의 PCB를 Ready Queue로 이동시킨다.

선점형과 비선점형

선점형 (preemptive) : OS가 CPU를 뺏어서 급한 거 먼저 할당 가능한 스케줄링

  • 자원의 독점을 방지
  • Context Swtiching 비용 높다

비선점형 (non-preemptive) : 프로세스가 종료되거나 대기상태로 가기 전까지 기다려야하는 스케줄링

  • 자원 독점 문제
  • Context Swtiching 비용 낮다

대부분의 OS는 선점형을 사용.

11-2 스케줄링 알고리즘

알고리즘의 아이디어에 집중하자.

FCFS Scheduler(First Come First Served)

먼저 Queue에 들어온 작업부터 처리

  • 비선점형
  • 호위효과 (Convoy Effect) : 금방 끝날 수 있는 작업이 오래기다려야하는 현상.

SJF(Shortest Job First)

가장 짧은 작업시간부터 처리

  • 비선점형

RR(Round Robin)

정해진 타임슬라이스만큼 작업을 수행. 타임슬라이스의 크기가 크다면 호위효과, 작다면 Context switching 오버헤드가 커진다.

  • 선점형

SRT (Shortest Remaining Time)

RR + SJF. 즉, 가장 짧은 것부터 타임슬라이스만큼 동작시킨다.

우선순위 스케줄링 (Priority)

높은 우선순위부터 처리한다. SRT, SJF가 넓은 범위에서 우선순위 스케줄러이다.

  • 기아현상(starvation) : CPU자원이 할당되지 못하는 작업 발생 가능.

→ 에이징 기법으로 처리 가능 (대기중인 프로세스의 우선순위를 증가시킨다)

Multilevel queue 다단계 큐

우선순위 스케줄러의 발전된 형태. 우선순위별로 큐들을 사용해서 높은 우선순위큐부터 처리한다.

큐별로 다양한 스케줄링을 적용가능하다.

  • 기아현상

Multilevel Feedback Queue 다단계 피드백큐

다단계 큐의 발전된 형태. 기아현상을 해결. 프로세스가 큐 사이를 이동 가능하게 한다. 가장 일반적인 CPU 스케줄링 알고리즘

CPU오래 사용해야하는 프로세스는 점차 낮은 순위로!

너무 오래 기다리는 프로세스는 에이징 기법으로 높은 순위로!

 

숙제

304페이지 1.생성 2.준비 3.실행 4.종료 5.대기

추가숙제

FCFS를 적용하면 ABCD순으로 처리됩니다.

'Etc > 도서' 카테고리의 다른 글

[혼공컴운]6주차 가상메모리와 파일시스템  (0) 2024.08.14
[혼공컴운]5주차 동기화와 교착상태  (0) 2024.08.05
[혼공컴운] 3주차  (3) 2024.07.21
[혼공컴운] 2주차  (0) 2024.07.15
[혼공컴운]1주차 정리  (0) 2024.07.07