2017년 3월 21일 화요일

operating system(4) - process

Process


1. process
 : 사용자의 요청에 의해 OS가 디스크에 있던 프로그램을 메모리에 적재하고, PCB로 관리함
   즉, 실행 중인 프로그램



=> 연산(CPU명령어의 집합)

=> 전역변수들을 저장
=> 동적 메모리 할당영역



=> 지역변수 및 매개변수 저장



 CPU의 레지스터들:
   1. CS : 코드영역의 시작 주소를 가짐
   2. DS : 데이터 영역의 시작 주소를 가짐
   3. SS : 스택영역의 시작 주소를 가짐
   4. PC : 다음 실행할 명령어의 주소값을 가짐


예시.

  

2. 프로세스 제어 블록

 1) 프로세스 제어블록이란?
    : 프로그램을 실행하여 프로세스가 만들어질 때, 운영체제가 프로세스를 관리하기 
    위해 만드는 데이터 구조
    프로세스가 생성될 때마다 PCB가 생성되고 프로세스가 종료되면 PCB는 제거된다.

 2) 프로세스 제어 블록의 내용 :
 
                 
    - 프로세스 번호(PID)
    - 프로세스 상태(state)
    - CPU 레지스터
    - CPU 스케쥴 정보
    - 기억장치 관리 정보
    - 계정 정보
    - 입출력 상태 정보 










3. 다중 프로그래밍

 : 다중 프로그래밍은 여러 작업들을 메모리에 유지시켜서 CPU가 항상 하나의 작업을 실행할 수 있게 하는 기법으로 CPU의 사용률을 높일 수 있다.
  단일 작업은 CPU와 입출력 장치를 동시에 사용할 수 없어 작업이 입출력 때문에 대기하게 된다면 운영체제는 CPU를 유휴상태로 두지 않고 다른 프로세스를 실행하도록 한다.


4. 시분할, 멀티태스킹
  : 각 프로세스에게 CPU를 시간적으로 분할해 조금씩 사용할 수 있게 하는 시스템
    => 각 사용자는 자신만이 컴퓨터를 소유한 것처럼 느끼지만 실제로는 다수의 사용자가 
       하나의 컴퓨터를 공유함

5. 프로세스 상태
  : 프로세스는 상태가 그때 그때 변한다.
     => 생성, 실행, 대기, 준비, 종료
       - 생성 : 프로세스가 생성되는 중
       - 실행 : 프로세스의 명령어들이 실행되고 있다.
       - 대기 : 프로세스가 어떤 사건이 일어나기를 기다림
       - 준비 : 프로세스가 CPU를 할당받기를 기다린다.
       - 종료 : 프로세스의 실행이 종료된다.
   => ps) 사실 더 많이 있다.

  * 어느 한순간에는 한 CPU에 오직 하나의 프로세스만이 실행된다.
     ==> 실행상태의 프로세스는 오직 한개다! 나머지는 대기 or 준비상태이다



예시.




* state : CPU의 여러 레지스터들

* save와 reload사이에 interrupt를 처리









6. 문맥 교환(Context switch)

  * 문맥 교환 : CPU가 다른 프로세서로 넘어갈 때, 현재 CPU의 레지스터들의 상태를 PCB에                   저장하고, 새 프로세서의 PCB를 다시 적재하는 작업

  * 문맥교환은 시스템의 오버헤드이다 : 문맥교환 동안에는 interrupt를 처리해야함으로
                                                  실제 필요한 작업을 하지 못한다.
       ==> 오버헤드는 작을수록 좋다.
  * 문맥 교환(오버헤드)에 걸리는 시간을 줄이는 방법 :
    1. PCB는 OS안에 만들어짐으로 메모리에 위치한다. 따라서 메모리의 읽고 쓰는 속도가
       빠를수록 문맥교환을 빨라진다.
    2. 레지스터가 많을수록 메모리로 옮길것이 많아짐으로 레지스터의 수가 적을수록 문맥
       교환 속도가 빨라진다.
    3. 일부 제품은 한 명령어로 CPU의 레지스터들을  메모리로 한번에 옮긴다.
       ==> 문맥교환은 하드웨어의 지원에 따라 달라진다.


7. 프로세스 스케줄링
  : CPU 이용률을 최대화 하기위해 여러 프로세스들 중에서 어떤 것을 실행할 것인지를
   결정하는 것

  1) 스케줄링 큐
    * 준비 큐(Ready queue)
      - 실행하기 위해 주기억장치(메모리)에서 준비하고 있는 프로세스들을 관리
      - 일반적으로 연결리스트 형태로 관리된다.
        > 준비 큐의 헤더는 첫벗째 PCB와 마지막 PCB를 가리키는 포인터를 가지고 있다.
        > PCB는 다음 PCB를 가리키는 포인터를 가지고 있다.
 
    * 입출력 장치 큐
      - 각 입출력 장치는 자신의 장치 큐를 가진다.
      - 입출력 장치에서 대기하는 프로세스들을 관리
      - 프로세스는 CPU를 할당받아 실행되다가 입출력 요청을 하게되면, 입출력 요청의
       완료를 기다려야한다. 이때, 입출력장치에 다른 프로세스들도 기다리고 있으므로
       대기하고 있는 프로세스들을 연결하여 큐로 관리한다.


예시.(준비 큐와 입출력장치 큐)
 * ready state : ready queue (준비 큐)
 * waiting state : device queue (장치 큐)
   : 장치큐는 장치마다 하나씩 존재하며 입출력 요청을 하고 끝날때까지 기다리는
   프로세스들을 큐로 연결한 것이다. 입출력이 완료되면 준비큐의 끝에 연결되어
   자신의 차례를 기다린다.
===> 결론 : PCB가 이동한다!!!



예시.(프로세스(PCB)의 큐 이동)
 * 새로 생성된 프로세스는 ready queue에서 대기한다.
 * 대기하던 프로세스는 CPU를 할당받아 실행된다.
 * 프로세스가 실행되던 도중 위와 같은 4가지 사건이 발생할 수 있다.
   - I/O interrupt가 발생하여 입출력장치 큐에 위치하고 입출력이 끝나면 준비큐로 복귀
   - 시분할 시스템의 경우 timer interrupt가 발생하면 준비 큐로 다시 복귀
   -  자식 프로세스를 생성하여 자식이 먼저 종료되길 기다리다가 종료되면 준비큐로 복귀
   - 특정 interrupt를 기다리다가 발생하면 레디큐로 돌아간다.
    ex. 입출력 요청을 하고서 입력 완료 interrupt가 발생하길 기다리는 것
       ps) 현재 진행 프로세스가 기다리는 것이 아니다!!















































2017년 3월 20일 월요일

software engineering (3) - Agile Software Development

Agile Software Development


