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에서 실행된..
요약다중 프로세스장점프로그래밍이 간단하여 매우 이해하기 쉬움개별 프로세스 주소 공간이 격리되어 있어 다른 하나의 프로세스에 문제가 발생하여 강제 종료되더라도 다른 프로세스에 영향을 미치지 않음.다중 코어 리소스를 최대한 활용할 수 있음.단점프로세스 공간 격리로 인해 서로 통신이 필요할 때 난이도가 올라감. -> 프로세스 통신 작동 방식을 사용해야 함.프로세스 생성시 부담이 큼.다중 스레드스레드는 프로세스 주소 공간을 공유함.스레드 간 통신을 위해 별도 통신 작동 방식을 사용할 필요 없음.서로 같은 주소 공간을 공유하기에 하나의 스레드가 문제가 발생하여 강제 종료되면 같은 프로세스를 공유하는 모든 스레드와 프로세스가 한꺼번에 강제 종료됨.여러 스레드가 공유 리소스를 동시에 읽고 쓸 수 있는 부작용이 있음...
요약 블로킹과 논블로킹 함수 a가 함수 b를 호출할 때 함수 b를 호출함과 동시에 운영체제가 ㅎ마수 a가 실행 중인 스레드나 ㅍ ㅡ로세스를 일시 중지 시키는 방식 -> 블로킹 방식 그렇지 않으면 논블로킹 방식 블로킹의 핵심 문제: 입출력 논블로킹 -> 논블로킹 함수를 호출할 때 운영 체제는 스레드를 일시 중지시키는 대신 함수를 바로 반환함. 그리고 호출 스레드는 자신의 작업을 계속 진행함. 데이터 수신 작업은 커널이 처리함. 동기 호출은 반드시 블로킹이 아님 블로킹 호출은 모두 확실한 동기 호출임. 논블로킹이더라도 전체적으로 반드시 비동기를 의미하지는 않음.
요약 동기 호출은 함수 실행이 완료될 때까지 기다려야 함. 비동기 호출은 함수 실행이 완료될 때까지 기다리지 않고 자기 할일을 계속함. 웹 서버에서 동기와 비동기 작업을 자주 볼 수 있음. 웹 서버는 주 스레드와 데이터베이스 처리 스레드 → 전형적인 스레드 두 개가 있음. 동기작업을 하면 주 스레드에 빈 공간이 생김 → 유휴 스레드 비동기 작업을 통해 데이터베이스 처리 요청을 전송하자마자 바로 다음 요청을 직접 처리함. 비동기 호출을 하면 주 스레드의 유휴 시간이 없어진 대신, 그 자리를 끊임없는 작업들이 차지하고 있음. 데이터베이스 스레드에도 빈 자리가 거의 없음.
요약 코루틴은 스레드와 매우 유사한 기능인 일시 중지와 재개 기능이 있음. 코루틴은 자신의 실행 상태를 저장할 수 있기에 코루틴이 반환된 후에도 계속 호출이 가능함. 마지막으로 일시 중지된 지점에서 다시 이어서 실행됨. 일반 함수는 반환된 후 프로세스 주소 공간의 스택 영역에 더이상 어떤 함수 실행 시 정보도 저장하지 않음. 코루틴은 반환될 때 함수의 실행 시 정보를 저장할 필요가 있음. 멈췄던 지점에서 다시 실행할 때 정보가 필요하기 때문. 코루틴의 실행 흐름은 운영 체제가 스레드를 스케줄링 하는 것과 똑같음. 코루틴을 사용할 때는 프로그래머가 명시적으로 yield 와 같은 예약어를 사용하여 어디에서 일시 중지하고 CPU, 리소스를 내어 줄 것인지 명시적으로 지정해야 함. 코루틴은 스레드의 구현과 본질..
요약 공유 리소스를 사용할 때는 반드시 그에 상응하는 제약이 필요함. 특정 스레드가 다른 스레드의 공유 리소스 사용 순서를 방해하지 않는 한 스레드 안전을 달성할 수 있음. 전용 리소스를 사용하는 스레드는 스레드 안전을 달성할 수 있음. 공유 리소스를 사용하는 스레드는 다른 스레드에 영향을 주지 않도록 하는 대기 제약 조건에 맞게 공유 리소스를 사용하면 스레드 안전을 달성할 수 있음. 스레드 안전이란? 어떤 코드가 스레드 몇 개에서 호출되든, 스레드들이 어떤 순서로 호출되든 상관없이 올바른 결과가 나오는 것. 스레드 전용 리소스와 공유 리소스 스레드 전용 리소스 : 함수의 지역 변수, 스레드의 스택 영역, 스레드 전용 저장소 그외의 것이 공유 리소스임. 힙 영역, 데이터 영역, 코드 영역 공유 리소스를 ..
요약 스레드 전용 리소스 스레드에 속한 스택 영역과 프로그램 카운터, 스택 포인터, 함수 실행 시 사용되는 레지스터 정보가 모두 해당 스레드 전용임. 이 모든 정보를 스레드 상황 정보 라고 함. 스레드는 프로세스 주소 공간에서 스택 영역을 제외한 나머지 영역을 모두 공유함 코드 영역 : 모든 함수를 스레드에 배치하여 실행할 수 있다. 스레드 간에 공유되므로 어떤 함수든지 모두 스레드에 적재하여 실행할 수 있음. 특정 함수를 특정 스레드에서만 실행되도록 하는 것은 불가능 함. 데이터 영역 : 모든 스레드가 데이터 영역의 변수에 접근할 수 있음. 전역 변수가 저장되는 곳임. 프로그램이 실행되는 동안 데이터 영역 내에 전역 변수의 인스턴스는 하나만 있기에 모든 스레드는 이 전역 변수에 접근할 수 있음. 힙 영..