코드스테이츠 15주차[FE 41기]

이동국·2022년 12월 5일
0

Unit5 - [컴퓨터 공학] 기초

이번 유닛에서는 컴퓨터와 운영체제의 이론적 지식을 학습하였다.

이번 유닛의 내용은 우리가 어느정도 들어본 적이 있는 내용이었다.

그래도 보다 더 나은 개발을 위해 이번 기회에 정리를 해보아야겠다.

컴퓨터 구조

컴퓨터는 단순하게 말하자면 하드웨어와 소프트웨어가 합쳐진 형태이다.

컴퓨터의 기본 구성 요소

  • 입력 장치
    입력장치는 컴퓨터가 처리할 수 있는 형태로 데이터와 명령을 받아들이는 물리적인 장치이다. 입력 장치에는 다양한 물리적인 장치가 존재하고 있다. (키보드, 마우스, 스캐너, 타블렛, 조이콘 같이 컴퓨터에 연결하여 무언가를 입력할 수 있는 장치)

  • 출력 장치
    출력장치는 처리된 데이터를 사람이 이해할 수 있는 형태로 출력하는 물리적인 장치를 의미한다. 가장 대표적인 출력장치는 모니터로, 컴퓨터에서 나오는 글자, 그림 등의 결과를 화면에 보여주는 장치이다.

  • 중앙처리장치
    CPU의 내부 구성은 크게 산술/논리 연산 장치(ALU)와 제어 장치, 레지스터로 구성되어 있다. 산술은 덧셈을 수행, 제어 장치는 프로그램에 따라 명령과 제어 신호를 생성하여 각종 장치의 동작을 제어하는 것이다. 그리고 레지스터는 CPU의 내부 메모리로서 CPU에서 사용하는 데이터를 일시적으로 저장하는 장소이다.

  • 저장 장치
    저장장치는 데이터나 프로그램을 보관하기 위한 일차 기억 장치인 주 기억 장치(Memory)와 주 기억 장치를 보조하기 위한 디스크와 씨디 같은 보조 기억 장치가 존재하고 있다.

Memory

컴퓨터에서 말하는 메모리는 기억소자 즉 반도체를 의미하는데, 반도체는 특성상 전류를 흐르게도 하고 흐르지 않게도 하는 특징이 있어 이를 이용해서 임시적인 내용들을 기억하게 만드는 것이다.

메모리 분류별 특성

운영체제

하드웨어는 단지 그 하드웨어의 특정 기능을 수행 할 뿐인데, 이 컴퓨터라는 하드웨어 상에 프로그램들이 동작되려면 이 하드웨어들과 적절하게 데이터틀 주고 받으며 논리적인 일들을 해야만 한다. 그 하드웨어에게 일을 시키는 주체가 바로 운영체제이다.

운영체제의 목적 및 기능

  • 프로세서, 기억장치, 입출력장치, 파일 및 정보 등의 자원을 관리한다.
  • 자원을 효율적으로 관리하기 위해 자원의 스케줄링 기능을 제공한다.
  • 사용자와 시스템 간의 편리한 인터페이스를 제공한다.
  • 시스템의 각종 하드웨어와 네트워크를 관리하고 제어한다.

운영 체제의 시스템 자원 관리

프로세스

프로세스는 프로그램이 실행 중인 상태로 특정 메모리 공간에 프로그램의 코드가 적재되고 CPU 가 해당 명령어를 하나씩 수행하고 있는 상태를 의미한다.

위의 사진과 같이 목록 하나하나가 전부 프로세스이다.

프로세스 구성 요소

  • 유저 메모리 영역 관리(Virtual Address Descriptors)
    프로세스 별로 독립된 영역을 가지게 되는 곳은 유저 메모리 공간이다. 커널 메모리 공간의 경우 모든 프로세스가 공유하여 사용하고 있다.
  • 핸들 테이블(Handle Table)
    핸들 테이블은 프로세스에서 사용하는 모든 핸들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간이다.
  • 독립적인 메모리 공간
    프로세스 단위로 관리되는 자원 중 가장 중요한 구별점은 가상 메모리이다.

