반응형

** KOCW에서 이석복 교수님의 컴퓨터네트워크(2015년) 강의를 수강한 내용을 정리한 글입니다.

http://www.kocw.net/home/search/kemView.do?kemId=1169634

[컴퓨터네트워크

인터넷을 동작시키는 컴퓨터네트워크 프로토폴을 학습한다.

www.kocw.net](http://www.kocw.net/home/search/kemView.do?kemId=1169634)

노드 4개로 시작했던 최초의 인터넷(ARPANET)

현재는 →

 

 

네트워크 구조

  • 네트워크 엣지(가장자리) : 어플리케이션, 호스트
  • 네트워크 코어(중심) : 라우터(아래 그림에서 X 표시된 동그라미) / 네트워크 속 네트워크
  • 네트워크 사이를 연결 : 통신 링크

 

 

네트워크 엣지

  • 엔드 시스템 : 어플리케이션 프로그램 실행 (Web, email)
  • 클라이언트 / 서버 모델 (웹 브라우저, 웹 서버, 이메일 클라이언트, 이메일 서버)

 

 

TCP(Transmission Control Protocol)

  • Connection-oriented(연결 지향)
  • 엔드 시스템 간 데이터 전송을 위한 프로토콜
  • Relidable(신뢰할 수 있는) / In-order byte-stream(데이터 전송 순서를 유지하는) 데이터 전송
  • Flow control : Receiver(수신자)에 맞게 전송
  • Congestion control : 과부하 등 감안
  • UDP에 비해 신뢰할 수 있다는 장점이 있지만, 비용이 많이 듦

 

 

UDP(User Datagram Protocol)

  • Connectionless(비연결)
  • 엔드 시스템 간 데이터 전송을 위한 프로토콜
  • Unreliable data transfer
  • No flow control
  • No congestion control
  • TCP에 비해 속도가 빠름 → 신뢰할 수 없어도 괜찮은 곳에 사용

TCP의 용도 : HTTP(Web), FTP(File transfer), Telnet(Remote login), SMTP(email)

UDP의 용도 : 스트리밍 미디어, 원격 회의, DNS, 전화(Telephony)

프로토콜(Protocol)이란?

쉽게 말해, 대화(통신)의 규칙, 규격

 

 

네트워크 코어

상호 연결된 라우터들의 집합(mesh)

 

어떻게 데이터는 망을 통해 전달될까?

  • 써킷 스위칭 : 호출마다 전용(dedicated) 회로 할당 → 전화망
    • 시작부터 끝까지 미리 할당해놓고 시작 (자원 예약)

  • 패킷 스위칭 : 불연속적인 덩어리 단위로 망을 통해 데이터를 보낸다 → 인터넷
    • 자원을 예약하지 않음

 

 

패킷 스위칭 vs 써킷 스위칭

  • Band width(통신망-Link 의 전송 가능 속도) : 1Mb/s 일때
  • 유저가 100kb/s를 사용할 때(When active)
  • 10%의 시간에 활성(Active)된다면
  • 써킷 스위칭 : 10명의 유저 감당 가능
  • 패킷 스위칭 : 35명의 유저를 감당해도 활성 유저가 10명 초과할 확률이 0.0004 미만
  • 인터넷에서 패킷 스위칭을 사용하는 이유 : 인터넷 사용 시, 특정 시점에만 데이터 송수신하는 경우가 많음
    • 단, 동시 접속을 해야 하는 경우 문제가 생길 수 있음

 

 

패킷 딜레이의 원인

  1. Processing delay : 패킷을 확인해야 함 (비트 에러, 목적지 등)
  2. Queueing delay : Input속도가 Output속도보다 빠르면 → queue에 저장해야 함
  3. Transmission delay : 패킷이 모두 통과하는 데에 걸리는 시간
    1. 패킷 길이(bits) / 링크 bandwidth(bps) → s(second) 단위
  4. Propagation delay : 전송에 걸리는 시간 → 거리/빛의 속도

 

 

패킷 딜레이를 줄여보자

  1. Propagation delay → 불가능
  2. Processing delay : 라우터 성능 개선
  3. Queueing delay : ??
  4. Transmission delay : 케이블 성능 개선(Bandwidth 개선)
  • 고속도로 예시
    • 톨게이트 하이패스 도입 → Processing delay 개선
    • 차선 늘리기 → Transmission delay 개선
    • 그럼에서 명절에는 막힌다 → Queueing delay는 어쩔 수 없다
      • Transmission 속도가 빨라지면 queue 처리 속도도 빠르지만, 그래도 queue가 쌓여 있다면 처리하는 시간이 걸린다.
      • 대부분의 네트워크 문제는 Queueing delay에서 발생한다.

Queue가 넘치면 → 패킷 유실! (대부분의 loss가 여기서 발생)

TCP는 Relialbe하다며?(신뢰성 있다며) → Queue에서 loss가 발생하면? → 재전송해야함 → 그 방식은?

→ 시작 단계에서 재전송한다

  • TCP는 네트워크 엣지에 존재하고, 사이에 있는 코어(라우터)는 판단을 하지 않는다.
  • → dumb core

 

 

 

 

반응형

'Computer Science > 네트워크' 카테고리의 다른 글

2강) Application layer architecture, HTTP란?  (0) 2023.01.22
반응형