Rapid software development

  요즘 빠른 개발과 배포는 소프트웨어 시스템을 위해 가장 중요한 요구사항중 하나이다.
  => because 변화가 빠르고, 요구사항의 변화가 빈번해 안정적인 요구사항을 찾기 불가능

   빠른 개발을 위해서는 다음과 같은 요구사항이 주어진다.
     - 명세와 설계가 중첨됨
     - system이 여러 버전의 시리즈로 만들어짐 (이렇게 하는 것이 더 빨리 작업됨)
     - 각 version마다 고객이 관여함으로 고객의 요구사항에 빠르게 대처
     - User interfaces는 tool을 사용해 빠르게 하는 경우가 많음
  하지만 기존의 waterfall 같은 방법으로는 overhead가 너무 많아 새로운 방법이 필요해짐

agile methods

  * waterfall같은 기존의 방법에 대한 대안으로 agile method가 등장.

  * agile method의 특성
    - 오랜 설계는 낭비이므로 코드에 집중해 개발을 진행
    - 소프트웨어 개발을 양방향에 기반을 두고 작업함
    - 변화하는 요구사항을 충족하기 위해 빠르게 진화하고 더 많이 배포한다.

  * agile method의 목적
    - 소프트웨어 프로세서상의 오버헤드를 줄인다.
    - 지나친 재작업 없이 변화하는 요구사항에 빠르게 반응할 수 있다.

  * agile method의 법칙
    - 고객의 협조 : 고객은 요구사항 및 이들간의 우선순위를 제공하고 반복된 평가를 수행
    - 단위 개발 : 고객이 각 increment에 포함되어야 할 요구사항을 명세
    - 단계에 얶매이지 않는다. : 별도의 process를 강제하지 않고 자신의 방법대로 개발
    - 변화를 바로 느껴라 : 요구사항에 변동이 있을 것을 예측, 시스템이 변동에 빨리 
                             적응 할 수 있도록 설계
    - 간단하게 유지하라 : 절차나 문서등을 간단하게 유지


   * agile method의 특징
    - 소형 또는 중형크기의 제품, 특정 사용자를 위한 시스템에 적합 (ex. 대학교 전산)
    - 고객이 직접 개발과정에 참여가 가능
    - 작고, 뭉쳐져있는 팀에 의해 진행되기 쉬움

   * plan-driven and agile development
  : 주된 차이점은 요구사항 명세가 없다는 것이다. 이를 통해 명세, 설계, 구현 및 테스트가 
  중첩되어 같이 일어나고 그 결과 속도가 plan-driven에 비해 더 빨라진다.

agile development의 예시
 Extreme programming
  : 최고로 잘 알려지고 널리 사용되고 있는 agile method.
    - 새로운 버전이 하루에 몇 개씩 나온다. => 빡세게 programming 하기
    - 2주마다 새로운 increment를 배포
    - 수 많은 코딩과 테스트의 반복을 통해 단점을 보안함
  ==> 짧은 기간에 많은 코딩과 테스트를 반복하고 짧은 기간안에 출시되기 때문에 
      고객과 잦은 소통이 가능하다. 이러한 원인들 때문에 계획이나 제제없이 
      좋은 프로그램이 나올수 있다. 

  ==> 다른 모델들과 달리 requirement specification을 하지 않고 user stories를 고려한다.       ==> 이는 명확한 명세가 필요없어 시간을 더욱 단축한다.

























computer architecture (2) - instruction

명령어의 집합 구조

  : CPU는 명령어를 수행하는 녀석이였다!(이전에)
 
그렇다면 명령어란 무엇이고 무엇이 있을까?

  1. 명령어란?

  : 주소 + 동작(operand +  operation)이다



  명령어의 구성요소

  : 1) operand(동작의 대상)
    2) opcode(=operation code, operand가 결정되는 방법)
    3) mode (operand가 결정되는 방법을 나타내는 부분=> 주소의 수)

 따라서, 명령어의 갯수는 operand의 수 * operation * mode 개 존재한다.
 예를 들어, 각각 10개씩 존재한다면 10 * 10 * 10 = 1000개의 명령어가 존재하게 된다.

그렇다면 명령어가 많으면 다양한 처리를 할 수 있게되니 많을수록 좋은 것일까?
--> NO!, CPU가 가질수 있는 자원은 한정되어져있다. 많은 명령어를 해석하기 위해
    decoder가 복잡해지면 다른 장치들이 가질 수 있는 자원들이 줄어들게 된다.
    예를 들어, register가 커지면 CPU의 속도가 빨라지는 한편 decoder의 영역이 줄어들어
   처리할 수 있는 명령어의 갯수가 줄어들게 된다.

  이러한 딜레마 때문에 2가지 유형의 CPU가 등장하게 된다. ==> RISC, CISC

  RISC는 명령어의 사용빈도를 고려하여 명령어의 처리를 결정하는데, 사용빈도가 높으면 자신이 처리하고 사용빈도가 적으면 compiler에게 자신이 알아들을 수 있는 명령어로 바꿔서 알려달라고 요청한 뒤 처리함으로 decoder를 보다 간단하고 적은 명령어를 사용하게 된다. 이를 통해 명령어가 적음에도 불구하고 CISC와 비슷한 처리능력을 낼 수 있다. 게다가 RICS는 CISC에 비해 간단한 명령어의 조합으로 이뤄져 cycle이 더 적고 덜 복잡하며 속도가 빠르다. 그리고 간단한 명령어들를 주로 사용하므로 길이가 고정되어 있어 이들의 조합으로 프로그래머는 불필요한 코드나 낭비되던 사이클을 줄일 수 있게 되므로 핸드폰같은 작은 전자기기에서 주로 사용하게 된다.

  반면,  CISC는 모든 명령어를 자신이 처리하여야 함으로 decoder가 복잡하고 속도가 느리며 더 많은 사이클을 가지게 된다. 단, 복잡한 명령어들을 RISC보다 더 많이 사용할 수 있어 명령어들의 길이가 가변적이지만 하나의 명령어를 통해 많은 일을 한 번에 해결할 수 있으므로 주로 테블릿에서 사용하게 된다.

  2. 주소의 수

   : 명령어를 표현하는 주소의 수(mode)의 종류는 4가지가 있다.
    1) 3-주소 명령어 : A <- B - C
    2) 2-주소 명령어 : B <- B + C
    3) 1-주소 명령어 : B <- (B)'
    4) 0-주소 명령어 : 스택연산 or 큐연산

























2017년 3월 19일 일요일

computer architecture (1) - introduction


 introduction


    1. 컴퓨터와 사람의 소통방법

  => 왼쪽으로 갈수록 더 간략하고 기계와 독립되어있으며 읽고 쓰기가 쉽고, 디버깅 및 유지보수가 쉽다. 반면 오른쪽으로 갈수록 더 견고하고 기계의존적이며, 에러가 발생하기 쉬우며 읽고 쓰기 및 디버깅 유지보수가 어렵다.

 - interpreter는 하나의 작업을 여러개의 문장으로 바꾸고, compiler는 하나의 문장을 여러개의 명령어로 바꾸며, assembler는 명령어를 기계어로 바꾼다.

 - 이러한 과정을 통해 아래 사진의 윗쪽 c언어 문장들이 아랫쪽의 어셈블리 언어로 바뀐다.

 여기에서 1번과 2번 사이에는 주소차이가 8이 생기는데 이는 이들 사이에
    0041138E  c7   ( ==> c7은 int형으로 4bit * 2개 = 1byte를 차지한다.)
    0041138F  45
    00411390  f8
    00411391  00
    00411392  00
    00411393  00
    00411394  00
    00411395  01
  이 담겨 있음을 의미한다.


