Today I Learned
- 컴퓨터의 기본 구조
- CPU
- Memory
- 운영체제(OS)
- 프로세스
- 스레드
- 문자열과 그래픽
- 가바지 컬렉션과 캐시
입출력 장치, 중앙 처리 장치(CPU), 저장 장치 ➡️ 컴퓨터를 이루는 기본 골격
입력 장치
컴퓨터가 처리할 수 있는 형태로 데이터와 명령을 받아들이는 물리적인 장치
(ex. 키보드, 마우스, 스캐너, 타블렛, 조이콘 등)
출력 장치
처리된 데이터를 사람이 이해할 수 있는 형태로 출력하는 물리적인 장치
(ex. 모니터, 프린터 등)
중앙 처리 장치(CPU)
컴퓨터의 정중앙에서 모든 데이터를 처리하는 장치
저장 장치
CPU의 구조
산술/논리 연산 장치(Arithmetic Logic Unit, ALU)
산술적인 연산과 논리적인 연산을 담당하는 장치
가산기, 보수기, 누산기, 기억 레지스터, 데이터 레지스터 등으로 구성
캐시나 메모리로부터 읽어 온 데이터는 레지스터라는 CPU 내부 메모리에 저장되고, ALU는 레지스터에 저장된 데이터를 이용해 산술 연산을 수행한다. 부동소숫연산장치(FPU), 정수연산장치, 논리연산장치 등이 있다.
레지스터(Register)
CPU 내부에 있는 기억 장치
주로 산술 연산 논리장치에 의해 사용되는 범용 레지스터
PC 등 특수 목적에 사용되는 전용 레지스터
레지스터 종류
제어장치(Control Unit, CU)
CPU가 자신 및 주변 기기들을 컨트롤하는 장치
제어장치 종류
제어 장치 구현의 방식
사용자가 컴퓨터를 쉽게 다룰 수 있게 해주는 인터페이스로, CPU, 메모리, 디스크로 이뤄진 하드웨어 상에 프로그램들이 동작할 수 있도록 이 하드웨어들과 적절하게 데이터를 주고 받으며 논리적인 일을 한다.
운영체제의 목적
처리능력 향상, 사용 가능도 향상, 신뢰성 향상, 반환 시간 단축 등
운영체제의 기능
운영 체제의 시스템 자원 관리
운영체제가 없다면, 응용 프로그램이 실행될 수 없다. 응용 프로그램은 컴퓨터를 이용해 다양한 작업을 하는 것이 목적이고, 운영체제는 응용 프로그램이 하드웨어에게 일을 시킬 수 있도록 돕는다. 하드웨어를 구성하는 일을 하는 CPU, 자료를 저장하는 RAM, 디스크 등의 시스템 자원을 관리하는 주체가 바로 운영체제이다.
운영체제의 구조 모식도
응용 프로그램 관리
응용 프로그램이 시스템의 자원을 마음대로 사용한다면, 해커에 의한 공격에 무방비한 상태가 된다. 따라서 응용 프로그램은 권한에 대한 관리가 팔요하다. 또한 여러 사람이 하나의 기기를 사용하는 경우에는 사용자를 관리하는 일도 중요하다. 즉, OS는 응용 프로그램이 실행되고, 시스템 자원을 사용할 수 있도록 권한과 사용자를 관리한다.
응용 프로그램 : 운영체제를 통해 컴퓨터에게 일을 시키는 것
응용 프로그램이 운영체제를 통해 컴퓨터에게 일을 시키려면, 운영체제로부터 컴퓨터를 조작할 수 있는 권한을 받아야 한다. 응용 프로그램이 운영체제와 소통하기 위해서는, 운영체제가 응용 프로그램을 위해 인터페이스(API)
를 제공해야 한다. 응용 프로그램이 시스템 자원을 사용할 수 있도록, 운영체제 차원에서 다양한 함수를 제공하는 것을 시스템 콜(System call)
이라고 한다.
응용 프로그램이 OS로부터 권한을 획득한 후에는, 사용할 때 필요한 API를 호출해야 합니다. 이 API는 시스템 콜로 이루어져 있다.
프로세스 구성 요소
프로세스의 구조체에는 프로세스마다 독립적으로 관리해야 하는 유저 메모리 영역이나 프로세스가 사용하는 각종 객체들의 포인터를 관리하는 핸들 테이블을 가지고 있다.
유저 메모리 영역 관리
프로세스 별로 독립된 영역을 가지게 되는 곳은 유저 메모리 공간이다. ( ↔️ 커널 메모리 공간의 경우 모든 프로세스가 공유하여 사용하고 있다. )
프로세스 별로 독립적인 유저 메모리 영역을 관리하기 위해 VAD(Virtual Address Descriptors)라는 관리 테이블이 존재한다.
핸들 테이블
프로세스에서 사용하는 모든 핸들에 대한 커널 객체 포인터 정보를 배열 형태로 가지고 있는 공간이다. 프로세스가 종료하게 될 때 이 테이블의 정보를 참고해서 이 프로세서에서 사용하고 있는 모든 객체를 자동으로 반환한다.
독립적인 메모리 공간
프로세스 단위로 관리되는 자원 중 가장 중요한 구별점은 가상 메모리다. 페이징 기법을 이용해 프로세스마다 별도의 고유한 메모리를 사용할 수 있게 하고 있다.
프로세스 특징
자원 소유의 단위
각각의 프로세스는 자신의 실행 이미지 로드와 실행에 필요한 추가적인 메모리 공간을 가지고 있어야 한다. 이것은 각 프로세스마다 구별돼야 하며 해당 프로세스가 접근하고자 하는 파일, I/O 장치들에 대해서 또한 프로세서 단위로 할당 받아 관리돼야 한다.
디스패칭의 단위
프로세스는 하나의 프로그램이 운영체제로부터 CPU의 자원을 일정 기간 동안 할당 받아 명령어를 실행하는 것이며, 운영체제는 여러 개의 프로세스가 병렬적으로 실행되게 하기 위해 CPU의 사용 기간을 각각의 프로세스에 골고루 나눠줘야 한다. 하나의 프로세스에 여러 개의 디스패칭 단위가 실행될 수 있도록 하고 있으며, 이러한 디스패칭 단위를 스레드
라고 한다.
프로세스 상태
프로세서 VS 프로세스
스레드는 명령어가 CPU를 통해서 수행되는 객체의 단위이다. 하나의 프로세스 내에는 반드시 1개 이상의 스레드가 존재하며, 이러한 스레드는 같은 프로세스에 있는 자원과 상태를 공유한다.
같은 프로세스 내에 있는 스레드는 같은 주소 공간에 존재하게 되며 동일한 데이터에 접근할 수 있는 것이다. 또한 하나의 스레드가 수정한 메모리는 같은 메모리를 참조하는 스레드에 영향을 미치게 된다. 예를 들어 하나의 스레드에서 오픈한 파일을 다른 스레드가 사용할 수 있다. 프로세스가 종료되면 그 프로세스에 속해있던 스레드도 함께 종료된다.
스레드는 왜 필요한가?
하나의 프로세스 안에서 여러 개의 루틴을 동시에 수행해서 수행 능력을 향상하려고 할 때 스레드를 사용하게 되는데, 독립적으로 수행하여 처리하려고 할 때 사용하게 된다. 즉 여러 개의 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해서이다.
예를 들어, 워드 프로세서에서 사용자로부터 키보드를 입력 받거나, 그래픽이나 UI를 그리고 문법 오류를 체크하는 등 워드 프로세스 내에서 여러 요청을 동시에 처리해야 하는데, 이때 스레드가 필요하다.
스레드의 구성요소
스레드의 특징
프로세스가 단일 스레드로 동작하는 방식으로, 일련의 처리를 단일 스레드만으로 직렬 처리하는 프로그래밍 방법이다. 하나의 레지스터, 스택으로 표현한다. 자바스크립트가 가장 대표적인 싱글 스레드 언어이다.
싱글 스레드의 장점
싱글 스레드의 단점
- 문맥 교환(context switch) : 하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업
- cluster 모듈: 기본적으로 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행한다. 또한, 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행한다. 시스템 자원의 활용 극대화 및 처리량을 증대할 수 있어 단일 프로세스 시스템의 효율성을 높일 수 있다.
멀티 스레드의 장점
멀티 스레드의 단점