[혼공단] 4주차_컴퓨터구조 + 운영체제

Algo rhythm·2024년 1월 22일
0

혼공단

목록 보기
7/13

1. 운영체제

1.1. 운영체제의 정의

  • 운영체제 : 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램
    • 응용 프로그램과 하드웨어 사이에서 사용자 영역에 적재된 응용 프로그램에 자원을 할당하여 응용 프로그램이 올바르게 실행되도록 돕는다.
    • 응용 프로그램이 부분별하게 자원에 접근하거나 자원을 사용하는 것을 방지
  • 시스템 자원(자원) : 프로그램이 실행되기 위해 필요한 모든 요소
  • 커널 영역 : 컴퓨터가 부팅될 때 동작하기 위해 메모리에 적재되는 영역, 운영체제가 적재되는 영역
  • 사용자 영역 :커널 영역을 제외한 사용자의 응용 프로그램이 적재되는 메모리 영역
    • 프로그램이 실행되기 위해선 메모리에 적재되어야 한다.
  • 응용 프로그램(application software) : 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램, 워드, 엑셀, 메모장 등등

1.2. 운영체제의 필요성

  • 운영체제를 이용하지 않고 개발을 진행한다면 하드웨어를 조작/관리하는 코드까지 작성해야 함.

1.3. 운영체제의 구성

1.3.1. 커널

  • 자동차의 엔진, 사람의 심장과 같은 역할을 한다.
  • 프로그램이 올바르고 안전하게 실행되게 하는 서비스를 제공

1.3.2. 사용자 인터페이스

  • 커널 외에 운영체제가 제공하는 서비스
  • 윈도우의 바탕화면처럼 사용자가 컴퓨터와 상호작용할 수 있는 통로

1.3.2.1. Graphic User Interface(GDI)

  • 윈도우, 스마트폰과 같은 화면 기반 상호작용

1.3.2.2. Command Line Interface(CLI)

  • 명령어 기반 상호작용

1.3.3. 이중 모드

  • 응용 프로그램이 부분별하게 자원에 접근하거나 자원을 사용하는 것을 방지

1.3.3.1. 사용자 모드

  • 운영체제 서비스를 제공받을 수 없는 실행 모드
  • 커널 영역의 코드 사용 불가
  • 일반적이 응용 프로그램이 실행되는 모드
  • CPU가 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어 실행 불가

1.3.3.2. 커널 모드

  • 운영체제 서비스 제공받기 가능
  • CPU가 하드웨어 자원에 접근/사용 등 모든 명령어 사용 가능
  • 사용자 모드에서 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받음
  • 시스템 호출(system call) : 운영체제 서비스를 제공받기 위한 요청
    • 소프트웨어적인 인터럽트
  • 소프트웨어 인터럽트 : 특정 명령어에 의해 발생하는 인터럽트

1.3.4. 운영체제의 핵심 서비스

  • 프로세스 관리, 자원 접근 및 할당, 파일 시스템 관리
  • 프로세스 : 실행 중인 프로그램
  • 일반적으로 cpu는 한번에 하나의 프로세스만을 실행시키기 때문에 많은 프로세스를 번갈아 가며 실행
  • 프로세스 동기화
  • 교착 상태 : 프로세스가 꼼짝도 못하고 더 이상 실행되지 못하는 상황

1.3.4.1. 자원 접근 및 할당

  • CPU - CPU 스케쥴링 : 실행할 프로세스의 순서를 정리하는 작업
  • 메모리
  • 입출력 장치

1.3.4.2. 파일 시스템 관리

  • 파일 열기, 생성, 삭제
  • 디렉토리 관리

1.4. 가상 머신

  • 소프트웨어적으로 만들어낸 가상 컴퓨터
  • 사용자 모드로 작동, 가상 머신상의 운영체제도 사용자 모드로 작동
  • 하이퍼 바이저 모드 : 가상 머신에서 운영체제 서비스를 받기위해 탄생함.

2. 프로세스

2.1. 프로세스

2.1.1. 프로세스 정의

  • 프로세스 : 메모리에 적재되어 실행된 프로그램
  • 포그라운드(foreground process) : 사용자가 보는 앞에서 실행되는 프로세스
  • 백그라운드 프로세스(background process) : 사용자가 보지 못하는 뒤편에서 실행되는 프로세스
    • 데몬/서비스 : 사용자와 직접 상호작용하지 않고 정해진 일만 수행하는 백그라운드 프로세스