2. CPU가 사람과의 소통에서 하는 일

 이러한 작업이 끝날때 까지 CPU는 위의 작업을 아래와 같이 행하고 있다.
=> 명령어의 해석은 디코딩을 의미하며 이를 수행하는 제어장치와 연산기에는 decorder가
      내장되어있다.  ps) Mem[PC] -> IR임

=== > ex. C언어 코드가 실행되면 메모리에 적재됨
       ---> 운영체제가 적재된 프로그램의 첫 주소를 레지스터(PC)로 가져옴 (인출단계)
       ---> 프로그램의 첫 주소를 메모리에서 찾아 IR에 가져와 실행함 (실행단계)
       ---> 주소값에 + 1을 실행함

   ===> 여기서 register의 존재의의가 발생함(기억장치로서)
         :  CPU가 실행할 주소를 가지기 위한, 또 명령어를 저장하기 위한 일시적인
          저장장치(기억장치)가 필요하다.

   ===> 이러한 반복은 산술 연산만으로 가능한 경우도 있고 산술 + 논리 연산을 해야
          가능한 경우도 있어 연산기가 필요하다.


3. CPU의 구조


== > 여기에서 버스들은 데이터가 다니는 통로 (처리속도에 큰 영향)
   ps) 버스에 단방향, 양방향이 있는 이유?
      : 들어오는 데이터와 나가는 데이터가 있을때, 일방통행이라면 데이터가 기다려야하는        시간이 너무 길어지기 때문에.


CPU가 하는 일 : 
   - 데이터 전달
      : 내부 레지스터, 주 기억장치, 입출력장치간 데이터 전달(버스)

   - 데이터 처리
      : 내부 레지스터 혹은 주기억장치의 데이터를 연산기에서 데이터값을 조작

   - 프로그램 제어
      : 프로그램의 실행순서 변경

=== > 결론 : CPU가 하는 일은 CPU연산 사이클을 진행하기 위해 주소를 가져오고
               해당 내용을 메모리에서 가져와 디코딩(실행)한다.



4. 메모리의 구조

 : 기억장치의 용량은 : 2^n * k 비트이다.
     (n : 비트 주소선, 비트 갯수, k : 한 방에 저장될수 있는 비트수)

   === > 258 * 8 = 2^8 * 8 = 256 Byte
           = 비트의 갯수(n)가 8 개이고 한방에 8개의 비트(k)를 저장(Byte가 기본 단위)
    ==> 기본 단위가 Byte이기 때문에 PC, 레지스터등들이 8bit로 작동 (IR예외)
       



5. 예시를 통한 정리









2017년 3월 14일 화요일

operating system(3) - 운영체제의 구조

운영체제 설계와 구현

    * 운영체제의 요구사항 : 사용자 목적과 시스템 목적
      - 사용자 목적 : 사용자가 사용하기 쉬워야 하고 신뢰성이 있어야하며 빨라야 한다.
      - 시스템 목적 : 설계, 구현, 관리가 쉬워야하고 융통성 신뢰성 효율성이 있어야한다.

   ==> 이러한 요구사항은 모호하며 다양하게 해석될 수 있다!
         ==> 즉, 새로운 요구사항이 등장함에 따라 다양한 OS들이 개발되고 있다.



1. 운영체제의 구조

  1) 단일(monolithic, 모노리틱) 커널 구조 : MS-DOS
    : 컴퓨터 등장 초창기에 출현했으며, 운영체제의 거의 모든 기능이 하나의
     프로그램에 의해 구현됨
     ex. Unix : 초기의 유닉스(여러가지 기능들이 하나의 프로그램에 구현되어있었다.)

단일 커널 구조 : Unix



  2) 마이크로 커널 구조
    : 중요 기능만 커널로 구현하고 나머지 많은 기능을 사용자 모듈인 서버들로 구현
     => 커널과 사용자 모듈 서버는 메시지를 사용하여 통신한다. 
         (서버는 사용자에게 서비스를 제공하는 모든 프로그램)

     장점 : 확장이 쉽다.
             커널이 작아 새로운 하드웨어의 이식이 쉽다.
             코드가 적기 때문에 버그가 적어 신뢰성이 좋다.
     
     단점 : 잦은 통신이 필요하기 때문에 성능저하의 우려가 있다.
             (요즘은 하드웨어 기술이 발달함에 따라 거의 없다고 봐도 무방함)

      ==> 이러한 장점들 덕분에 기존의 OS들이 대부분 마이크로 커널로 옮겨오게 됨
            ex. Mach, Mac OS X, Windows NT



==> 단일커널에서는 하드웨어 드라이버나 파일 시스템을 함수 호출로 실행했으나,
      마이크로 커널에서는 메시지 통신을 통해 하드웨어 드라이버나 파일 시스템을 
      응용프로그램처럼 취급하여 실행한다.



  3) 모듈 지원 구조
    : 코널과 모듈을 분리하지만 실행시에 커널과 링크하여 함수호출하듯 프로그램을 
    실행하여 마이크로 커널의 문제점을 상쇄하는 운영체제.

     평소에는 추가기능(프로그램)들을 모듈로 구현해 마이크로 커널같은 구조를 하고 있음.   ----> 사용자가 프로그램을 실행하게 되면 운영체제가 해당 프로그램을 동적으로 메모리에 적재하고 커널에 링크한다. ---> 이후 함수호출하듯이 프로그램을 실행함.

   ex. Solaris, Linux, Max OS X등...


