728x90
C++
lower_bound, upper_bound
- 이진 탐색으로 원소를 탐색하는 함수 제공.
- 찾으려는 key값보다 같거나 큰 숫자가 배열 몇 번째에서 처음 등장 하는지 찾기위한 함
- 오름차순 정렬되어 있어야 한다.
#include <iostream>#include <algorithm>using namespace std;
int main() {
int arr[6] = { 1,2,3,4,5,6 };
cout << "lower_bound(6) : " << lower_bound(arr, arr + 6, 6) - arr;
// 결과 -> lower_bound(6) : 5return 0;
}
- lower_bound의 반환형은 iterator이므로 실제로 몇 번째 인덱스인지 알고 싶다면, 위 코드와 같이 lower_bound값에서 배열 첫 번째 주소를 가리키는 배열의 이름을 빼 주면 된다.
- 벡터의 경우 arr.begin()을 빼면 된다.
Vector Container
- 자동으로 메모리가 할당되는 배열
Vector의 초기화
vector<자료형> 변수명 벡터 생성
vector<자료형> 변수명(숫자) 숫자만큼 벡터 생성 후 0으로 초기화
vector<자료형> 변수명 = { 변수1, 변수2, ..} | 벡터 생성 후 오른쪽 변수 값으로 초기화 |
vector<자료형> 변수명[] = {,} | 벡터 배열(2차원 벡터) 선언 및 초기화(열 고정, 행가변 |
vector<vector<자료형>> 변수명 | 2차원 벡터 생성(열과 행 모두 가변) |
vector<자료형>변수명.assign(범위, 초기화할 값) | 벡터의 범위 내에서 해당 값으로 초기화 |
Vector의 Iterators
v.begin() 벡터 시작점의 주소 값 반환
v.end() 벡터 (끝부분 + 1) 주소값 반환
Vector Element Access(벡터의 요소 접근)
v.at(i) 벡터의 i번째 요소 접근(범위 검사o)
v.[i] 벡터의 i번째 요소 접근(범위 검사x)
v.front() | 벡터의 첫 번째 요소 접근 |
v.back() | 벡터의 마지막 요소 접근 |
- at과 []의 차이점
- 둘 다 같은 n번째 요소 접근이지만 at는 범위를 검사하여 범위 밖의 요소에 접근 시 예외처리를 발생시킨다. []는 범위검사를 하지 않으며 예외처리를 발생시키지 않는다. 또한 해당범위 밖의 요소에 접근을 시도한다면 일반적인 디버깅(g++ or VC++)이 발생한다.
Vector에 요소 삽입/제거
v.push_back() 벡터의 마지막 부분에 새로운 요소 추가
v.pop_back() 벡터의 마지막 부분 제거
v.insert(삽입할 위치의 주소 값, 변수 값) | 사용자가 원하는 위치에 요소 삽입 |
v.emplace(삽입할 위치의 주소 값, 변수 값) | 사용자가 원하는 위치에 요소 삽입(move 로 인해 복사생성자 x) |
v.emplace_back() | 벡터의 마지막 부분에 새로운 요소 추가(move로 인해 복사생성자x) |
v.erase(삭제할 위치) or v.erase(시작 위치, 끝 위치) | 사용자가 원하는 index값의 요소를 지운다. |
v.clear() | 벡터의 모든 요소를 지운다.(return size =0) |
v.resize(수정 값) | 벡터의 사이즈를 조정한다.(범위 초과시 0으로 초기화) |
v.swap(벡터 변수) | 벡터와 벡터를 스왑한다. |
Vector Capacity(벡터 용량)
v.empty() 벡터가 빈공간이면 true, 값이 있다면 false
v.size() 벡터의 크기 반환
v.capacity() | heap에 할당된 벡터의 실제크기(최대크기) 반환 |
v.max_size() | 벡터가 system에서 만들어 질 수 있는 최대 크기 반환 |
v.reserve(숫자) | 벡터의 크기 설정 |
v.shrink_to_fit() | capacity의 크기를 벡터의 실제 크기에 맞춘다. |
CSAPP 11
11.3 글로벌 IP Internet
- 각 인터넷 호스트는 TCP/IP 프로토콜(transmission control protocol/internet protocol)을 구현하는 소프트웨어를 실행한다. 인터넷 클라이언트와 서버는 소켓 인터페이스와 Unix I/O 함수들의 혼합을 사용해서 통신한다. 소켓 함수들은 일반적으로 시스템 콜들로 구현되는데, 이 시스템 콜은 커널에서 트랩을 발생시키며, TCP/IP에서 다양한 커널모드 함수들을 호출한다.
- TCP/IP는 실제로 프로토콜의 집합으로 각각 서로 다른 기능을 제공한다.
- IP는 기본 명명법과 데이터그램이라고 하는 패킷을 한 인터넷 호스트에서 다른 호스트로 보낼 수 있는 배달 메커니즘을 제공한다. IP 메커니즘은 만일 데이터그램을 잃어버리거나 네트워크내에서 중복되는 경우에 복구하려고 노력하지 않는다는 점에서 안정적이지 못하다.
- TCP는 IP위에 구현한 복잡한 프로토콜로 프로세스들 간에 완전한 양방향 연결을 제공한다.
- 인터넷은 다음의 특징을 가지는 전 세계적인 호스트의 집합이다.
- 호스트의 집합은 32비트 IP주소 집합에 매핑된다.
- IP주소의 집합은 인터넷 도메인 네임이라고 부르는 식별자의 집합에 매핑된다.
- 하나의 인터넷 호스트의 프로세스는 연결을 통해서 다른 인터넷 호스트의 프로세스와 통신할 수 있다.
11.3.1 IP주소
- IP주소는 비부호형 32비트 정수이다. 네트워크 프로그램은 IP주소를 IP주소 구조체에 저장한다.
- 인터넷 호스트들이 서로 다른 호스트 바이트 순서를 가질 수 있기 때문에 TCP/IP는 네트워크 패킷 헤더에 포함되는 IP주소같은 모든 정수형 데이터 아이템에 대해서 통일된 네트워크 바이트 순서(빅 엔디안 바이트 순서)를 정의한다. IP주소 구조체의 주소는 호스트 바이트 순서가 리틀 엔디안인 경우에도 항상 네트워크 바이트 순서(빅엔디안)로 저장된다.
- IP주소는 대개 사람들에게 dotted-decimal 표기라고 하는 형식으로 제시되며, 이것은 각 바이트가 10진수 값을 사용하고, 다른 바이트들과는 점을 사용해서 구분된다.
- 128.2.194.242 는 0x8002c2f2의 dotted-decimal 표현이다.
11.3.2 인터넷 도메인 이름
- 인터넷 클라이언트와 서버는 서로 통신할 때 IP주소를 사용한다. 그렇지만 크기가 큰 정수는 사람들이 기억하기 어려워서 인터넷에서는 도메인 이름들의 집합을 IP주소의 집합으로 매핑하는 메커니즘과 함께 사람들에게 친숙한 별도의 도메인 이름 집합을 정의한다.
- 도메인 이름들의 집합은 계층구조를 형성하고 있으며, 각각의 도메인 이름은 계층구조에서 자신의 위치를 인코드한다. 계층구조는 트리로 나타낸다. 트리의 노드들은 루트로 돌아가는 경로로 형성되는 도메인 이름을 나타낸다. 서브트리는 서브 도메인이라고 한다. 계층구조의 첫 번째 단계는 이름이 없는 루트 노드이다. 다음계층은 ICANN(Internet Coporation for Assigned Names and Numbers)이라고 하는 비영리조직이 정의한 일 단계 도메인 이름의 집합이다.
- ex) com, edu, gov, org ,net
- 다음 계층에는 2단계 도메인 이름이 포함되며 이들은 수많은 ICANN이 인정하는 대행사가 요청한 순서에 의해 그 이름이 할당된다. 일단 한 조직이 2단계 이름을 받은 후에는 서브 도메인 내에서는 어떤 새로운 이름도 자유롭게 생성할 수 있다.
- 인터넷의 도메인 이름의 집합과 IP주소 집합 사이에 매핑을 정의한다. 매핑은 DNS(Domain Name System)라고 하는 전세계에 분산된 데이터 베이스에 의해 관리된다. 개념적으로 DNS 데이터 베이스는 수 백만 개의 호스트 엔트리로 구성되어 있으며, 이들 각각은 도메인 이름 집합과 IP주소들의 동일성(equivalence) 클래스로 생각할 수 있다.
- 각 인터넷 호스트는 지역적으로 정의된 도메인 이름 localhost를 가지고 있으며, 이것은 항상 루프백주소 127.0.0.1에 매핑된다.
- localhost 이름은 같은 머신에서 돌고있는 클라이언트와 서버들을 참조하는 편리하고 포터블한 방법을 제공하며, 이것은 특히 디버깅시에 유용하다.
- 가장 간단한 경우, 도메인 이름과 IP주소 사이에는 일대일 매핑이 존재한다. 그러나 일부 경우에, 다수의 도메인 이름이 동일한 IP주소에 매핑된다. 대부분의 일반적인 경우에, 다수의 도메인 이름들은 다수의 IP주소로 매핑될 수 있다. 일부 유효한 도메인 이름들은 어떤 IP주소에도 매핑되어 있지 않다는 것을 발견했다.
11.3.3 인터넷 연결
- 인터넷 클라이언트와 서버는 연결을 통해서 바이트 스크림을 주고 받는 형식으로 통신한다. 이 연결은 두 개의 프로세스를 연결한다는 점에서 point-to-point 연결이다. 데이터가 동시에 양방향으로 흐를 수 있다는 의미에서 이것은 완전양방향(full-duplex)이다. 그리고 소스 프로세스가 보낸 바이트 스크림이 결국의 보낸것과 동일한 순서로 목적지 프로세스에서 수신된다는 의미에서 안정적이다.
- 소켓(Socket)은 연결의 종단점이다. 각 소켓은 인터넷주소와 16비트 정수 포트로 이루어진 소켓 주소를 가지며, 이것은 address : port 로 나타낸다. 클라이언트 소켓 주소 내의 포트는 클라이언트가 연결 요청을 할 때 커널이 자동으로 할당하며, 이것은 단기(ephemeral) 포트라고 한다. 그러나 서버의 소켓 주소에 있는 포트는 대개 영구적으로 이 서비스에 연결되는 잘 알려진 포트다. 잘 알려진 포트를 갖는 각 서비스에 연관되어 이에 대응되는 잘 알려진 서비스 이름들이 존재한다. 잘 알려진 이름과 포트들 간의 매핑은 /etc/services 파일에 보관되어 있다.
- 연결은 두 개의 종단점의 소켓주소에 의해 유일하게 식별된다. 이 두 개의 소켓 주소는 소켓 쌍이라고 알려져 있으며 tuple로 나타낸다.
- (cliaddr : cliport , servaddr : servport) - 클라이언트 주소 : 클라이언트 포트 , 서버 주소 : 서버 포트
11.4 소켓 인터페이스
- 소켓 인터페이스는 네트워크 응용을 만들기 위한 Unix I/O 함수들과 함께 사용되는 함수들의 집합이다.
11.4.1 소켓 주소구조체
- 리눅스 커널의 관점에서 보면, 소켓은 통신을 위한 끝점이다. Unix프로그램의 관점에서 보면 소켓은 해당 식별자를 가지는 열린파일이다.
11.5 웹 서버
11.5.1 웹 기초
- 웹 클라이언트와 서버는 HTTP(Hypertext Transfer Protocol) 라고 하는 텍스트 기반 응용수준 프로토콜을 사용해서 상호연동한다. 웹 클라이언트(브라우저)는 서버로의 인터넷 연결을 오픈하고 컨텐츠를 요청한다. 서버는 요청한 컨텐츠로 응답하고, 그 후에 연결을 닫아준다. 브라우저는 컨텐츠를 읽고 이것은 스크린에 보여준다.
11.5.2 웹 컨텐츠
- 웹 클라이언트와 서버에게, 컨텐츠는 연관된 MINE(Multipurpose Internet Mail Extensions) 타입을 갖는 배열이다.
- 웹 서버는 두 가지 서로 다른 방법으로 클라이언트에게 컨텐츠를 제공한다.
- 디스크 파일을 가져와서 그 내용을 클라이언트에게 보낸다. 디스크 파일은 정적 컨텐츠라고 하며, 파일을 클라이언트에게 돌려주는 작업은 정적컨텐츠를 처리한다고 말한다.
- 실행 파일을 돌리고 그 출력을 클라이언트에게 보낸다. 실행 파일이 런타임에 만든 출력을 동적 컨텐츠라고 하며, 프로그램을 실행하고 그 결과를 클라이언트에게 보내주는 과정을 동적 컨텐츠를 처리한다고 말한다.
- 웹 서버가 리턴하는 모든 내용들은 서버가 관리하는 파일에 연관된다. 이 파일 각각은 URL(universal presource Locator)라고 하는 고유의 이름을 가진다.
- 어떻게 서버가 URL 접미어를 해석하는지에 대해서 이해해야 할 몇 가지 사실들.
- URL이 정적 또는 동적 컨텐츠를 참조하는지를 결정하기 위한 표준 규칙은 없다. 각각의 서버는 자신이 관리하는 파일들을 위한 자신만의 규칙들을 가진다.
- 접미어 앞 부분의 ‘/’ 는 리눅스의 루트 디렉토리를 나타내는것은 아니다. 오히려 이것은 어떤 종류의 컨텐츠가 요청되든 간에 홈 디렉토리를 나타낸다.
- 최소한의 URL은 ‘/’ 문자이면, 모든 서버는 이것을 /index.html 같은 특정 기본 홈페이지로 확장한다.
11.5.3 HTTP 트랜잭션
- HTTP가 인터넷 연결 위로 전송된 텍스트 라인들을 기초하고 있기 때문에 리눅스 TELNET 프로그램은 사용해서 인터넷 상의 모든 웹 서버와 트랜잭션을 실행할 수 있다.
- TELNET 프로그램은 연결을 통해서 텍스트 라인으로 클라이언트와 대화하는 서버를 디버그 하는데 매우 간편하다.
HTTP 요청
- HTTP는 많은 서로 다른 메소드를 지원하며 여기에는 GET, POST, OPTIONS … 등 포함되어있다. 이중 GET은 전체 HTTP 요청의 대부분에 해당한다. GET 메소드는 서버에게 URI(uniform resource identifer)에 의해 식별되는 내용을 리턴 할 것을 지시한다. URI는 파일 이름과 옵션인 인자들은 포함하는 URL의 접미어다.
- Host 헤더는 프록시 캐시에 의해 사용되며, 이거은 때로는 브라우저와 요청된 파일을 관리하는 본래의 서버 사이의 중간자 역할을 한다. 하나의 클라이언트와 하나의 본래 서버 사이에는 소위 프록시 제안 내에서 다중 프록시가 존재 할 수 있다. 원점 서버의 도메인 이름을 식별하는 Host 헤더 내의 데이터는 프록시 체인의 중간에 있는 프록시가 요청한 컨텐츠의 지역적으로 캐시된 사본을 가질 수 있는지 결정할 수 있게 한다.
728x90
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.09.20 C++, CS (0) | 2024.09.20 |
---|---|
24.09.19 C#, CS (0) | 2024.09.19 |
24.09.11 C++, CSAPP (2) | 2024.09.11 |
24.09.09 코테, CS (1) | 2024.09.09 |
24.09.06 CSAPP, CS (4) | 2024.09.06 |