** KOCW에서 반효경 교수님의 운영체제(2014년) 강의를 수강한 내용을 정리한 글입니다.

http://www.kocw.net/home/cview.do?cid=3646706b4347ef09

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

 

 

운영체제란?

  • 컴퓨터 하드웨어 바로 위에 설치되어 사용자, 소프트웨어, 하드웨어를 연결하는 소프트웨어 계층

좁은 의미(커널) : 운영체제의 핵심 / 부팅 이후로 계속 메모리에 상주하는 부분

넓은 의미 : 커널 + 각종 주변 시스템 유틸리티

전공자 입장에서, 운영체제는 커널만을 의미!

 

 

운영체제의 목적

  1. 컴퓨터 시스템의 자원을 효율적으로 관리 → 자원 관리자
    • 프로세서, 메모리, 입출력 장치 등의 자원
      • 사용자 간 형평성 있는 자원 분배
      • 주어진 자원으로 최대한의 성능
    • 사용자 및 운영체제 자신을 보호하고, 프로세스, 파일, 메시지 등을 관리

 

  1. 컴퓨터 시스템을 편리하게 사용할 수 있는 환경 제공
    • 동시 사용자/프로그램들이 각각 독자적 컴퓨터에서 수행되는 것 같은 효과를 줌

 

 

운영체제의 처리방식

  • 시분할(Time sharing)
    • 여러 작업을 수행할 때, 처리 능력을 일정한 시간 단위로 분할하여 사용
    • interactive한 방식 → 지금 우리가 쓰는 컴퓨터
  • 실시간(Realtime OS)
    • 정해진 시간 안에 어떠한 일이 반드시 종료되어야 하는 시스템을 위한 OS
    • 특수 목적으로 사용 : 원자로/공장, 미사일, 반도체 장비, 로보트 제어 등
  • 일괄 처리(Batch processing)
    • 작업 요청을 일정량 모아서 한꺼번에 처리 (종료까지 기다려야 함)
    • 역사속으로..

 

 

헷갈리는 용어

  • Multitasking
  • Multiprogramming
  • Time sharing
  • Multiprocess

위 용어들을 컴퓨터에서 여러 작업을 동시에 수행하는 것을 뜻함

Multiprogramming은 여러 프로그램이 메모리에 올라가 있음을 강조

Time sharing은 CPU의 시간을 분할하여 나누어 쓴다는 의미를 강조

  • Multiprocessor → 하나의 컴퓨터에 CPU(Processor)가 여러 개 붙어 있음을 의미

 

 

운영체제의 종류

  • 유닉스(UNIX)
    • 코드의 대부분을 C언어로 작성
    • 이식성이 높음 (C언어로 되어 있어, 기계어 종류에 영향을 받지 않고 컴파일만 하면 된다)
    • 최소한의 커널 구조
    • 확장 용이
    • 소스 코드 공개 (지금은 유료)
    • 프로그램 개발에 용이
    • 다양한 버전
      • Linux → 공개된 오픈소스 버전
  • DOS(Disk Operating System)
    • MS사에서 1981년 IBM-PC(개인용 PC)를 위해 개발
    • 단일 사용자용 운영체제, 메모리 관리 능력의 한계 (주 기억장치 : 640KB)
  • MS Windows
    • MS사의 다중 작업용 GUI 기반 OS
    • Plug and Play, 네트워크 환경 강화
    • DOS용 응용 프로그램과 호환성 제공
    • 불안정성
    • 풍부한 지원 소프트웨어
  • 그 외 Handhel device를 위한 OS, 스마트폰 용 OS(iOS 등) 등 다양한 OS가 존재

 

 

 

 

 