프로세스 특징

  • 자원 소유의 단위
    각각의 프로세스는 자신의 실행 이미지 로드와 실행에 필요한 추가적인 메모리 공간을 가지고 있어야 하는데,이것은 각 프로세스마다 구별되어야 하며 해당 프로세스가 접근하고자 하는 파일, I/O 장치들에 대해서 또한 프로세서 단위로 할당 받아 관리되어야 한다.
  • 디스패칭의 단위
    프로세스는 하나의 프로그램이 운영체제로부터 CPU 의 자원을 일정 기간 동안 할당 받아 명령어를 실행하는 것이며, 운영체제는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해서 CPU 의 사용 시간을 각각의 프로세스에 골고루 나누어 주어야 한다.

프로세스 상태

  • 실행(Run)
  • 준비(Ready)
  • 대기(Waiting)

프로세서(Processor)란?

프로세스와 이름은 비슷하지만 전혀 다른 개념이다.

프로세서는 중앙 처리 장치를 의미하며, 컴퓨터에 조금 관심이 있는 사람이라면 많이 들어봤을 흔히 CPU라고 불리는 부품이 프로세서를 의미한다.

스레드

스레드는 명령어가 CPU 를 통해서 수행되는 객체의 단위이다.

스레드의 구성요소

  • 가상 CPU : 인터프리터, 컴파일러에 의해 내부적으로 처리되는 가상 코드
  • 수행 코드 : Thread Class에 구현되어 있는 run() Method 코드.
  • 처리 데이터 : Thread에서 처리하는 데이터

스레드의 특징

  • 프로세스 내에서 실행되는 흐름의 단위
  • 각 스레드마다 call stack이 존재하고, 나머지 Code, Data, Heap 영역은 스레드 끼리 공유한다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 스레드는 다른 스레드와 독립적으로 동작한다.

스레드는 왜 필요한가?

하나의 프로세스 안에서 여러 개의 루틴을 동시에 수행하여서 수행 능력을 향상하려고 할 때 스레드를 사용하게 되는데, 독립적으로 수행하여 처리하려고 할 때 사용하게 된다.
즉, 여러 개의 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해서 이다.

싱글 스레드(Single-Thread)

프로세스가 단일 스레드로 동작하는 방식으로 일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법이다.

멀티 스레드 (Multi-Thread)

멀티 스레드(multi thread)란 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다.

문자열

문자열

문자열은 2010년 이후 유니코드라 불리는 인코딩 방식으로 통일되었다. 과거에는 영어 알파벳 하나가 1byte를 차지하기도 했으나, 현재는 다양한 언어가 컴퓨터 환경에서 사용되고 있기 때문에 유니코드를 사용해 텍스트를 저장한다.

유니코드

유니코드(Unicode)는 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.

ASCII 문자

영문 알파벳을 사용하는 대표적인 문자 인코딩으로 7 비트로 모든 영어 알파벳을 표현할 수 있다. 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의 공백 문자를 포함하며 유니코드는 ASCII를 확장한 형태이다

UTF-8과 UTF-16의 차이점

UTF-8과 UTF-16은 인코딩 방식의 차이를 의미한다.

UTF-8의 특징

  • 가변 길이 인코딩
    UTF-8은 유니코드 한 문자를 나타내기 위해 1byte(=8 bits)에서 4bytes까지 사용한다. 문자열에 따라 가변 길이를 가지는 인코딩 방식이며, 네트워크를 통해 전송되는 텍스트는 주로 UTF-8로 인코딩 된다. 사용된 문자에 따라 더 작은 크기의 문자열을 표현할 수 있기 때문이다. 일반적으로 ASCII 코드의 경우 1 byte, 영어 외 글자는 2~3bytes, 이모지와 같은 보조 글자는 4bytes를 차지한다.
let encoder = new TextEncoder(); // 기본 인코딩은 'utf-8'
encoder.encode('코') // Uint8Array(3) [236, 189, 148]

(236).toString(2) // "11101100"
(189).toString(2) // "10111101"
(148).toString(2) // "10010100"
  • 바이트 순서가 고정
    UTF-16에 비해 바이트 순서를 따지지 않고, 순서가 정해져 있다.

UTF-16 특징

  • 코드 그대로 바이트로 표현 가능, 바이트 순서가 다양하다.

U+ABCD라는 16진수를 있는 그대로 이진법으로 변환하면 1010-1011-1100-1101 이다. 이 이진법으로 표현된 문자를 16 bits(2 bytes)로 그대로 사용하며, 바이트 순서(엔디언)에 따라 UTF-16의 종류도 달라진다.

그래픽

