컴퓨터 시스템이 2진법인 이유는 컴퓨터의 저수준 계층이 각각 켜고 끄는 스위치인 트랜지스터로 구성되어 있기 때문임.숫자 0과 양의 정수0이라는 개념을 표현하기 위해 위치 기수법을 사용하여 값과 숫자의 위치를 표현함.ex) 숫자 5를 2진법으로 표기하면 101(2) 임. → 1 x 2^2 + 0 x 2^1 + 1 x 2^0비트 k개를 사용하면 정수 2^k개를 나타낼 수 있음.ex) k가 8 비트이면, 표현 가능한 범위는 0~255 임. → 부호 없는 정수에 해당함.부호 있는 정수부호 없는 정수를 나타내려면 부호 있는 정수에서 표현 범위를 반으로 나누면 됨.ex) 4비트 부호 없는 정수 → 0~15부호 있는 정수는 1~7, 그리고 -8~-1 까지 표현할 수 있음.비트로 표현한다면, 최상위 비트를 정수 부호로..
컴퓨터의 CPU 사용률은 얼마인가?대부분의 CPU 사용률은 7~8% 정도로 매우 낮음.물론 게임, 영상 편집, 이미지 처리 같은 상황은 다르게 판단해야 함.이러한 상황이 아님에도 사용률이 항상 높다면 소프트웨어 버그이거나, 바이러스 감염 가능성을 고려해야 함.ex) 프로세스가 약 300개가 열려있는데, 이렇게 많은 프로세스는 기본적으로 아무 작업도 하지 않고 있음.특정 이벤트가 발생하여 자신을 깨우기를 기다리고 있음.즉, 그전 까지는 계속 대기 상태에 머무르게 됨.프로세스 관리와 스케줄링프로그램이 메모리에서 실행되면 프로세스 형태로 존재함.프로세스가 생성되면 운영 체제가 관리하고 스케줄링 함.프로세스에 우선순위를 할당하고, 우선순위에 따라 스케줄러(scheduler)가 스케줄링할 수 있도록 대기열을 통해..
위대한 발명트랜지스터는 한쪽에 전류를 흘려서 나머지 단자 두 개에 전류가 흐르거나 흐르지 못하게 할 수 있음.스위치와 동일함.프로그래머가 작성한 프로그램이 아무리 복잡해도 소프트웨어가 수행하는 최종적 기능은 이 트랜지스터의 간단한 개폐 작업으로 완성됨.논리곱, 논리합, 논리부정스위치 두 개를 동시에 켜야만 전류가 흐른다 → 논리곱스위치 둘 중 하나라도 켜있으면 전류가 흐른다 → 논리합스위치를 닫아야만 전류가 흐름 → 논리부정이러한 논리곱, 논리합, 논리부정 게이트로 모든 논리 함수를 표현할 수 있음.논리적 완전성(logical completness) 라고 함.이 논리 게이트외에 어떠한 다른 형태의 논리 게이트 회로가 필요가 없음.위 세 논리 게이트가 논리적으로 완전하다고 간주함.연산 능력은 어디에서 나올..
현재 기준, 성능이 가장 좋은 SSD 제원을 확인해보면 순차 읽기 속도가 최대 7.5GB/s 임.현재 5세대 DDR 메모리 최대 대역폭은 60GB/s 임.즉, SSD 속도로 비교해보면 SSD 를 메모리로 사용하면 컴퓨터 속도가 현재보다 약 10분의 1 수준으로 느려짐.메모리 읽기/쓰기 vs 디스크 읽기/쓰기메모리의 주소 지정 단위는 바이트임.각 바이트마다 메모리 주소가 부여되어 있음.CPU가 이 주소를 이용하여 해당 내용을 직접 접근할 수 있음.SSD는 조각 단위로 데이터를 관리함.이 조각 크기는 매우 다양함.CPU가 파일의 특정 바이트에 직접 접근할 수 있는 방법이 없음.즉, 바이트 단위 주소 지정이 지원되지 않음.즉, CPU는 SSD 또는 디스크에서 직접 프로그램을 실행할 수 없음.가상 메모리의 제한..
지역 변수의 포인터 반환하기int* func(){ int a = 2; return &a;}void main(){ int* p = func(); *p = 20;}지역 변수 a가 func 함수의 스택 프레임에 위치함.func 함수의 실행이 끝나면 해당 스택 프레임도 없어짐.즉, main 함수의 func 함수를 호출한 후 얻은 포인터는 이미 없는 변수를 가리킴.만약 위 상황에서, 추가적으로 foo 와 같은 함수가 호출되면 포인터 p의 내용을 foo 함수의 스택 프레임이 덮어 쓰게됨.혹은, 포인터 p가 가리키는 값을 수정하면 실제로 foo 함수의 스택 프레임이 파괴됨.포인터 연산의 잘못된 이해포인터 연산에 1을 더하는 것은 1바이트만 이동하는 것이 아님.단위 한 개만큼 이동함.ex) int..
메모리 풀 vs 범용 메모리 할당자범용 메모리 할당자인 malloc 은 표준 라이브러리의 일부임.설계 및 구현이 비교적 복잡함.메모리 풀은 응용 프로그램의 일부임.설계 및 구현이 비교적 간단함.특정 상황에서만 메모리 할당 성능을 최적화하기에 범용성이 매우 떨어짐.메모리 풀 기술의 원리한 번에 큰 메모리 조각을 요청하고 그 위에서 자체적으로 메모리 할당과 해제를 관리하는 방식임.표준 라이브러리와 운영 체제를 우회함.특정 사용 패턴에 따라 최적화도 가능함.ex) 서버에서 사용자 요청을 처리할 때마다 여러 종류의 객체를 생성해야 한다면, 자체 메모리 풀에서 미리 이 객체를 생성해 두는 것이 가능함.초간단 메모리 풀 구현ex) 서버 프로그래밍단 한 종류의 객체만 사용한다면, 미리 객체를 메모리로 생성하여 실제 ..
CPU 실행상태x86 CPU는 네 가지 특권 단계를 제공함.CPU의 여러 가지 동작 상태를 나타냄.숫자가 작을 수록 CPU의 특권은 커짐.여기서 특권은, 일부 명령어를 실행할 수 있는지를 나타냄.일반적으로 시스템은 CPU 특권 단계 0, 3 두 단계만 이용함.3단계는 사용자 상태(user mode), 0단계는 커널 상태(kernel mode) 라고 함.커널 상태와 사용자 상태CPU가 운영 체제의 코드를 실행할 때 바로 커널 상태에 놓임.커널 상태에서는 CPU가 모든 기계 명령어를 실행할 수 있고, 모든 주소 공간에 접근할 수 있음.제한 없이 하드웨어에 접근할 수 있음.프로그래머가 작성한 일반적인 코드를 CPU가 실행할 때는 사용자 상태에 해당함.특정 주소 공간에 절대 접근할 수 없음.이것이 바로 유명한 ..
여유 메모리 조각을 선택하는 방법최초 적합 방식매번 처음부터 탐색하다가 가장 먼저 발견된 요구 사항을 만족하는 항목을 반환first fit 방식이라고 함.다음 적합 방식메모리를 요청할 때 처음부터 검색하는 대신 적합한 여유 메모리 조각이 마지막으로 발견된 위치에서 시작함.최적 적합 방식사용 가능한 메모리 조각을 모두 찾은 후 그중 요구 사항을 만족하면서 크기가 가장 작은 조각을 반환함.메모리 할당머리 정보와 남아있는 할당 정보를 통해 내부 단편화를 최소화하여 메모리 할당할 수 있음.메모리 해제사용자가 메모리 해제 요청할 주소를 전달하면 해당 머리 정보를 통해 여유 메모리로 바꾸면 해제가 완료 됨.여유 메모리 조각을 효율적으로 병합메모리 조각 끝에 꼬리 정보를 추가함.메모리 조각을 일종의 암시적 양방향 연..
힙 영역이 필요한 이유특정 데이터를 여러 함수에 걸쳐 사용해야 한다면?전역 변수는 모든 모듈에 노출되어 있는데, 모든 모듈에 노출하고 싶지 않을 때가 있음.이때, 프로그래머가 직접 관리하는 특정 메모리 영역에 저장해야 함.메모리 수명 주기에 프로그래머가 완전히 직접 제어할 수 있는 매우 큰 메모리 영역이 필요함.이를 바로 힙 영역이라고 함.malloc 메모리 할당자 직접 구현하기c/c++ 언어에서 메모리의 도적 할당과 해제 요청은 모두 전문적으로 힙 영역에 메모리를 할당하고 해제하는 작은 프로그램에 전달되어야 함.이 프로그램은 malloc 메모리 할당자임.메모리 할당자 입장에서 적절한 크기의 메모리 영역을 제공하기만 하면 됨.할당자는 그 메모리 영역에 무엇을 저장할지까지는 신경 쓰지 않음.힙 영역은 사실..
함수 호출 활동 추적 : 스택스택은 후입선출 순서의 데이터 구조임.이진 트리 탐색으로 볼 수 있음.트리 구조의 순회는 재귀 뿐만 아니라 스택으로도 사용 가능함.스택 프레임 & 스택 영역함수 실행 시, 작은 상자가 필요함.이 작은 상자를 스택 프레임, 호출 스택이라고 함.이 스택에는 함수 호출 정보가 필요함.함수 점프와 반환함수 A가 함수 B를 호출하면 제어권이 함수 A에서 함수 B로 옮겨짐.제어권이란 실제로 CPU가 어떤 함수에 속하는 기계 명령어를 실행하는지를 의미함.제어권이 이전될 때는 다음 두 가지 정보가 필요함.반환(return) : 어디에서 왔는지에 대한 정보함수 A의 기계 명령어가 어디까지 실행되었는지점프(jump) : 어디로 가는지에 대한 정보함수 B의 첫 번째 기계 명령어가 위치한 주소매개..
메모리의 본질 : 비트, 바이트, 객체메모리는 메모리 셀(memory cell)로 가장 작은 단위를 구성함.이를 비트라고 하며, 1과 0을 보관할 수 있음.비트 8개가 모여 1바이트를 이룸.각 바이트마다 번호를 붙임.즉, 모든 바이트는 메모리 내 자신의 주소를 가지고 있음.1바이트로 정보를 표현하기엔 한계가 있음.따라서 바이트를 묶어서 여러 정보를 표현함.ex) 4바이트 → 32비트 → 4,294,967,295개의 조합이 가능4바이트도 부족하면 여러 정보를 묶는 구조체, 객체를 만들면 됨.변수의 의미메모리 주소에 값을 저장했다고 치자.ex) 주소 6에 값 1을 저장함.→ 주소 6이라는 표현 대신 변수 a를 둬서 직관적으로 표현함.포인터 이해하기변수의 주소를 알고 있다면 그 변수의 값을 굳이 ‘복제’할 필..
요약**코드, 데이터, 변수, 포인터**메모리에 코드로 구성된 명령어를 저장할 수 있음.마찬가지로 명령어가 작동하는 데 필요한 데이터도 저장할 수 있음.구조체 인스턴스, 객체, 배열 일 수 있음.별칭을 사용하여 변수를 지정할 수 있음.여러 변수가 동일한 데이터를 참조할 수 있음 → 포인터**콜백 함수와 클로저**데이터 뿐만 아니라 코드도 여러 변수가 참조할 수 있음.이 함수를 일급 객체 함수(first-class function) 라고 함.c언어에서는 함수가 일급 객체가 아니므로 함수에서 다른 함수를 반환할 수 없음.파이썬에서는 함수가 일급 객체이므로 함수를 일반 변수처럼 반환할 수 있음.함수가 다른 함수에 매개변수로 전달될 때 해당 함수를 콜백 함수라고 함.콜백 함수가 A에 정의되어 있고 B에서 실행된..