반응형
반응형

 

Java의 기본 라이브러리에는 Binary Search 메서드가 내장되어 있습니다.

java.util.Arrays 클래스에 존재합니다.

 

다양한 자료형의 배열을 사용할 수 있에 오버로딩되어 있는데,

본 아티클에서는, 제너릭스로 구현된(자료형에 구애받지 않고 사용할 수 있게 구현) 메서드를 사용해볼 것입니다..

 

 

 


새로운 자료형(클래스) 제너릭스로 구현

//--- 신체검사 데이터 ---//
class PhyscData {
    private final String name;          // 이름
    private final int    height;        // 키
    private final double vision;        // 시력

    //--- 생성자(constructor) ---//
    public PhyscData(String name, int height, double vision) {
        this.name = name;
        this.height = height;
        this.vision = vision;
    }

    //--- 문자열로 만들어 반환하는 메서드 --//
    public String toString() {
        return name + " " + height + " " + vision;
    }

    //--- 키의 오름차순으로 정렬하기 위한 comparator ---//
    public static final Comparator<PhyscData> HEIGHT_ORDER =
            new HeightOrderComparator();

    private static class HeightOrderComparator implements Comparator<PhyscData> {
        public int compare(PhyscData d1, PhyscData d2) {
            return (d1.height > d2.height) ?  1 :
                    (d1.height < d2.height) ? -1 : 0;
        }
    }
}

 

PhyscData라는 자료형에 대해 Binary Search를 사용하려고 합니다.

PhyscData라는 클래스 내부에 Comparator를 하나 구현했습니다. (외부에 구현해도 상관 없습니다.)

그리고 구현한 Comparator 내부에는 compare라는 메서드를 구현해야 합니다.

 

PhyscData 객체들의 순서를 비교할 때, height를 기준으로 하며,

더 큰 height를 가진 객체가 오른쪽에 오도록(오름차순) 정렬 규칙을 정한 것입니다.

 

 

 

 

binarySearch 메서드 사용

class BinarySearch1 {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        PhyscData[] x = {                    // 키의 오름차순으로 정렬
            new PhyscData("강민하", 162, 0.3),
            new PhyscData("이수연", 168, 0.4),
            new PhyscData("황지안", 169, 0.8),
            new PhyscData("유서범", 171, 1.5),
            new PhyscData("김찬우", 173, 0.7),
            new PhyscData("장경오", 174, 1.2),
            new PhyscData("박준서", 175, 2.0),
        };

        System.out.print("키가 몇 cm인 사람을 찾고 있나요?: ");
        int height = stdIn.nextInt();                // 킷값을 읽어 들임
        int idx = Arrays.binarySearch(
                        x,                                 // 배열 x에서
                        new PhyscData("", height, 0.0),    // 키가 height인 요소를
                        PhyscData.HEIGHT_ORDER             // HEIGHT_ORDER에 의해 검색
                     );

        if (idx < 0)
            System.out.println("그 값의 요소가 없습니다.");
        else {
            System.out.println("그 값은 x[" + idx + "]에 있습니다.");
            System.out.println("찾은 데이터: " + x[idx]);
        }
    }
}

위의 코드는 PhyscData의 배열에서 Binary Search를 실행하고 있습니다.

Arrays.binarySearch 메서드의 인자로 배열, key값, Comparator를 구현한 객체가 들어감을 확인할 수 있습니다.

 

만약 찾는 값이 존재한다면, 위치(인덱스)를 반환합니다.

존재하지 않는다면, 만약 값이 존재한다면 어디에 위치해야하는지를 알려주는 값을 음수로 반환합니다.

이를 삽입 포인트(insertion point)라고 하는데,

