인터페이스

• 응용 프로그램과 커널의 첫번째 인터페이스

• 커널에 사용자의 명령을 전달하고 실행 결과를 다시 사용자에게 알려주는 역할

• 운영체제는 커널과 인터페이스를 분리하며, 같은 커널이여도 다른 인터페이스 형태로 제작 가능하다.

    ◦  같은 커널이라도 다른 인터페이스가 장착되면 사용자에게 다른 운영체제로 보일 수 있다.

          -  예) 유닉스의 인터페이스는 쉘(shell)이라 하며, bash 쉘, C 쉘, T 쉘 등 여러 종류가 있다.


시스템 호출

• 응용 프로그램과 커널의 두번째 인터페이스

• 커널은 사용자나 응용 프로그램으로부터 컴퓨터 자원을 보호하기 위해 외부에서 자원에 직접 접근하는 것을 차단한다.
   따라서 자원을 이용하기 위해서는 시스템 호출 이라는 인터페이스를 사용해 접근해야 한다.


커널

• 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하는데
    이 때 메모리에 상주하는 부분을 커널 이라 부른다.

• 주로 하는 일은 메모리 관리, 프로세스 관리, 파일 시스템 관리, 입출력 관리, 프로세스 간 통신 관리 등이 있다.

 

단일형 구조 커널

    ◦  초창기 커널 구조. 커널의 핵심 기능을 구현하는 모듈이 구분 없이 하나로 구성되어 있다.

    ◦  장점

          -  모듈 간의 통신 비용이 적어 효율적이다.

    ◦  단점

          -  모든 모듈이 하나로 묶여 있기 때문에 버그나 오류를 처리하기 어렵다.

          -  기능 간 상호 의존성이 높기 때문에 한 기능의 결함이 시스템 전체 결함으로 이어질 수 있다.

          -  다양한 환경 시스템에 적용하기 어렵다. (수정이 불가능하므로)

 

계층형 구조 커널

    ◦  단일형 구조 커널이 발전된 형태. 비슷한 기능을 가진 모듈을 묶어서 하나의 계층으로 만들고,

        계층 간의 통신을 통해 운영체제를 구현하는 방식

    ◦  비슷한 기능 끼리 모듈화 되어 있기 때문에 오류가 발생하면 문제가 있는 계층만 고치면 되는 등 단일형 구조보다 버그나 오류를

         쉽게 고칠 수 있다.


드라이버

• 응용 프로그램과 커널의 인터페이스가 시스템 호출이라면 커널과 하드웨어의 인터페이스드라이버이다.

• 다양한 하드웨어에 맞는 인터페이스를 직접 개발하는 것은 어렵기 때문에, 하드웨어의 특성을 반영한 소프트웨어인 디바이스 드라이버

    하드웨어 제작자에게 받아 커널이 실행될 때 함께 실행되도록 한다.


참고자료

 

운영체제 - YES24

운영체제

www.yes24.com

 

'CS Knowledge > 운영체제' 카테고리의 다른 글

[OS] CPU 스케줄링 개념  (0) 2022.09.16
[OS] 스레드와 멀티스레드  (0) 2022.09.08
[OS] 프로세스와 Context Switching  (0) 2022.09.08
[OS] 운영체제 개요  (0) 2022.09.07
[OS] 운영체제와 프로세스 & 스레드  (0) 2022.06.26

운영체제란?

• 컴퓨터 하드웨어 및 시스템 자원을 관리하는 소프트웨어

• 응용 프로그램과 하드웨어 간의 인터페이스를 제공해 응용 프로그램 작업 환경을 제공해주는 소프트웨어


운영체제의 필요성

• 사용자 측면

    ◦ 사용자가 원하는 동작을 편리하게 수행할 수 있는 시스템 환경 구축을 위해

 

• 시스템 측면

    ◦ 어떠한 동작을 최대한 효율적으로 수행하기 위해

    ◦ 운영체제의 목적

         -  처리능력 : 같은 시간 동안 처리할 수 있는 작업량

         -  응답 시간 : 사용자의 요청에 대한 결과를 산출하기 까지 소요되는 시간

         -  신뢰성 : 시스템이 산출한 결과의 정확성

         -  사용 가능성 : 사용자의 요구에 대한 시스템 자원 지원 가능성

 

• 즉 운영체제는 사용자의 요청을 빠르고 정확하게 수행하고, 많은 데이터를 효율적으로 처리하기 위해 필요


운영체제 정의

• 컴퓨터 하드웨어 및 시스템 자원을 관리하는 소프트웨어