디지털 이미지는 사진이나 그림을 디지털 형태로 변환한 것을 의미한다. 디지털 이미지는 비트맵(Bitmap)과 벡터(Vector) 두 종류로 나뉘는데, 서로 상반된 방식으로 이미지를 표현하기 때문에 비트맵과 벡터는 큰 차이점이 있다.

비트맵

비트맵(Bitmap)은 웹 상에서 디지털 이미지를 저장하는 데에 가장 많이 쓰이는 이미지 파일 포맷 형식이다. 일반적으로는 래스터 그래픽(점 방식)이라고 한다.

벡터

벡터(Vector)는 비트맵과는 완전히 다른 방식으로 이미지를 표현한다.

비트맵과 벡터 이미지의 차이점

가비지 컬렉션

가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리하는 것이다.(자바, C#, 자바스크립트)

메모리 생존주기(어떤 프로그래밍 언어에 관계 없이 비슷)

  • 필요할 때 개발자가 할당한다.
  • 할당된 메모리를 사용한다. (Read and Write)
  • 메모리가 더이상 필요하지 않으면 해제한다.

메모리 할당

JavaScript는 프로그래머 대신, 값을 선언할 때 자동으로 메모리를 할당해준다.

할당된 메모리 사용 (값 사용)

기본적으로 할당된 메모리를 읽고 쓰는 것을 의미한다.

메모리 해제

할당된 메모리가 더이상 필요 없다면 해제를 해야 앱의 성능을 저하시키지 않는다.
이 부분에서, 저수준 언어는 개발자가 직접 결정하고 해제하는 방식을 사용하지만, 고수준 언어는 앞서 이야기 했듯 가비지 컬렉션이라는 자동 메모리 관리 방법을 내장한 상태이다.

대표적인 가비지 컬렉션의 방법

  • 참조(reference)
    명시적이든, 암묵적이든 관계없이 메모리 관리 관점에서 어떤 객체가 다른 객체에 접근할 수 있다면 다른 객체를 참조한다고 말한다.

  • 렉시컬 스코핑(lexical scoping)
    변수 이름이 중첩된 함수에서 해석되는 방식을 정의하는 것으로, 중첩되어 있는 더 안쪽의 함수는 부모 함수가 값을 반환한 다음에도 부모 함수의 스코프를 포함하고 있다.

레퍼런스 카운팅(참조 횟수 계산)

한 객체를 참조하는 변수의 수를 추적하는 방법으로 가장 단순한 형태의 가비지 컬렉션 알고리즘이다.

function reference() {
  var obj1 = {};
  var obj2 = {};
  obj1.p = obj2; 
  obj2.p = obj1; 
}
reference();

위 코드에서는 두 객체가 생성되고 서로를 참조하고 있는 형태이기 때문에 순환 참조가 발생한다.
객체들은 함수 호출 뒤에는 스코프를 벗어나게 되므로 실질적으로 쓸모가 없게 된다. 그래서 이들이 차지하던 메모리는 반환될 수 있지만, 레퍼런스 카운팅 알고리즘에서는 두 객체가 적어도 한 번은 참조한 것으로 간주되기 때문에 둘 다 가비지컬렉션이 될 수 없게 된다.

트레이싱

한 객체에 flag를 두고, 가비지 컬렉션 사이클마다 flag에 표시 후 삭제하는 mark and sweep 방법이다

mark and sweep 알고리즘은 객체가 필요한지 결정하기 위해 해당 객체에 닿을 수 있는지 (reachable)을 판단한다.

  • 루트(Roots): 일반적으로 루트는 코드에서 참조되는 전역 변수이다. 예를 들어 자바스크립트에서 루트로 동작할 수 있는 전역 변수는 window 객체이다. Node.js에서 이와 동일한 객체는 global입니다. 가비지컬렉터는 모든 루트의 완전한 목록을 만들어낸다.
  • 그런 다음 모든 루트와 그 자식들을 검사해서 활성화 여부를 표시한다.(활성상태이면 가비지가 아닙니다). 루트가 닿을 수 없는 것들은 가비지로 표시된다.
  • 마지막으로 가비지컬렉터는 활성으로 표시되지 않은 모든 메모리를 OS에 반환한다.

메모리 누수

Garbage collected 언어에서 메모리 누수의 주요 원인은 예상치 못한 참조이다.

메모리 누수는 일반적으로 3가지의 형태

  • 우발적으로 생성된 전역변수
  • DOM 외부에서의 참조
  • 클로저의 잘못된 사용

0개의 댓글