know = 설명할 수 있음
"개발자가 성장하려면 제대로 알아야 한다"
CPU
CPU = CPU Core + Controllers
Core : 소프트웨어 해석, 실행 담당 => 연산 처리
Controller : 연산 결과에 따른 CPU 주변 장치 제어 담당 => 주변 장치(H/W)별로 존재
※ 컴파일 : 자연어를 CPU 코어가 이해할 수 있는 CPU 명령어로 변환하는 과정
=> CPU 내부의 트랜지스터는 전기신호(전압)로 이진 데이터 처리
=> 0과 1은 사람이 이해하는 자연어이고 이를 전기신호로 변환하면서 CPU가 해석할 수 있게 됨
3. 왜 앱은 디스크에서 메모리로 로딩되어야 실행되는 건가요?
※ 파일은 소프트웨어만이 다룰 수 있는 단위 (CPU 기계는 다룰 수 없음)
=> 소프트웨어 형태를 하드웨어(CPU)가 이해할 수 있도록 메모리에 로딩함
1. 애플, M1 칩(ARM)은 왜 전력은 낮고 성능은 높을까요?
일반 컴퓨터 : 메모리가 Bus 구조로 연결됨, GPU 내부도 Bus ( Bus : 확장성 높지만 속도 느림 )
애플 맥북 : Unified memory architecture => 메모리 공유를 통해 극단적으로 메모리 동작 횟수 줄임
OS
- 범용 운영체제
: 다양한 애플리케이션, 작업 실행 가능
ex) Linux, Mac OS
- OS 구조
소프트웨어 => CPU에 가까이 갈수록 하드웨어에 접근할 수 있는 권한이 많아짐
2. OS는 개발되는 프로그래밍 언어에 영향받지 않고 어떻게 항상 앱을 실행시킬 수 있나요?
유저 라이브러리 : 일반적으로 알고 있는 개발자용 라이브러리
시스템 라이브러리 : 애플리케이션을 시스템에서 실행시켜주는 라이브러리
개발자가 작성하는 애플리케이션 코드는 래핑된 함수
=> 래핑 벗겨내면 시스템 라이브러리 함수
=> 내 애플리케이션을 OS에서 실행해주게 함
※ Software Interrupt
시스템 라이브러리 함수 실행시키면(ex. swi 0x900005;) Vector Table 내 대응하는 함수 위치 찾아 실행
=> CPU가 하던 작업 중단시킴
- 실시간 운영체제 (RTOS) 애플리케이션
: OS 커널 내부 함수를 작성해야 실행 가능
ex) 비행기, 차량 소프트웨어
4. 왜 안드로이드 애플리케이션에는 main 메서드가 없는가?
안드로이드 => 앱이 직접 실행을 시작하는 구조가 아닌, 시스템 라이브러리가 실행 시작하는 구조
=> JVM을 정적으로 선언하여 시스템이 앱 실행을 관리함.
(C언어 애플리케이션이면 컴파일 단계에서 -static 추가하여 정적 링크로 프로그램을 고정시켜야 함)
- OS
오픈스택 : 인프라 구축 시 사용하는 오픈소스 프로젝트
=> 스케줄러를 통해 디스크에 있던 애플리케이션을 메모리에 올려 프로세스화시켜 구동
=> Nova(오픈스택의 스케줄러 역할)를 통해 VM의 이미지 파일은 VM으로 실행됨
=> 오픈스택은 VM을 실행/관리하기 위한 OS (≒Meta OS)
ex) 로봇 소프트웨어 개발 시 Ubuntu 위에 ROS(Robot Operating System) 설치됨
=> Meta OS는 로봇을 제어할 때 필요한 함수들을 한 단계 위에서 OS처럼 제공함
Tool
소프트웨어 => Compile(문법 검사) & Linking(실행에 필요한 정보 추가) 과정으로 구성됨
컴파일러 : 문법 검사
시스템 라이브러리 : 프로세스 실행 지원
Binutils : 바이너리 파일 후처리
세가지 요소 모두 애플리케이션 실행에 필수
5. 왜 C언어에는 사용하지 말라는 GOTO가 있을까요?
GOTO : 프로그램 흐름을 특정 위치로 즉시 점프 (어셈블리어의 JMP와 유사)
=> OS 개발 시 하드웨어와 가까운 시스템 단 작업을 하는 과정에서 GOTO는 어셈블리어와의 매핑에 도움을 줌
※ 어셈블리어 : 하드웨어와 가장 가까운 저수준 언어
운영체제 수준에서의 개발을 위해 C언어에 GOTO가 포함된 것이므로, 현대 애플리케이션 개발자들은 GOTO 사용을 지양해야 함
마무리
코딩 능력, 근성(디버깅?) 은 오픈소스 소프트웨어를 탐색해보며 향상하고,
소통 능력(말하기, 글쓰기)은 발표, 블로그 등을 통해 향상하자.
느낀 점
처음에 CPU 얘기 나올 땐 흥미진진하게 듣다가 점점 내용이 어려워져서 영상을 잠깐 멈추고 되돌아가고를 몇 번이나 반복해서 이틀 동안 봤다. 마지막 질문 두개는 이해가 잘 안돼서 GPT한테도 물어봤다. 컴퓨터공학의 역사와 공부 범위는 정말 무궁무진하구나..! C언어는 포인터 문법 밖에 몰랐는데 이번 기회에 운영체제 수준 개발 용도였고 GOTO라는 시스템 개발용 제어문을 갖고 있음을 배웠고, 나아가 어셈블리어와 저수준 언어에 대해서도 알게 되었다. 초반에 말씀하신대로 이걸 아하! 하면서 알아들은 거에 멈추지 않고 설명할 수 있을 정도로 뇌에 정리해야 하는데 조금 막막하긴 하다. 컴퓨터의 역사를 보면서 타임라인대로 정리해야 하려나.. 공부법이랑 공부범위, 순서에 대해 좀 더 생각해봐야겠다. 일단은 알게 되는 대로 찾아보고, 배운 정보에 대해 아이패드에 끄적이면서 혼잣말이나 해야겠다
'Programming > 컨퍼런스' 카테고리의 다른 글
[인프콘 2022] 나도 내 코드의 문제를 찾고 싶다구요?! - 테스트 할 때 기억할 7가지 (0) | 2024.09.29 |
---|---|
[goorm COMMIT] 더 나은 코드를 위한 켄트 벡의 Tidy First? (0) | 2024.06.23 |
[당근 ML 밋업] LLM을 프로덕션에 적용하며 배운 것들 (0) | 2024.06.14 |
[NHN FORWARD 22] 클린 아키텍처 애매한 부분 정리해드립니다 (0) | 2024.06.11 |
[2023 클라우드 컨퍼런스] Cloud Native 성공 전략 (0) | 2024.06.02 |