컴퓨터 공학 기초

Yeong·2023년 10월 9일
0

CS

목록 보기
12/12
post-thumbnail

1. 컴퓨터의 구조

  • 하드웨어: 전자 회로 및 기계장치
  • 소프트웨어: 하드웨어 위에서 작업을 수행하는 프로그램

1-1. 컴퓨터의 기본 구성 요소

입력장치

명령받아들이는 물리적 장치(키보드 마우스 )

출력장치

처리된 데이터를 사람이 이해할 수 있는 형태로 출력하는 물리적 장치 (모니터)

중앙처리장치(CPU)

CPU는 컴퓨터의 모든 것을 결정한다.

CPU의 내부 구성은 크게 ALU와 레지스터이다.

  •  ALU: 산술/논리 연산 장치(ALU)
  •  레지스터: 제어 장치로 프로그램에 따라 명령과 제어 신호를 생성하여 각종 장치의 동작을 제어한다.

저장장치

  • 주 기억 장치(Memory): 데이터나 프로그램을 보관하기 위한 일차 기억 장치(RAM과 ROM)
  • 보조 기억 장치:  주 기억 장치를 보조하기 하는 장치(플로피 디스크와 하드 디스크 같은 자기 디스크, CD와 DVD 같은 광 디스크, USB와 SSD 같은 플래쉬 메모리)

1-2. Memory의 종류

레지스터(Register)

cpu내부에 함께 존재하며 매우 빠르고 비싸다.
cpu가 사용하라고 할당해둔 메모리이므로 사람이 관리하는 부분이 아니다.

캐시 메모리(Cache Memory)

캐시 메모리는 CPU 내 또는 외에 존재하는 메모리이다.(컴퓨터마다 다름)

메인 메모리와 같이 RAM을 사용하나 좀 더 비싸고 빠른 SRAM을 사용한다.

메인 메모리와 CPU 간의 데이터 속도 사이의 중간 버퍼(완충) 역할을 한다. 우리가 자주 사용하는 프로그램을 미리 캐시 메모리에 저장해둬 cpu에서 요청했을때 메인 메모리까지 가지않고 캐시에서 보내준다.

CPU가 필요한 데이터가 Cache Memory 내에 들어와 있으면 ‘Cache Hit’라 하고 접근하고자 하는 데이터가 없을 경우를 ‘Cache Miss’라고 한다. 이때 원하는 데이터가 Cache에 있을 확률을 ‘Hit Ratio'이라고 한다.

Cache Memory의 Size의 크기가 크면 Hit Ratio율과 반비례 관계를 가지는데 이유는 필요한 데이터를 찾기 위해서는 캐시를 탐색해야하는데 캐시가 공간이 크다면 그만큼 탐색할 공간도 늘어나기 때문이다. 
하지만 또 캐시가 너무 작으면 메인 데이터로 부터 꺼내 미리 캐시에 저장해둘 공간 자체가 부족할 수 있다.
즉, 캐시는 너무 크면 비효율적이고 너무 작으면 재 기능을 수행하지 못할 수 있으므로 적당한 크기여야한다.

주기억 장치(Main Memory)

메인메모리는 RAM과 ROM이 있다.

  • RAM: RAM의 크기는 프로그램의 수행 속도에 영향을 주며, 전원이 끊어지면 내용이 휘발된다.
    RAM의 종류에는 SRAM과 DRAM있으면 캐시메모리가 SRAM 메인 메모리가 DRAM이다.
  • ROM: 전원이 끊어져도 내용이 보존된다.

보조기억장치

말 그대로 보조하는 기억장치이다. 내용을 읽는 속도는 느리지만 대용량 기억이 가능하다.

레지스터, 캐시, 메인 메모리가 없으면 컴퓨터가 동작을 안하지만 보조 기억장치는 없어도 컴퓨터 작동한다.

2. 운영체제(OS)

하드웨어 상에 프로그램들이 동작되려면 이 하드웨어들과 적절하게 데이터틀 주고 받으며 논리적인 일들을 해야만 한다.

운영체제는 소프트웨어로 하드웨어에게 일을 시키는 주체이다.

2-1. 운영체제의 목적 및 기능

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

2-2. 프로세스

애플리케이션의 파일이 디스크에 저장된 상태 -> 사용자가 애플리케이션 실행 -> 운영체제로부터 실행에 필요한 메모리를 할당받음(각각의 프로세스가 각각 독립적인 메모리 공간 할당 받음) -> 애플리케이션의 코드를 실행

이때 실행되는 애플리케이션을 프로세스라고 부른다.

멀티프로세스(다중 프로세스)

하나의 애플리케이션은 여러 프로세스(다중 프로세스)를 만들기도한다.

멀티프로세스는 2가지의 의미를 가진다. 하나는 여러개의 CPU코어가 각기 다른 프로세스를 병렬적으로 처리하는 것이고 다른 하나는 한개의 코어가 여러 프로세스를 돌아가면서 조금씩 처리하는 것이다.

프로세서와 프로세스

프로세서(Processor)

  • 하드웨어적인 측면 : 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛으로, 중앙처리장치(CPU)를 의미하며 적어도 하나 이상의 ALU와 레지스터를 내장하고 있다.
  • 소프트웨어적인 측면 : 데이터 포맷을 변환하는 역할을 수행하는 데이터 처리 시스템을 의미합니다. 워드프로세서나 컴파일러 등

프로세스(Process)

특정 목적을 수행하기 위해 나열된 작업의 목록을 의미합니다. 메모리에 적재 되어 프로세서에 의해 실행 중인 프로그램을 프로세스라고 한다.

2-3. 스레드

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

