티스토리 뷰
컴퓨터 구조
CPU / MEM(메모리) / DISK ⇒ 폰노이만 구조
이렇게 크게 3가지로 나눌 수 있다.
*CPU가 가장 비싸고 그 다음이 MEM 그 다음이 DISK
*I/O는 이들과 연결된 모니터나 마우스나 키보드 같은 입출력장치를 뜻한다.
운영체제(OS)는 이 3가지(하드웨어)들의 역할을 수행시킨다. DISK에 있는 실행파일을 MEM에 올리고 MEM는 이를 CPU로 보내서 프로세스를 만들어 수행을 시키는 과정을 운영체제가 관리 감독을 하게 되는 것이다. 막힘 없이, 효율적으로 수행시킨다. 운영체제 말 그대로 운영을 한다는 것이다.
*확장자가 exe인 파일을 실행시킨다고 예를 들어보자.
실행파일(exe)인 파일을 다운로드 받으면 DISK에 저장이 된다. 이 실행파일은 ‘코드’와 ‘리소스’로 구성이 되어 있다.
실행파일을 실행하게 되면 ‘코드와 리소스’의 일부들이 MEM로 올라오게 된다.
(MEM으로 올라가게 되는 과정을 ‘프로세스’ 라고 한다. 결국 프로그램이 실행되고 있는걸 프로세스가 되었다 라고 표현한다.)
그럼 MEM이 명령어를 CPU에게 전달하면 명령어대로 CPU가 처리하게 된다.
한 마디로 파일을 실행시키면 메모리로 올라가고 메모리가 CPU에게 전달하면 CPU가 처리한다. 이 때 중요 포인트는 모든 실행 파일이 올라가는 것이 아니라는 점이다.
*참고로 프로그램을 메모리에 올려서 프로세스로 만드는 것을 ‘운영체제(OS)의 커널’이 담당한다. 커널이란 그냥 운영체제의 핵심 역할을 수행하는 운영체제의 부품 같은거라고 생각하면 된다. 자동차로 치면 엔진 같은 존재이다.
운영체제의 종류는 대표적으로 윈도우, 리눅스 등이 있다. 고로 CPU나 MEM 같은 하드웨어가 있다고해서 곧바로 프로그램이 실행되는게 아니다. 운영체제까지 있어야 한다.
CPU(프로세서 라고도 한다.)
-컴퓨터 시스템의 두뇌로서, 프로그램 명령을 해석하고 실행하는 역할을 담당한다. 주요 구성 요소는 다음과 같다.
- ALU (Arithmetic Logic Unit, 산술 논리 장치): 산술 및 논리 연산을 수행하는 구성 요소이다. 덧셈, 뺄셈, 곱셈, 나눗셈 등의 산술 연산과 논리 연산을 처리한다.
- CU (Control Unit, 제어 장치): 프로그램 명령을 해석하고, 적절한 하드웨어 구성 요소에 신호를 보내어 명령을 실행하는 역할을 담당한다. 이를 통해 CPU는 다양한 장치와 상호작용할 수 있습니다.
- Registers (레지스터): CPU 내부의 작은 메모리 블록으로, ALU와 CU가 처리하는 데이터와 명령을 임시로 저장하는 역할을 한다. 레지스터는 고속 데이터 액세스를 제공하여 CPU의 작업 효율을 높여준다.
*참고로 캐시 메모리는 CPU와 메모리(MEM)의 사이에 위치해 있다. 캐시 메모리는 속도가 빠른 장치와 느린 장치 사이에서 속도 차에 따른 병목 현상을 줄이기 위한 범용 메모리이다. 메모리에서 CPU에 실행 파일을 올려줄 때 이 캐시 메모리에 올려지게 된다.
-CPU는 메모리에 있는 명령들이 올라오면 계산을 수행한다.
메모리(MEM)
메모리는 임시저장 공간이고 RAM과 ROM으로 이루어져 있다.
RAM은 휘발성 메모리로서 전원이 차단되면 데이터가 사라진다.
ROM은 비휘발성 메모리로서 전원이 차단되어도 데이터가 사라지지 않는다.
(RAM은 우리가 따로 분해하면 보이는 그 부품이고 ROM은 메인보드 내에 작게 위치하고 있다.)
MEM가 하는 일은 메모리관리 또는 교체알고리즘을 통해 실행하고 있는 파일을 적재시키고 실행중이지 않는 파일을 내리는 과정을 반복하게 된다. 즉 데이터를 저장하고 접근하는 기능을 수행하는 역할을 한다.
디스크(DISK)
MEM 처럼 임시로 저장하는 공간이 아닌 진정한 저장소이다. 그렇기 때문에 비휘발성이다.
디스크는 컴퓨터 시스템에서 운영 체제, 응용 프로그램, 사용자 데이터 등을 저장하는데 사용된다. 일반적으로 디스크는 파일 시스템을 통해 구성되고 사용자가 파일 및 폴더를 조직화하고 관리할 수 있도록 해준다. 또한 컴퓨터의 메모리가 부족할 때 가상 메모리로서 사용되어지기도 한다.
보충 설명 및 추가 내용
1. 컴파일러 언어와 인터프리터 언어의 차이.
*컴파일러 언어와 인터프리터 언어의 차이를 이야기 하기에 앞서 이 둘이 무엇을 위해 존재하고 둘의 차이를 왜 알아야 하는지에 대해 알아야 한다. 개발자로서 프로그램을 만들 때 특정 언어를 사용해서 만들게 된다. 이렇게 특정 언어를 사용해서 프로그램을 만들 때 사람이 아닌, 컴퓨터가 이해할 수 있는 언어로 변경을 해줘야 한다. 즉 컴퓨터의 언어로 번역을 해야 한다는 것이다. 컴퓨터는 0과 1 밖에 인식을 하지 못하고 컴퓨터가 알아들을 수 있는 형태를 '바이너리' 라고 한다. 프로그래밍 언어마다 바이너리로 변경하는 방식이 있는데 이 때 컴파일러 언어와 인터프리터 언어의 차이점이 생기게 된다.
-컴파일 언어의 종류로는 C, C++, Java가 있다.
-컴파일 언어는 '컴파일러 과정'을 거친 뒤 바이너리 형태로 변경을 해야한다. 바이너리의 형태로 변경된 프로그램은 .exe, .dll 등의 파일 확장자로 표현이 된다. 즉 컴파일 과정을 통해 '실행 파일'로 변경이 된다.
-컴파일러 과정은 프로그램을 완성시킨뒤에 '한 번에' 진행을 하게 된다.
-인터프리터 언어의 종류로는 Python, Ruby, JS 등이 있다.
-인터프리터 언어는 프로그래밍 과정 중에 '한 줄 한 줄' '그 때 마다' 번역을 진행하게 된다. 그렇기 때문에 컴파일 언어와는 달리 별도의 '컴파일러 과정'을 거칠 필요가 없다.
*소스 코드가 컴파일 과정을 거친 뒤 실행파일로 변경 되는 과정은 아래와 같다.
- 전처리(Preprocessing): 소스 코드에 포함된 헤더 파일, 매크로, 조건부 컴파일 등을 처리한다.
- 컴파일(Compilation): 전처리된 소스 코드를 어셈블리어로 변환한다. 이때 어셈블리어는 프로그래머가 이해하기 쉽도록 표현된 저수준(low-level)의 언어이다.
- 어셈블(Assembly): 어셈블리어를 기계어로 변환한다. 기계어는 컴퓨터가 직접 실행할 수 있는 이진 코드 형태이다.
- 링킹(Linking): 여러 개의 기계어 코드를 하나의 실행 파일로 결합하고, 라이브러리 및 함수와 같은 외부 참조를 해결한다.
2. 누군가가 컴퓨터를 사용 할 때 프로세스는 상당히 많이 존재하게 된다. 예를 들어 크롬 창을 띄우고 익스플로러 창을 띄우고 노래를 듣고 프로그램을 다운로드 받고 이런걸 동시에 할 수 있게 된다.
(편의상 동시에라고 표현을 했지만 엄밀히 말하면 동시에는 아니다.)
여러가지의 프로세스들이 동작할 때 이를 처리하는건 결국 CPU(프로세서)인데 CPU 하나가 프로세스들을 처리를 하는 것인데 동시에 프로세스들을 처리하는게 아닌 프로세스 ‘하나하나’ 처리하게 된다. 이게 속도가 엄청 빨라서 마치 동시에 실행이 되는 것처럼 보이지만 그게 아니다.
(요새는 멀티코어라고 해서 CPU가 여러가지 내장되어 있는 경우도 있다.)
나중에 따로 다룰 것이지만 이 프로세스 안에는 Thread 라는 것이 존재한다. 프로세스와 달리 동시에 여러가지 일들을 수행한다. 또한 IPC의 개념에서 프로세스끼리는 서로 관여를 못 하는게 원칙이지만 특별한 상황에서는 메모리를 공유하여 서로 데이터를 공유할 수 있는데, 이런 특징의 프로세스와는 달리 Thread는 애초에 데이터를 공유할 수 있는 특성이 있다.
프로세스는 크롬, 엣지, 카카오톡 등과 같은 프로그램을 실행한다고 생각하면 되고, Thread는 프로세스 안에서의 여러 업무들을 수행한다고 보면 된다. 크롬을 예로 들면 크롬 안에서 구글을 켜서 검색을 하는 것과 동시에 유튜브에서 영상을 시청하면서 멜론에서 노래를 들을 수 있는데 이는 Thread의 특성 덕분에 가능한 일이다.
3. CPU는 여러가지의 프로세스들이 실행되고 있을 때 CPU 스케줄링 방식에 의해 어떤 프로세스를 먼저 CPU를 할당시킬지에 대해 판단하게 된다. 쉽게 말해서 멀티코어가 아닌 이상 CPU는 한가지 일만 수행하기 때문에 프로세스를 하나만 실행 시킬 수 있기 때문에 어떤 프로세스를 우선적으로 실행시킬지에 대한 기준이 있다는 것이다.
CPU의 스케줄링 종류는 크게 '선점형 스케줄링'과 '비선점형 스케줄링'으로 나뉜다.
-선점형 스케줄링은 이미 CPU를 점유하고 있는 프로세스가 있을 때 '강제적으로' CPU 점유를 뺏어 다른 프로세스에게 할당시킬 수 있는 방식이다. 즉 현재 실행 중인 프로세스가 있어도 이를 강제로 중지시키고 다른 프로세스가 실행될 수 있도록 하는 방식이라는 의미이다.
선점형 스케줄링의 종류
- 우선순위 기반 스케줄링(Priority-based Scheduling) : 각 프로세스에 우선순위를 할당하고, 우선순위가 높은 프로세스를 먼저 실행하는 방식이다.
- 라운드 로빈 스케줄링(Round Robin Scheduling) : 각 프로세스에 일정 시간을 할당하고, 그 시간이 지나면 다른 프로세스로 넘어가는 방식이다.(참고로 '시분할 스케줄링'은 라운드 로빈에 속하는 개념이다.)
- 다중 레벨 큐 스케줄링(Multi-level Queue Scheduling) : 여러 개의 큐를 사용하여 프로세스를 분류하고, 각각의 큐에서 스케줄링을 수행하는 방식이다.
- 다중 레벨 피드백 큐 스케줄링(Multi-level Feedback Queue Scheduling) : 멀티레벨 큐 스케줄링과 유사하지만, 프로세스가 다른 큐로 이동할 수 있도록 허용하는 방식이다.
- 최단 잔여 시간 우선 스케줄링(Shortest Remaining Time First Scheduling) : 현재 실행 중인 프로세스가 실행을 완료하기 전까지 남은 실행 시간이 가장 짧은 프로세스를 먼저 실행하는 방식이다.
*시분할 스케줄링이란?
=> 여러 프로세스가 동시에 실행이 되는 것처럼 느끼도록 해주는 방식이다. 이는 프로세스가 '얼마 동안' 동작하게 할지를 정해서 프로세스를 관리한다.
-비선점형 스케줄링은 이미 CPU를 점유하고 있는 프로세스가 있을 때 강제적으로 뺏지 못하고 해당 프로세스가 작업을 완료할 때까지 다른 프로세스에게 점유권을 주지 못하는 방식이다. 즉 현재 실행 중인 프로세스가 종료되거나 대기 상태로 되기 전까지는 다른 프로세스가 실행될 수 없다는 의미이다.
비선점형 스케줄링의 종류
- FCFS(First Come, First Served) : 프로세스가 도착한 순서대로 CPU를 할당하는 방식이다.
- SJF(Shortest Job First) : 실행 시간이 가장 짧은 프로세스를 먼저 실행하는 방식이다.
- HRN(Highest Response Ratio Next) : 대기 시간과 실행 시간을 모두 고려하여 우선순위를 계산하고, 가장 높은 우선순위를 가진 프로세스를 먼저 실행하는 방식이다.
- 우선순위 기반 스케줄링(Priority-based Scheduling) : 각 프로세스에 우선순위를 할당하고, 우선순위가 높은 프로세스를 먼저 실행하는 방식이다. (선점형 스케줄링에서도 사용될 수 있음)
- 기한부 스케줄링(Deadline-based Scheduling) : 각 프로세스에 실행을 완료해야 할 기한이 정해져 있고, 그 기한 내에 실행이 완료되도록 스케줄링하는 방식이다.
*이러한 각각의 스케줄링 방식은 운영체제가 해야 할 작업이 무엇인지에 따라서 선택된다. 일반적인 시스템에서는 비선점형이 더 적합하다. 반면 실시간 시스템에서는 선점형이 적합하다.
*위에서 언급했듯이 우선순위 기반 스케줄링의 경우 '선점형', '비선점형' 둘 다 적용될 수 있는 스케줄링 방식이다.
이 때 우선순위의 높고 낮음을 판단하는 기준은 운영체제가 제공하는 여러 가지 정보를 기반으로 결정이 된다. 일반적으로 다음과 같은 정보를 고려하게 된다.
- 작업의 중요도 : 작업의 중요도가 높을수록 우선순위가 높아진다.
- 작업의 종류 : 작업의 종류에 따라 우선순위가 결정된다. 예를 들어, 실시간 시스템에서는 실시간 작업의 우선순위를 높게 설정하여 빠른 처리를 보장해준다.
- 작업의 실행 시간 : 작업의 실행 시간이 짧을수록 우선순위가 높아진다. 실행 시간이 짧은 작업은 빨리 실행되어야 하므로 우선순위를 높게 할당한다.
- 작업의 대기 시간 : 작업이 대기한 시간이 길수록 우선순위가 높아진다.
- 작업의 예상 실행 시간 : 작업의 예상 실행 시간을 고려하여 우선순위를 할당할 수 있다. 예상 실행 시간이 긴 작업은 우선순위를 높게 할당한다.
'기술 노트' 카테고리의 다른 글
Node.js의 '특징'과 '동작원리' 그리고 JS의 '동작원리' (0) | 2023.04.08 |
---|---|
DB Index란? (0) | 2023.03.28 |
defer과 async를 통해 HTML과 JS를 연결하기. (0) | 2023.03.19 |
모듈을 Import 할 때 { }(중괄호)를 쓰는 경우와 아닌 경우(Node.js) (0) | 2023.03.15 |
DOM이란? (0) | 2023.03.11 |