2. 운영체제의 수행

  * 컴퓨터 시스템의 메모리는 ROM(비휘발성)RAM(휘발성)으로 구성되며,
   일반적으로 메모리의 첫 부분에는 ROM, 뒷부분는 RAM이 위치한다.
    - Rom의 시작 위치에는 부트로더 프로그램이 저장되어 있다.


  * 컴퓨터의 전원이 켜지면 CPU는 메모리의 첫 부분의 내용을 수행함
     ==> 부트로더가 실행되고, CPU모드는 커널 모드로 초기화됨

  * 실행된 부트로더는 시스템을 초기화하고 보조기억장치(HDD)에서 운영체제를
  읽어들여 메모리에 적재하고 CPU의 PC값을 OS의 메모리 주소로 바꿈으로서 실행시킨다.

  * 운영체제가 부팅되면 시스템을 초기화하고 프로세서 모드를 사용자 모드로 변경한뒤
   최초의 응용프로그램을 시작시킴 (Unix의 경우, init)
   (OS가 PC값을 init프로그램이 적재된 메모리의 첫 주소로 변경시킴)
  
  * 이후, 운영체제는 인터럽트에 의해 CPU 제어를 받아서 수행됨
    (운영체제는 인터럽트에 의해 구동되는 프로그램)
    - 타이머 인터럽트 : 주기적으로 인터럽트를 발생
     (ex. 100ms가 기준이라면, 1초에 10번 os가 수행됨)

    - 응용프로그램 : 시스템 호출을 수행
      (ex. 사용자의 파일 열기 및 실행...)

    - 입출력 장치 : 입출력을 마치면 인터럽트를 발생시킴

   * 인터럽트에 의해 운영체제가 수행 될 때, 운영체제는 먼저 CPU의 상태(registers의 값)
    를 저장한다. 그리고 인터럽트 서비스 루틴(인터럽트의 시작주소)을 수행한 후, 저장했던
    CPU의 상태를 복원하여 인터럽트가 발생하기 직전으로 상태로 CPU제어를 넘긴다.

   * CPU 모드 : OS가 자기자신을 보호하고 시스템 구성요소를 보호할 수 있게 함
    - 사용자 모드와 커널모드로 나뉨
    - 커널모드만이 특권명령어를 사용할 수 있음

   * 운영체제는 항상 커널모드에서만 수행됨
    - 인터럽트가 발생하면, 하드웨어적으로 CPU모드가 커널모드로 설정됨
    - 따라서, 운영체제는 항상 커널모드에서 수행된다.
    - 운영체제가 인터럽트를 처리한 이후, 특권명령어를 수행하여 CPU모드를 변경


3. 운영체제와 사용자 인터페이스의 연관성

  1) CLI (Command Line Interface)
    - 키보드를 사용하여 직접 명령어를 입력
      ex. Unix shells, MS windows cmd

  2) GUI (Graphical User Interface)
    - 마우스와 키보드를 사용하여, 파일, 프로그램 등을 아이콘으로 나타냄
    - 보통 대부분의 시스템들은 CLI와 GUI를 모두 다 제공함

   * 시스템 호출

     : 운영체제가 응용 프로그램에게 제공하는 시스템 함수
        => 응용 프로그램은 마치 함수 호출하듯이 호출하여 사용할 수 있다.

    - 응용 프로그램은 직접 하드웨어를 제어하거나 파일을 읽기 / 쓰기 할 수 없다.
       -> 따라서, 운영체제가 이러한 서비스를 대신하여 응용프로그램에게 제공함




    - 시스템 호출의 종류로는 프로세스 제어, 파일 조작, 장치관리, 정보유지관리, 통신 등
      약 100 ~ 200여개 정도 있다.


2017년 3월 13일 월요일

software engineering (2) - software processes

The software process

 : 소프트웨어 생산을 위해 필요한 여러 활동들을 구조적(시간, 역할)으로 모아둔 것
  * 공동 활동
    - 명세 : 시스템이 어떤것을 해야하는지를 정의
    - 설계 및 실행 : 시스템의 구조를 정의하고 구현
    - 검토 : 고객이 원하는 바를 수행하고 있는지 검토
    - 변화 : 고객의 요구사항의 변화에 대응

  * Software process model
   : 추상화하여 간략히 표현한 것으로 특정 관점에 따라 process를 나타내게 됨


Plan-driven VS agile processes

  * plan-driven processes
   : 2000년도 초의 모델로 프로세스의 모든 활동들이 모두 미리 계획되어 진행 정도가 
    계획에 대비되어 측정됨

  * agile processes
   : 최근에 등장한 모델로 모든 계획이 점진적으로 이루어지며 고객의 요구사항 변화를 
    수용하기 쉬운 구조  ==> 고객의 요구사항에 민첩하게 반응할 수 있다.

  ==> In practice, 위의 두가지를 혼용해서 사용 
      ==> because there are no right or wrong software processes.

Software process models

  * The waterfall model(폭포수형 모델)
   : plan-driven model, 명세(specification)와 개발(development)이 명확히 분리됨

  * Incremental development(점진적 개발)
   : May be plan-driven or agile, 명세와 개발 및 검증이 같이 일어남 
      => 섞여서 들어가는 이상한 구조! but, game 개발에는 유용함

  * Reuse-oriented software engineering(재사용 기반 소프트웨어 공학)
   : May be plan-driven or agile, 기존의 컴포넌트로부터 조림됨
      => 서비스단위 또는 통채로 재사용하기도 함 ==> 재사용가능하게 제작하는게 좋다.


  ==> In practice, 대규모 시스템 개발의 경우 위의 process 모델의 일부 요소들을 도입하여 프로세스를 구성하게 됨(process tailoring) ==> 관리자의 역할

   
  1. The waterfall model
 : 1970년대에 출현했으며, software life cycle이라고도 불림
  임의의 phase가 시작되기 위해서는 이전 phase가 완료되어야하며 명확한 단계로 구분되어져 있어 한 번 다음 단계로 넘어가면 돌아갈 수 없다. 즉, 요구사항이 fix되면 잘못된 부분이 있어도 되돌아 갈수 없다. 따라서 고객의 요구사항 변화에 즉각적으로 반응하기 힘들다.

    만약 설계가 잘못된 경우, 우회적으로(설계에 영향을 미치지 않는 정도로) 작업하지만 불가능할 경우 처음부터 다시 해야한다.

   요구사항 정의 -> 설계 및 구상 -> 기능 테스트 -> 통합 테스트 -> 작동 및 유지

ex. 하드웨어 기반 software :  하드가 이미 출하되면 요구사항이 바뀌지 않음
     통신 분야 : 표준대로 해야함
     표준화된 모델들 : 요구사항이 변하지 않음
 ==> 요구사항이 명확한 경우에 사용!

  따라서, 관리자(사장)는 이 모델을 좋아한다.
     because..
     1. 변동사항이 없고 명확함 : 한 phase가 지나면 특정한 output이 발생함
                                        대형 프로젝트를 할때 유용함

     2. 오래 사용될 프로그램에 사용 : 잘 짜여진 설계를 사용하므로 차후에 고치기 편함

     3. 개발자가 흩어져 있는 경우 : 한번 만들어진 설계가 바뀌지 않음

 BUT!
  소비자 입장에서는 불친절한 process다!! 
 (완성될 때까지 고객이 사용 불가, 요구사항 변화를 받아드리기 힘듬)



  2. Incremental development


    : 2000년대에 출현, waterfall모델과 달리 단계가 명확히 구분되어있지 않고 유동적으로 흘러가기 때문에 고객의 요구사항 변화를 수용하기위한 비용(시간, 자원..)이 적다. 따라서 고객의 feedback 받는 것에 용이하며 waterfall보다 해당 소프트웨어를 빠르게 경험 할 수 있다. (Increment는 version들을 구분하는 가늠자) 

ex. Game, 비지니스 시스템에 유용 : 고객의 요구사항 변화를 수용하기 좋음
  ==> 고객의 요구사항 변화를 수용하기 좋음!

  따라서, 관리자(사장)는 이 모델을 싫어한다.
     because..
     1. 단계가 명확하지 않다 : 개발정도를 확인하기 위한 정기적 산출물이 없다.

     2. 새로운 Increments가 추가됨에 따라 시스템 구조가 망가지므로 관리측면에서 
       매우 좋지 않은 process이다.

