Post

데브코스 TIL - CS 파트2

1. 컴퓨터 구조의 설계와 구현

✅ 컴퓨터 하드웨어의 구성

  • 중앙처리장치: CPU (central processing unit)
  • 주기억장치: Memory (RAN/ROM)
  • 보조기억장치: Storage (HDD,SDD, optical discs …)
  • 입출력장치: I/O Devices (keyboard, mouse, display, printer, networks …)

🔍 중앙처리장치 (CPU)

  • 제어장치: 명령어를 해석하여 그 실행에 필요한 제어 신호를 발생시킴
  • ALU(산술 논리 연산 장치): 산술 및 논리 연산 등을 수행
  • CPU 내부 버스: 연산 대상을 잠시 저장해두는 곳
  • 레지스터: 연산의 대상 및 연산 결과 등을 저장

🔍 ISA (Instruction Set Architecture)

  • 마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 명령어들의 집합 (기계어 명령어)
  • 중앙처리장치가 표현할 수 있는 자료형 정의
  • 중앙처리장치에 명령할 수 있는 기계어 명령어들의 종류 정의
  • 주소지정법 (addressing modes) 정의

기계어는 사람이 알아보기 불편하므로 주로 어셈블리(assembly)로 표현

※마이크로 아키텍처 (Microarchitecture)” 명령어 집합 구조를 물리적으로 구현한 것

🔍 명령어 기능 및 종류

1. 산술 및 논리 연산 명령

  • ADD, SUB, MUL, DIV …
  • AND, OR, NOT …

2. 데이터 전송 명령

  • 레지스터/메모리/입출력장치 사이에 데이터 전송

3. 실행 제어 명령

  • 프로그램의 실행을 순차(메모리에 저장되어 있는 순서)에서 벗어나 다른 곳으로 옮김
  • 브랜치: 조건을 검사하고, 실행 조건이 만족할 때 실행조건이 변경되는 컨디션
  • 점프: 언컨디션 브랜치

4. 기타

  • 인터럽트 제어
  • 명령어 실행 권한을 변경

✅ CISC vs RISC

서로 다른 설계 철학으로 만들어진 아키텍처

🔍 CISC (Complex Instruction Set Computing)

  • intel
  • 여러 동작을 한꺼번에 할 수 있는 여러 가지 명령어들을 제공 (명령어 하나가 하는 일이 많음)
  • 명령어들의 형식과 길이가 다양하고, 주소 지정 방식도 다양
  • 주로 마이크로프로그램 제어 방식의 프로세서로 구성

🔍 RISC (Reduced Instruction Set Computing)

  • ARM
  • 고정된 길이의 최소 종류의 명령어들을 제공
  • 주소 지정 방식 최소화, Load/Store 방식의 메모리 접근 (연산하는 명령어 제공X)
  • 한 클록 사이클에 하나의 명령을 실행할 수 있도록 설계 (처리 속도가 빠름)
※ 클록 사이클: 컴퓨터 시스템에서 기본적인 작업 단위 (CPU가 명령어를 실행하는데 걸리는 시간)

✅ 명령어 파이프라인 (Instruction Pipeline)

모든 명령어의 실행을 동일한 단계들로 나누고, 한 클록 사이클에 한 단계씩 진행하도록 하여 동시에 여러 명령어들의 서로 다른 단계를 실행

https://upload.wikimedia.org/wikipedia/commons/2/21/Fivestagespipeline.png

출처: 위키백과
  • 녹색으로 칠해진 단계에서는 서로 다른 스테이지를 실행
  • 기대 효과: 이론적으로는 5배의 성능 개선을 얻을 수 있음

🔍명령어 파이프라인 5단계

  1. Instruction Fetch
  2. Instruction Decode
  3. EXecute
  4. MEMory access
  5. WriteBack

✅ 기억장치(Memory) 구성

메모리 계층 구조 (memory hierarchy) 구성

🔍 메모리 계층 구조 (memory hierarchy)

https://i.namu.wiki/i/GyXRIJaA01JkmhNu-JWF3bk7TUy5UIb7v_VnDjTPM3KlSQwdCKN0boin8T1wuR-3mYqhiIfftzHIQbCuVMucIikwZCYgvciatJYh3hsVkP9nfp2k0hCerKcVMD7al0-aCp3HKSvwNcoIBrH4ffkryw.webp

출처: 나무위키
  • 상단에 위치한 것일수록 크기가 작음
  • 상단으로 올라갈수록 접근속도가 빠름
  • 하단으로 내려갈수록 비트당 비용이 낮음

🔍 메모리 주소 공간

메모리 내의 매 바이트마다 독립된 주소를 부여하는 것이 일반적

https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Virtual_address_space_and_physical_address_space_relationship.svg/1024px-Virtual_address_space_and_physical_address_space_relationship.svg.png

출처: 위키백과

2. 프로그램의 번역과 실행

✅ 프로그래밍 언어의 분류

크게 고수준 프로그래밍 언어, 어셈블리, 기계어로 구분

  • 고수준 프로그래밍언어에 가까울수록 복잡한 설계와 소프트웨어 상호작용을 표현하기에 적합하며 하드웨어 의존성이 낮음(최소)
  • 기계어에 가까울수록 하드웨어에 특화된 프로그래밍 가능

🔍 고수준 프로그래밍 언어

  • C++, Java, Python

🔍 어셈블리(Assembly)

  • 기계어를 1:1로 사람이 알아볼만한 기호로 표현

🔍 기계어 (Machine language)

  • 기계어(CPU)가 바로 이해할 수 있는 언어

✅ 프로그램 번역

원시코드를 목적 코드로 번역 (시스템 소프웨어가 담당)

✅ 프로그램 번역 단계

원시코드 → 어셈블리 코드 → 목적코드

🔍 원시코드

  • 고수준 프로그래밍 언어 이용
  • 프로그래머가 작성
  • 어느 기계에 실행할지에 따라 크게 다르지 않음

🔍 원시코드 → 어셈블리 코드

  • 프로그래밍 언어에 따라 다른 번역기 사용
  • 구문 구조를 해석하고 특정 기계를 대상으로 어셈블리 코드 생성

🔍 어셈블리 코드 → 목적코드

  • 어셈블러에 의하여 1:1로 번역됨

🔍 목적코드

  • 기계가 이해할 수 있는 명령어들의 집합
  • 0과 1만으로 이루어진 코드 나열
  • 서로 다른 컴퓨터에서 다르게 표현됨

✅ 프로그램 번역/실행 모델

프로그래머가 코드를 작성하면, 컴퓨터 하드웨어가 코드를 실행

🔍 컴파일러

컴파일러방식

  • 실행하기 이전에 번역
  • 번역을 실행 이전에 하므로 코드를 최적화할 수 있음
  • 코드 실행의 효율이 높음

🔍 인터프리터

인터프리터방식

  • 런타임때 번역
  • 다른 컴퓨터로 옮겨서 실행하는 것이 편리
  • 대화형 개발이 가능

🔍 가상기계를 이용한 모델

가상기계방식

  • 동일한 바이트 코드를 실행할 수 있는 가상기계를 이용하는 방식
  • 컴파일러 방식과 인터프리터 방식의 장점을 사용하려는 의도
  • 컴파일러에 의하여 코드 최적화가 가능하며 실행 효율이 높음
  • 동일한 모델의 가상기계를 사용하는 모든 컴퓨터에서 실행 가능
  • 자바나 파이썬에서 이용

🔍 컴파일러와 링커/로더

컴파일러와링커로더

💡 링커 (linker)

  • 보통 컴파일러와 함께 실행됨 (눈에 잘 보이지는 않음)
  • 적재 가능한 모듈을 만들어내는 것 (코드 엮기)
  • 여러 덩어리의 목적 코드를 연결
  • 서로 다른 모듈 사이의 주소 상호 참조를 해결

💡 로더 (loader)

  • 운영체제의 일부로서 프로그램 실행을 담당
  • 적재 가능한 모듈을 실행하는 것
  • 프로그램 파일을 저장장치로부터 메모리에 적재
  • 동적 적재 문제도 해결
※ 동적 적재 문제: 필요할 때 가져다가 실행

3. 운영체제의 역할과 구조

✅ 소프트웨어 분류

소프트웨어는 크게 시스템 소프트웨어, 응용 소프트웨어로 구분

🔍 시스템 소프트웨어

  • 컴퓨터 시스템을 운영하거나 소프트웨어 개발을 지원하는 데 이용되는 소프트웨어 모음
  • 운영체제 (operating system)
  • 컴파일러 (compiler)
  • 링커/로더 (linker/loader)
  • 라이브러리 (library)
  • 시스템 운용 도구들