2.1.2. 프로세스 제어 블록(Process Control Block)

  • 프로세스와 관련된 정보를 저장하는 자료 구조, 상품의 태그와 유사
  • 커널 영역에서 생성

2.1.2.1. 프로세스 제어 방법

  • 타이머 인터럽트를 통해 한정된 CPU 자원을 가지고 프로세스를 번갈아 실행
    • 타이머 인터럽트 : 프로세스에 부여된 시간만큼 CPU를 이용하고 다음 차례까지 대기
  • PCB를 통해 프로세스에 대한 정보를 확인하고 작업을 재개

2.1.2.2. PCB 기록

  • 프로세스 ID(PID) : 프로세스 식별을 위한 고유 번호
  • 레지스터 값 : PCB 안에 해당 프로세스가 실행하며 사용했던 프로그램 카운터 등을 레지스터에 기록
  • 프로세스 상태 : 현재 프로세스에 대한 상태 값, CPU 사용 대기 여부, CPU 이용 상태 여부 등
  • CPU 스케쥴링 정보 : 프로세스가 CPU를 언제 어떤 순서로 할당 받을 지에 대한 스케쥴 관리
  • 메모리 관리 정보 : 프로세스가 저장된 메모리 주소 정보, 베이스 레지스터, 한계 레지스터, 페이지 테이블 정보
  • 사용한 파일과 입출력장치 목록

2.1.2.3. 문맥 교환

  • 문맥 : 수행 중 CPU 사용 시간이 만료되어 추후 작업을 이어하기 위한 정보
  • 문맥 교환 : 기존의 프로세스 문맥을 PCB에 입력하고 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 복구하여 새로운 프로세스를 실행하는 것
  • 빈번한 문맥 교환은 오버헤드 야기 가능

2.1.3. 프로세스 메모리 영역

  • 사용자 영역에서의 프로세스의 배치

2.1.3.1. 코드 영역

  • 텍스트 영역 : 실행할 수 있는 코드, 기계어로 이루어진 명령어, 읽기 전용 공간
  • 정적 할당 영역 : 프로그램을 구성하는 명령어들이 갑자기 바뀌는 일이 없어 코드 영역의 크기가 변하지 않음

2.1.3.2. 데이터 영역

  • 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
  • 전역 변수
  • 정적 할당 영역 : 프로그램이 실행되는 동안에만 유지되는 데이터이기 때문에 크기가 고정된 영역

2.1.3.3. 힙 영역

  • 프로그래머가 직접 할당할 수 있는 저장 공간
  • 동적 할당 영역 : 크기가 가변하는 영역
  • 메모리 누수 : 할당된 메모리 공간을 반납하지 않고 계속 메모리 내에 남아 낭비되는 상태
  • 낮은 주소에서 높은 주소로 할당

2.1.3.4. 스택 영역

  • 데이터를 일시적으로 저장하는 공간
  • 동적 할당 영역 : 크기가 가변하는 영역
  • 매개 변수/지역 변수 : 함수 실행이 끝나면 사라진다.
  • 높은 주소에서 낮은 주소로 할당

2.2. 프로세스 상태와 계층

2.2.1. 프로세스 상태

  • 프로세스의 현재 상태를 표현
  • 생성 상태(new) : 프로세스를 생성 중인 상태 - 메모리에 적재되어 PCB를 할당받은 상태
  • 준비 상태(ready) : CPU를 할당받아 실행할 수 있으나 차례가 되지 않아 기다리는 상태
    • 디스패치(dispatch) : 준비 상태에서 실행 상태로 전환되는 것
  • 실행 상태(running) : CPU를 할당받아 실행 중인 상태 - 일정 시간 동안만 CPU를 할당 받아 실행
  • 대기 상태(blocked) : 프로세스 실행 중 입출력 작업 시, 입출력 작업의 처리속도와 CPU 내부의 처리속도가 차이로 인해 상호간의 작업 속도로를 맞춰주기 위해 잠시 입출력 작업이 끝날 때까지 기다려주는 상태
    • 입출력 작업 외에도, 특정 이벤트가 일어나길 기다릴 때 프로세스의 대기 상태
  • 종료 상태(terminated) : 프로세스가 종료된 상태.
    • 운영체제는 PCB와 프로스스가 사용한 메모리를 정리