• 컴퓨터에서 항상 실행되는 프로그램인 커널, 응용 프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프레임워크,
    시스템 실행 및 관리에 이용되는 시스템 프로그램을 포함하는 개념

 

    ◦ 커널(Kernel)

         -  운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서

            사용하는데 이 때 메모리에 상주하는 운영체제 부분을 커널이라 부른다.

 

    ◦ 시스템 프로그램(System Program)

         -  좀 더 편리한 프로그램의 개발 및 실행을 위해 운영체제가 제공하는 소프트웨어

 

    ◦ 미들웨어(Middle Ware)

         -  운영 체제와 해당 운영 체제에서 실행되는 응용 프로그램 사이에 존재하는 소프트웨어

         -  시스템 프로그램 이외에 추가적으로 이용할 수 있는 서비스를 제공하는 컴퓨터 소프트웨어이다.


운영체제 역할

• 자원관리

    ◦ 컴퓨터 시스템 자원의 효율적 관리

         -  CPU, Memory, I/O장치와 같은 하드웨어 자원 및 프로세스

         -  파일 메시지 등의 소프트웨어 자원

 

• 자원 보호

    ◦ 프로그램이나 다른 사용자가 데이터를 삭제하거나 접근하지 못하도록 보호

 

• 인터페이스 제공

    ◦ 하드웨어 인터페이스와 사용자 인터페이스를 제공해 컴퓨터를 편리하게 사용하도록 지원


참고자료

 

운영체제 - YES24

운영체제

www.yes24.com

 

'CS Knowledge > 운영체제' 카테고리의 다른 글

[OS] CPU 스케줄링 개념  (0) 2022.09.16
[OS] 스레드와 멀티스레드  (0) 2022.09.08
[OS] 프로세스와 Context Switching  (0) 2022.09.08
[OS] 운영체제 구조  (0) 2022.09.07
[OS] 운영체제와 프로세스 & 스레드  (0) 2022.06.26

 

표준 라이브러리를 사용하면 좋은점

선대 개발자들의 노고를 누리자

• 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과, 앞서 라이브러리를 사용한 다른 개발자들의 경험을 활용할 수 있다.


쓸데없는데 시간을 허비하지 말자

• 핵심적인 일과 크게 관련없는 문제를 해결하느라 시간을 허비하지 않아도 된다.

• 자잘한 기능 개발이 아닌, 어플리케이션 핵심 기능 개발에 집중할 수 있다.


자동으로 개선되는 성능

 따로 노력하지 않아도 성능이 지속해서 개선된다.

 자바 플랫폼 라이브러리의 많은 부분이 수년에 걸쳐 다시 작성되며, 때로는 성능이 많이 개선되기도 한다.


기능 무한 증식

 라이브러리에 부족한 부분이 있다면 개발자 커뮤니티에서 이야기가 나오고, 논의된 후 다음 릴리스에 해당 기능이 추가되곤 한다.


알아보기 쉬운 코드 작성 가능

• 작성한 코드가 많은 사람에게 낯익은 코드가 된다.

    ◦  읽기 쉽고, 유지보수하기 좋고, 재사용하기 쉬운 코드


그럼에도 많은 개발자들이 기능을 직접 구현하는 이유

• 아마도 라이브러리에 그런 기능이 있는지 모르기 때문일 것이다.

• 메이저 릴리즈마다 주목할만한 수많은 기능이 라이브러리에 추가된다.

• 메이저 릴리즈마다 제공되는 릴리즈 노트에서 새로운 기능에 대한 설명을 참고하자.

 

JDK Release Notes

We’re sorry. We could not find a match for your search. We suggest you try the following to help find what you’re looking for: Check the spelling of your keyword search. Use synonyms for the keyword you typed, for example, try "application" instead of

www.oracle.com

 

표준 라이브러리 사용 예시

난수 생성 메소드

많은 개발자들이 메소드를 이렇게 작성하곤 한다.

• java.util.Random 을 이용하여 작성된 메소드 : 0 이상 n 미만의 수를 랜덤 반환한다.

•문제점

   ◦  n 이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다.

   ◦  n 이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다.

n 의 값이 크면 이 현상은 더 두드러진다.

   ◦  지정한 범위 바깥의 수가 종종 반환될 수 있다.

         -  rnd.nextInt( ) 의 반환값이 -2147483648 일 때

         -  자바의 int 타입은 32 bit 이므로 -2147483648 ~ 2147483647 의 값만 나타낼 수 있기 때문에
             rnd.nextInt() 이 -2147483648 를 반환하는 경우 절댓값 처리가 되지 않는다.

         -  Math.abs(-2147483648) = -2147483648

해결 방법

   ◦  java.util.Random 을 이용해 메소드를 작성하는 대신 Random.nextInt(int) 를 사용하면 된다.

         -  몇몇 숫자가 더 자주 반환되는 문제 해결

         -  범위 바깥의 수가 반환될 일도 없음

Java 7 부터는 성능이 훨씬 개선된 TreadLocalRandom 을 사용하는 것이 좋다.

Random.nextInt(int) vs TreadLocalRandom 성능 비교

포크-조인 풀이나 병렬 스트림에서는 SplittableRandom 을 사용하는 것이 좋다.


입력한 URL에서 내용을 가져오는 어플리케이션

자바 9에서 InputStream 에 추가된 transferTo 메서드를 사용하면 쉽게 구현할 수 있다.

Command Line 으로 입력 받기 까다로워 임시 String url 을 선언해 사용했다.

위 코드는 transferTo 를 이용해 이 기능을 완벽히 구현한 코드이다.

 

알아두면 좋은 라이브러리

java.lang

• Object 클래스

• String 클래스

• System 클래스

• Wrapper(래퍼) 클래스


java.util

• Arrays 클래스

• java.util.concurrent (동시성 라이브러리)

   ◦  멀티스레드 프로그래밍 작업을 단순화해주는 편의 기능 탑재

   ◦  자신만의 멀티스레딩 코드를 직접 구현할 수 있도록 도와주는 요소 탑재

   ◦  예) Semaphore 클래스, locks 패키지 등


java.io

• File 클래스

• BufferedReader / Writer 클래스

• Serializable 인터페이스


컬렉션 프레임워크

• List / Set / Map 클래스


스트림 라이브러리

• 기존 Java 에서 컬렉션 데이터를 처리할때는 for, for-each 루프문을 사용했음

   ◦  복잡한 처리 or 컬렉션의 크기가 커지면 성능 저하를 일으킴

• Stream : Java8에서 추가된 기능

   ◦  컬렉션 데이터를 선언형으로 쉽게 처리할 수 있음

   ◦  복잡한 루프문을 사용하지 않아도 되며, 루프문을 중첩해서 사용할 필요도 X

   ◦  병렬 처리를 별도의 멀티스레드 구현 없이 쉽게 사용 가능


Guava 라이브러리

• 구글이 작성한 자바 오픈 소스 라이브러리

•  Guava 사용 예시

Guava 를 이용해 리스트의 가장 마지막 원소 구하기

정리

어떤 기능이 필요할 때, 이미 구현된 라이브러리가 있는지 먼저 찾아보고 있으면 그걸 쓰자.

만약 찾아봤는데 없으면 구현해라. 즉, 무작정 구현부터 하진 말자. (그래야 너도 나도 좋다)

 

프로세스란 종단 시스템, 즉 어플리케이션 계층에서 실행되는 프로그램을 의미한다.

그럼 프로세스 간의 통신은 언제 일어날까?

 

먼저 통신 프로세스가 동일한 어플리케이션 계층에서 실행될 때 발생한다.

같은 계층 안에서 프로세스간에 이루어지는 통신은 어플리케이션 계층, 즉 종단 시스템의 운영체제에 따라 그 방식이 결정된다.

 

두번째로 서로 다른 어플리케이션 계층 간에도 프로세스 통신이 발생할 수 있다.

서로 다른 2개의 종단 시스템에서 프로세스는 컴퓨터 네트워크를 통해 메시지(message)를 교환하는 방식으로 통신한다.

송신 프로세스가 메시지를 만들어 네트워크로 보내면, 수신 프로세스는 메시지를 받아 다시 그에 대한 응답 메시지를 보내는 식이다.

 

네트워크 통신에서  프로세스 간 통신이라 하면, 주로 이렇게 서로 다른 어플리케이션 계층 간의 통신을 의미한다.

이번 포스팅에서는 네트워크 통신에서의 프로세스 간 통신에 대해 알아보자.

 

 

클라이언트 프로세스 & 서버 프로세스

이전 포스팅에서 클라이언트 - 서버 어플리케이션 구조에서는 클라이언트끼리 직접적으로 통신하는 것이 아니라, 서버가 클라이언트와

클라이언트 사이에서 중재자 역할을 하며, 클라이언트가 보낸 데이터를 다시 다른 클라이언트에게 전달해 준다는 내용을 살펴보았다.

 

이 때 클라이언트가 바로 클라이언트 프로세스를 의미하고, 서버가 서버 프로세스를 의미하며,

클라이언트와 서버 사이를 왔다갔다 하는 데이터가 바로 메시지를 의미한다고 이야기할 수 있다.

 

즉 클라이언트 브라우저 프로세스가 웹 서버 프로세스와 메시지를 교환하는 경우,

브라우저는 클라이언트 프로세스이고, 웹 서버는 서버 프로세스인 것이다.

P2P 구조에서 피어(peer) 역시 하나의 프로세스라고 할 수 있는데, 이 때 피어는 클라이언트 프로세스가 될 수도 있고,

동시에 서버 프로세스가 될 수도 있다. 

 

이런 경우 클라이언트 프로세스와 서버 프로세스는 다음과 같이 분리된 개념으로 보면 편하다.

 

클라이언트 프로세스 : 두 프로세스 간의 통신 세션에서 통신을 초기화하는 프로세스

                                      (다른 프로세스와 세션을 시직하기 위해 접속을 초기화 시킴)

서버 프로세스 : 세션을 시작하기 위해 접속을 기다리는 프로세스

 

웹 브라우저는 웹 서버와 접촉을 초기화한다.

따라서 브라우저 프로세스는 클라이언트 프로세스이고, 웹 서버 프로세스는 서버 프로세스이다.

 

P2P 파일 공유 어플리케이션에 피어 A, B 가 있다고 가정하자.

A 가 B 에게 특정 파일을 보낼 것을 요청하는 경우 A 는 클라이언트 프로세스, B 는 서버 프로세스이다.

반대로 B 가 A 에게 특정 파일을 보낼 것을 요청하는 경우 다시 B 가 클라이언트 프로세스, A 가 서버 프로세스가 된다.

 

쉽게 말해 요청을 보내는 쪽이 클라이언트, 요청을 받고 응답을 보내주는 쪽이 서버이다.

 

 

소켓 between 프로세스 & 컴퓨터 네트워크

대부분의 어플리케이션은 메시지를 주고 받는 두 통신 프로세스의 쌍으로 구성된다.

이 때 두 프로세스간의 메시지는 인터넷, 즉 네트워크를 통해 움직이며, 프로세스는 소켓(socket)을 통해 네트워크로 메시지를 보내거나 받는다.

쉽게 말해 프로세스는 집 이고 소켓은 출입구이며, 메시지는 출입구를 통해 집을 빠져 나간다고 볼 수 있다.

 

지난 포스팅에서 살펴본 OSI 7 계층을 떠올려 본다면,

소켓은 어플리케이션 계층트랜스포트 계층 간의 인터페이스 이며, API 라고 이야기할 수도 있다.

 

이 때 어플리케이션 개발자는 어플리케이션 계층에 대해서는 모든 통제권을 가지나, 트랜스포트 계층에 대해서는 그렇지 않다.

트랜스포트 계층에 대해 어플리케이션 개발자가 조작할 수 있는 것은 트랜스포트 프로토콜을 선택하는 것과,

최대 버퍼/세그먼트 크기 등의 매개변수를 설정하는 것 뿐이다.

 

어플리케이션은 개발자가 선택한 트랜스포트 프로토콜이 제공하는 전송 서비스를 사용하여 구성되는데,

이 트랜스포트 프로토콜에 대해서는 이후 포스팅에서 좀 더 자세히 알아보도록 하자.

 

 

프로세스 주소 : IP 주소와 포트 넘버

이전 포스팅에서 클라이언트-서버 구조를 다룰 때 고정 IP 주소의 개념을 간단하게 살펴본 적이 있었다.

프로세스간에 메시지를 주고 받기 위해서는 두가지 정보가 필요한데, 그 중 하나가 IP 주소이고,

나머지 하나는 IP 주소가 가리키는 목적지 호스트 안에서 통신에 참여하고 있는 프로세스의 식별자이다.

 

호스트 안에 여러개의 프로세스가 존재할 수 있기 때문에, 그 중 어떤 프로세스가 메시지를 보냈는지 알기 위해 식별자가 필요하고

포트 넘버(port number)가 바로 이 프로세스를 식별하는데 사용된다.

 

자주 사용되는 어플리케이션에는 보통 약속처럼 정해진 포트 넘버가 할당되는데,

예를 들어 웹 서버는 포트 넘버 80번으로 식별되고, SMTP 프로토콜을 사용하는 메일 서버는 포트 넘버 25번으로 식별된다.

인터넷 표준 프로토콜들이 이렇게 약속처럼 정해두고 사용하는 포트 번호 리스트는 여기에서 찾아볼 수 있다.

 

 

참고자료

 

