문제 해결에 필요한 입력값과 문제를 해결하는 프로그램이 주어졌을 때, 프로그램이 입력값을 받아 동작하고 결과를 만들어내는 데 걸리는 정도를 복잡도라고 한다. 그 중 얼마나 오래 걸리는지는 시간 복잡도라고 하고, 얼마나 많은 메모리를 사용하는지는 공간 복잡도라고 한다.

 

 

빅오(Big-O) 표기법

실제로 코드를 실행해보면 소프트웨어나 하드웨어적 변수가 많아 똑같은 코드라도 환경에 따라 실행 시간이 조금씩 다르다. 이런 차이 때문에 시간을 정확한 수치로 표현하기는 어렵지만, 문법이나 구성에서 발생하는 비용을 수치화해 문제를 푸는 데 필요한 총 연산의 수를 수학적으로 표기할 수 있다. 이를 점근 표기법이라고 하며, 세 가지 표기법 중 가장 흔하게 사용하며, 최악의 경우를 계산하는 계산법을 빅오(Big-O) 표기법 이라고 한다.

 

빅오 표기법은 알고리즘이 해당 차수이거나, 그보나 낮은 차수의 시간 복잡도를 가지는 점근적 상한 표기 방법을 의미한다. 쉽게 '최악의 경우 이 정도의 시간이 걸린다'로 이해하면 된다.

 

수학적으로 정의하면 다음과 같다.

 

예를 들어 a 변수에 +1 을 하는 코드를 작성했다고 한다면 (코드로 a += 1) 이를 실행하기 위해 필요한 연산은 총 1번이다. 만약 데이터 개수가 n개라면 프로그램을 실행할 때 발생하는 비용을 f(x)라고 가정하면 데이터 개수만큼 연산을 1번 수행하므로 f(n) = n 이라고 표기할 수 있고, 이를 빅오 표기법으로 나타내면 O(n)이 된다.

 

n개의 데이터를 수행하는 데 걸리는 시간이 제곱만큼, f(n) = 4n^2 + 4n + 1이라고 한다면 동일 최대 차수인 최소 단위 시간 복잡도  g(n) = n^2이 있을 때 f(n) <= cg(n)이 성립하는 상수 c가 존재하므로 결론적으로 표기법 O(x)를 사용하여 최소 단위인 O(n^2)으로 표현할 수 있다.

 

즉, 연산 횟수가 최고 차항에 비례하는 흐름을 보인다면 부가적인 연산은 신경 쓸 필요가 없다. 가령 n^2 + 2n + 1 의 시간 복잡도 역시 최고 차항만 계산하여 O(n^2)으로 줄어든다. 같은 이유로 99n의 시간 복잡도는 O(n)으로 줄어든다.

 

 

시간 복잡도 그래프

시간 복잡도 그래프

 

각 시간 복잡도에 따른 연산 횟수를 정리하면 다음과 같다.

입력 데이터 수에 따른 시간 복잡도의 연산 횟수

 

자주 사용하는 자료 구조에 따른 시간 복잡도

 

서버는 사용자가 누구인지 식별할 수 있어야 한다. 사용자가 누구인지 알면, 그 사용자가 어떤 작업이나 리소스에 접근할 수 있는지 결정할 수 있다. HTTP는 자체적인 인증 관련 기능을 제공한다.

 

HTTP의 인증요구 / 응답 프레임워크

HTTP는 사용자 인증을 하는 데 사용하는 자체 인증요구/응답 프레임워크를 제공한다. 

간략한 인증요구/응답

웹 애플리케이션이 HTTP 요청 메시지를 받으면, 서버는 요청을 처리하는 대신에 현재 사용자가 누구인지를 알 수 있게 비밀번호 같이 개인 정보를 요구하는 '인증요구'로 응답할 수 있다. 

 사용자가 다시 요청을 보낼 때는 인증 정보(사용자 이름과 비밀번호)를 첨부해야 한다. 만약 인증 정보가 맞지 않으면 서버는 클라이언트에 다시 인증요구를 보내거나 에러를 낼 수 있다. 

 

 

인증 프로토콜과 헤더

HTTP는 필요에 따라 고쳐 쓸 수 있는 제어 헤더를 통해, 다른 인증 프로토콜에 맞추어 확장할 수 있는 프레임워크를 제공한다. 아래 그림에 나열된 헤더의 형식과 내용은 인증 프로토콜에 따라 달라진다.

 HTTP에는 기본 인증과 다이제스트 인증이라는 두 가지 공식적인 인증 프로토콜이 있다. 

네 가지 인증 단계

 

 

 

기본 인증

기본 인증은 가장 잘 알려진 HTTP 인증 규칙이다. 거의 모든 주요 클라이언트와 서버에 기본 인증이 구현되어 있다.

 기본인증에서, 웹 서버는 클라이언트의 요청을 거부하고 유요한 사용자 이름과 비밀번호를 요구할 수 있다. 서버는 200 대신 401 상태 코드와 함께, 클라이언트가 접근하려고 했던 보안 영역을 WWW-Authenticate에 기술해서 응답하여 인증요구를 시작한다. 브라우저는 사용자가 입력한 사용자 이름과 비밀번호를 Authorization 요청 헤더 안에 암호화해서 서버로 다시 보낸다.

기본 인증 헤더

 

 

 

Base-64 사용자 이름/비밀번호 인코딩

HTTP 기본 인증은 사용자 이름과 비밀번호 콜른으로 이어서 합치고, base-64 인코딩 메서드를 사용해 인코딩 한다. base-64 인코딩은 8비트 바이트로 이루어져 있는 시퀀스를 6비트 덩어리의 시퀀스로 변환한다. 각 6비트 조각은 대부분 문자와 숫자로 이우어진 특별한 64개의 문자 중에서 선택된다.

 아래 그림은 기본 인증에서 base-64 인코딩을 사용하는 예시이다. 사용자 이름은 'brian-totty'이고 비밀번호는 'Ow!'이다. 브라우저는 사용자 이름과 비밀번호를 콜론으로 이어서 'binary-totty:Ow!'를 만든다. 그러고 나서 이 문자열을 base-64로 인코딩해서 길고 복잡한 'YnJpYW4tdG90dHk6T3ch'를 만든다.

사용자 이름과 비밀번호로 기본 Authorization 헤더 생성

 

Base-64 인코딩은 바이너리, 텍스트, 국제 문자 데이터 문자열 받아서 전송할 수 있게, 그 문자열을 전송 가능한 문자인 알파벳으로 변환하기 위해 발명됐다. 전송 중에 원본 문자열이 변질될 걱정 없이 원격에서 디코딩할 수 있다.

컴퓨터 부품들은 전기만 공급하면 알아서 작동하지 않는다. 

 

모든 프로그램은 실행을 위해 자원을 필요로 한다.

 

 

자원 / 시스템 자원

  • 프로그램 실행에 있어 마땅히 필요한 요소
  • 컴퓨터의 네 가지 핵슴 부품

 

운영체제는 

  • 실행할 프로그램에 필요한 자원을 할당하고
  • 프로그램이 올바르게 실행되게 돕는
  • 특별한 프로그램

 

 

운영체제의 메모리 관리

운영체제
운영체제의 메모리 관리

 

 

운영체제의 CPU 관리

운영체제의 CPU 관리

 

 

운영체제의 입출력장치 관리

운영체제의 입출력장치 관리

 

 

운영체제 덕분에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요가 없다. 

 

개발자는 문제 해결 능력 - 오류 메세지에 대한 깊은 이해를 위해서는 운영체제를 알아야 한다.

 

+ Recent posts