앞으로 사용할 프로그램들에 대해 하나도 아는 것이 없어 전반적으로 알아보기 위한 간단한 정리 수준으로만 작성하였습니다.

 

1. postman이란?

  • 자신이 제작한 웹 API를 직접 테스트해 볼 수 있는 환경을 제공하는 프로그램이다.

  • get/post와 같은 방식으로 요청해볼 수 있다.

2. filezilla란?

  • 파일 질라는 오픈소스이고, FTP, SFTP, FTPS를 지원하는 FTP관리 소프트웨어이다.
  • 여기서 FTP(File Transfer Protocol)란 TCP/IP상의 컴퓨터들끼리 파일을 주고 받을 때 쓰는 파일 전송 프로토콜(서비스)이다.
  • 말 그대로 한글판 FTP프로그램이라고 할 수 있다.

3. PuTTy란?

  • 서버(서버 컴퓨터)에 접속하기 위한 가상단말기이다.

  • 서버는 단말 장비를 통해 원격으로 접속해서 작업할 필요가 있는데, 이때 서버로 접속할 수 있도록 논리적인 가상 단말기를 제공하는데 이를 PuTTy라고한다.

함수 선언식

  1. 함수명이 반드시 있어야 한다.
  2. function 키워드를 사용한다.
  3. 매개변수 타입을 적지 않는다.
  4. 호이스팅에 영향을 받는다.

함수 표현식

  1. 변수에 할당이 가능하다.
  2. 함수 이름을 사용하는 것은 선택하지만 보통은 익명함수를 사용한다.
  3. 호이스팅에 영향을 받지 않는다.
var http = require('http');

http.createServer(function (request, response) {
    
}).listen(3000,function(req,res){
    console.log("3000port");
});

 

화살표 함수

  1. 간결하다.
  2. 매개변수 하나면 소괄호로 안 묶어도 된다.
  3. return문을 줄일 수 있다.
  4. 기존의 함수를 완전히 대신할 수는 없다.
  5. 객체의 메소드를 정의할 때에는 사용하면 안된다.
const http = require('http');

const server = http.createServer((req, res) => {

}).listen(3000, (req, res) => {
    console.log("3000 포트와 연결중!");
});

 

 

- CPU스케줄러(CPU scheduler)

  CPU가 유휴상태가 될 때마다, 운영체제는 준비 완료 큐(ready queue)에 있는 프로세스들 중 하나를 선택해 실행해야 한다. 선택 절차는 short term(단기) 스케줄러에 의해 수행된다.

* short term scheduler = CPU scheduler

  CPU 스케줄러는 ready queue에 있는 어느 프로세스에게 CPU를 할당할 것인지를 결정하는 문제를 다룬다. 이에는 여러가지 알고리즘들이 존재한다.

 


 

1.     선입 선처리 스케줄링(First-Come, First-Served Scheduling)

  비선점 알고리즘이다. 가장 간단한 CPU스케줄링 알고리즘이며 FIFO라고도 한다. CPU를 먼저 요청하는 프로세스가 CPU를 먼저 할당 받는다.

FCFS 스케줄링 Gantt차트

  여기서 각각의 turnaround time은 25, 30, 33이며 평균 대기 시간은 (0+25+30)/3=18.33이다. 이때 프로세스의 순서를 P3, P2, P1순으로 바꾸어주면 (0+3+8)/3=3.66으로 크게 줄어든다.

* convoy effect(호위효과) : 모든 다른 프로세스들이 하나의 긴 프로세스가 CPU가 양도하기를 기다리는 것을 말한다. 호위효과는 작을수록 좋다.

 

2.     최단 작업 우선 스케줄링(Shortest-Job-First Scheduling)

  SJF 스케줄링은 장기 스케줄링에서 자주 사용된다. 이 스케줄링은 선점일 수도 있고 비선점일 수도 있다. CPU의 버스트 길이를 연관시켜 구현하였다.