insertioin point = -(원래 위치했어야 하는 인덱스 값)  - 1 로 주어집니다.

 

만약 배열이 Comparator에 정의된 compare 메서드의 규칙에 따라 정렬되어 있지 않다면,

정확하지 않은 값을 반환합니다.

binarySearch 메서드는 정렬이 된 배열을 가정하고 검색을 실행하기 때문입니다.

 

 

 

 

내림차순으로 수정해보기

package chapter3;// 신체검사 데이터 배열에서 이진 검색

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

class BinarySearch1 {
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        PhyscData[] x = {                    // 시력의 내림차순으로 정렬
                new PhyscData("박준서", 175, 2.0),
                new PhyscData("유서범", 171, 1.5),
                new PhyscData("장경오", 174, 1.2),
                new PhyscData("황지안", 169, 0.8),
                new PhyscData("김찬우", 173, 0.7),
                new PhyscData("이수연", 168, 0.4),
                new PhyscData("강민하", 162, 0.3),
        };

        System.out.print("시력이 몇인 사람을 찾고 있나요?: ");
        double vision = stdIn.nextDouble();                // 킷값을 읽어 들임
        int idx = Arrays.binarySearch(
                        x,                                 // 배열 x에서
                        new PhyscData("", 0, vision),    // 시력이 vision인 요소를
                        PhyscData.VISION_ORDER             // HEIGHT_ORDER에 의해 검색
                     );

        if (idx < 0)
            System.out.println("그 값의 요소가 없습니다.");
        else {
            System.out.println("그 값은 x[" + idx + "]에 있습니다.");
            System.out.println("찾은 데이터: " + x[idx]);
        }
    }
}

//--- 신체검사 데이터 ---//
class PhyscData {
    private final String name;          // 이름
    private final int    height;        // 키
    private final double vision;        // 시력

    //--- 생성자(constructor) ---//
    public PhyscData(String name, int height, double vision) {
        this.name = name;
        this.height = height;
        this.vision = vision;
    }

    //--- 문자열로 만들어 반환하는 메서드 --//
    public String toString() {
        return name + " " + height + " " + vision;
    }

    //--- 시력의 내림차순으로 정렬하기 위한 comparator ---//
    public static final Comparator<PhyscData> VISION_ORDER =
            new HeightOrderComparator();

    private static class HeightOrderComparator implements Comparator<PhyscData> {
        public int compare(PhyscData d1, PhyscData d2) {
            return (d1.vision < d2.vision) ?  1 :
                    (d1.vision > d2.vision) ? -1 : 0;
        }
    }
}

시력의 내림차순으로 정렬된 배열에서 이진 탐색을 수행하도록 코드를 수정했습니다.

입력을 받는 자료형을 double로 바꾸고,

Comparatorcompare 메서드가 vision을 기준으로,

그리고 반대 방향으로 정렬을 수행하도록 수정했습니다.

 

System.out.println("idx: " + idx);

위와 같은 코드를 추가하여 idx의 값을 살펴봅시다.

 

idx-5가 됩니다.

만약 0.77이 존재했다면 idx4였을 것이므로,

(-4) - 1 = -5 의 값이 나온 것입니다.

 

        PhyscData[] x = {                    // 시력의 내림차순으로 정렬
                new PhyscData("박준서", 175, 2.0),
                new PhyscData("유서범", 171, 1.5),
                new PhyscData("장경오", 174, 1.2),
                new PhyscData("김찬우", 173, 0.7),
                new PhyscData("황지안", 169, 0.8),
                new PhyscData("이수연", 168, 0.4),
                new PhyscData("강민하", 162, 0.3),
        };

이번에는 위와 같이 내림차순의 순서를 망가뜨리고 프로그램을 실행해보겠습니다.

 

망가진 순서 이전의 값은 탐색이 잘 됩니다.

 

하지만 망가진 순서 이후의 값은 잘 탐색이 되지 않습니다.

 

즉, Arrays.binarySearch 메서드는

정렬이 잘 되어 있는지를 따로 확인하지 않고,

정렬이 잘 되어 있다고 가정한 채로 탐색을 수행한 결과를 반환합니다.

 

 

 

 


감사합니다.

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts