TIL - 2020.12.04 (금)

코드 굽는 제빵사·2020년 12월 4일
0

TIL

목록 보기
9/20
post-thumbnail

리눅스 네트워크의 이해 책을 읽으면서

소개

락킹은 네트워킹 코드에서 광범위하게 사용된다.

스핀락(spin locks)

한번에 오직 하나의 실행 스레드만 획득할 수 있다. 이 락이 해제될 때까지 다른 실행 스레드는 락을 획득하려고 시도하며 대기하게 된다. 이 대기로 인한 낭비 때문에 이 락은 멀티프로세서 시스템에서만 사용되고, 아주 짧은 시간동안만 락을 획득하는 곳에만 사용된다. 다른 스레드를 기다리게 하므로 락을 획득한 스레드는 슬립을 수행해선 안된다.

읽기-쓰기 스핀락(Read-write sprin locks)

이 락이 일기 전용 또는 읽기/쓰기를 사용할 것인지를 확실히 해야 할 때 읽기-쓰기 락을 더 선호한다. 스핀락과 읽기-쓰기 스ㅡ핀락의 차이는 후자의 경우 다수의 읽기 프로세스가 락을 동시에 가질 수 있다는 점이다.
하지만 쓰기 프로세스가 락을 획득할 경우 읽기 프로세스는 락을 가질 수 없다. 읽기 프로세스가 쓰기 프로세스에 비해 높은 우선 순위를 가지므로 이종류의 락은 읽기 프로세스수가 쓰기 프로세스 수보다 많을 경우 유용하다. 읽기 모드에서 락이 걸릴 경우 읽기-쓰기 락으로 전환할 수 없고 반드시 락을 해제한 다음 다시 읽기-쓰기 락을 요청해야 한다.

호스트와 네트워크 순서 변환

1바이트 범위를 넘어가는 데이터 스트럭처는 리틀엔디안과 빅엔디안 두가지 포맷으로 저장 가능하다. 리틀엔디안 포맷은 메모리의 가장 하위 주소를 먼저 기록하는 것이고, 빅앤디안은 반대로 하는 것이다. 리눅스와 같은 운영체제는 사용하는 프로세스의 종류에 따라 해당 포맷이 결정된다.

인텔 계열 프로세서들은 리틀엔디안이고, 모토롤라 계열 프로세서는 빅엔디안을 따른다.
TCP / IP 스택은 빅엔디안 모델을 사용한다.

주요 데이터 스트럭처

struct sk_buff

여기에 패킷의 정보가 저장된다. 모든 네트워크 계층에서 자신들의 헤더와 사용자 데이터 정보(payload), 그리고 내부적으로 작업을 배분하기 위한 정보를 저장한다.

struct new_device

네트워크 장치들이 커널 내에서 이 데이터 스트럭처로 표현되고, 여기에는 하드웨어 정보와 소프트웨어 설정 정보들이 저장된다.

struct sock

소켓에 대한 네트워킹 정보를 저장한다.

소켓 버퍼 스트럭처: sk_buff

수신이나 송신에 사용될 데이터의 헤더 정보를 갖고 있기 때문에 리눅스 네트워킹 코드에서 가장 중요한 스트럭처 일 것이다. 이 스트럭처는 여러 다른 네트워크 계층(MAC과 같은 L2 계층의 연결 프로토콜, L3의 IP, L4 TCP/UDP)에서 사용되고 각 계층을 거치면서 스트럭츼 변수들이 변경된다. L4dml ruddn L3로 보내기 전에 헤더를 붙이고, L3에서 L2로 보내기 전에 자신의 헤더를 붙인다. 계층 간 이동 시에 헤더를 붙이는 것이 데이터를 복사하는 것보다 더 효율적이다. 버파가 네트워크 계층을 거쳐 올라가면 이전 계층에서의 헤더는 더이상 관심의 대상이 아니다. 버퍼를 지우는 대신 페이로드의 시작 포인터를 계층에 맞게 옮기는게 더 적은 CPU 싸이클을 사용한다.

0개의 댓글