요약다중 프로세스장점프로그래밍이 간단하여 매우 이해하기 쉬움개별 프로세스 주소 공간이 격리되어 있어 다른 하나의 프로세스에 문제가 발생하여 강제 종료되더라도 다른 프로세스에 영향을 미치지 않음.다중 코어 리소스를 최대한 활용할 수 있음.단점프로세스 공간 격리로 인해 서로 통신이 필요할 때 난이도가 올라감. -> 프로세스 통신 작동 방식을 사용해야 함.프로세스 생성시 부담이 큼.다중 스레드스레드는 프로세스 주소 공간을 공유함.스레드 간 통신을 위해 별도 통신 작동 방식을 사용할 필요 없음.서로 같은 주소 공간을 공유하기에 하나의 스레드가 문제가 발생하여 강제 종료되면 같은 프로세스를 공유하는 모든 스레드와 프로세스가 한꺼번에 강제 종료됨.여러 스레드가 공유 리소스를 동시에 읽고 쓸 수 있는 부작용이 있음...
요약 블로킹과 논블로킹 함수 a가 함수 b를 호출할 때 함수 b를 호출함과 동시에 운영체제가 ㅎ마수 a가 실행 중인 스레드나 ㅍ ㅡ로세스를 일시 중지 시키는 방식 -> 블로킹 방식 그렇지 않으면 논블로킹 방식 블로킹의 핵심 문제: 입출력 논블로킹 -> 논블로킹 함수를 호출할 때 운영 체제는 스레드를 일시 중지시키는 대신 함수를 바로 반환함. 그리고 호출 스레드는 자신의 작업을 계속 진행함. 데이터 수신 작업은 커널이 처리함. 동기 호출은 반드시 블로킹이 아님 블로킹 호출은 모두 확실한 동기 호출임. 논블로킹이더라도 전체적으로 반드시 비동기를 의미하지는 않음.
요약 동기 호출은 함수 실행이 완료될 때까지 기다려야 함. 비동기 호출은 함수 실행이 완료될 때까지 기다리지 않고 자기 할일을 계속함. 웹 서버에서 동기와 비동기 작업을 자주 볼 수 있음. 웹 서버는 주 스레드와 데이터베이스 처리 스레드 → 전형적인 스레드 두 개가 있음. 동기작업을 하면 주 스레드에 빈 공간이 생김 → 유휴 스레드 비동기 작업을 통해 데이터베이스 처리 요청을 전송하자마자 바로 다음 요청을 직접 처리함. 비동기 호출을 하면 주 스레드의 유휴 시간이 없어진 대신, 그 자리를 끊임없는 작업들이 차지하고 있음. 데이터베이스 스레드에도 빈 자리가 거의 없음.
요약 코루틴은 스레드와 매우 유사한 기능인 일시 중지와 재개 기능이 있음. 코루틴은 자신의 실행 상태를 저장할 수 있기에 코루틴이 반환된 후에도 계속 호출이 가능함. 마지막으로 일시 중지된 지점에서 다시 이어서 실행됨. 일반 함수는 반환된 후 프로세스 주소 공간의 스택 영역에 더이상 어떤 함수 실행 시 정보도 저장하지 않음. 코루틴은 반환될 때 함수의 실행 시 정보를 저장할 필요가 있음. 멈췄던 지점에서 다시 실행할 때 정보가 필요하기 때문. 코루틴의 실행 흐름은 운영 체제가 스레드를 스케줄링 하는 것과 똑같음. 코루틴을 사용할 때는 프로그래머가 명시적으로 yield 와 같은 예약어를 사용하여 어디에서 일시 중지하고 CPU, 리소스를 내어 줄 것인지 명시적으로 지정해야 함. 코루틴은 스레드의 구현과 본질..
요약 공유 리소스를 사용할 때는 반드시 그에 상응하는 제약이 필요함. 특정 스레드가 다른 스레드의 공유 리소스 사용 순서를 방해하지 않는 한 스레드 안전을 달성할 수 있음. 전용 리소스를 사용하는 스레드는 스레드 안전을 달성할 수 있음. 공유 리소스를 사용하는 스레드는 다른 스레드에 영향을 주지 않도록 하는 대기 제약 조건에 맞게 공유 리소스를 사용하면 스레드 안전을 달성할 수 있음. 스레드 안전이란? 어떤 코드가 스레드 몇 개에서 호출되든, 스레드들이 어떤 순서로 호출되든 상관없이 올바른 결과가 나오는 것. 스레드 전용 리소스와 공유 리소스 스레드 전용 리소스 : 함수의 지역 변수, 스레드의 스택 영역, 스레드 전용 저장소 그외의 것이 공유 리소스임. 힙 영역, 데이터 영역, 코드 영역 공유 리소스를 ..
요약 스레드 전용 리소스 스레드에 속한 스택 영역과 프로그램 카운터, 스택 포인터, 함수 실행 시 사용되는 레지스터 정보가 모두 해당 스레드 전용임. 이 모든 정보를 스레드 상황 정보 라고 함. 스레드는 프로세스 주소 공간에서 스택 영역을 제외한 나머지 영역을 모두 공유함 코드 영역 : 모든 함수를 스레드에 배치하여 실행할 수 있다. 스레드 간에 공유되므로 어떤 함수든지 모두 스레드에 적재하여 실행할 수 있음. 특정 함수를 특정 스레드에서만 실행되도록 하는 것은 불가능 함. 데이터 영역 : 모든 스레드가 데이터 영역의 변수에 접근할 수 있음. 전역 변수가 저장되는 곳임. 프로그램이 실행되는 동안 데이터 영역 내에 전역 변수의 인스턴스는 하나만 있기에 모든 스레드는 이 전역 변수에 접근할 수 있음. 힙 영..
요약 모든 것은 CPU 에서 시작 됨. 메모리에서 명령어를 하나 가져옴 이 명령어를 실행한 후, 다시 메모리에서 명령어를 가져옴. 운영체제가 탄생하면서 프로그래머는 더 이상 실행 파일을 수동으로 적재하거나 프로그램을 수동으로 유지 관리할 필요가 없어짐. 운영 체제는 모든 것을 백그라운드에서 처리함. 프로세스 주소 공간은 아래에서 위의 방향을 기준으로 다음과 같음. 코드 영역 데이터 영역 힙 영역 스택 영역 스레드는 프로세스 주소 공간을 공유함. 스레드 풀은 스레드 여러 개를 미리 생성해 두고 스레드가 처리할 작업이 생기면 해당 스레드에 처리를 요청함. 미리 생성되어 있기에 스레드 생성 종료 작업이 빈번하게 발생하지 않음. 불필요한 메모리를 소비하지 않음.
요약 링커는 컴파일러가 생성한 대상 파일 여러 개를 하나로 묶어 하나의 최종 실행 파일을 생성함. 링크의 전체 과정 대상 파일이 참조하고 있는 **외부 심벌(external symbol)**에 대한 실제 구현이 어느 모듈이든지 단 하나만 있어야 하며, 링커는 이를 찾아내서 연결하는 작업을 하는데, 이를 **심벌 해석(symbol resolution)** 이라고 함. 대상 파일을 모아 하나로 합침. 대상 파일에서 다른 파일의 내용을 ‘참조’ 하고 싶지만, 아직 다른 파일의 내용이 작성되지 않은 경우, 임시로 그 값을 비워두었다가 그 파일의 작업이 마쳐지면 그때 쭉 다 바꿔준다. 이 과정을 **재배치(relocation)** 이라고 함. 링크 과정 (심벌 해석) 심벌은 전역 변수와 함수의 이름을 포함하는 모..
요약 프로그래밍 언어로 작성된 “소스 파일”을 컴파일러에게 먹여주면 컴파일러는 이것을 꼭꼭 씹고 뜯고 맛본 후, 실행 파일 형태로 뱉어냄. 실행 파일이 바로 CPU가 직접 실행할 수 있는 기계 명령어 임. 즉, 컴파일러는 “번역기” 이자 “텍스트 처리 프로그램” 이라고 생각할 수 있음. 컴파일러는 소스 파일의 각 항목을 잘게 쪼개어 토큰화 함. 소스 코드에서 토큰을 추출하는 과정을 어휘 분석(lexical analysis) 라고 함. 토큰을 가지고 그 의도를 표현해야만 함. 특정 토큰 키워드에 따라 컴파일러는 문법 오류를 보고할 수 있음. 이 과정을 해석(parsing) 이라고 함. 컴파일러는 해석을 통한 구조를 트리로 표현함. 구문 트리에서 이상이 있는지 확인함. 이 단계를 통과하면 컴파일 오류가 없다..
요약 (Section 1.1 여러분이 프로그래밍 언어를 발명한다면?) CPU는 단순하지만 빠르다. 프로그래머는 단순하지만 빠른 CPU를 다루기 위해 천공 카드로 컴퓨터 작업을 제어함. 하지만 이는 CPU 관점의 코드일 뿐 인간이 이해하기 어려움 어셈블리어를 통해 인간이 인식할 수 있는 ‘기계 명령어’ 를 이용하여 CPU를 제어하게됨. 하지만 여전히 어셈블리어는 저수준 언어임. 저수준 언어는 매우 추상화되어 있어 구체적으로 ‘우리가 원하는 동작’ 을 하려면 세부 사항들을 하나하나 다 알려줘야 함. 고급 프로그래밍 언어를 통해 CPU를 동작시키기 위한 ‘추상적인 표현’ 을 ‘구체적인 표현’으로 자동 변환할 수 있게 됨. 프로그래밍 언어를 통해 단순한 문장을 표현하기도 하지만, 이들이 중첩되어 복잡한 문장을 ..
17. 어려운 연습문제 17.21 막대 그래프의 부피 히스토그램(막대 그래프)을 상상해 보자. 누군가가 히스토그램 위에서 물을 부었을 때, 이 그래프가 저장할 수 있는 물의 양을 계산하는 알고리즘을 설계하라. 단, 막대의 폭은 1이라고 가정하자. 17.26 드문드문 유사도 서로 다른 단어로 구성된 두 문서의 유사도는 단어들의 교집합의 크기 나누기 합집합의 크기로 정의할 수 있다. 즉, 정수로 이루어진 두 문서 {1, 5, 3}과 {1, 7, 2, 3}의 유사도는 0.4가 된다. 왜냐하면 두 문서의 교집합의 크기는 2이고 합집합의 크기는 5이기 때문이다. 유사도의 밀도가 굉장히 ‘희박’할 것 같은 문서가 굉장히 많이 주어져 있다(각 문서는 ID로 표현된다). 여기서 희박하다는 뜻은 임의의 두 문서의 유사도..
17. 어려운 연습문제 17.16 마사지사 인기 있는 마사지사가 있다. 마사지 사이에 15분간 휴식이 필요하므로 마사지 예약이 연달아 들어온다면 그중에서 어떤 예약을 받을지 선택해야 한다. 연달아 들어온 마사지 예약 리스트가 주어졌을 때(모든 예약 시간은 15분의 배수이며 서로 겹치지는 않고 한번 예약이 되면 변경이 불가능하다), 총 예약 시간이 가장 긴 최적의 마사지 예약 순서를 찾으라. 17.19 빠진 숫자 찾기 1부터 N까지 숫자 중에서 하나를 뺸 나머지가 정확히 한 번씩 등장하는 배열이 있다. 빠진 숫자를 O(N) 시간과 O(1) 공간에 찾을 수 있겠는가? 만약 숫자 두 개가 빠져 있다면 어떻게 찾겠는가?