SJF 스케줄링 - 비선점형 Gantt차트

  평균 대기 시간은 (3+0+16+9)/4=7이다. 하지만 SJF의 어려움은 다음 CPU의 길이를 파악하는 것이다. 다음 burst(프로세스)는 지수 평균한 것으로 예측한다. 아래는 선점형 SJF알고리즘을 통해 구현한 스케줄링이다.

 

SJF 스케줄링 - 선점형 Gantt차트

3.     라운드 로빈 스케줄링(Round-Robin Scheduling)

  RR알고리즘은 선점형 알고리즘으로, 시분할 시스템을 위해 설계되었다. FCFS스케줄링과 비슷하지만 시스템이 프로세스들 사이를 옮겨 다닐 수 있도록 선점이 추가된다. 시간 할당량(time quantum) 또는 time slice라는 시간의 '단위'를 정의하여 구현한다. 어떤 프로세스가 이 단위 시간을 지나면 실행을 강제로 다른 프로세스에게 선점시키는 것이다. 일반적으로 time quantum은 10에서 100밀리초 동안이다.

RR 스케줄링 Gantt차트

  평균 대기시간은 (0+5+6+9)/4=5밀리초이다. 반응 시간의 정의는 처음 반응한 시간이기 때문에 P2의 반응 시간은 3밀리초이다. RR 알고리즘의 성능은 time quantum(시간 할당량)의 크기에 매우 큰 영향을 받는다. time quantum이 너무 큰 경우에는 FCFS와 같아질 것이며 time quantum이 너무 작아진다면 context switch가 자주 일어나 프로세스의 실행이 느려질 수 있다.

 

4.     다단계 큐 스케줄링(Multilevel Queue Scheduling)

  다단계 큐 스케줄링 알고리즘은 foreground(대화형) 프로세스와 background(일괄처리) 프로세스들을 구분한다. 이들 두 유형의 프로세스는 응답시간에 대한 요구사항이 다르기 때문에, 스케줄링 요구 또한 다를 것이다. 다단계 큐 스케줄링 알고리즘은 ready queue를 다수의 별도의 큐로 구분하여 각 큐는 자신의 스케줄링 알고리즘을 가지고 있다.

각 큐는 우선순위를 가진다.

     1. 시스템 프로세스

     2. 대화형 프로세스

     3. 대화형 편집 프로세스

     4. 일괄처리 프로세스

     5. 학생 프로세스

  시스템 프로세스가 가장 높은 우선수위를 가지며 학생 프로세스가 가장 낮은 우선순위를 가진다. 높은 우선순위를 가진 프로세스를 위한 큐 들이 비어있지 않으면 다음 우선순위의 큐는 실행될 수 없다. 

  foreground queue는 자신의 프로세스들 사이에서 라운드 로빈 스케줄링을 위해 CPU시간의 80%가 주어지고, background queue는 CPU시간의 20%를 받아 자신의 프로세스들에게 선입 선처리 방식으로 줄 수 있다.

 

 

다중 프로그램 시스템은 CPU의 사용을 최대화 하기 위한 시스템이다. 다중 프로그램 운영체제의 기본은 CPU스케줄링이다. CPU를 프로세스들 간에 교환함으로써, 컴퓨터를 생산적으로 만든다. 이 다수의 프로세스들을 교환할때 필요한 것이 CPU스케줄링이다.


