입력장치
명령받아들이는 물리적 장치(키보드 마우스 )
출력장치
처리된 데이터를 사람이 이해할 수 있는 형태로 출력하는 물리적 장치 (모니터)
중앙처리장치(CPU)
CPU는 컴퓨터의 모든 것을 결정한다.
CPU의 내부 구성은 크게 ALU와 레지스터이다.
저장장치
레지스터(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이 있다.
보조기억장치
말 그대로 보조하는 기억장치이다. 내용을 읽는 속도는 느리지만 대용량 기억이 가능하다.
레지스터, 캐시, 메인 메모리가 없으면 컴퓨터가 동작을 안하지만 보조 기억장치는 없어도 컴퓨터 작동한다.
하드웨어 상에 프로그램들이 동작되려면 이 하드웨어들과 적절하게 데이터틀 주고 받으며 논리적인 일들을 해야만 한다.
운영체제는 소프트웨어로 하드웨어에게 일을 시키는 주체이다.
애플리케이션의 파일이 디스크에 저장된 상태 -> 사용자가 애플리케이션 실행 -> 운영체제로부터 실행에 필요한 메모리를 할당받음(각각의 프로세스가 각각 독립적인 메모리 공간 할당 받음) -> 애플리케이션의 코드를 실행
이때 실행되는 애플리케이션을 프로세스라고 부른다.
하나의 애플리케이션은 여러 프로세스(다중 프로세스)를 만들기도한다.
멀티프로세스는 2가지의 의미를 가진다. 하나는 여러개의 CPU코어가 각기 다른 프로세스를 병렬적으로 처리하는 것이고 다른 하나는 한개의 코어가 여러 프로세스를 돌아가면서 조금씩 처리하는 것이다.
프로세서(Processor)
프로세스(Process)
특정 목적을 수행하기 위해 나열된 작업의 목록을 의미합니다. 메모리에 적재 되어 프로세서에 의해 실행 중인 프로그램을 프로세스라고 한다.
스레드는 명령어가 CPU 를 통해서 수행되는 객체의 단위이다.
여러 개의 동작을 동시에 처리하기 위해 각각의 동작을 스레드라는 작업단위로 쪼개 처리하는 것이다.
하나의 프로세스 내에는 반드시 1개 이상의 스레드가 존재하며, 이러한 스레드는 같은 프로세스에 있는 자원과 상태를 공유한다.
특징
프로세스가 단일 스레드로 동작하는 방식
하나의 레지스터, 스택으로 표현한다. 자바스크립트가 가장 대표적인 싱글 스레드 언어이다.
싱글 스레드의 장점
싱글 스레드의 단점
하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것
여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것
멀티 스레딩의 장점
멀티 스레딩의 문제점
영문 알파벳을 사용하는 대표적인 문자로 인코딩으로 7 비트로 모든 영어 알파벳을 표현할 수 있다.
ASCII문자는 알파벳만 표현가능했어서 모든 문자를 일관되게 표현하기 위해 유니코드가 설계되었다.
유니코드(Unicode)는 유니코드 협회(Unicode Consortium)가 제정하는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다.
가비지 컬렉션은 프로그램에서 더 이상 사용하지 않는 메모리를 자동으로 정리해준다.
C 언어 같은 저수준 언어에서는 메모리 관리를 위해 개발자가 스스로 메모리를 할당하고 해제해야 한다. 그러나 JavaScript는 C언어와는 반대로 고수준 언어로서, 객체가 생성되었을 때 자동으로 메모리를 할당하고 필요하지 않다면 자동으로 해제하는 가비지 컬렉션이 내장되어 있다.
한 객체를 참조하는 변수의 수를 추적하는 방법으로 가장 단순한 형태의 가비지 컬렉션 알고리즘이다.
변수의 레퍼런스가 복사되면 레퍼런스 카운트가 늘어나고 변수의 값이 바뀌거나 변수 스코프에서 벗어나면 레퍼런스 카운드가 줄어든다.
결국 레퍼런스 카운트가 0이되면 객체와 관련된 메모리를 비운다.
객체가 필요한지 결정하기 위해 해당 객체에 닿을 수 있는지 (reachable)을 판단한다.
가비지 컬렉터는 모든 루트(전역변수)의 완전한 목록을 만든 후 모든루트와 그 자식을을 검사해서 활성화 여부를 표시한다. 만약 루트가 닿을 수 없다면 가비지로 표시한다.
표시가 완료되면 가비지컬렉터는 활성으로 표시되지 않은 메모르를 OS에 반환한다.
Garbage collected 언어에서 메모리 누수의 주요 원인은 예상치 못한 참조이다.
출처) 코드스테이츠 유어클래스!