함수 호출 활동 추적 : 스택스택은 후입선출 순서의 데이터 구조임.이진 트리 탐색으로 볼 수 있음.트리 구조의 순회는 재귀 뿐만 아니라 스택으로도 사용 가능함.스택 프레임 & 스택 영역함수 실행 시, 작은 상자가 필요함.이 작은 상자를 스택 프레임, 호출 스택이라고 함.이 스택에는 함수 호출 정보가 필요함.함수 점프와 반환함수 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, 리소스를 내어 줄 것인지 명시적으로 지정해야 함. 코루틴은 스레드의 구현과 본질..
요약 공유 리소스를 사용할 때는 반드시 그에 상응하는 제약이 필요함. 특정 스레드가 다른 스레드의 공유 리소스 사용 순서를 방해하지 않는 한 스레드 안전을 달성할 수 있음. 전용 리소스를 사용하는 스레드는 스레드 안전을 달성할 수 있음. 공유 리소스를 사용하는 스레드는 다른 스레드에 영향을 주지 않도록 하는 대기 제약 조건에 맞게 공유 리소스를 사용하면 스레드 안전을 달성할 수 있음. 스레드 안전이란? 어떤 코드가 스레드 몇 개에서 호출되든, 스레드들이 어떤 순서로 호출되든 상관없이 올바른 결과가 나오는 것. 스레드 전용 리소스와 공유 리소스 스레드 전용 리소스 : 함수의 지역 변수, 스레드의 스택 영역, 스레드 전용 저장소 그외의 것이 공유 리소스임. 힙 영역, 데이터 영역, 코드 영역 공유 리소스를 ..
요약 스레드 전용 리소스 스레드에 속한 스택 영역과 프로그램 카운터, 스택 포인터, 함수 실행 시 사용되는 레지스터 정보가 모두 해당 스레드 전용임. 이 모든 정보를 스레드 상황 정보 라고 함. 스레드는 프로세스 주소 공간에서 스택 영역을 제외한 나머지 영역을 모두 공유함 코드 영역 : 모든 함수를 스레드에 배치하여 실행할 수 있다. 스레드 간에 공유되므로 어떤 함수든지 모두 스레드에 적재하여 실행할 수 있음. 특정 함수를 특정 스레드에서만 실행되도록 하는 것은 불가능 함. 데이터 영역 : 모든 스레드가 데이터 영역의 변수에 접근할 수 있음. 전역 변수가 저장되는 곳임. 프로그램이 실행되는 동안 데이터 영역 내에 전역 변수의 인스턴스는 하나만 있기에 모든 스레드는 이 전역 변수에 접근할 수 있음. 힙 영..
요약 모든 것은 CPU 에서 시작 됨. 메모리에서 명령어를 하나 가져옴 이 명령어를 실행한 후, 다시 메모리에서 명령어를 가져옴. 운영체제가 탄생하면서 프로그래머는 더 이상 실행 파일을 수동으로 적재하거나 프로그램을 수동으로 유지 관리할 필요가 없어짐. 운영 체제는 모든 것을 백그라운드에서 처리함. 프로세스 주소 공간은 아래에서 위의 방향을 기준으로 다음과 같음. 코드 영역 데이터 영역 힙 영역 스택 영역 스레드는 프로세스 주소 공간을 공유함. 스레드 풀은 스레드 여러 개를 미리 생성해 두고 스레드가 처리할 작업이 생기면 해당 스레드에 처리를 요청함. 미리 생성되어 있기에 스레드 생성 종료 작업이 빈번하게 발생하지 않음. 불필요한 메모리를 소비하지 않음.
요약 링커는 컴파일러가 생성한 대상 파일 여러 개를 하나로 묶어 하나의 최종 실행 파일을 생성함. 링크의 전체 과정 대상 파일이 참조하고 있는 **외부 심벌(external symbol)**에 대한 실제 구현이 어느 모듈이든지 단 하나만 있어야 하며, 링커는 이를 찾아내서 연결하는 작업을 하는데, 이를 **심벌 해석(symbol resolution)** 이라고 함. 대상 파일을 모아 하나로 합침. 대상 파일에서 다른 파일의 내용을 ‘참조’ 하고 싶지만, 아직 다른 파일의 내용이 작성되지 않은 경우, 임시로 그 값을 비워두었다가 그 파일의 작업이 마쳐지면 그때 쭉 다 바꿔준다. 이 과정을 **재배치(relocation)** 이라고 함. 링크 과정 (심벌 해석) 심벌은 전역 변수와 함수의 이름을 포함하는 모..
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.