🔍 응용 소프트웨어

  • 컴퓨터 시스템이 응용될 분야에 따른 기능을 수행하도록 만들어진 소프트웨어
  • 워드 프로세서 (word processor)
  • 스프레드 시트 (spreadsheet)
  • 웹 브라우저 (web browser)
  • 게임 (game)

✅ 운영체제

컴퓨터 시스템이 살아가기 위하여 반드시 필요한 소프트웨어

✅ 운영체제의 역할

1. 컴퓨터 시스템 자원을 관리 (메인)

프로세스 관리, 메모리 공간 관리, 입출력 장치 관리, 파일 시스템 관리 등

2. 사용자에게 시스템 자원을 활용할 수 있는 기능 제공

응용프로그램이 효율적으로 사용할 수 있도록 관리 (자원 배분)

  • 단일 사용자 시스템의 경우, 다소 간단
  • 다중 사용자 시스템의 경우, 다소 복잡

✅ 운영체제의 종류

윈도우, 리눅스, macOS, UNIX, iOS, 안드로이드

✅ 운영체제의 분류 기준

1. 운용 대상 시스템의 종류는?

  • 범용 (general purpose)
  • 내장형 (embedded)

2. 여러 사용자들에게 서비스를 제공하는가?

  • 단일 사용자 (single-user)
  • 다중 사용자 (multi-user)

3. 여러 개의 중앙처리장치로 이루어진 시스템을 지원하는가?

  • 단일 프로세서 (uniprocessor)
  • 다중 프로세서 (multiprocessor)

4. 어떤 방식으로 복수의 작업을 수행하는가?

  • 시분할 방식 (batch processing)
  • 다중 프로그래밍 (multiprogramming)

✅ 운영체제 커널 (kernel)

운영체제의 핵심 부분에 위치 (core)

  • 시스템의 모든 측면에 대한 완전한 권한을 가지고 있음
  • 사용자 간 충돌 또는 침해로부터 보호
  • 효율적이면서 공정한 자원 공유를 담당
  • 시스템의 하드웨어 및 소프트웨어 리소스를 관리
  • 하드웨어와 직접적으로 상호작용하기 때문에 시스템 자원을 완전한 제어를 가지기 위해서는 하드웨어의 지원이 필요함
  • 커널 외의 부분을 이루는 코드는 시스템 자원 접근을 위해 커널의 서비스를 이용 (시스템 콜)

🔍 시스템 콜

운영체제 커널이 제공하는 서비스에 대한 응용 프로그램의 요청을 가능하게 하기 위한 프로그래밍 인터페이스 (프로그램이 운영체제의 기능을 사용할 수 있도록 도와주는 다리의 역할)

4. 프로세스 관리와 스케줄링

✅ 프로세스

컴퓨터 시스템에서 CPU 및 메모리를 이용하여 실행 중인 작업 (소프트웨어의 생명체)

  • 컴퓨터 시스템에서 실행되는 모든 소프트웨어는 하나 이상의 프로세스를 이룸
  • 생명주기(life cycle)을 가지며, 운영체제가 관리

✅ 프로세스 관리

운영체제는 각 프로세스 상태를 유지관리하고 시스템 자원을 사용할 수 있도록 관리하고 있음

✅ 프로세스 상태

프로세스상태

💡 start

프로그램 생성의 상태

💡 ready

처음 만들어져있을 때의 상태 (CPU를 실행하면 바로 실행할 수 있는 상태)

💡 running

CPU에서 실행되고 있는 상태

  • interrupt: 하나의 프로세스가 오래도록 실행되고 있을 때 ready 상태로 변경하는 과정

💡 waiting/blocked

  • I/O wait: I/O 작업이 끝나기를 기다리는 과정
  • I/O completion: I/O이 끝나면 ready상태로 변경하는 과정

✅ 프로세스와 스레드

쓰레드

💡 single-threaded process

  • ready상태로 가거나 wait 상태로 가면 스레드는 멈춰있음
  • 자신의 문맥을 가지고 있음

💡 multithreaded process

  • 한 프로세스 내에서 여러 개의 독립적인 실행을 가지고 있음
  • 서로 다른 상태로 실행되고 있기 때문에, 문맥이 다름
  • 구글 크롬 브라우저

✅ 동시성 (concurrency)

동시성을 가지는 일들을 처리할 때에는 동기화가 필요함

Context Switches (문맥전환)

스레드 전환

  • 시간과 비용이 듬

✅ 스케줄링

어느 순간 어느 작업을 수행할 것인지 결정

💡 효율성

  • 응답 시간(response time)을 최소화
  • 시스템 처리율(throughput: 단위 시간당 처리한 작업량)을 극대화

💡 공정성

  • 우선순위가 낮은 작업은 영원히 기다려야하기 때문에 공정성을 해치면 안됨

✅ 스케줄링 알고리즘 - FCFS

First-come, first-served scheduling
먼저 도착한 것을 먼저

#예시 1

작업소요시간
P124
P23
P33
  • 대기시간: P1 = 0, P2 = 24, P3 = 27
  • 평균 대기시간: 17 ((0 + 24 + 27) / 3)
  • 평균 응답시간: 27 ((24 + 27 + 30 / 3))

#예시 2

작업소요시간
P23
P33
P124
  • 대기시간: P2 = 0, P3 = 3, P3 = 6
  • 평균 대기시간: 3 ((0 + 3 + 6) / 3)
  • 평균 응답시간: 13 ((3 + 6 + 30 ) / 3)

예시2가 예시1보다 평균 대기시간과 평균 응답시간이 짧다.

✅ 스케줄링 알고리즘 - SJF

Shortest Job First
먼저 작업이 끝나는 것을 먼저

먼저 작업이 끝나는 것을 예측할 수 있어야 함 (비선점 방식)

✅ 스케줄링 알고리즘 - SRTF

Shortest Remaining Time First
새로운 작업이 도착하고, 새로운 작업을 더 일찍 끝낼 수 있다면 새로운 작업을 먼저

매 순간, 남아 있는 작업량이 가장 적은 것을 선택하여 스케줄 (선점 방식)

5. 메모리와 입출력관리

✅ 시스템 자원의 추상화

💡 프로세스

  • CPU 시간에 대한 추상화
  • 각각 프로세스는 CPU 시간 중 일부가 자신에게 주어지는 것으로 가상할 수 있음

💡 가상메모리

  • 메모리 공간에 대한 추상화
  • 전체 주소 공간을 모두 자신에게 할당된 메모리로 사용할 수 있다고 가상

💡 파일 시스템

  • 입출력 장치들을 일관된 인터페이스로 추상화

✅ 메모리 계층 구조 (memory hierarchy)

https://i.namu.wiki/i/GyXRIJaA01JkmhNu-JWF3bk7TUy5UIb7v_VnDjTPM3KlSQwdCKN0boin8T1wuR-3mYqhiIfftzHIQbCuVMucIikwZCYgvciatJYh3hsVkP9nfp2k0hCerKcVMD7al0-aCp3HKSvwNcoIBrH4ffkryw.webp

  • 레지스터: CPU 안에 있으며, 하드웨어에 의해 제어
  • 캐시메모리: CPU 안에 있거나 가까이에 있으며, 하드웨어에 의해 제어
  • 주기억장치: CPU와 메모리 버스로 연결되어 있으며, 하드웨어에 의해 제어
  • 보조기억장치: 운영체제와 하드웨어의 협력에 의하여, 주기억장치에 대한 가상화 제공 (가상메모리)

✅ 가상 메모리 (Virtual Memory)

메모리가 실제 메모리보다 많아 보이게 하는 기술

운영체제의 역할

  • 프로세스에게 메모리를 할당해 주고, 프로세스가 반환하는 메모리를 이용 가능한 것으로 관리
  • 서로 다른 프로세스가 메모리를 침범하지 못하도록 보호

가상메모리 및 페이징기법에 대한 포스트글

체리1001 - [운영체제]가상 메모리, 페이징 기법

✅ 요구 페이징 (Demand Paging)

페이지 폴트(page fault)를 줄이는 것은 전체 시스템 향상에 매우 중요

  • 캐시 메모리의 관리와 유사한 방법
  • 지역성에 근거하여 자주 참조될 것 같은 것을 메인 메모리에 저장

※ 페이지 폴트(page fault): 페이지가 물리 메모리가 없는 경우
※ 시간적 지역성(temporal locality): 지금 참조된 주소는 가까운 미래에 다시 참조될 가능성이 높음
※ 공간적 지역성(spatial locality): 지금 참조된 주소와 가까운 주소가 미래에 참조될 가능성이 매우 높음

✅ 파일 시스템

  • 운영체제는 저장파일을 파일시스템으로 추상화
  • 많은 종류의 장치들을 파일로 간주하는 추상화 방식을 사용하여 일관된 방법으로 장치에 접근할 수 있도록 관리
This post is licensed under CC BY 4.0 by the author.