2.2.2. 프로세스 계층 구조

  • 부모 프로세스(parent process) : 프로세스 실행 도중 시스템 호출을 통해 다른 프로세스를 생성한 프로세스
    • 부모 프로세스 = 시스템 호출 + 새 프로세스 생성
    • PPID(Paren Process ID) : 부모 프로세스 ID
  • 자식 프로세스(child process) : 부모 프로세스에 의해 생성된 프로세스
  • 자식 프로세스의 자식 프로세스 생성 가능
  • init/systemd/launchd : 최초의 프로세스, 모든 프로세스의 시작

2.2.3. 프로세스 생성 기법

  • 부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행
  • 복제(fork) : 일종의 시스템 호출
    • 복제(fork) : 시스템 호출을 통해 자신의 복제본인 자식 프로세스 생성
    • 부모 프레세스의 자원(메모리 내의 내용, 열린 파일 목록 등)을 상속
    • PID 값 및 저장된 메모리 위치는 다름
  • exec(옷 갈아입기) : 자신의 메모리 공간으로 새로운 프로그램으로 덮어쓰는 시스템 호출
    • 코드 영역과 데이터 영역의 내용이 실행할 프로그램의 내용으로 바뀌고, 나머지 영역은 초기화 됨
  • 자식 프로세스가 exec를 호출하지 않으면, 부모 프로세스와 자식 프로세스는 같은 코드를 병행하여 실행하는 프로세스가 됨

2.3. 확인문제

  • 프로세스 상태 다이어그램

3. 스레드

  • 스레드 : 프로세스를 구성하는 실행의 흐름 단위
  • 프로세스 내의 각기 다른 스레드 ID, 프로그램 카운터 값, 레지스터 값, 스택으로 구성
  • 위의 각기 다른 값을 가지고 있기 때문에 각기 다른 코드를 실행 가능
  • 실행에 필요한 최소한의 정보(프로그램 ㅏ운터, 레지스터, 스택)을 유지하고 프로세스 자원을 공유하며 실행

3.1. 단일 스레드 프로세스

  • 하나의 프로세스가 하나의 부분만을 실행하는 프로세스

3.2. 멀티 프로세스 & 멀티 스레드

3.2.1. 멀티 프로세스

  • 여러 프로세스를 동시에 실행

3.2.2. 멀티 스레드

  • 여러 스레드로 프로세스를 동시에 실행

3.2.3. 멀티 프로세스와 멀티 스레드의 차이

  • 가정 : "hollo, os"를 세번 출력하는 프로그램
  • 멀티 프로세스
    • 코드 영역, 데이터 영역, 힙 영역 등 동일한 자원이 사용됨 -> 메모리 낭비
    • 프로세스 간의 독립적은 실행으로 오류 발생 시 다른 프로세스에 영향 없음
  • 멀티 스레드
    • 하나의 프로세스가 소유한 자원을 여러 스레드가 공유, 협력 및 통신에 유리 -> 효율적인 작업 가능
    • 하나의 스레드에서 문제가 발생하면 프로세스 전체의 문제로 번질 수 있음

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

  • 프로세스 간의 자원을 공유하고 데이터를 주고 받는 것
  • 공유 메모리 : 프로세스 간의 메모리를 공유하는 영역을 두고 데이터를 주고 받는 메모리 영역

4. CPU 스케쥴링

4.1. CPU 스케줄링

  • 운영체제가 프로세스 간의 합리적이고 공정한 CPU 자원 배분

4.1.1. 프로세스 우선순위

  • 우선순위 : 입출력 작업이 많은 프로세스를 먼저 실행함
    • 입출력 집중 프로세스 : 비디오 재생, 디스크 백업 등 입출력 작업이 많은 프로세스(많은 입출력 버스트)
    • CPU 집중 프로세스 : 복잡한 수학 연산, 컴파일, 그래픽 처리 등 CPU 작업이 많은 프로세스(많은 CPU 버스트)
    • 대기시간 : 입출력 작업 > CPU 작업
    • 실행시간 : 입출력 작업 < CPU 작업
  • 따라서 입출력 작업을 먼저 수행하면 입출력 작업을 위해 대기하는 동안 CPU 작업을 수행할 수 있어 작업이 효율적이다.
  • CPU 버스트 : CPU를 이용하는 작업
  • I/O 버스트 : 입출력장치를 기다리는 작업(=입출력 버스트)