CPU-입출력 버스트 사이클(CPU-I/O Burst Cycle)

  • 버스트란 특정 기준에 따라 한 단위로서 취급되는 연속된 신호나 데이터의 모임을 말한다. 즉, 입출력 요청을 위해 CPU 사용을 사용했다가 쉬었다가를 반복한다.

  • 프로세스가 CPU를 사용할 때를 CPU버스트, 입/출력을 기다릴 때를 입/출력 버스트라고 한다.

  • CPU 버스트 : CPU에 해당하는 접근이 많은 것이다. running 안에 들어가 있는 시간이 많다. 프로그램 수행 중에 연속적으로 CPU를 사용하는 단절된 구간을 말한다. 즉, CPU명령을 실행하는 것을 말한다.

  • I/O 버스트 : I/O에 해당하는 접근이 많은 것이다. waiting 안에 들어가 있는 시간이 많다.

  • 프로세스의 실행은 CPU 버스트를 시작으로 뒤이어 입출력 버스트가 발생하는 식으로 두 버스트의 사이클로 구성된다. 마지막 CPU버스트는 또 다른 입출력 버스트가 뒤따르는 대신에 실행을 종료하기 위한 시스템 요청과 함께 끝난다.

  • 입출력 중심의 프로그램은 CPU 버스트 시간이 짧을 것이다. 반대로 CPU 지향 프로그램은 CPU 버스트 시간이 길 것이다.


Preemptive Scheduling(선점 스케줄링)

  • 수행되고 있는 프로세서의 권한을 가지고 올 수 있다.

  • 빠른 응답시간을 요구하는 대화식 시분할 시스템에 사용한다.

  • 선점으로 인해 많은 오버헤드를 초래할 수 있다.

  • 선점을 위해 인터럽트 타이머 클럭이 필요하다.

  • 종류 : 선점 우선순위, RR(Round Robin), 다단계 큐, 다단계 피드백 큐 알고리즘 등

 

non-Preemptive Scheduling(비선점 스케줄링)

  • 이미 할당된 CPU를 다른 프로세스가 강제로 빼앗아 사용할 수 없다.

  • 한 프로세스가 실행 상태에서 대기 상태로 전환될 때, 프로세스가 종료할 때 비선점 스케줄링을 사용한다.

  • 응답시간 예측이 쉽다.

  • 협조적(cooperative)이며 모든 프로세스를 공정하게 처리한다.

  • 종류 : FCFS, SJF, 우선순위, HRN, 기한부 알고리즘 등


Dispatcher(디스패처)

  • CPU의 제어를 단기 스케줄러가 선택한 프로세스에게 주는 모듈이다. 즉, ready에서 running으로 넘어갈 때 스케줄러에 의해 선택되는 것을 말한다.

    • context switch가 일어나는 일

    • 사용자 모드로 전환하는 일

    • 프로그램을 다시 시작하기 위해 사용자 프로그램의 적절한 위치로 이동하는 일

  • 디스패처가 하나의 프로세스를 정지하고 다른 프로세스의 수행을 시작하는 데까지 소요되는 시간을 dispatch latency(디스패치 지연)라고 한다. 이는 ready queue에서 running queue로 넘어갈 때 PCB에 복사해 주는 시간을 말하며, 시스템 효율을 결정한다.


 

CPU스케줄링 알고리즘은 다양한 특성을 가지고 있다. 그에 따라 다섯 가지로 기준을 나눌 수 있다.

<기억합시다>

① utilization(CPU 이용률) : CPU를 최대한 바쁘게 유지하는 것이 좋다.

② throughput(처리량) : 단위 시간 당 완료된 프로세스의 개수를 말한다.

③ turnaround time(총 처리 시간) : 프로세스를 실행하는 데 소요된 시간을 말한다. 프로세스의 제출 시간과 완료 시간의 간격을 말한다.

④ waiting time(대기시간) : 프로세스가 ready/waiting queue에서 대기하는 시간을 말한다.

⑤ response time(응답시간) : 응답이 시작되는 데까지 걸리는 시간을 말한다. 처음 반응한 시간을 말한다.

** turnaround time(총 처리 시간) - running에 있는 시간 = waiting time(대기 시간)

 

Crypto 모듈 사용하기