BUT!
  소비자 입장에서는 매우 친절한 process다!!
 (비교적 일찍 고객이 사용할 수 있으며, 요구사항 변화를 받아드리기 좋음)


  3. Integration and Configuration











  : 최근 오픈소스가 활발해짐에 따라 출현, 현재 오픈소스에 등록된 소프트웨어들을 통합 및 조정해서 새로운 프로그램을 만드는 방법.

   Component analysis -> Requirements modification -> System design with reuse -> 
 Development and integration

ex. 비지니스 시스템 구축, Stand-alone software systems, Collections of objects, 
    웹 서비스, office programs
       => 구성 요소(기능)가 비슷하다.



Process activities

 : 앞선 3가지의 모델은 전부 다르지만 , 4가지 기본 활동을 기반으로 작동함
   - specification, development, validation, evolution
   => 위의 4가지 활동이 프로세스 모델에 따라 다르게 조직화 됨

 1) software specification
  :  어떤 서비스를 할 것인지와 시스템 작동과 개발에 대한 제약사항을 명확하게 하는 것
   ex. 쇼핑몰에서의 service (기능적 요구사항): 검색, 결제, 분류, 장바구니....
        쇼핑몰에서의 constraint (비기능적 요구사항) : 비용, 보안

   과정 : 
    적합성 검토 --> 요구사항울 마구 추출한 뒤 분석 --> 요구사항 명세 --> 요구사항 검증
    ==> 완료시 RS라는 요구사항 명세서가 생겨난다.
     ps) The requirements engineering process : 고객이 무슨 기능을 원하는 지 찾는 방법


 2) software design and implementation (development)
 : System specification을 실행 가능한 시스템으로 변화시키는 과정
 -> software design : 명세한 자료를 실현하는 소프트웨어의 구조를 설계
 -> implementation : 설계단계의 소프트웨어 구조를 수행가능한 프로그램으로 전환함

==> 위 두 활동은 매우 밀접하게 연관되어져있다!!

A general model of the design process
  * Architectural design : 시스템의 개략적 구조, 컴포넌트들 간의 관계 및 분산을 정의
  * Interface design : 시스템 컴포넌트 간 인터페이스를 정의
  * Component design : 각 시스템 컴포넌트 별로 작동 내용을 설계
  * Database design : 시스템의 자료구조를 정의하고 이것이 어떻게 DB에 표현되는지 정의

 3) software validation(검증)
   : Verification and validation.
    => 시스템이 주어진 specification에 부합하는지, 요구사항을 만족하는지 보이는 작업
         ex. checking, review processes, system testing.

   * Stages of testing

     - Component Testing : 각 컴포넌트들을 독립적으로 테스트함, system이 되기 전까지
                                  Component끼리 묶어가며 여러 번 테스팅함
       (Component는 독립적 기능을 제공하는 단위로 함수 or 함수들 또는 객체 or 객체들
        or 객체 + 함수들... 을 의미함)
    
     - System testing : 전체 하나의 시스템을 테스트하며 주로 Emergent properties
                           (창발적 특성) 을 테스트함
         ps)창발적 특성 : 따로 있을때는 없었다가 모이게 되면 나타나는 성질
              ex. 자동차 각각의 부품들이 하나로 합쳐졌을 때 등장하는 성질(연비, 제동거리...)

     - Acceptance testing : 고객 데이터를 통해 시스템이 고객의 요구에 맞는지 테스트

     - 개발자 또는 개발부서가 Component Testing과 System Testing을 진행하고 
     고객들이 Acceptance Testing을 진행함


Testing phases in a plan-driven software process ( V-model)

  1. requirements Specification -> 2. Acceptance test plan -> 3. System Specification
   -> 4. System Integration test plan -> 5. System Design -> 6. Sub - system Integration
  Test plan -> 7. Detailed Design -> 8. Module and Unit code and test -> 9. Sub-system
  Integration test -> 10. System Integration test -> 11. Acceptance test -> 12. Service



 4) software evolution
 : 소프트웨어는 business변화, New technology를 통한 변화, platforms 변화로 인해 변화가 요구되어진다. 따라서 소프트웨어의 변화는 불가피하다.

   이러한 변화에 대한 비용(요구사항 재분석 + 새로운 기능 구현)을 최소화 하기 위해
 등장한 것이 software prototyping과 Incremental delivery이다.


 (1) 변화에 대한 비용 최소화


   1. software prototyping 
    : prototype을 만들어 보는 것.

     - prototype
      : 시스템 초기에 요구사항들의 개념을 증명하기 위해 제작되면 try out 용도로 쓰임.  
      설계 단계에서 가능한 옵션을 알아보고 UI 디자인 검토에 쓰임.

    - prototype을 통한 이득
     : 사용 편이성이 증대, 사용자의 필요에 부합할수 있음, 설계 품질 향상, 유지보수 용이
      개발 비용 절약

   - prototype 개발 과정
  => 위와 같은 과정은 설계 과정에서 일어남으로 매우 빨리 진행되어야함
    따라서, 신뢰성이나 보안 같은 비기능적인 측면보다는 기능적인 측면만 제작되어있다.
     또, 문서화 작업(유지보수를 위한)이 없으며 특별한 tools이나 language가 사용되므로
     개발 이후에는 무조건 버려지게 됨.

    만약 prototype으로 개발 되는 경우 비기능적 요구사항들의 실현과 유지보수가
   어려워지고 차후 변화를 겪으면서 구조가 나빠질 가능성이 높다.

  ===> 이러한 과정을 통해 중대한 rework가 발생하기 전에 가능한 변동사항을 prototype
        으로 예측하여 변화로 인한 비용을 없애는 방법이다.


  2. Incremental delivery
   : 시스템을 한번에 변화에 맞춰 바꾸는 것이 아니라 조금씩 increment단위로 나누어
   개발하고 delivery함.

   - 사용자 요구사항들을 우선순위로 구분하여 우선순위가 높은 요구사항을
   초기 increment에 포함하여 개발함
   => 한번 increment 개발이 시작되면 이전부터 해당 increment의 요구사항은 변동될 수
     없음.(이후의 increment가 앞선 increment에 부가 내용을 추가해서 개발함)


   - Incremental delivery개발 과정


   - Incremental delivery의 장점
   : 1. 각 increment가 출시될 때마다 고객의 평가를 빨리 받을 수 있다.
     2. 일단 하다보면 다음 할 일이 생각 나듯이 각 increment는 다음 increment가 구현해야
       하는 요구사항을 추출해 내는데 prototype의 역할을 할 수 있음.
     3. 중간에 프로젝트가 중단되어도 중요사항부터 완성된 결과물이 존재하므로 프로젝트
       실패의 위험성이 낮다.
     4. 우선순위가 가장 높은 서비스는 가장 많이 테스팅을 하는 경향이 있다.
       => 가장 중요한 서비스가 자주 테스트 됨으로 차후 변경 비용이 감소하게 된다.

    - Incremental delivery의 단점
     1. 시스템의 여러 부분에서 공동으로 쓰이는 기본 facilities는 어떻게 구현할 것인가?
       => 모든 increment들이 필요로 하는 공통된 부분을 식별하는게 어렵다.
         즉, 중복된 코드 또는 흩어진 코드가 될 가능성이 있어 유지보수가 어렵다.
     2. 소프트웨어 개발과 동시에 명제 작업이 일어나는 반복 구조가 항상 좋은가??
       => 비지니스에서 어떤 계약에 의해 필요한 output이 존재하지 않아
          좋아하지 않는 기업도 있다.


  (1) 프로세스의 개선
     1. 프로세스 성숙도 접근법
       : 프로세스와 프로젝트 관리 기법의 개선을 위해 바람직한 소프트웨어 공학의
      여러 실무(사례)를 조직에 소개함으로 개선을 시도

     단계 :
        1. 프로세스 측정 : 한가지 이상의 속성 측정 => 개선의 효과가 있었는지 판단
        2. 프로세서 분석 : 프로세스의 약점 및 방해물을 식별
        3. 프로세스 변경 : 약점을 해결하기 위해 프로세스 변경
        4. 위의 3단계를 무한루프시킴

   ==> 그렇다면 구체적으로 어떻게 사이클을 돌면서 개선하는 것이 좋은가??
      => 조직들이 프로세스를 개선할 때 아래와 같은 5단계를 순차적으로 진행한다.
          ==> 역량 성숙도 수준(단계)