4.1.2. 스케줄링 큐

  • CPU를 사용하고자 하는 프로세스, 메모리에 적재되고 싶은 프로세스, 특정 입출력장치를 사용하고자 하는 프로세스 모두에 순서를 부여

4.1.2.1. 준비 큐

  • CPU를 이용하고 싶은 프로세스의 차레
  • 선입선출을 기본으로 하나 우선순위가 높은 프로세스를 우선 처리

4.1.2.2. 대기 큐

  • 입출력장치를 이용하고 싶은 프로세스 중 대기 상태에 접어든 프로세스의 차례

4.1.3. 선점형/비선점형 스케줄링

4.1.3.1. 선점형 스케줄링

  • 프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에 할당하는 방식
  • 장점 : 프로세스의 자원 독점을 막고 프로세스들에게 골고루 자원을 배분
  • 단점 : 문맥 교환 과정에서 오버헤들 발생

4.1.3.2. 비선점형 스케줄링

  • 하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까지 다른 프로세스가 끼어들 수 없는 스케줄링 방식
  • 장점 : 오버헤드 발생 적음
  • 단점 : 프로세스의 자원 독점, 선행 작업 종료시 까지 반드시 대기

4.2. CPU 스케줄링 알고리즘

4.2.1. 선입 선처리 알고리즘

  • FCFS 스케줄링(First Come First Scheduling)이라고도 함
  • 비선점형 스케줄링 방식
  • 호위효과(convoy effect) : a, b, c 프로세스 각각 17ms, 5ms, 2ms가 소요되는데 c 프로세스가 처리되기 위해 22ms를 대기해야하는 비효율적인 상황

4.2.2. 최단 작업 우선 스케줄링

  • SJF 스케줄링(Shortest Job First Scheduling) 이라고도 함
  • 선점형/비선점형 모두 구현 가능

4.2.3. 라운드 로빈 스케줄링

  • 선입 선처리 스케줄링에 타임 슬라이스 개념 추가
    • 타임 슬라이스 : 프로세스가 CPU를 사용할 수 있는 정해진 시간
  • 정해진 타임 슬라이스 만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링
  • 타임 슬라이스의 범위에 따라 선입 선처리 알고리즘이 되어 호위 효과가 발생하기도 하며, 빈번한 문맥 교환으로 오버헤드 발생 가능

4.2.4. 최소 잔여 시간 우선 스케줄링

  • SRT 스케줄링(Shortest Remaining Time)
  • 최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링
  • 타임 슬라이스만큼 CPU를 사용하되, CPU를 사용할 다음 프로세스를 남은 작업시간이 가장 적은 프로세스로 지정

4.2.5. 우선순위 스케줄링

  • 프로세스에 우선순위 부여, 가장 높은 우선순위 작업부터 처리
  • 기아(starvation) 현상 : 우선순위가 낮은 프로세스의 차례가 밀리는 현상
  • 보완 방안
    • 에이징 : 오래 대기한 프로세스에 우선순위를 높이는 기법

4.2.6. 다단계 큐 스케줄링

  • multilevel queue scheduling
  • 우선순위 별로 준비 큐를 여러 개 사용
  • 우선순위가 높은 프로세슬 별로 모인 준비 큐부터 처리하 후 다음 우선순위 큐에 있는 프로세스를 실행

4.2.7. 다단계 피드백 큐 스케줄링

  • 다단계 큐 스케줄링의 발전 형태
  • 낮은 우선순위의 큐에 발생할 기아현상을 보완
  • 큐와 큐 사이를 프로세스들이 이동 가능
  • 타임 슬라이스 동안 처리가 완료되지 않은 프로세스를 다음 우선선위의 큐로 보냄

4.3. 확인문제

  • A, B, C, D 순서로 프로세스가 들어왔을 때
    선입선출 알고리즘을 적용하면 A, B, C, D 순서로 프로세스를 처리
profile
배운 건 써 먹자

0개의 댓글