Study/TIL(Today I Learned)

24.09.11 C++, CSAPP

에린_1 2024. 9. 11. 23:44
728x90

C++

C++ 입출력 성능 향상

ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

c++에서 ios::sync_with_stdio, cin.tie, cout.tie를 사용하는 주된 이유는 입출력 성능을 향상시키기 위해서 이다.

  1. ios::sync_with_stdio(false);
    • 이 함수는 c++ 표준 입출력 스트림(cin, cout)과 c 표준 입출력 버퍼(stdin, stdout)의 동기화를 해제한다.
    • 기본적으로 c++ 표준 입출력은 c의 표준 입출력과 동기화되어 있어서 입출력 작업 시 버퍼를 공유하고 동기화하는 과정에서 오버헤드가 발생한다.
    • ios::sync_with_stdio(false);를 호출하면 c++과 c의 입출력 버퍼가 분리되어 동기화 오베헤드가 사라지므로 입출력 속도가 빨라진다.
    • 단. 이 함수를 호출한 이후에는 c표준 입출력 함수(scanf, printf등)를 사용하면 안된다.
  2. cin.tie(NULL), cout.tie(NULL);
    • 이는 입력과 출력의 순서를 보장하기 위한 것이지만, 불필요한 플러시로 인해 성능 저하가 발생할 수 있다.
    • cin과 cout은 기본적으로 묶여(tied) 있다. 즉, cin으로 입력을 받으면 자동으로 cout의 버퍼가 플러시된다.
    • cin.tie(NULL);과 cout.tie(NULL);을 호출하면 cin과 cout의 묶음을 해제하여 자동 플러시를 방지할 수 있다.
    • 이렇게 하면 입출력 속도가 향상될 수 있다.

플러시(Flush)

  • 출력 버퍼(output buffer)의 내용을 실제로 출력 장치(화면, 파일 등)에 쓰는 작업을 의미한다. c++에서 cout과 같은 출력 스트림을 사용할 때, 출력 데이터는 즉시 출력 장치로 전송되지 않고 출력 버퍼에 저장된다. 출력 버퍼는 일정한 크기를 가지고 있으며, 버퍼가 가득 차거나 개행문자(\n)을 만나면 자동으로 플러시된다.
  • 플러시가 발생하면 출력 버퍼의 내용이 실제 출력 장치로 전송되고, 버퍼는 비워진다. 이러한 버퍼링은 출력 성능을 향상시키기 위해 사용된다. 매번 출력할 될 때마다 장치에 접근하는 것보다 버퍼에 모아 한 번에 출력하는 것이 효율적이기 때문입니다.

Pragma pack

  • 네트워크 통신을 할때 패킷의 사이즈를 정확하게 지정하고 통신할 수 있게 하는것
  • 네트워크 헤더 구조체의 경우 필수적으로 사용한다.
  • 구조체의 크기가 커지는 것을 막을 수 있다.
#pragma pack(push, n)
#pragma pack(pop)
  • 전처리기 이며, n은 정렬크기를 넣어주면 된다.
  • n의 값은 1,2, 4, 8, 16만 유효하며, 디폴트 값은 기본 타입중 가장 큰 타입인 8이다.
#pragma pack(push, 1)
  • 위의 경우 1byte씩 정렬한다고 선언한 것이다.
#pragma pack(pop)
  • 특정 구조체에 대해서만 구조체의 정렬 크기를 지정해주고자 한다면 #pragma pack(pop)을 사용한다

CSAPP

11. 네트워크 프로그래밍

  • 모든 네트워크 응용들은 동일한 기본적인 프로그래밍 모델에 기초하고 있으며 이들은 비슷한 전체 논리구조를 가지고 동일한 인터페이스를 사용한다.

11.1 클라이언트 - 서버 프로그래밍 모델

  • 모든 네트워크 응용프로그램은 클라이언트 - 서버 모델에 기초하고 있다. 이 모델을 사용해서 응용은 한 개의 서버 프로세스와 한개 이상의 클라이언트 프로세스로 구성된다. 서버는 일부 리소를 관리하고, 이 리소스를 조작해서 클라이언트를 위한 일부 서비스를 제공한다.
  • 클라이언트 - 서버 모델에서 근적인 연산은 트랜잭션이다. 클라이언트 - 서버 트랜잭션은 네 단계로 구성된다.
    1. 클라이언트가 서비스를 필요로 할 때, 클라이언트는 한 개의 요청을 서버에 보내는 것으로 트랜잭션을 개시한다.
    2. 서버는 요청을 받고, 해석하고, 자신의 자원들을 적절한 방법으로 조작한다.
    3. 서버는 응답을 클라이언트로 보내고, 그 후에 다음 요청을 기다린다.
    4. 클라이언트는 응답을 받고 이것을 처리한다.
  • 클라이언트와 서버는 프로세스이며, 머신이나 호스트가 아니다. 한 개의 호스트는 서로 다른 많은 클라이언트와 서버를 동시에 실행할 수 있으며, 클라이언트와 서버 트랜잭션은 동일하거나 다른 호스트에 존재 할 수 있다.

