혼잡제어 (CONGESTION CONTROL)에 대해 알아보자
Congestion Control and Quality of Service 혼잡제어는 라우터의 버퍼가 넘치는 경우를 제어해서 없도록 하는 것이다. QOS는 프로토콜 상에선 존재하지 않지만 라우터가 적용할려고 노력한다. 필요하기 때문이다. Data Traffic 네트워크 혼잡(Congestion)과 품질(QoS)은 사용자로부터 들어오는 데이터 트래픽 양을 조절하거나 서비스 양을 달리하는 것 양을 조절하려면 얼마나 어떤 식으로 들어오는 지 정량화 필요 가장 간단한 정량화 방법은 평균을 구하는 것이다. Average data rate = amount of data / time 문제점 : 평균은 단위 시간에 들어오는 양이 일정할 때 유용하지만 실제 인터넷 트래픽은 그렇지 않다. 인터넷 트래픽은 bursty하다고 할 수 있다.
TRANSPORT LAYER에 대해 알아보자
Transport Layer process-to-process 한 컴퓨터의 프로세스와 다른 컴퓨터의 프로세스의 통신을 생각하면 좋다.
UNICAST AND MULTICAST에 대해 알아보자
Unicast and Multicast Routing Unicasting : 1:1 방식, Class A,B,C Multicasting : 1:N 방식으로, Group 형성 방법이 문제가 된다. 모든 계층에서 구현 가능하다. 여기서 설명할 내용은 Network 계층에서의 multicasting 구현 방법. 최근의 multicasting은 응용계층에서 구현한 것이다. Class D Broadcasting : 1:All 방식 Anycasting : 1:anyone of them 방식
네트워크 레이어 프로토콜 (NETWORK LAYER PROTOCOL)에 대해 알아보자
Network Layer Protocols: ARP, IPv4, ICMPv4, IPv6 and ICMPv6 Network layer 프로토콜 : IGMP, ICMP, IP, ARP, RARP
네트워크 레이어 (NETWORK LAYER)에 대해 알아보자
Network Layer Host-to-Host Delivery : Internetworking, Addressing and Routing Internetworks
네트워크에 대해 알아보자
인터넷이란 무엇인가? Computing devices : hosts, end-system(PC, Workstation, server). 네트워크 앱이 실행된다.
쓰레드(THREAD)에 대해 알아보자
Thread Parallel Programming 병렬 프로그래밍 공동의 목적을 달성하기 위해, 다수의 실행 주체가 동시에 작업을 수행하는 방식 실행 주체: Process or Thread 사실 컴퓨터 시스템에서 프로그램을 실행하는 주체는 CPU (or Core)!! 프로세스나 쓰레드는 여러 프로그램이 CPU를 공유해서 사용하기 위한 추상적 단위 병렬 프로그래밍의 필요성 최근 컴퓨터 시스템은 대부분 다수의 CPU 를 탑재하고 있으며, 여러 CPU를 최대한 활용하여 성능을 높이기 위해서는 병렬 프로그래밍이 필수 소켓 프로그래밍에서는? 일반적으로 서버는 여러 클라이언트에 대해 동시에 서비스를 제공함 예) 포털에 여러 사람이 동시에 접근하여 각자 서로 다른 서비스를 이용함 반복 서버 하나의 프로세스가 동작하며 모든 클라이언트의 요청을 순서대로 처리 클라이언트는 연결 수립을 위해 이전 클라이언트의 요청이 모두 처리될 때까지 대기하여야 함 동시 동작 서버 (Parallel or Concurrently running or Multi-user Server) 여러 요청을 동시에 처리해 서비스할 수 있는 서버 서버를 병렬로 동작하도록 구성 일반적인 서버 역할 분담 Door-keeper process: 문지기 역할. 접속을 대기하다, 요청이 오면 연결을 수립함. 그리고 수립된 각각의 연결에 대해 서비스 프로세스를 할당함. 이를 반복함. Service thread: 각 연결에 대해 1:1로 실제 서비스를 제공하는 쓰레드 반복 서버의 예 지난 소켓에서의 서버-클라이언트 예제 동작 방식 Server: listen()→ accept() → send() → recv() → close() Client: connect() → recv() → send() → close() 서버 프로세스 수정: 반복 처리 서버 하나의 클라이언트 처리가 종료된 후, 다시 accept()로 돌아와서 대기 위 동작을 3번 반복하여, 3개의 클라이언트 요청을 처리하게 함 만약 클라이언트가 send()를 하지 않는다면? 서버 프로세스는 recv() 에서 무한 대기하며, 해당 클라이언트로부터 패킷이 전송되길 기다릴 것 그때 만약 다른 클라이언트가 동시에 접속을 요청한다면? 서버가 accept()를 대기하고 있기 않기 때문에, 접속 처리를 할 수 없음 Process-based Parallel Socket Programming 프로세스 기반 동시 동작 서버 Door-keeper process 기존 서버 코드와 같이 서버 소켓을 열고 bind(), listen() 수행 새로운 연결이 수립되면, child process를 만들어, 아래 service 동작을 수행하게 함 서버는 fork() 이후, 즉각 다시 accept()에서 대기. 이를 3회 반복함 종료 전, 생성된 child 개수만큼 wait()를 수행하여 모든 종료 상태값을 출력 후, 종료 Service process 기존과 같이 send(), recv() 수행하고, 소켓을 닫고, 종료 Thread 두 가지 종류의 실행 주체(execution unit or entity)
IPC에 대해 알아보자
IPC: Signal and Shared Memory IPC: Inter-process communication IPC의 필요성 Many processes are co-operating 서로 협업하는 프로세스: 한 가지 목적을 위해 여러 프로세스가 함께 동작 큰 프로그램의 모듈화, 병렬 작업을 통한 성능 향상, 사용자 편의성 향상 등 예) Game: video and audio processing, background data loading, chatting, etc. 이를 위해서는 상호 간의 정보 교환이 필수 그러나 프로세스들은 가상 메모리 공간 (Virtual Memory Space) 에 갇혀 있음 각 프로세스는 자기 자신만의 독립되고, 고립된 (isolated) 메모리 공간을 가짐 프로세스들은 서로 다른 프로세스의 space 를 침범할 수 없음! 존재조차 모름. 함께 일을 해야 하는데, 그럼 어떻게 정보를 주고 받지? → IPC IPC: Inter-Process Communication IPC: 프로세스 간 통신 모든 프로세스들의 공간에 접근할 수 있는 OS의 도움을 받아, 프로세스들 간에 서로 정보를 교환하는 것 예) Message queue, shared memory, signal, pipe, socket 등 (더 쉬운 예. CTRL+C, V) 어떤 medium 을 어떤 방식으로 사용해서 정보를 전달하느냐에 따라 서로 다른 통신 특성을 갖게 됨 커널 및 유저 메모리 공간, 네트워크 등이 medium 이 될 수 있음 예) Signal: 커널 메모리 공간을 통해 아주 단순한 정보만 단방향으로 전달 예) Shared memory: 유저 메모리 공간을 통해 양방향으로 정보 전달 가능 그러나 양쪽이 동시에 데이터를 수정할 수 있기 때문에 동기화 문제 발생 가능 예) Socket: 네트워크를 통해 원격 시스템에서 동작하는 프로세스와 통신 가능 협업 방식 및 상황에 따라 적절한 IPC 를 선택할 수 있어야 함 Signal 시그널의 개념 시그널 프로세스에 무슨 일이 발생했음을 알리는 간단한 메시지를 비동기적으로 보내는 것 예) 메모: “전화왔음” (누구한테?? 거기까진 알 수 없음. 메모 종류도 한정적) 발생사유 0으로 나누기처럼 프로그램에서 예외적인 상황이 일어나는 경우 Kill(2) 처럼 시그널을 보내는 시스템콜을 호출해 다른 프로세스에 시그널을 보내는 경우 사용자가 CTRL+C 와 같이 키를 입력해 인터럽트를 발생시킨 경우 시그널 처리방법 각 시그널에 지정된 기본 동작 수행. 대부분의 기본 동작은 프로세스 종료 무시: 발생한 시그널을 무시하고 진행 핸들러 호출: 특정 시그널 처리를 위한 함수(핸들러)를 지정해두고, 시그널을 받으면 해당 함수를 호출 블록: 발생한 시그널을 처리하지 않고 그대로 둠. 블록을 해제하면 그때 전달되어 처리 시그널 종류
프로세스 관리(PROCESS MANAGEMENT)에 대해 알아보자
Process Management Process Creation 프로세스 생성: fork(2) 1#include <sys/types.h> 2#include <unistd.h> 3pid_t fork(void); 프로세스 생성: fork(2) 새로운 프로세스를 생성 : 자식 프로세스 fork 함수를 호출한 프로세스 : 부모 프로세스 자식 프로세스는 부모 프로세스의 메모리 주소 공간을 그대로 복사 메모리 공간이 똑같이 복제됨에 따라, 아래 자원들도 그대로 복사됨 RUID, EUID, RGID, EGID, 환경변수 열린 파일기술자, 시그널 처리, setuid, setgid 현재 작업 디렉토리, umask, 사용가능자원 제한 부모 프로세스와 다른 점 자식 프로세스는 유일한 PID를 갖는다 자식 프로세스는 유일한 PPID를 갖는다. (Parent PID) 프로세스 잠금, 파일 잠금, 기타 메모리 잠금은 상속 안함 자식 프로세스의 tms구조체 값은 0으로 설정 (수행 시간 관련 구조체) 부모 프로세스와 자식 프로세스는 열린 파일을 공유하므로 읽거나 쓸 때 주의해야 한다. (동기화 문제 발생 가능)
동적할당(DYNAMIC MEMORY ALLOCATION)에 대해 알아보자
Dynamic Memory Allocation Memory Allocation Volatile and Non-volatile storage devices Primary storage: Main memory 주기억장치로 사용하는 DRAM 등의 휘발성 저장 장치 성능이 높지만, 적은 저장 공간 제공 프로그램 내의 변수와 같이 용량은 적지만 자주 접근하는 자료를 저장 Secondary storage: Storage devices 보조기억장치로 사용하는 HDD, SSD 등은 비휘발성 저장 장치 느리지만, 많은 저장 공간을 제공 시스템 종료 시에도 보관하여야 할 데이터를 적재하고, 시스템 재기동 시 다시 로드 일반적으로 파일(file)의 형태로 데이터를 저장함 Memory 메모리는 한정된 자원 (예. 8GB, 16GB) OS와 여러 프로세스가 동시에 물리 메모리 공간을 공유하며 실행됨 OS는 자기 자신과 여러 프로세스에 대해 최대한 효율적으로 메모리를 할당하고자 함 이를 위해 OS는 가상 메모리 관리 기법을 사용 가상 메모리 공간 (Virtual Memory Space) 각 프로세스는 자기 자신만의 독립되고, 고립된 (isolated) 메모리 공간을 가짐 프로세스들은 서로 다른 사람의 space 를 건드릴 수 없음! 공간의 크기는? 일반적으로 32 비트 주소 공간 (각 주소 마다 1B 저장: total 4GB = 2^32) 64비트 프로세스의 경우, 48비트 혹은 56 비트만 사용 (256 TB = 2^48 or 64 PB = 2^56) Memory Allocation OS의 메모리 관리