컴퓨터 네트워킹 하향식 접근 - YES24

컴퓨터 네트워킹 하향식 접근

www.yes24.com

 

네트워크 어플리케이션 구조란 이전 포스트에서 다룬 OSI 7 계층 구조 같은 네트워크 구조와는 다른 개념이다.

어플리케이션 개발자 관점에서 네트워크 구조는 고정되어 있는 구조인 반면, 네트워크 어플리케이션 구조는
어플리케이션 개발자가 직접 여러 구조 중 하나를 선택하고, 세부적으로 설계해야하는 구조라 할 수 있다.

이번 포스팅에서는 가장 많이 사용되는 대표적인 네트워크 어플리케이션 구조 두가지에 대해 알아보자.

 

 

클라이언트 - 서버 구조 (Client-server Architecture)

서버(server) : 항상 켜져있는 호스트

클라이언트(client) : 가끔 혹은 항상 켜져있을 수 있음

• 서버는 클라이언트 라는 다른 많은 호스트로부터 요청(Request)을 받는다.

    ◦  예 ) 클라이언트 호스트에서 실행되는 브라우저가 항상 켜져있는 웹 서버로 서비스를 요청한다.

                이 때 웹 서버는 클라이언트 호스트로 요청받은 객체를 보내어 응답한다.

    ◦  즉 서로 다른 브라우저가 상호간에 직접적으로 통신하지 않는 것 처럼,

         클라이언트 - 서버 구조에서 클라이언트 끼리는 서로 직접적으로 통신하지 않고, 무조건 서버를 거친다.

고정 IP 주소 : 서버는 고정 IP 주소라는 잘 알려진 유일한 주소를 갖는다.

    ◦  인터넷에서 호스트는 IP 주소로 식별된다.

    ◦  서버는 항상 동작하고 있으므로, 클라이언트는 이 서버 주소로 패킷을 보내서 항상 서버에 연결할 수 있다.


• 때때로 하나의 서버 호스트가 자신의 모든 클라이언트로부터의 요청에 응답하는것이 불가능한 경우도 있다.

    ◦  하나의 서버 호스트가 감당할 수 있는 정도 이상으로 요청이 들어오면 서버가 정상적으로 작동하지 못할 수 있음

    ◦  이런 문제를 해결하기 위해 데이터 센터가 사용된다.

데이터 센터(data center) : 많은 수의 호스트를 갖춘 강력한 가상의 서버

    ◦  데이터 센터는 전력이 공급되어야 하는 10만개 정도를 서버를 가지며, 서비스 제공자들은 데이터 센터로부터 데이터를 보내기 위해

         상호연결 및 대역폭에 대한 비용을 지불해야 한다.

    ◦  구글 같은 검색엔진이나 페이스북, 인스타그램 같은 SNS 등의 인기 있는 서비스들은 모두 하나 이상의 데이터 센터를 사용한다.

 

 

P2P 구조

• P2P 구조에서 어플리케이션은 클라이언트 - 서버 구조와 달리, 항상 켜져있는 호스트 서버에 거의 혹은 전혀 의존하지 않는다.

    그 대신 피어(peer)라는 간헐적으로 연결된 호스트 쌍이 서로 직접 통신한다.

    ◦  피어(peer) : 서비스 제공자가 소유하는 것이 아닌, 사용자들이 제어하는 데스크탑/랩탑 등을 의미

• 특정 서버를 경유하지 않고, 피어끼리 직접 통신하므로 이 구조를 피어-투-피어(P2P)라 부른다.

• 비트토렌트(BitTorrent), 스카이프 등의 서비스가 P2P 구조를 사용한다.


자가 확장성(self-scalability) : P2P 구조의 가장 주목할만한 특성

    ◦  New peers bring new service capacity.

    ◦  P2P 파일 공유 어플리케이션에서 여러 피어들이 파일을 요구하면 작업 부하가 발행하지만,

       각 피어들은 동시에 다른 피어들에게 파일을 분배해줄 수 있으므로 시스템 서비스 기능에 기여할 수 있다.

비용 효율성 : P2P 구조는 서버 기반 구조 및 서버 대역폭을 요구하지 않기 때문에 클라이언트 - 서버 구조 혹은 데이터 센터와

   비교해보았을 때 비용적인 측면에서 효율적이다.

그러나 P2P 특유의 분산 구조 특성으로 인해 보안, 성능, 신뢰성 부분에서 여러 단점이 존재한다.

 

 

참고자료

 

컴퓨터 네트워킹 하향식 접근 - YES24

컴퓨터 네트워킹 하향식 접근

www.yes24.com