Crypto 모듈은 단방향 암호화 방식을 사용한다. 단방향 암호화 방식은 원래의 문자열로 돌려놓는 복호화가 불가능하다. 그래서 알고리즘을 사용하여 암호화하는데, MD5나 SHA1방식은 이미 뚫렸기 때문에 사용하면 안된다. 복호화가 안된다면 왜 사용하나 싶었는데, 홈페이지의 비밀번호는 다시 복호화 할 필요가 없다. 암호화가 된 사용자의 비밀번호를 저장하여 로그인 할 때마다 같은 알고리즘으로 암호화를 하여 DB에 저장된 비밀번호를 확인하면 된다.

crypto.createHash('sha512').update('1234').digest('base64');

위와 같이 Crypto 모듈을 통해 createHash 메소드를 사용하면 되는데, createHash메소드에는 사용할 알고리즘 명을, update 메소드에는 암호화 할 문자열을, digest 메소드에는 암호화된 문자열 표시 방법을 결정한다.

 

Crypto+salt 사용하기

같은 알고리즘을 사용할 때, 같은 문자열에 대한 것은 같은 암호화 결과를 반환한다. 그렇기 때문에 암호화 결과를 통해서도 원래의 암호를 유추해낼 수 있다. 이러한 데이터 베이스를 레인보우 테이블이라고 한다. 그렇기 때문에 해커가 레인보우 테이블을 사용하지 못하도록 소금을 뿌려준다. 랜덤으로 생성된 Salt를 통해 암호화하여 얻은 결과를 다시 변형할 수 있다.

crypto.randomBytes(32,(err,buf)=>{
        crypto.pbkdf2('1234',buf.toString('base64'),100000,64,'sha512',(err,key)=>{
            console.log(key.toString('base64'));
        });
    });

위 코드와 같이 먼저 randomBytes 메소드로 32바이트(또는 64바이트) 길이의 salt를 생성해준다. buf는 버퍼 형식이기 때문에 buf.toString(‘base64’)으로 base64 문자열 salt로 변경해준다. 그 다음 pbkdf2 메소드를 사용하여 단방향 암호화를 해준다. 매개변수는 차례대로 비밀번호, salt, 반복횟수, 비밀번호 길이, 해시 알고리즘이다.

 

Key stretching이란

hashing함수를 반복하여 해싱하는 것을 말한다. 동일한 횟수만큼 해시해야 일치여부를 확인할 수 있다. salt값을 알더라도 반복횟수가 일치하지 않으면 digest를 찾을 수 없다.

 


 

Request 모듈

내부 서버에서 다른 서버로 요청을 보낼 때 사용하는 모듈이다. 또한 다른 서버에서 요청을 보내서 데이터를 받아온다. request()가 리턴하는 것은 request(url)에서 보내는 http 요청에 대한 정보를 담고 있다.

'_정리&복습_' 카테고리의 다른 글

[OS] CPU스케줄링 - 스케줄링 알고리즘  (0) 2019.04.29
[OS] CPU스케줄링 - 기본 개념  (0) 2019.04.19
[솝트] 2차 세미나 (Node js란?)  (0) 2019.04.18
OAuth2.0 flow  (0) 2019.02.27
OAuth 2.0  (0) 2019.02.18

Node js란?

  • javascript 기반 서버 플랫폼
  • 크롬 V8엔진 기반 동작
  • 이벤트 기반
  • non-blocking I/O 방식
  • 싱글 스레드 기반

- V8 엔진, 이벤트 기반

  코드를 한 줄씩 해석하면서 실행하는 인터프리터 방식의 느린 속도를 해결하기 위해 크롬의 V8엔진을 사용하였다. V8엔진은 이벤트를 받아 처리하는 이벤트 루프 기능이 있다. 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식인데, Node js는 서버쪽에서 동작하는 프로그램을 만드는 것이 주임무이기 때문에 가장 중요한 기능이다.

 

- non-blocking I/O 방식 사용

  웹 서버에 파일을 업로드할 때, 업로드가 완료되기 전까지 서버에서 다른 작업을 할 수 없는 문제를 해결하기 위해 새로운 방식의 서버개발 도구를 만들기 시작했는데, 이것이 Node.js이다. 즉, 하나의 요청 처리가 끝날 때 까지 기다리지 않고 다른 요청을 동시에 처리할 수 있는 비동기 입출력(non-blocking I/O)방식을 적용했다.