어떤 차이가 있을까?
1.아무것도 조절이 되지 않는 level 1의 회사에게 어떤 프로세스를 주면 어쩌다가 성공한다!
2.제품에 대한 관리 절차가 정의되어 있는 level 2의 회사에게 어떤 프로세스를 주면
   성공했던 것은 계속 성공한다!
3. 프로세스 관리 절차와 전략이 정의되어있는 level 3의 회사는 개인이 할 일이 명확하다.
4. 품질 관리 전략이 정의되어 있는 level 4의 회사는 다수의 데이터를 확보하고 있다.
5. 프로세스 개발 전략이 정의되어있는 level 5의 회사는 스스로 최적화를 할 수 있는
   힘이 있다.

ps) 작고 특정 소프트 개발회사가 단계가 높다.






2017년 3월 11일 토요일

database(2) - Relational Model

Relational Model을 알기 전에 우선 data model에 대해 알아보자

 data model : 데이터들을 표현하기 위한 방법!
  ex. 글이 라면  ==> Word
       그래프라면 ==> PowerPoint
       표라면 ==> Excel
         
  ==> 데이터 모델은 굉장히 다양하고 그에 따라 최적화된 프로그램들이 다르다!

 * 주요 Data Model
   - Relational data model
   - Entity Relationship(E-R) data model
       : 데이터베이스 설계에 주로 사용됨
   - object-based data models
      (Object-Oriented and Object-Relational)
       : RDBMS의 한계점 극복을 위해 제안되었으며 OO-DBMS의 장점이 부각되자,
        대형 RDMS Vendor들이 OR-DBMS발표
        (현재 대부분의 RDBMS는 실질적으로 ORDMBS이다)
   - 기타:
     Network(graph) model, Hierarchical(Tree) model : RDBMS이전 IBM시대에 주로 사용
                                                                      되었던 모델
          ==> 데이터를 정리할 때 표를 이용하는게 쉽다는 걸 알고 있었지만
                표를 쓰기 위한 알고리즘이 없었다.


 * Relational data model
    :  현재 가장 널리 이용되는 방법으로 high language인 SQL을 제공하고
      Relation(Table)에 기반하는 모델을 사용해 데이터를 정리할 때 유용하며 편리하다.
        ex. Oracle, IBM DB2, MS-SQL Server...

   - 주요 개념


     1) Attrubute (column) : 연관성은 없지만 하나의 특징을 표시하는 세로줄
     2) Tuple (row, record) : set of values for attributes
     3) Relation (table) : set of tuples
     4) Database : set of relations
     5) Domain (type) :Attribute가 가질 수 있는 값의 집합 및 범위
         ex. Domain(학년) = {1, 2, 3, 4}
              Domain(성별) = {'M', 'F'} or {'M', 'F', NULL}
              Domain(이름) = 1자리 이상의 임의의 문자열

 * Table VS Relation



   - Relation은 수학적인 개념이다!
      => 튜플간, 애트리뷰트간 순서가 없음
               ex. {1, 2} == {2, 1} == {1, 1, 1, 2}
          또한 동일한 튜플은 존재할 수 없다.(set이므로)


 * Schema
  : the logical structure of the database
   => 스키마는 프로그램안에 변수의 type정보나 이름 같은 정보를 가진
      논리적 설계도이다.



 * Instance
   : actual contents at a particular point in time
    => 어떤 한 순간에 값들 ==> 시간이 지나면 바뀔 수 있다.




 * NULL
   : special value for "unknown" or "undefined"
    => 아무것도 없다는 의미(0이 아님!!)
         ==> 모든 도메인들은 NULL을 포함하고 있다.(단, 기본키를 제외하고)

* Key
  : tuple들을 구별하기 위한 Attribute의 집합
    => 동일한 튜플은 존재할 수 없으므로 Key를 통해 각각의 튜플을 구별한다.


* super Key
  : Key와 동일한 뜻 (구분하기 위해 나눠뒀을 뿐)
  ex. (학번), (주민번호), (학번, 주민번호), (학번, 이름, 성별, 주민번호), (학년, 반, 번호, 이름)


* candidate Key
  : superKey중 minimal한 키
  ex. (학번), (주민번호), (학년, 반, 번호)


* primary Key (제일 중요!!)
  : candidate key중 단 하나!
    ==> 정책상으로 정하는 것이므로 가상으로 만들어 지정하는 경우도 많음
         (학번, 주민번호)
      ===> 게다가 절대 NULL이 될 수 없다.(개체 무결성)


* foreign Key
  : 다른 relation에서의 primary key가 현 relation의 attribute로 들어오는 키
    (자기 자신을 참조하는 경우도 있다.)

 학번
 ----
 ------
 ------
 멘토 학번
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

===> 이러한 경우 멘토 학번 attribute(fk)에서 학번 attribute(pk)를 참조 할 수 있다.
  ps) 참조하고 있는 relation의 기본키가 존재하거나 NULL이어야함 (참조 무결성)



2017년 3월 10일 금요일

computer network (3) - The network core