여러 개의 동작을 동시에 처리하기 위해 각각의 동작을 스레드라는 작업단위로 쪼개 처리하는 것이다.

하나의 프로세스 내에는 반드시 1개 이상의 스레드가 존재하며, 이러한 스레드는 같은 프로세스에 있는 자원과 상태를 공유한다.  

특징

  • 프로세스 내에서 실행되는 흐름의 단위이다. 하나의 스레드는 시작해서 종료할 때까지 한번에 하나씩 명령들을 수행합니다
  • 각 스레드마다 call stack이 존재하며, 나머지 Code, Data, Heap 영역은 스레드 끼리 공유합니다. 반면에 프로세스는 다른 프로세스의 메모리에 직접 접근할 수 없다.
  • 스레드는 다른 스레드와 독립적으로 동작합니다. 독립적으로 동작하기 때문에 두 개 이상의 스레드가 동작되는 경우, 두 개 이상의 스레드의 실행 및 종료순서는 예측할 수 없다.

싱글 스레드와 멀티 스레드

싱글 스레드(Single-Thread)

프로세스가 단일 스레드로 동작하는 방식

하나의 레지스터, 스택으로 표현한다. 자바스크립트가 가장 대표적인 싱글 스레드 언어이다.

싱글 스레드의 장점

  • 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
    여러 개의 스레드가 프로세스의 자원을 공유할 경우, 공용 자원에 대한 접근을 제어해야 한다. 모든 스레드가 일정 자원에 동시에 접근하거나, 똑같은 작업을 실행하려는 경우,에러가 발생하거나 원하는 값이 나오지 않기 때문이다. 그래서, 스레드들이 동시에 같은 자원에 접근하지 못하도록 제어해줘야만 한다.
  • 자원 접근에 대한 동기화를 신경쓰지 않아도 되므로 문맥 교환(context switch) 작업 또한 요구하지 않는다.
    문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.
  • 프로그래밍 난이도가 쉽고, CPU 메모리를 적게 사용한다.

싱글 스레드의 단점

  • 여러 개의 CPU를 활용하지 못한다.
  • 연산량이 많은 작업을 하는 경우, 그 작업이 완료되어야 다른 작업을 수행할 수 있다.
  • 싱글 스레드 모델은 에러 처리를 못하는 경우 멈춰버린다. 반면 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복할 수 있다.

멀티 스레드 (Multi-Thread)

하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것

여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것

멀티 스레딩의 장점

  • 싱글 스레드인 경우, 작업이 끝나기 전까지 사용자에게 응답하지 않지만 반면 멀티스레드인 경우 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답할 수 있다.
  • 싱글 스레드인 경우 한 프로세스는 오직 한 프로세서에서만 수행 가능하지만 반면 멀티 스레드인 경우 한 프로세스를 여러 프로세서에서 수행할 수 있으므로 훨씬 효율적이다.

멀티 스레딩의 문제점

  • 주의 깊은 설계가 필요하며, 디버깅이 까다롭다.
  • 단일 프로세스 시스템의 경우 효과를 기대하기 어려우며 다른 프로세스에서 스레드를 제어할 수 없다. (즉, 프로세스 밖에서 스레드 각각을 제어할 수 없다.)
  • 멀티 스레드의 경우 자원 공유의 문제가 발생한다. 하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받게 된다.
  • 문맥 교환 작업을 요구한다다. CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 문맥 교환(Context Switching)이라 한다. 문맥 교환이란 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행 중인 태스크(프로세스, 스레드)를 멈추는 것을 말한다.

3. 문자열

3-1. ASCII 문자

영문 알파벳을 사용하는 대표적인 문자로 인코딩으로 7 비트로 모든 영어 알파벳을 표현할 수 있다. 

3-2. 유니코드(Unicode)

ASCII문자는 알파벳만 표현가능했어서 모든 문자를 일관되게 표현하기 위해 유니코드가 설계되었다.

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

유니코드 UTF-8과 UTF-16의 차이점

  • UTF-8은 유니코드 한 문자를 나타내기 위해 1 byte(= 8 bits)에서 4 bytes까지 사용
  • UTF-16은 유니코드 코드 대부분(U+0000부터 U+FFFF; BMP) 을 16 bits로 표

4. 그래픽

5. 가비지 컬렉

가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리해준다.

C 언어 같은 저수준 언어에서는 메모리 관리를 위해 개발자가 스스로 메모리를 할당하고 해제해야 한다. 그러나 JavaScript는 C언어와는 반대로 고수준 언어로서, 객체가 생성되었을 때 자동으로 메모리를 할당하고 필요하지 않다면 자동으로 해제하는 가비지 컬렉션이 내장되어 있다.

5-1. 가비지 컬렉션의 방법

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

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

변수의 레퍼런스가 복사되면 레퍼런스 카운트가 늘어나고 변수의 값이 바뀌거나 변수 스코프에서 벗어나면 레퍼런스 카운드가 줄어든다. 

결국  레퍼런스 카운트가 0이되면 객체와 관련된 메모리를 비운다.

트레이싱

객체가 필요한지 결정하기 위해 해당 객체에 닿을 수 있는지 (reachable)을 판단한다.

가비지 컬렉터는 모든 루트(전역변수)의 완전한 목록을 만든 후 모든루트와 그 자식을을 검사해서 활성화 여부를 표시한다. 만약 루트가 닿을 수 없다면 가비지로 표시한다.

표시가 완료되면 가비지컬렉터는 활성으로 표시되지 않은 메모르를 OS에 반환한다.

5-2. 메모리 누수

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

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

출처) 코드스테이츠 유어클래스!

profile
긍정적으로~✍️(◔◡◔)

0개의 댓글