먼저, blocking I/O 란 아래 그림처럼 프로그램이 읽기 요청을 하면 그 동안은 프로그램이 다른 작업을 하지 않고 기다리게 된다. 파일 시스템에서 동작을 완료하고 난 후에 프로그램이 다시 다른 작업을 시작할 수 있다.

blocking I/O인 경우

  이러한 대기 시간때문에 작업 속도가 느려지는 문제가 생기게 된다.

 

  이것을 non-blocking I/O 방식으로 바꾸면 파일을 읽어들일때 대기하는 시간이 없어진다. 다시 말해, non -blocking I/O는 시작만 해둔 채 완료되지 않은 상태에서 다른 처리 작업을 계속 진행할 수 있도록 멈추지 않고 입출력 처리를 기다리는 방법을 말한다. 이는 콜백함수(callback function) 통해 해결한다. 프로그램에서는 파일 읽기 요청을 하기 전에 콜백 함수를 등록하는데, 파일 시스템은 파일 처리가 끝나면 자동으로 콜백 함수를 호출한다. 따라서 프로그램이 파일 읽기 작업이 끝날때 까지 대기하지 않아도 파일을 다 읽은 시점에 통보를 받고 파일의 내용을 화면에 보여주는 작업을 진행할 수 있다. 

blocking I/O 방식(왼쪽)일 경우와 non-blocking I/O 방식일 경우 코드 비교

 

- 싱글스레드 기반

 먼저, 스레드란 프로세스 내에서 실행되는 여러흐름의 단위를 말한다. 보통 한 프로세스 당 여러개의 스레드가 존재한다. 멀티스레드란 여러 개의 스레드가 일을 나누어서 처리하는 것을 말한다. 그렇기 때문에 하나의 스레드에 문제가 생겨도 다른 스레드로 대체가 가능하다. 반대로 싱글스레드란 주어진 작업을 혼자 처리하는 것을 말한다. 노드에도 여러 스레드가 존재하지만 직접 제어할 수 있는 스레드는 하나뿐이라 싱글스레드라고 부른다. 

 

Node js는 비동기 입출력 방식을 사용하는 이벤트 기반의 싱글스레드
장점
  • 싱글 스레드와 비동기 입출력 처리에 기반한 빠른 속도
  • 멀티 스레드 방식에 비해 컴퓨터 자원을 적게 사용
  • 입출력 작업이 많은 서버에 적합
  • 비교적 높은 생산성
  • 웹 서버가 내장되어 있음
  • JSON형식과 호환이 쉬움
단점
  • 싱글 스레드라 하나의 큰 작업이 들어오면 부하가 크게 걸림
  • CPU작업이 많은 서버로는 부적합
  • 콜백함수가 중첩될 경우 가독성이 떨어짐
  • 규모가 큰 서버에는 관리가 어려움

 


노드를 쉽게 사용할 수 있게 해주는 '모듈'

 

모듈이란 특정한 기능을 하는 함수느 변수들의 집합을 말한다. 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로 사용이 가능하다. 모듈로 만들어두면 모듈을 재사용할 수 있다.

모듈 만들기 두 가지 방법
모듈 불러오기

 

 do it! Node.js 프로그래밍과 세미나 ppt를 참고하여 작성하였습니다.

 

'_정리&복습_' 카테고리의 다른 글

[OS] CPU스케줄링 - 스케줄링 알고리즘  (0) 2019.04.29
[OS] CPU스케줄링 - 기본 개념  (0) 2019.04.19
[솝트] 2차 세미나 (Node js 모듈 정리)  (0) 2019.04.19
OAuth2.0 flow  (0) 2019.02.27
OAuth 2.0  (0) 2019.02.18

+ Recent posts