The network core

  : 서로 연결된 라우터 망


  1) packet-switching

    : 호스트가 응용프로그래밍 계층 메시지를 패킷으로 나눕니다.

     - 하나의 라우터에서 다음 라우터로, 출발지에서 목적지까지의 경로상의 링크를 통해 
     패킷을 전달합니다.
     - 각각의 패킷은 full link capacity로 전송됩니다.





       * store and forward

       : 다음 링크로 패킷을 전송하기 전에 전송중인 패킷이 완전히 라우터에 도착해야함.
        => 전송하는데 L / R초가 걸림 => L-bit의 패킷을 R bps로 전송
             one-hop numerical example : L : 7.5 Mbits, R : 1.5 Mbits
                                          => one-hop transmission delay = 5sec
            따라서, 끝에서 끝까지 가는데 걸리는 시간  : 2 L / R (sec)
        ps) cut-through 방식 : 헤드(목적지)만 확인하고 다음 라우터로 전송.
         ==> 끝에서 끝까지 가는데 걸리는 시간 : L / R (sec) (if propagation delay is zero)


       * queuing delay, loss

       : access network에서 도착하는 패킷률이 일정 기간 동안 다음 링크로의 전송률을
        초과하는 경우,  패킷들은 링크에서 전송되길 기다리고 있다가 메모리(버퍼)가
        가득 차게 되면 패킷이 손상(손실) 될 수 있음


  2) Two key network-core functions

       * routing

         : 들어온 패킷들을 통해 출발지와 목적지를 결정한다.
          => routing protocol 이 router table을 만든다.
           ex. 고속버스의 시간표를 만드는 것

       * forwarding

         : 라우터의 입력에서 적절한 라우터의 출력으로 패킷들이 이동한다.
           ex. 게이트까지 가는 것



  3) Alternative core : circuit switching

     : 출발지와 목적지 사이에 요청에 의해 할당된 종단(끝과 끝) 자원들
        - 옛날 전화 네트워크에서 주로 사용됨. 사용되지않으면 초기상태로 돌아감,
          dedicated형태라서 sharing하지 않고 보장된 성능을 낼 수 있다.
     ==> 장점 : 보장성!! -> 품질 저하가 없다 -> 속도가 보장된다.
           ex. 다수의 채널 중 1개만 시청(TV)  

  ==> FDM : Frequency Division Multiplexing = 빈도수를 분할하여 4명의 사용자가
             dedicated 방식으로 통신하게함
         TDM : Time Division Multiplexing = physical link를 시간 단위로 쪼개서 사용

        ps) code division multiplexing = code를 사용해 구분하는 방법


  4) Packet switching VS circuit switching

   packet switching이 더 좋을까?
    * Packet switching의 장점 :
                             폭발적인(급격한 변화가 있는) 데이터에 적합
                             자원 공유
                             더 간단하고, no call setup(just transfer)
                             더 많은 사람이 이용가능
    * Packet switching의 단점 :
                             과도한 혼잡(손실 발생)이 있을 수 있음 : 패킷 지연 및 손실
                             프로토콜들은 신뢰할 수있는 데이터의 전송, 혼잡 제어기능이 필요
                             속도에 대한 보장성이 없다.
     * Q : Packet switching이 회로와 같은 동작을 제공하기 위한 방법은?
                  오디오 / 비디오 애플리케이션에 필요한 대역폭의 보장이 필요

   ps) circuit switching 3단계 : call setup : network에서 자원을 할당받을 때 필요
                                        transfer : 데이터를 전송
                                        call terminate : 전송이 끝날 때 할당받은 자원을 반환





2017년 3월 8일 수요일

software engineering(1) - introduction

software engineering

 배경 : '소프트웨어의 위기'를 극복하기 위해 conference에서 처음 등장

 ==> 소프트 웨어의 위기란?

    : 소프트웨어의 등장 초기에는 소프트웨어의 기술을 따라갈 수 있는 하드웨어의 기술이
    부족해 그 격차를 극복하기 위해 등장했지만, 최근 하드웨어가 급속한 발전을 이뤄냄에
    따라 소프트웨어의 시스템 복잡도가 크게 증가했으며 그에 따라 인수 및 개발에 필요한
    비용과 시간도 늘어가게 되었다.

====> 이러한 배경에 의한 software engineering의 정의 

      : 전문적인 소프트웨어 개발(대규모 SW개발)을 위한 이론, 방법, 도구를 배우는 과목


FAQs about software engineering

 * software란? 

     : programs과 관련된 문서들(menual)의 합

 * good software란? 

     다양한 기능, 성능, 유지보수의 용이성, 의존성 및 사용의 용이성을 제공해야함
  => ex. 어떤 회사의 전산프로그램이 good software가 되기 위해서는
                            => 다양한 기능 : 입출력, 각종 계산, redo, undo... 와 같은 여러 기능
                            => 성능 : 하드의 자원을 적게 사용할수록 good!
                            => 유지보수의 용이성 : 구매자(회사)가 해당 프로그램을 쉽게 
                                                         유지보수 할 수 있도록 
                            => 의존성(확실성) : 신뢰성, 보안성, 안정을 모두 포함함
                                    * 신뢰성 : 오류가 없다!
                                    * 보안성 : 악의적인 사용자의 접근을 막는다!
                                    * 안정성 : 시스템에 문제가 생기더라도 피해가 없다!
                                    ex) 사용자의 정보를 예비 DB와 Main DB를 중복해서 저장!!
                            => ps) 수용성 : 사용이 편하고 호환성이 좋을수록 good!
                            => ps) 효율성 : 적은 자원을 사용하고 처리시간이 빠를수록 good! 

 * 결국 software engineering이란? 

    : good software를 개발하는 방법!

 * software enginnering의 기본 activities 

    :  1. software specification : 고객과 개발자가 소프트웨어의 기능과 제한사항을 정의함
            ex. chrome .. 기능 => redo, undo.....
                           .. 제한 사항 => 클릭하고 8초안에 작업이 이뤄져야 한다.(버블x, 퀵 o)
                 ==> 이러한 기능과 제한사항을 알기위해 의사소통이 중요하다.

      2. software development : designed(분석과 설계를 통해)와 programmed(코딩함)

      3. software validation : optimal test set 등으로 검증함
                                => 분석 및 설계를 통해 코딩보다 먼저 테스트 셋을 개발함

      4. software evolution : 사용자의 요구사항이나 법규에 따라 계속적으로 수정함

 * software engineering VS computer science

    : computer science는 이론과 기반에 중점을 두는 반면 software engineering은 유용한 
    software를 개발하기 위해 실용성에 중점을 둔다.

 * software engineering VS system engineering

    : 과거 system engineering은 시스템 개발을 위한 전반적인 내용을 다룸으로서 software는 system에 포함되어 있다고 보는 것이 일반적이었나 최근 software가 전문화되고 세분화됨에 따라 오히려 software가 system을 조정하는 입장이 되고 있다.

 * software engineering의 key challenges 

    : 다양성(프로그래밍 언어의 다양성으로 인해 선택의 폭이 굉장히 넓어짐 ex. C, JAVA..), 
      개발시간단축(경쟁의 과열로 인해 누가 먼저 출시하느냐가 중요시 됨. ex. game..), 
      믿을수 있는 software개발(good software의 개발이 요구됨. ex. IoT..)

 * software engineering 비용

   : 개발 비용: 60%, 테스트 비용 : 40%
    but, custom software의 경우 evolution비용이 개발비용보다 매우 많이 든다!!!

     / generic product : 일반사용자를 대상으로하며 개발자가 명세, 변경을 주도함
    |                          ex. window, chrome...
    \customized product : 특정 사용자를 대상으로하며 고객이 명세, 변경을 주도함
                                    ==> 고객의 요구에 따라 잦은 변경이 요구됨
                                           => 따라서, evolution비용이 개발비용보다 많이 든다!!!
                                    ex. 학교 개인 전산망... 

 * Best software engineering 기술과 방법? 

  : 없다! => 어떤 software를 개발하느냐에 따라 매우 다양한 기술과 방법이 사용된다!
            ==> 즉, 그때그때 다르다.
            ex. game의 경우, 완벽한 software보다는 빠르게 출시할 수 있는 software가 중요!
                critical control system(IoT, 하드웨어 제어프로그램)의 경우, 
                        완벽한 software(분석 가능하고 명확한 명세를 동반하는)가 중요하다!
   하지만, 소프트웨어를 몇몇 유형으로 나눠 그때마다 다른 방법 또는 기술을 적용한다.


  * 소프트웨어 유형
    - stand-alone applications(독립형 applications)
      : 네트워크 같은 것 없이 컴퓨터에서 혼자 작동할 수 있는 프로그램
       ex. 지뢰찾기, 메모장, office programs

    - Interactive transaction-based applications
      : 원격 컴퓨터 상에서 작동하며 사용자의 pc에서 접근됨.
       ex. ATM, 대부분의 web apps, e-commerce applications

    - Embedded control systems
      : Hardware devices를 제어하는 소프트웨어
      ex. driver

    - Data collection & Analysis systems
      : Sensor로 부터 data를 수집하고, 처리를 담당하는 다른 시스템과 연결됨
      ex. Big data

    - System of systems
      : Software systems들의 집합으로 구성된 시스템
      ex. pos(편의점 결제시스템)



