날것의 개인학습 내용 올리기.
오늘 하루의 학습 복기겸 기록, 자세한 느낀점은 일기에 적겠다.
개인적인 생각과 비유를 들며 학습한 내용이기에, 정확하지 않을 수 있다.
우선 첫날이라 책이 없어서 책 선정후 책주문 6권 구매
책이 오기전 os 개념을 익혀보려고 했다.
운영체제 OS
컴퓨터 하드웨어와 프로그램을 연결시켜주는 소프트웨어, 인터페이스 제공 및 자원관리.
- 인터페이스 : 입출력 장치를 통해 사용자가 쉽게 컴퓨터를 사용할수 있게 만들어줌
- 하드웨어와 프로그램 연결 : 프로그램 조작만으로 메모리에 올리거나, 파일을 저장 할 수 있게 해줌
- 자원관리 : 여기서 조금 애매 했는데, 자원의 범위가 어디까지인가가 헷갈렸다. 메모리, CPU 등의 저장 공간 사용률로 받아들임
책이 있어야겠다 싶어서
자료구조로 넘어감.
Chapter 1.
자료구조란? : 데이터를 표현하고, 저장하는것
크게 두가지로 나눌수 있다.
선형 : 말 그대로 데이터가 선의 형태로, 일렬로 저장 (리스트, 스택, 큐)
비선형 : 데이터를 나란히 저장하지 않는 구조 (그래프, 트리)
자료구조와 알고리즘
자료구조가 데이터를 표현하고, 저장하는거라면,
알고리즘은 데이터를 가지고 문제를 해결하는 방법
알고리즘 성능 분석
- 시간 복잡도 : 데이터가 문제를 해결하는데 걸리는 시간이 얼마나 빠른지
- 공간 복잡도 : 데이터가 문제를 해결하는데 드는 메모리 공간이 얼마나 필요한지
일반적으론 시간 복잡도를 말한다.
시간복잡도가 빠르다고 무조건 좋은게아니다.
대체로 빠른 알고리즘은 구현이 어려운편이기에, 성능이 중요하지 않는 경우에는 구현이 편한 알고리즘을 선택하기도 한다.
즉, 상황에 맞는 알고리즘을 쓰면 된다.
알고리즘의 성능 분석하는데에는, 연산의 횟수를 세는데.
모든 연산이 아니라 핵심이 되는 연산을 세야한다 (의존성 인건 제외)
그렇기에 객관적증거로 알고리즘의 성능분석은 쉬운일이 아니다.
최선의 경우 bast case, 최악의 경우 worst case
최선의 경우는 대부분의 알고리즘이 만족할만한 성능이 나오기 때문에 채택하지 않는다.
평균적인 경우로 average case 를 쓰기도하는데.
평균이 어딘지 구하는것조차, 다양한 시나리오나. 데이터 구성이 다르기때문에
결국엔 worst case를 선택한다.
순차 탐색 : 하나씩 차례로 탐색
이진 탐색 : 정렬이 필수! 정렬이 되어있기 때문에 끝에서 끝을 지정하고, 반씩 제외하면서 탐색
빅-오 표기법
최고 차항의 차수를 쓴다
수학적 접근
f(n) -> 분석할 알고리즘의 T(n) 실제 연산횟수.
g(n) -> 비교대상으로 삼을 단순 함수 (log n , n^2 ..)
n >= K에 대하여, f(n) <= Cg(n)을만족하는 두개의 상수 C, K가 존재하면
f(n) 의 빅-오는 O(g(n))이 된다.
어지러울수 있는 말이지만.
결국 최고 차항의 차수를 수학적으로 접근한것이때문에 어려워할 필요없다.
but. g(n)을 잘못 잡으면, 비교가 불가능하고, 너무 높게 잡으면 어떤경우도 충족 되버리기 때문에 적절한 비교대상을 찾아야한다.
왼쪽부터 속도가 빠르다
O(1) < O(log n) < O(n) < O(nlog n) < O(n^2) < O(2^n) < O(n!)
저녁밥 먹고 책이 도착해서 바로 컴퓨터구조 시작
컴퓨터 구조를 알아야 하는 이유
- 문제해결
구조를 모르면 해결을 할 수 없다. 저쪽 컴퓨터는 되는데 이쪽 컴퓨터는 안됨 왜그런지 알기위해. - 성능, 용량, 비용
프로그램을 만들었는데, 프로그램의 적절한 서비스 환경을 알아야한다.
ex 서버일경우, 서비스를 구동할 컴퓨터의 성능을 너무 높게잡으면 비용이 낭비되거나, 부족한상황이 생길수 있음,
너무 낮게잡으면 서비스가 불가능함.
클라일경우, 사용자의 사양의 범위를 타겟할 수 있고, 너무 높다면 개선 필요를 알게됨.
컴퓨터 구조의 큰 그림
- 컴퓨터가 이해하는 정보
컴퓨터는 0과 1만 안다. 그럼 0과 1로 되어있는게 뭘까?
*데이터
*명령어 (행동) 데이터를 이동하거나 계산한다. - 컴퓨터의 4가지 핵심부품
중앙처리장치 (CPU)
주기억장치 (메모리)
보조기억장치 (저장소)
입출력장치 (모니터, 키보드 등)
0과 1로 숫자로 표현 하는 방법
- 정보단위
bit : 0과 1
byte : 8개의 bit
word : CPU가 한번에 처리할수 있는 데이터 단위 - 이진법
0과 1로 표현
음수표현시 2의보수사용, 하지만 음수를 구분하려면? flag 사용 - 십육진법
09, AF
표기도 어려운데 왜쓰는가? : 2진법과 상호 변환이 쉽다.
0과 1로 문자를 표현 하는방법
- 문자집합과 인코딩
컴퓨터가 이해하고있는 문자들의 집합
인코딩 > 컴퓨터가 알수 있게 글자를 0,1로 표현
디코딩 > 사람이 볼수 있게 0,1을 문자로 표현 - 아스키코드
7자리 bit로 문자를 지정해놓은것. - EUC-KR
2바이트로 구성된 한글 표현방식, 하지만 한글의 전부를 나타낼수가 없다. - 유니코드와 UTF-8
유니코드는 한글뿐아니라 여러 나라의 언어들을 표현할수 있고 특수문자도 가능,
UTF > Unicode Tranfomation Format의 약자
소스코드와 명령어
- 소스코드 : 말 그대로 printf처럼 흔히 말하는 코드
- 명령어 : 컴퓨터가 이해할수 있는 저급언어
- 고급언어와 저급언어
고급언어 : 흔히 쓰는 C++ ,C#등의 언어 크게 2가지로 나뉨저급언어 - 어셈블리어 : 기계어를 사람이 알아볼수 있게한 언어
- 기계어 : 0과 1로 구성된 언어 (00101101 보기쉽계 16진수로 표현 d92f ac32..)
- 컴파일 언어 : 컴파일 과정을 거쳐 기계어로 변환하는 언어
컴파일이 뭘까? > 컴파일은 printf -> 010101110로 바꾸는것. 바뀐걸 목적코드라고 한다.
ps. 추가로 인터넷 검색해서 찾아봤는데 맞는지는 모르겠지만
컴파일러 변환 > 어셈블리어 > 어셈블러 변환 > 기계어 여기서 컴파일러 변환 ~ 어셈블러 변환까지의 과정이
컴파일 과정이라고 했다. - 인터프리터 언어 : 한줄한줄 기계어로 변환하며 실행하는 언어 한줄씩 실행하기 때문에 컴파일 언어보다 느리다. 완전한 인터프리터는 없다고한다. 컴파일 비스무리한걸 하긴한다고.
명령어의 구조
- 연산코드와 오퍼랜드
어셈블리어를 본적이 있으면 좀 쉬운데 mov a, b이렇게 있다면
mov 옮겨라(행동) -> 연산코드 (op코드)
a,b b를 a에게(대상) -> 오퍼랜드 - 주소 지정 방식
즉시 주소 지정 방식 : 때려넣는 느낌으로, 즉시 유효코드(데이터)를 오퍼랜드에
직접 주소 지정 방식 : 유효코드가 있는 메모리 주소를 오퍼랜드에
간접 주소 지정 방식 : 약간 포인터 느낌으로 유효코드의주소가 있는 메모리의 주소를 오퍼랜드에
메모리를 두번참조하는 하므로 느리다.
레지스터 직접 주소 지정방식 : 레지스터에 이미 유효코드가 들어가있고, 레지스터의 주소를 오퍼랜드에
레지스터 간접 주소 지정방식 : 레지스터에 유효코드가 있는 메모리의 주소를 오퍼랜드의
운영체제를 읽고,
1~2챕터는 보면서 정리하면서 해서 아는 내용이 있는데도 느렸다.
3챕터는 이해하려고 하면서 다보고 정리했는데도 기억이 잘났다.
문제는 1회독 인데 이해 안되면 안넘어가려고 해서 너무 느리다.
내일은 좀 공부 방식을 바꿔보면서 해야할듯.
이해X -> 가볍게 읽고 읽혀지는대로 가볍게 넘어가서 복기한번 하면서 옵시디언에 기록후 다음챕터.
챕터 정해놓고 시간별 수업처럼 진행해보기도하고.
여기는 복기하면서 옵시디언에 기록한거
그냥 복사 붙여넣기 하는 방향으로, 정리 없이. 시간아끼자.
'학습 노트 > 개인학습' 카테고리의 다른 글
250503 6일차 (0) | 2025.05.04 |
---|---|
250502 5일차 (0) | 2025.05.03 |
250501 4일차 (0) | 2025.05.02 |
250430 3일차 (0) | 2025.05.01 |
250429 2일차 (0) | 2025.04.30 |
댓글