
UMC 1주차 스터디가 시작되었다. 앞으로 워크북 내용을 정리해 나갈 예정이다.
1주차의 주제는 가장 기본적인 서버란 무엇인지에 대한 내용을 다루었다.
❓IPC란?
하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신
❓소켓이란?
네트워크를 경유하는 프로세스 간 통신의 종착점
컴퓨터가 네트워크 상에서 통신을 하기 위해서는 자신이 누구인지 유일하게 식별이 가능한 수단이 있어야 한다. 이 수단이 IP 주소이고 따라서 IP 주소는 절대로 겹치면 안되고, 고유해야 한다.
But, 컴퓨터가 많아지면서 IP 부족 현상이 발생하게 되었다.
이를 해결하기 위한 여러 기술들이 존재한다. ex) NAT, 서브네팅, IPv6 등
💡 프로세스 간 통신을 위해 IPC를 하되, 다른 시스템의 프로세스와 IPC를 한다.
데이터를 보내는 송신쪽 컴퓨터에서 어떤 프로세스에게 데이터를 보내야 하는지 식별할때 사용하는 값
클라이언트 -> 서버로 데이터를 보낼 때 [서버 ip주소]:[서버 프로세스가 부여 받은 포트번호] 형태로 데이터를 보낼 대상을 식별한다.

위의 socket(), bind() 등의 함수는 시스템 콜을 의미한다.
시스템 콜이란, 사용자 프로그램이 특권 명령의 수행을 필요로 하는 경우, 운영체제에게 특권 명령의 대행을 요청하는 것을 말한다.
❓특권 명령이란?
CPU가 Kernel 모드일 때에만 CPU에서 실행될 수 있는 기계어 명령
권한이 필요한 이유 : 하드웨어 명령어를 잘 몰라서 아무렇게 함수를 호출했을 때 시스템 전체를 망가뜨릴 가능성이 있음
domain(주소영역 지정) : IPv4, IPv6중 무엇을 사용할지 결정
type(서비스 타입) : stream, datagram 소켓 중 선택
protocol(프로토콜 지정) : 0, 6, 17 중 0을 넣으면 시스템이 프로토콜을 선택하며, 6이면 tcp, 17이면 udp
소켓 파일 디스크립터 : 바인딩을 할 소켓의 파일 디스크립터
바인드될 소켓의 주소 : 소켓에 바인딩 할 아이피 주소, 포트번호를 담은 구조체
주소크기 : 위 구조체의 메모리 크기
❗첫번째 파라미터에 소켓의 파일 디스크립터를 넣는 이유는 OS에게 어떤 소켓에 아이피 주소와 포트번호를 부여할지 알려주기 위함이다.
소켓 파일 디스크립터 : 바인딩을 할 소켓의 파일 디스크립터
백로그 : 연결요청을 받아줄 크기 = TCP의 백로그 큐의 크기
소켓 파일 디스크립터 : 백로그 큐의 요청을 받아들이기 위한 소켓의 파일 디스크립터
주소 : 선입선출로 빼온 연결 요청에서 알아낸 클라이언트의 주소 정보
주소의 길이 : 위 구조체의 메모리 크기
다수의 클라이언트 요청을 효율적으로 처리하기 위한 기술로 높은 처리량과 빠른 응답 시간을 제공한다.
서버가 다수의 클라이언트로부터 동시에 많은 요청을 받는 경우, 서버가 단일 프로세스로 운영된다면 엄청난 병목 현상을 야기할 것이다. 따라서, 효율적인 요청 처리를 위해 병렬 처리 방식(멀티 쓰레드, 멀티 프로세스)을 사용한다.
운영체제에서 하나의 응용 프로그램에 대해 동시에 여러 개의 프로세스를 실행할 수 있게 하는 기술을 말한다.
fork() 함수를 이용한 멀티 프로세스 구현
fork() 함수는 현재 실행 중인 프로세스의 복사본을 생성한다.
부모 프로세스는 원본 프로세스, 즉 fork()를 호출한 주체를 뜻한다.
자식 프로세스는 부모 프로세스의 fork()를 통해 복사된 프로세스를 말한다.
부모 프로세스에서의 fork() 반환 값 : 자식프로세스 ID
자식 프로세스에서의 fork() 반환 값 : 0
실행이 종료된 자식 프로세스는 좀비 상태로 남게되고, 부모는 이 좀비 프로세스를 수거해주어야 함
좀비상태 : 프로세스가 종료 되었지만 메모리 공간에서 완전히 소멸하진 않은 상태
❗정리❗
accept()에서 새로운 소켓을 반환하는 것은 데이터 통신을 위한 구조적 분리를, fork()를 사용하는 것은 동시에 여러 클라이언트의 요청을 처리할 수 있는 병렬 처리 능력을 갖추기 위함

클라이언트와 서버간에 서로 신뢰성있는 통신을 위해 서로 준비가 되었음을 확인하는 과정이다.
client -> server로 보내지는 SYN은 listen 상태인 서버의 소켓에 연결 요청을 보내는 것이다.
이후 두개의 과정은 accept() 시스템 콜 이후 진행하여 최종적으로 Established 상태를 수립하고 본격적인 데이터의 송/수신이 이루어지게 된다.
❓인터럽트란?
시스템의 내부 또는 외부에서 발생하는 예기치 못한 사건에 의해, CPU가 실행 중인 프로그램의 작업을 중단시키고 다른 프로그램을 수행하도록 하는 명령어를 말한다.
(예기치 못한 사건이란 입출력이나 에러의 발생, 타이머의 시간 만료 등을 의미함)