11.2 네트워크

  • 클라이언트와 서버는 종종 별도의 호스트에서 돌아가며, 컴퓨터 네트워크의 하드웨어 및 소프트웨어 자원을 사용해서 통신한다. 호스트에게 네트워크는 단지 또 다른 I/O 디바이스이며, 데이터를 위한 소스와 싱크로 서비스한다. I/O 버스의 확장 슬롯에 꽂혀있는 어댑터는 네트워크에 물리적인 인터페이스를 제공한다. 네트워크에서 수신한 데이터는 I/O와 메모리 버스를 거쳐서 어댑터에서 메모리로, 대개 DMA 전송으로 복사된다. 비슷하게 데이터는 또한 메모리에서 네트워크로 복사 될 수 있다.
  • 물리적으로 네트워크는 기하적으로 구성된 계층구조 시스템이다. 하위수준은 LAN(Local Area Network)으로 빌딩이나 캠퍼스에 설치된다. 가장 대중적인 LAN 기술은 현재 이더넷(Ethernet)이다.
  • 이더넷 세그먼트는 몇 개의 전선들과 허브라고 부르는 작은 상자로 구성된다. 각 전선은 동일한 최대 비트 대역폭을 가지며, 한쪽 긑은 호스트의 어댑터 한쪽은 허브의 포트에 연결된다. 허브는 각 포트에서 수신한 비트를 종속적으로 다른 모든 포트로 복사한다.
  • 각 이더넷 어댑터는 어댑터의 비휘발성 메모리에 저장된 전체적으로 고유한 48비트주소를 가진다. 호스트는 프레임이라고 부르는 비트들을 세그먼트의 다른 호스트에 보낼수 있다. 각 프레임은 프레임의 소스와 목적지, 프레임의 길이를 식별할 수 있는 고정된 헤더 비트를 가지고 있으며, 그 뒤에 데이터비트가 이어진다. 모든 호스트 어댑터는 이 프레임을 볼 수 있지만 목적지 호스트 만이 실제로 이것을 읽어들인다.
  • 전선들과 브릿지라고 하는 작은 상자들을 사용해서 다수의 이더넷 세그먼트가 연결되어 브릿지형 이더넷이라고 하는 더 큰 LAN을 구성할 수 있다. 브릿지형 이더넷에서 일부 선은 브릿지를 비릿지로 연결하고, 다른 선들은 브릿지를 허브로 연결한다. 각 선의 대역폭은 다를수 있다.
  • 브릿지는 허브보다 더 높은 전선의 대역폭을 가진다. 우수한 분산 알고리즘을 사용해서 이들은 자동으로 어떤 호스트가 어떤 포트에서 도달 가능한지 장기간에 걸쳐 학습하고, 그 후 필요한 경우 선택적으로 하나의 포트에서 다른 포트로 프레임을 복사한다.
  • 계층구조의 상부에서 다수의 비호환성 LAN들은 라우터라고 부르는 특별한 컴퓨터에 의해서 연결될 수 있으며, 라우터는 네트워크간 연결을 구성한다.(상호연결 네트워크) 각 라우터는 이들이 연결되는 각 네트워크에 대해 어댑터(포트)를 가지고 있다. 라우터는 고속의 point-to-point 전화연결을 할 수 있으며, 이들은 WAN이라고 하는 네트워크의 사례이다. 일반적으로 라우터는 임의의 LAN과 WAN들로부터 internet을 만들기 위해서 사용될 수 있다.
  • internet의 중요한 특성은 이것이 매우 다르고 비호환적인 기술을 갖는 여러가지 LAN과 WAN들로 이루어져 있다는점이다. 비호환적인 네트워크들을 지나 데이터 비트를 다른 목적지 호스트로 전송할 수 있는 이유는 여러가지 네트워크간의 차이를 줄여주는 각 호스트와 라우터에서 돌고 있는 프로토콜 소프트웨어 계층 때문이다. 이 프로토콜은 두 가지 기본 기능을 제공해야 한다.
    • 명명법(Naming Scheme) : 서로 다른 LAN 기술은 주소를 호스트에 할당하는 서로 다른 비호환성을 갖는 방법을 사용한다. internet 프로토콜은 호스트 주소를 위한 통일된 포맷을 정의해서 이 차이점을 줄인다. 각 호스트는 자신을 유일하게 식별하는 internet 주소 최소한 한 개가 할당된다.
    • 전달기법(Delivery mechanism) : 서로 다른 네트워킹 기술은 서로 다른 비호환성을 갖는 비트 인코딩 방법과 프레임 내에 이들을 패키징하는 방법을 가지고 있다. internet 프로토콜은 데이터 비트를 패킷이라고 부르는 비연속적인 단위로 묶는 통일된 방법을 정의해서 이 차이점을 줄인다. 패킷은 패킷 크기와 소스 및 목적지 호스트 주소를 포함하는 헤더와 데이터 비트를 포함하는 데이터로 구성된다.
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.09.19 C#, CS  (0) 2024.09.19
24.09.12 C++, CSAPP  (0) 2024.09.12
24.09.09 코테, CS  (1) 2024.09.09
24.09.06 CSAPP, CS  (4) 2024.09.06
24.09.05 CSAPP복습 ,C++  (0) 2024.09.05