===> software engineering fundamentals
     1. system은 관리되고 이해 될 수 있는 개발과정에 의해 개발되어야 한다.

     2. 어떤 시스템이건 의존성과 성능은 중요

     3. software의 명세 및 요구사항을 이해하고 관리하는 것은 매우 중요!!!

     4. 소프트웨어의 신규 개발보다는 재사용하는 것이 바람직함



















2017년 3월 7일 화요일

computer network(2) - network structure

Network structure

 * access networks, physical media(물리적 매개체)
    : wired, wireless communication links
       => They connect Host to network.
       ex. home network, mobile network...

 * network edge 
    : hosts -> clients and servers(servers often in data centers)

 * network core
    : interconnected routers (ISPs)
network structure

1. Access network and physical media

Q. How to connect end systems to edge router? 

    (edge router is a router that Host first meet)
    * residential access nets (home network)
    * institutional access networks(school, company...)
    * mobile access networks
         => connect to one of the three above.

 Keep in mind : 

   bandwidth(bits per second) of access network?
    : It mostly has a big impact on the speed of the Internet.
    The Internet speed advertised on the TV is the speed of the access network.

   shared or dedicated?
     Shared is a case multiple homes share the bandwidth of one router
      => shared는 여러 집이 한 라우터의 대역폭을 공유하는 경우
     Dedicated is a case one home uses all of the bandwidth of one router
      => dedicated는 한 집이 한 라우터의 대역폭을 모두 쓰는 경우



 1) Access net : DSL(digital subscriber line)(dedicated)
















 
   => use existing telephone line to central office DSLAM
         DSLAM과 연결된 기존의 전화선을 사용. 
        ==> data over DSL phone line goes to Internet
               voice over DSL phone line goes to telephone net.



   ps) upstream과 downstream의 차이
     => upstream : end systems ---> network (ex. upload)
     => downstream : end systems <--- network (ex.download)



 2) Access net : cable network(shared)

    => frequency division multiplexing 기술
      : If the frequency bands are different, they are transmitted to other channels.
         (channel은 주파수를 대역별로 나눈 것)
       => 주파수 대역이 다르면 다른 채널로 전송한다.
          즉, 주파수 대역이 같으면 같은 채널로 전송한다!





  * HFC (hybrid fiber coax)
    : 접속망 구성의 한 방식으로, 기존에 설치한 케이블 TV 신호 전송용 선로를 이용해
    인터넷을 연결하는 기술로 다수의 케이블 네트워크와 광섬유, 즉 다수의 집들이 access
    network를 공유해 cable headend와 연결되고 그 cable headendISP 라우터에 연결되
    인터넷을 가능하게 한다.
 
    따라서, dedicatedDSL과 달리 cable networkshared의 형태를 띄고 있다.
     한편, HFCdownstream의 속도가 30Mbps인 반면 업스트림 속도가 2Mbps로 상당한
    불균형을 이루고 있다.



 3) Ethernet (Enterprise access networks) (shared)



  : 오늘날 대부분의 엔드 시스템(호스트)들은 Ethernet switch와 연결되어있으며
   주로 회사나 대학등에서 많이 사용한다.(10Mbps, 100Mbps, 1Gbps, 10Gbps)


 4) Wireless access networks

   : 공유 무선 access network는 라우터와 엔드시스템(호스트)들을 연결한다.
     - wireless LANS :
        : winth in builing
        ex. WiFi
     - wide-area wireless access :
        : provided by telco operator
        ex. 3G, 4G, LTE

2. Host : sends packets of data

   host sending function :
        * 요청(application message)를 받는다.
        * L 길이 비트의 작은 덩어리 (packets이라고 함)로 나누기
        * 전송률(transmission rate) Raccess network에 패킷을 전송
            - link transmission, 일명 link capacity, 일명 link bandwidth








3. Physical media



 * bit  : 수신기와 송신기 쌍사이에 전달되는 것.
 * physical link : 수신기와 송신기 사이에 놓여지는 것
 * guided media (유도하는 매체) : 고체 매개체로 신호를 전달(copper, fiber, coax)
 * unguided media (유도하지 않는 매체) : 자유롭게 신호를 전달(radio)


 1) guided media
   - twisted pari (TP) :
    2개의 절연된 구리선으로 미국에서는 4개의 선을 사용한다.

   - coaxial cable (동축 케이블) :
    중심이 같은 두개의 구리선, 양방향 통신이 가능하고, 넓은 대역폭을 가지고 있어 
   여러개의 채널을 가질 수 있어 HFC에 이용된다.

   - fiber optic cable (광섬유 케이블) :
    빛 펄스를 운반하는 유리 섬유, 매우 빠르고 속도와 적은 에러, 넓은 대역폭과 저항이 
   적어 매우 긴 전송거리를 자랑한다.
   ps) 광섬유 대역폭>>> 동축 케이블 대역폭, 먼거리와 통신할 때는 repeater를 부착한다.


 2) unguided media
   - radio (무선통신) :
   전자기 스펙트럼을 통해 신호를 전송, 선이 없으며 양방향 통신이 가능하나 반사, 간섭,
  물체에 의한 방해 가능성이 있음

   => radio link type : terrestrial microwave(지상파), LAN(WiFi), wide-area(LTE),
                            satellite(위성 통신)