- C언어는 Transistor를 개발한 벨 연구소에서 Unix를 만들다 Assembly로의 개발에 한계를 느껴 개발된 언어
- C++도 이 연구소에서 개발됨
- OS(Unix)를 만들던 언어이므로 효율성이 높고, OS의 주요 역할이 HW 제어이므로 C언어도 HW에 강력함
- 우리가 사용하는 모든 프로그램은 HW를 사용하기 위함이다
0.1 컴퓨터의 구성 요소들
- 사용자 -> 입력장치 -> 컴퓨터 본체 -> 출력장치 -> 사용자 -> 입력장치
- 위의 과정을 반복하며 동작
- 입/출력이 다른 컴퓨터에 의해 진행될 수도 있음
- 메인보드 (마더보드) : 컴퓨터에서 주회로가 내장된 보드. CPU, 메모리 등이 내장되어 있다.
1) 중앙 처리장치 (Central Processing Unit) : 컴퓨터에서 모든 연산을 담당. 일을 하는 부분
- 보통 수십~수백억개의 트랜지스터들로 구성되어있다
- 컴퓨터 및 OS에 필요한 명령과 처리를 실행한다
2) 그래픽스 카드(Graphics Card) : GPU + 그래픽스 용도의 Memory
- 그래픽스 카드는 자체적으로 팬을 가지고 있음. 그래픽스 카드 자체를 하나의 컴퓨터로 볼 수 있음
- GPU (Graphics Processing Unit): 그래픽 카드 안의 CPU
- 특정 연산을 여러번 반복할 시 (ex) 딥러닝) 그래픽스 카드 여러개로 계산량을 높임
- 보편적으로 그래픽스 카드와 디스플레이가 연결됨
- 초기의 그래픽스 카드는 카드처럼 얇았으나 게임분야의 발전에 따라 지금처럼 두꺼워짐
- 특정 3D 렌더링 작업 속도 단축을 위해 개발된 ASIC였으나, 시간이 지나며 범용적인 병렬 프로세서로 발전하여 Deep Learning 등의 다양한 분야에서 활용됨
- Rendering : 이미지 합성의 의미를 가지며 컴퓨터 프로그램을 사용하여 Model 또는 이들을 모아놓은 장면인 Scene 파일로부터 영상을 만들어내는 과정을 말한다
- CPU vs GPU
- CPU는 직렬 명령 처리를 위해 설계되어 서로 다른 명령어들을 빠르게 처리할 수 있다
- 반면 GPU는 병렬 명령 처리를 위해 설계되어 많은 양의 동일한 명령어들을 빠른 속도로 처리할 수 있다
- CPU에 비해 다수의 코어를 가지고 있으나 성능은 CPU보다 떨어진다
- 따라서 복잡한 작업에는 CPU가 유리하며 다수의 단순 반복 작업에는 GPU가 유리하다
3) 주 기억장치 - 메모리 (Primary Storage - Computer Memory) : 저장을 하는 부분
- 주 기억 장치는 컴퓨터 내부의 CPU가 현재 처리하고 있는 내용을 저장하는 역할을 함
- 주 기억장치의 종류로는 RAM, ROM이 있다
- RAM (Random Access Memory) : 보조 기억 저장 장치의 데이터 (OS, 응용 프로그램 등)를 일정량 복사해 임시 저장한 후 CPU에 빠르게 전달하는 역할
- 전원을 끄면 데이터가 사라지므로 (휘발성. 이 방식이 속도가 빨라서 사용), 따로 데이터를 저장해놓을 보조 기억장치 필요
- 실행중인 파일은 항상 보조기억장치에 저장해줘야 함
- ROM (Read Only Memory) : 읽기 전용 메모리, 저장된 메모리를 읽을수만 있고 새로운 정보를 기억시킬 수 없음
- 전원을 종료해도 데이터가 소멸되지 않음 (비휘발성). BIOS같은 System에 기억시키고 변화시키면 안되는 주요 데이터 저장
- 보통 보조 기억장치는 다른 곳에 연결
- RAM의 용량이 클수록 보조 기억 저장 장치에서 한번에 RAM으로 올리는 Data의 양이 늘어나 다중작업에 유리
- CPU와 Memory는 물리적으로 가까워 서로 통신을 주고 받음.
4) 보조 기억 장치 (Auxiliary/Secondary Storage) : 물리적인 Disk가 연결되어 있는 기억장치
- 컴퓨터를 꺼도 데이터를 저장함 (비휘발성). 주 기억장치보다 훨씬 느림
- OS, 응용프로그램, 데이터 등이 저장됨
- 보조 기억 장치의 종류로는 HDD, SSD가 있다
- HDD (Hard Disk Drive) : 내부에 디스크가 돌아가는 걸 핀이 돌아가는 순서로 찾음
- 물리적으로 움직이는 부분 존재
- SSD (Solid - State Drive) : Flash Memory (USB같은 비휘발성 컴퓨터 기억 장치) 가 발전된 형태
- 물리적으로 움직이는 부분 X
- HHD보다 상대적으로 빠르고 비쌈
- HHD는 플로피 디스크 (FFD)보다 딱딱해서 Hard라는 이름이 붙음. 원리는 FFD와 동일
- 플로피 디스크를 장치에 넣으면 돌면서 (Driving 하면서) 데이터를 읽어서 Drive라는 이름이 붙음
- 전통적으로 A, B 드라이브가 플로피 디스크 드라이브여서 요즘 컴퓨터에선 C 드라이브부터 시작함
- HDD vs SSD
- HDD
- 기계적 매체(지정된 주소로 직접 이동)
- 수명 3~5년 정도
- 온도에 큰 영향을 받지 않음
- 물리적인 처리를 반복하다보니 Bad Sector(물리/논리적 손상) 위험 있음
- 용량 대비 가격이 SSD에 비해 높음
- 아카이빙(장기간 자료 보관)에 유리 : 무전원으로 20년 정도 보관 가능
- SSD
- 전자적 매체(전기적 신호 사용)
- 수명 20년 정도
- 고온에 취약 : Throttling(발열, 배터리 수명 등의 이유로 전자기기의 성능을 낮추거나 종료시키는 것) 위험 존재
- FLASH Memory는 정전기에 취약
- 고온에서 데이터 자연 증발 현상으로 인한 데이터 유실 가능성 있음
- 전력 소비량이 적어 발열이 적음
0.2 컴퓨터를 켤 때 일어나는 일들
1) 전원버튼 on
2) 전원 공급 장치가 메인보드에 전원 공급 -> 그 안의 부품들에 전기가 공급
3) 부트 프로그램 (하드웨어 검사) 실행
- 메인 보드에 전원이 들어오면 ROM BIOS가 가장 먼저 실행
- BIOS는 내용이 변화되면 안되므로 ROM에 저장
- BIOS 실행을 위해 1MB의 공간 필요
- Basic Input Output System
- PC용 Firmware. PC의 기본적인 입출력을 관리하며 메인보드 시작시의 절차들을 담고 있음
- 전원이 켜지면 POST(Power On Self Test)를 통해 HW의 정상동작 여부 검사 후 보조기억장치 내의 OS를 불러와 부팅 시작
- 입출력을 포함한 PC의 모든 HW/SW의 기본적인 동작을 제어하고 컴퓨터의 HW와 OS를 연결하는 역할을 한다
- 따라서 HW가 바뀌더라도 OS에서 일일히 설정할 필요가 없다
- PC의 가장 기초적인 기능을 담당하므로 BIOS가 손상되거나 지워지면 PC는 동작을 전혀 하지 못한다
- 2010년 경 부터 UEFI (Unified Extensible Firmware Interface)가 보급되어 기존의 BIOS를 대체함
- UEFI : OS와 Platform Firmware 간의 SW Interface를 정의하는 공개 사양
- Platform : SW가 구동 가능한 HW Architecture나 SW Framework의 종류를 설명하는 단어. 컴퓨터 아키텍처, OS, 프로그램 언어, 관련 Run Time Library 또는 GUI를 포함한다
- Interface : 서로 다른 두 개의 System이나 Device 사이에서 Data나 Signal을 주고받을 때의 매게체, 경계면으로, 컴퓨팅에서는 컴퓨터 시스템들끼리 정보를 교환할 때 공유 경계를 의미한다
- 즉 두 장치나 시스템간의 접점, 경계면을 의미한다
- 즉 컴퓨터의 Firmware를 OS에 연결하는 역할을 한다
- 컴퓨터 부팅 시 첫번째로 실행되어 HW를 OS와 연결하여 OS가 부팅되고 Hard Drive의 정보를 Load할 수 있도록 함
- Hardware 구성 요소가 연결되어 있는지 확인한 후 구성 요소를 깨우고 OS에 연결함
- UEFI는 기존의 Legacy BIOS를 대체한다
- 특정 Firmware를 통해 컴퓨터의 Mother Board 위에서 작동하며 제조 과정에서 사전 설치됨
- UEFI vs BIOS : 기능상으로는 동일한 역할을 함 (OS Load 전 OS와 Firmware Hardware를 연결)
1. UEFI
- 지원 드라이브 크기 : 8ZB (BIOS의 10^12 배 크기)
- 사용 환경 : 3TB 이상의 OS Hard Drive, GPT Disk
- OS는 32/64 bits
- 즉 최신의 OS에서는 UEFI를 사용함
- 초기화 위치 및 시작 정보 : EFI 파일의 .efi 파일
- BIOS에 비해 부팅 속도 빠름
- 보안 부트 (맬웨어에 의한 PC 손상 방지), 네트워킹 기능 (원격 문제 해결 및 구성) 지원
- Malware : 프로그래밍 가능한 기기 또는 네트워크를 손상시키거나 악용하도록 설계된 모든 종류의 악성 소프트웨어를 가리키는 용어
- BIOS에 비해 더 유용한 세부 설정 메뉴를 가짐
2. BIOS
- 지원 드라이브 크기 : 2TB
- 사용 환경 : 2TB 이하의 OS Hard Drive, MBR Disk
- 2.1TB 이상에선 부팅 불가
- 16bits만 사용 가능
- 초기화 위치 및 시작 정보 : Firmware
- 보안 부트, 네트워킹 기능 지원 X
- HW 한번에 초기화가 어려워 부팅 속도가 UEFI에 비해 느림
- 컴퓨터가 UEFI를 사용중인지 확인하는 방법
- Windows + R 키를 누르고 MSinfo32 입력
- 확인 후 뜨는 창에서 'BIOS 모드'를 찾아 확인 가능
- 레거시인 경우 BIOS, UEFI인 경우 UEFI 사용 중
4) 운영체제 로드 (OS가 보조 기억 장치 -> 주 기억 장치로 복사가 됨)
- 운영체제는 보조 기억 장치에 저장 -> 주 기억장치는 전원을 끄면 데이터가 사라지기 때문
- CPU는 RAM과만 일을 하고, 보조 기억 장치엔 직접 접근 불가
- RAM에 OS를 복사한 후 그것을 CPU가 실행시킴
5) 운영체제 실행 : CPU가 OS 실행
0.3 운영체제가 해주는 일들 (IOS, Windows, Android, Mac Os...)
- 컴퓨터를 킨 후의 모든 일은 OS를 통해서 함
- C언어도 Unix를 개발하다가 나온 부산물
- Windows를 제외한 현재 대부분의 현대적 컴퓨터 OS의 원형이 되는 운영체제
- Unix에서 Linux(무료 OS)가 나옴
- OS (Operating System) : Computer의 Resource들(Hardware, Software 등)을 제어하고 Program에 대한 일반적 서비스를 지원하는 System Software
- 여러개의 프로그램 실행 시 OS가 어떤 프로그램이 하드웨어의 자원들(CPU, 메모리등)을 사용할지 제어하는 역할을 함
- 커널(Kernel) : OS에서 항상 메모리에 올라가 있는 OS의 핵심 부분으로, 하드웨어를 담당하는 부분이다
- 응용프로그램과 하드웨어 사이에서 Interface를 제공하여 둘을 중계해주며 컴퓨터 자원들을 관리한다
- Kernel은 항상 컴퓨터 자원들만을 바라보므로 User와의 상호작용은 지원하지 않는데, User와의 직접적인 상호작용을 위해 Shell 등의 명령어 해석기 프로그램을 제공함
- Shell : CLI(Command Line Interface) 명령을 해석하는 Software로, 명령어와 프로그램을 실행할 때 사용하는 Interface 이다
- CLI : 문자열의 형태로 작업 명령을 입력하여 컴퓨터에 명령을 내리는 방식. 즉 글자를 입력하여 컴퓨터에 명령을 내리는 방식을 뜻한다
- 즉 User가 OS의 서비스에 Access하기 위한, Kernel과 User 간의 다리 역할을 한다
- 사용자로부터 명령을 받아 해석하고 프로그램을 실행
- User가 Shell에 명령어 입력 -> OS가 알아들을 수 있게 해석 -> Kernel이 그 내용을 받음 -> 하드웨어에 직접 명령
- Shell은 자체로 프로그래밍 기능이 있어 여러 명령을 반복적으로 수행하는 작업을 하나의 프로그램으로 제작할 수 있음
- 위와 같은 프로그램을 Shell Script라고 함
- 또한 초기화 파일 기능을 통해 User의 환경설정을 할 수 있음 (로그인 시 해당 초기화 파일이 실행되어 User의 초기 환경이 설정됨)
- 즉 아래와 같이 Terminal 창에서 명령어를 입력하는 환경을 Shell이라 한다. OS에 따른 Shell 실행 법은 아래와 같다
- Window : 명령 프롬프트(CMD)
- macOS : Terminal
- Prompt : User의 명령을 받아들일 준비가 되었음을 모니터에 나타내는 표시로, Terminal에서 키보드의 입력을 확인하고 편집할 수 있는 한 줄의 공간을 의미한다
- Terminal : Shell을 실행하기 위해 글자 입력을 받아 컴퓨터에 전달하거고 컴퓨터의 출력을 화면에 글자로 출력
- Terminal은 단순 Text 입출력 환경이고 컴퓨터랑 상호작용하여 명령을 처리하고 출력을 내는 것은 Shell이 한다
- 즉 Terminal은 명령어에 액세스 할 수 있도록 하는 Interface이다
- 물리적(하드웨어 형태) Terminal은 Console이라고 한다 (시스템에 직접 연결)
- Terminal은 콘솔에서 원격제어 환경까지 포함하는 더 넓은 의미이다
- Shell과 Terminal은 항상 같이 실행되어 둘은 보통 같은 의미로 사용한다
- Shell의 종류로는 Bourne Shell(sh), bash, C Shell(csh)등이 있다
- 현재 Linux는 bash를 표준 Shell으로 사용하고 있음 (GNU OS, Mac, OS X 등의 다양한 OS에서 사용 중)
$ ehco $SHELL
$ env | grep SHELL
- 위의 두 명령어 중 하나를 통해 현재 사용중인 Shell 확인 가능
- 시스템 프로그램 (System Program) : 컴퓨터의 시스템에 대해서 작동은 하지만 OS의 핵심은 아닌것들 ex) 바탕화면 바꾸기
- 응용 프로그램(Application Program) : 시스템 프로그램을 제외한 나머지 대부분의 프로그램들
- 하드웨어를 어떻게 사용할지를 OS를 만들며 미리 만들어 다른 프로그래머들에게 제공
- 하드웨어를 직접 다루는 것은 어려운 일이다
- 프로그램 개발 시 여러 부분을 직접 개발하지 않고 인터페이스라는 도구를 이용해 개발
강의 출처 : https://www.inflearn.com/course/following-c/dashboard
참고 자료 :
https://www.easeus.co.kr/diskmanager/what-is-uefi.html
https://mindstation.tistory.com/152
https://www.intel.co.kr/content/www/kr/ko/products/docs/processors/cpu-vs-gpu.html
https://minkwon4.tistory.com/295
'Study_C, C++ > 홍정모의 따라하며 배우는 C언어' 카테고리의 다른 글
[홍정모의 따라하며 배우는 C언어] 1.5 통합개발환경 소개 ~ 1.7 비주얼 스튜디오 2019의 기본적인 사용법 (0) | 2021.07.02 |
---|---|
[홍정모의 따라하며 배우는 C언어] 1.1 C언어의 탄생 ~ 1.4 소프트웨어 개발의 7가지 단계 (0) | 2021.07.01 |
[홍정모의 따라하며 배우는 C언어] 0.9 정보의 단위 ~ 1.0 C언어를 제대로 배우는 방법 (0) | 2021.06.30 |
[홍정모의 따라하며 배우는 C언어] 0.7 CPU의 기본 구조 ~ 0.8 CPU가 일하는 방법 (0) | 2021.06.29 |
[홍정모의 따라하며 배우는 C언어] 0.4-컴퓨터는 왜 2진수를 사용할까? ~ 0.6-컴퓨터 메모리의 기본 구조 (0) | 2021.06.29 |