nayonngme
서버 | 스프링 | 부트 본문
서버
- 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템
# 서버 컴퓨터(=정보 제공자)
: 내가 제공하는 정보에 대한 사진을 올려놓고 다른 컴퓨터들이 접속해서 정보를 확인할 수 있게 하는 내 컴퓨터
# 데이터 센터(IDC, Internet Data Center)
: 서버 컴퓨터들을 한 곳에 모아 안정적으로 관리하기 위한 공간
- 전력 공급, 인터넷 연결, 보안에 초점
- 페이스북은 IDC의 냉각 비용을 절감하기 위해 스웨덴의 북극권에 IDC를 세우기로 함
# IaaS(Infrastructure as a service)
: 사용자가 관리할 수 있는 범위가 가장 넓은 클라우드 컴퓨팅 서비스
- 운영 인력, 비용, 해킹 위험 등의 이유로 자체적인 IDC를 세우지 않고, 서버를 빌려서 운영하는 것
- PaaS, SaaS의 바탕
- 아마존의 AWS(Amazon Web Service), 구글의 GCE(Compute Engine)가 대표적
- 기업들은 특정 기간동안 일정 비용을 지불하고 AWS의 서버를 빌려쓸 수 있음
- 전 세계에 AWS의 서버가 존재하므로, 서버 다운이 발생하더라도 다른 곳의 서버를 작동시켜 서비스 마비를 방지할 수 있다는 장점이 있음
- 인프라 수준의 클라우드 컴퓨팅을 제공함
- 사용자는 서버 OS, 미들웨어, 런타임, 데이터 어플리케이션까지 직접 구성하고 관리할 수 있음
- 컴퓨팅 자원 확장 및 축소를 유연하게 조절할 수 있어 탄력적인 인프라 운영 가능
- 사용한 만큼만 지불하는 종량제 형식으로 합리적임
- 인프라 운영에 대한 여건이 갖춰져 있어야 활용하기 좋음
스프링
- 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크
- 동적 웹사이트를 개발하기 위한 여러 가지 서비스를 제공함
- 특징
- 자바 객체의 라이프 사이클(객체 생성, 소멸)을 직접 관리함
- Plain Old Java Object 방식의 프레임워크. J2EE 프레임워크에 비해 기존 라이브러리 등을 지원하기 용이함
- 스프링은 제어 반전(IoC : Inversion of Control)을 지원한다. 컨트롤의 제어권이 사용자가 아니라 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.
- 스프링은 의존성 주입(DI : Dependency Injection)을 지원한다. 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
- 스프링은 관점 지향 프로그래밍(AOP : Aspect-Oriented Programming)을 지원한다. 따라서 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리할 수 있다.
- 스프링은 영속성과 관련된 다양한 서비스를 지원한다. iBATIS나 하이버네이트 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공한다.
- 스프링은 확장성이 높다. 스프링 프레임워크에 통합하기 위해 간단하게 기존 라이브러리를 감싸는 정도로 스프링에서 사용이 가능하기 때문에 수많은 라이브러리가 이미 스프링에서 지원되고 있고 스프링에서 사용되는 라이브러리를 별도로 분리하기도 용이하다.
# 스프링에서 사용되는 주요 모듈
- 제어 반전 컨테이너
제어 반전(IoC: Inversion of Control) 컨테이너는 스프링의 가장 중요하고 핵심적인 기능으로서 자바의 반영(reflection)을 이용해서 객체의 생명주기를 관리하고 의존성 주입(Dependency Injection)을 통해 각 계층이나 서비스들간의 의존성을 맞춰준다. 이러한 기능들은 주로 환경설정을 담당하는 XML 파일에 의해 설정되고 수행된다.
- 관점 지향 프로그래밍 프레임워크
스프링은 로깅이나 보안, 트랜잭션 등 핵심적인 비지니스 로직과 관련이 없으나 여러 곳에서 공통적으로 쓰이는 기능들을 분리하여 개발하고 실행 시에 서로 조합할 수 있는 관점 지향 프로그래밍(AOP)을 지원한다. 기존에 널리 사용되고 있는 강력한 관점 지향 프로그래밍 프레임워크인 AspectJ도 내부적으로 사용할 수 있으며, 스프링 자체적으로 지원하는 실행시(Runtime)에 조합하는 방식도 지원한다.
- 데이터 액세스 프레임워크
스프링은 데이터베이스에 접속하고 자료를 저장 및 읽어오기 위한 여러 가지 유명한 라이브러리, 즉 JDBC, iBATIS(MyBatis), 하이버네이트 등에 대한 지원 기능을 제공하여 데이터베이스 프로그래밍을 쉽게 사용할 수 있다.
- 트랜잭션 관리 프레임워크
스프링은 추상화된 트랜잭션 관리를 지원하며 XML 설정파일 등을 이용한 선언적인 방식 및 프로그래밍을 통한 방식을 모두 지원한다.
- 모델-뷰-컨트롤러 패턴
스프링은 웹 프로그램밍 개발 시 거의 표준적인 방식인 Spring MVC라 불리는 모델-뷰-컨트롤러(MVC) 패턴을 사용한다. DispatcherServlet이 Controller 역할을 담당하여 각종 요청을 적절한 서비스에 분산시켜주며 이를 각 서비스들이 처리를 하여 결과를 생성하고 그 결과는 다양한 형식의 View 서비스들로 화면에 표시될 수 있다.
- 배치 프레임워크
스프링은 특정 시간대에 실행하거나 대용량의 자료를 처리하는데 쓰이는 일괄 처리(Batch Processing)을 지원하는 배치 프레임워크를 제공한다. 기본적으로 스프링 배치는 Quartz 기반으로 동작한다.
부트
= 부팅=시동
- 사용자가 운영 체제를 시동할 때 이를 시작하는 부트스트래핑 과정
# 운영 체제(OS, Operating System)
: 사용자의 하드웨어, 시스템 리소스를 제어하고 프로그램에 대한 일반적인 서비스를 지원하는 시스템 소프트웨어
- 실행되는 응용 프로그램들이 메모리, CPU, 입출력 장치 등의 자원들을 사용할 수 있게 만들어주고, 이들을 추상화하여 파일 시스템 등의 서비스를 제공함
- 멀티태스킹을 지원하는 경우, 여러 개의 응용 프로그램이 실행되는 프로세스를 스케줄링하여 동시에 수행되는 것처럼 보이게 함
- 목적
- 사용자에게 컴퓨터의 프로그램을 쉽고 효율적으로 실행할 수 있게 하는 환경을 제공함
- 컴퓨터 시스템 하드웨어 및 소프트웨어 자원을 여러 사용자에게 효율적으로 할당 및 관리, 보호함
- 제어 프로그램으로서, 사용자 프로그램의 오류 또는 잘못된 자원 사용을 감시함
- 입출력 장치 등의 자원에 대한 연산과 제어를 관리함
- 종류
- 싱글태스킹 운영 체제 / 멀티태스킹 운영 체제
싱글 태스킹 운영 체제는 한번에 오직 하나의 프로그램만 실행할 수 있으나 멀티태스킹 운영 체제는 하나 이상의 프로그램이 동시에 실행할 수 있게 한다. 이는 운영 체제의 작업 스케줄링 하부 시스템에 의해 제각기 반복적으로 인터럽트 처리되는 여러 프로세스 사이에서 이용 가능한 프로세서 시간을 쪼개는 시분할을 통해 이루어진다. 멀티태스킹의 경우 선점형과 협동형(비선점형)이 있다. 선점형 멀티태스킹의 경우 운영 체제는 CPU 시간을 쪼개어 프로그램들 각각에 슬롯을 할당해준다. 솔라리스, 리눅스, 아미가OS와 같은 유닉스 계열 운영 체제들은 선점형 멀티태스킹을 지원한다. 협동형 멀티태스킹은 정해진 방식에 따라 다른 프로세스들에 시간을 제공하기 위해 각 프로세스에 의존함으로써 수행된다. 16비트 버전의 마이크로소프트 윈도우는 협동형 멀티태스킹을 사용하였다. 32비트 버전의 윈도우 NT, 윈도우 9x의 경우 선점형 멀티태스킹을 사용하였다.
단일 사용자 운영 체제 / 다중 사용자 운영 체제
단일 사용자 운영 체제는 사용자 구별이 없으나 여러 프로그램이 나란히 실행하는 것은 허용한다.[4] 다중 사용자 운영 체제는 디스크 공간과 같은 리소스와 프로세스를 식별하는 기능을 갖춘 멀티태스킹의 기본 개념을 확장하며, 여러 사용자에 속해 있으면서 여러 사용자가 동시에 시스템과 상호 작용할 수 있게 한다. 시분할 운영 체제들은 시스템의 효율적인 이용을 위해 태스크를 스케줄링하며, 프로세서 시간, 기억 공간, 인쇄, 기타 자원을 여러 사용자에게 비용적으로 할당하기 위한 회계 소프트웨어를 포함할 수 있다.
분산 운영 체제
분산 운영 체제는 구별된 컴퓨터 그룹을 관리하고 이들이 마치 하나의 컴퓨터인 것처럼 보이게 만들어 준다. 서로 연결되어 통신하는 네트워크화된 컴퓨터들이 개발되면서 분산 컴퓨팅이 활성화되었다. 분산되는 연산들은 하나 이상의 컴퓨터에서 수행된다. 하나의 그룹에 속하는 컴퓨터들이 협업을 할 때 분산 시스템을 형성하게 된다.[5]
판형 운영 체제
운영 체제에서, 배포 형식 및 클라우드 컴퓨팅 환경에서 판형은 하나의 가상 머신 이미지를 게스트 운영 체제로 만드는 것을 가리키며, 실행 중인 여러 개의 가상 머신을 위한 도구로 이를 저장한다. 이 기법은 가상화와 클라우드 컴퓨팅 관리에 둘 다 사용되며, 대형 서버 웨어하우스 환경에서 흔히 볼 수 있다.[6]
임베디드 운영 체제
임베디드 운영 체제는 임베디드 컴퓨터 시스템에서 사용할 수 있게 설계되어 있다. PDA처럼 조그마한 기계에 동작하도록 설계되어 있으며 ,제한된 수의 자원으로 동작한다. 매우 크기가 작고 극히 효율적으로 설계되어 있다. 임베디드 운영 체제의 예로 윈도우 CE와 미닉스 3이 있다.
실시간 운영 체제
실시간 운영 체제는 특정한 짧은 시간 내에 이벤트나 데이터의 처리를 보증하는 운영 체제이다. 실시간 운영 체제는 싱글태스킹일 수도 있고, 멀티태스킹일 수도 있으며 멀티태스킹의 경우 특수한 스케줄링 알고리즘을 사용한다.
라이브러리
라이브러리 운영 체제는 네트워크 등 일반적인 운영 체제가 제공하는 서비스들이 라이브러리 형태로 제공되는 것을 의미한다.
- 싱글태스킹 운영 체제 / 멀티태스킹 운영 체제
- 예시
- 유닉스 및 유닉스 계열 운영 체제
유닉스는 처음에는 어셈블리어로 작성되었다. 켄 톰프슨은 BCPL에 기반을 둔 B를 작성하였다. 이것으로 말미암아 그는 유닉스를 작성하기도 하였는데, 이는 멀틱스 프로젝트에서의 경험을 바탕으로 한다. C는 B를 대체하였으며 유닉스는 현대의 모든 운영 체제에 영향을 미쳤던 크고 복잡한 계열의 상호 관련 운영 체제로 발전하였다. 유닉스 계열 운영 체제는 유닉스에서 파생한 계열이며 시스템 V, BSD, GNU/리눅스,와 같은 주된 하부 분류가 몇 가지 있다. 유닉스라는 이름은 어느 운영 체제와도 사용할 수 있게 한다는 것을 표명한 오픈 그룹의 상표이다. 유닉스 계열은 원래의 유닉스를 닮은 커다란 집합의 운영 체제들을 가리키는 데 흔히 쓰인다.
유닉스 계열 운영 체제는 다양한 컴퓨터 아키텍처에서 돌아간다. 이들은 비즈니스 분야의 서버와 학술 및 공학 환경에서의 워크스테이션에서도 쓰인다. GNU/리눅스와 BSD와 같은 자유 유닉스들은 이러한 분야에서 널리 쓰인다.
HP의 HP-UX와 IBM의 AIX는 제조업체의 하드웨어에만 동작하도록 설계되어 있다. 솔라리스와 같은 것들은 x86 서버와 PC를 포함한 여러 종류의 하드웨어에서 돌아간다. 넥스트스텝, 마하, FreeBSD에서 파생한 하이브리드 커널 기반의 BSD류인 애플의 맥 OS X은 유닉스 계열이 아니었던 애플의 초기 맥 OS를 대체하였다. 유닉스의 정보 처리 상호 운용성은 POSIX 표준을 확립함으로써 드러난다. POSIX 표준은 이것이 비록 다양한 유닉스 계열을 위해서 만들어지기는 하였으나 다른 어떠한 운영 체제에라도 적용할 수 있다. - BSD 및 BSD 계열
월드 와이드 웹을 위한 최초의 서버는 BSD 기반의 넥스트스텝에서 실행하였다.
유닉스 계열의 하부 집합 가운데 하나로 BSD 계열이 있다. 여기에는 FreeBSD, NetBSD, OpenBSD를 포함한다. 이러한 운영 체제들은 웹 서버에서 가장 쉽게 찾을 수 있지만 개인용 컴퓨터 운영 체제로의 역할도 한다. 인터넷은 BSD와도 많은 관련이 있는데, 네트워크에 연결하여 데이터를 주고 받는 데 흔히 쓰이는 현재의 프로토콜들 가운데 다수가 BSD에서 정의하여 널리 쓰이게 된 것이다. 또, 월드 와이드 웹은 넥스트스텝이라는 BSD 기반 운영 체제를 실행하는 수많은 컴퓨터에서 처음 입증되었다.
BSD는 유닉스에 뿌리를 두고 있다. 1974년에 캘리포니아 대학교 버클리는 최초의 유닉스 시스템을 설치하였다. 시간이 지나 컴퓨터 과학부의 학생들과 직원들은 그곳에서 문서 편집기와 같은 새로운 프로그램을 이러한 것들에 일찍이 추가하기 시작하였다. 버클리 대학교가 최초의 유닉스 시스템이 설치된 새로운 VAX 컴퓨터를 1978년에 도입하였을 때 대학생들은 컴퓨터 하드웨어의 가능성을 이용하기 위하여 유닉스를 수정하였다. 미국 국방부의 방위고등연구계획국이 이에 관심을 가져 프로젝트에 투자하기로 결정하였다. 수많은 학교와 회사, 정부 단체들은 이를 알아채고 AT&T에서 제공하는 공식적인 것이 아닌 버클리 버전의 유닉스를 사용하기 시작하였다. 1985년에 애플을 떠났던 스티브 잡스는 넥스트스텝이라 불리는 BSD류를 실행하는 고성능 컴퓨터를 제조하였던 기업 NeXT사를 세웠다. 이러한 컴퓨터들 가운데 하나는 팀 버너스 리가 최초의 웹 서버로 월드 와이드 웹을 만드는 데 사용하였다. - OS X
맥 OS X은 매킨토시 컴퓨터에 미리 최신으로 설치되어 있으면서도 애플이 개발하여 판매한 사유 그래픽 운영 체제이다. 맥 OS X은 1984년 이후로 애플의 사유 운영 체제였던 원래의 맥 OS의 뒤를 잇는 것이다. 전작과 달리 맥 OS X은 1980년대 2/4 분기부터 애플이 1987년 초에 이 회사를 사들일 때까지 NeXT에서 개발한 기술로 만든 유닉스 운영 체제이다.
이 운영 체제는 1999년에 맥 OS X 서버 1.0이라는 이름으로 처음 출시하였으며 그 뒤 2001년 3월에 데스크톱 지향 버전인 맥 OS X v10.0을 출시하였다. 그 뒤로 맥 OS X의 "클라이언트", "서버" 에디션 여섯 가지가 공개되었으며, 최신 제품은 2020년에 출시된 OS X 빅서이다.
서버 에디션인 맥 OS X 서버는 구조적으로 데스크톱의 것과 비슷하지만 일반적으로 애플의 매킨토시 서버 하드웨어에서 돌아간다. 맥 OS X은 메일 전송 에이전트, 삼바, LDAP 서버, DNS 등을 비롯한 네트워크 서비스에 접근할 수 있게 하는 워크 그룹 관리 및 관리 소프트웨어 도구를 포함하고 있다. - 플랜 9
켄 톰프슨, 데니스 리치, 더글라스 맥길로이는 벨 연구소에서 유닉스 운영 체제를 개발하기 위하여 C 프로그래밍 언어를 설계하고 개발하였다. 벨 연구소의 프로그래머들은 현대의 배포 환경을 위해 계획된, 플랜 9와 인페르노를 개발하기 시작하였다. 플랜 9는 네트워킹 운영 체제로 발돋움하기 위하여 계획된 것이었으며 당시 그래픽이 제공되지 않았던 유닉스와 달리 그래픽을 내장하였다. Lucent 공중 허가 사용 허가서 하에 출시되었다. 인페르노는 Vita Nuova Holdings에 팔려 GPL/MIT 라이선스로 배포되고 있다. - 리눅스와 GNU
안드로이드는 리눅스 커널을 이용하는 대중적인 모바일 운영 체제이다.
리눅스는 BSD 및 그 변종과 달리 실제 유닉스 코드 없이 개발된 유닉스 계열 운영 체제이다. 슈퍼컴퓨터에서부터 손목시계에 이르기까지 다양한 기기에 쓰인다. 리눅스 커널은 오픈 소스 라이선스로 배포되므로 누구나 코드를 읽고 수정할 수 있다. 리눅스는 다양한 전자 기기에서 동작하도록 수정되고 있다.
GNU 프로젝트는 완전한 원래의 코드를 제외하고 유닉스와 비슷하게 완전하게 자유롭고 열려 있는 운영 체제를 만들고 싶어하는 프로그래머들의 협동적인 노고 그 자체이다. 이 프로젝트는 1983년에 리처드 스톨만이 시작하였고 대부분의 리눅스의 수많은 부분을 책임지고 있다. 이 까닭에 리눅스는 GNU/리눅스로 불리기도 한다. 실질적으로 모든 운영 체제를 위한 수많은 소프트웨어가 GNU 일반 공중 사용 허가서 하에 배포된다. 이 가운데 리눅스 커널은 핀란드의 대학교 학생이었던 리누스 토르발스의 부차적인 프로젝트로 시작되었다. 1991년에 토르발스는 이 작업에 착수하여 프로젝트에 대한 정보를 컴퓨터 학생과 프로그래머를 위한 뉴스그룹에 게시하였다. - 구글 크롬 OS
크롬은 구글이 리눅스 커널을 기반으로 설계한 운영 체제이다. 크롬은 대부분의 시간을 인터넷으로 보내는 이용자들을 대상으로 한다. 기술적으로는 어떠한 응용 프로그램도 없는 웹 브라우저만을 이용하며 문서 작성이나 미디어 보기와 같은 작업을 위해 웹 브라우저에 쓰이는 인터넷 애플리케이션에 의존한다. - 마이크로소프트 윈도우
마이크로소프트 윈도우는 개인용 컴퓨터에 가장 흔히 쓰이는 사유 운영 체제 계열이다. 개인용 컴퓨터를 위한 가장 흔한 운영 체제이며 약 90%의 시장 점유율을 차지하고 있다.[9][10][11] 최신 버전은 개인용 컴퓨터의 경우 윈도우 11이, 서버의 경우 윈도우 서버 2019이다.
1981년에 IBM PC용의 오래된 MS-DOS 운영 체제에 추가 기능으로 나온 것이 기원이다. 1985년에 마이크로소프트는 개인용 컴퓨터의 비즈니스 분야를 지배하기 시작하여 수많은 산업 표준을 정립하기에 이르렀다. 윈도우 XP를 시작으로 현대의 모든 윈도 버전은 윈도우 NT 커널을 기반으로 하고 있다. 현재 나오는 윈도우 버전은 IA-32와 x86-64 프로세서에서 동작하지만 그 이전에 나왔던 버전들은 다른 아키텍처를 지원하기도 하였다. - 기타
틈새 시장에 존재하는 오래된 운영 체제로는 IBM과 마이크로소프트의 OS/2, 애플 맥 OS X의 유닉스를 이용하지 않는 이전작 맥 OS, 또 BeOS와 XTS-300이 있다. RISC OS, MorphOS, 아미가OS 4도 열성적인 커뮤니티와 전문 분야를 위한 소수 플랫폼으로 개발이 이어지고 있다. DEC의 OpenVMS도 휴렛 패커드가 계속 개발하고 있다. 도스 등의 운영 체제도 FreeDOS와 같은 프로젝트를 통해 명맥을 이어가고 있다. 그 밖의 운영 체제는 운영 체제 교육용이나 학술용, 또는 운영 체제 개념의 연구 등을 위해 예외적으로 쓰인다. 학술과 연구 역할을 모두 수행하는 시스템의 전형적인 예로 미닉스가 있다. 반면 순수 연구 목적으로 쓰이는 것으로는 싱귤래러티가 있다.
- 유닉스 및 유닉스 계열 운영 체제
- 구성 요소
- 커널
펌웨어와 장치 드라이버의 도움을 받아 커널은 모든 컴퓨터 하드웨어 장치에 대한 가장 기초 수준의 제어권을 제공한다. 커널은 램을 통해 프로그램을 위한 메모리 접근을 관리하며 어느 프로그램이 어느 하드웨어 자원에 접근할지를 결정하며 CPU의 동작 상태를 늘 최적으로 설정 및 초기화하고 디스크, 테이프, 플래시 메모리와 같은 매체의 파일 시스템을 갖춘 장시간 비휘발성 기억 장치를 위한 데이터를 정리한다. 운영 체제 내에서의 커널의 영역과 그 구성에 따라 모노리딕 커널(monolithic kernel), 마이크로 커널(micro kernel) 등으로 분류한다. - 프로그램 실행
운영 체제는 응용 프로그램과 하드웨어 사이의 인터페이스 역할을 한다. 운영 체제는 응용 프로그램 개발을 단순하게 하는 서비스의 집합이다. 프로그램을 실행하면 운영 체제가 프로세스를 만든다. 커널은 메모리와 다른 자원을 할당하여 프로세스를 만들며, 이로써 멀티태스킹 환경에서 프로세스에 대한 우선 순위를 확립하고, 메모리에 프로그램 코드를 적재하며 프로그램을 실행한다. 그 뒤 프로그램은 사용자 및 장치와 상호작용한 다음 원하는 명령을 수행하게 된다.
운영 체제는 프로세스들을 생성하거나 삭제하고, 중단시키거나 재개시킨다. 프로세스 간의 동기화와 통신, 교착상태 처리에 관한 메커니즘을 제공한다.- 사용자 및 시스템 프로세스의 생성과 종료 관리
- 프로세스의 일시 중지와 속개
- 프로세스 동기화를 위한 수단의 제공
- 프로세스간 통신을 위한 수단의 제공
- 교착 상태 처리를 위한 수단의 제공
- 인터럽트
- 인터럽트는 주변 환경에 반응하고 상호작용하는 데에 효율적인 방법을 운영 체제에 제공하므로 운영 체제에 핵심적인 역할을 한다고 할 수 있다. 동작을 요구하는 이벤트(폴링)를 위한 다양한 소스의 입력을 운영 체제가 감시할 수 있는 다른 대안은 스택이 매우 작은 구형 운영 체제에서 볼 수 있으나 스택이 큰 현대의 운영 체제에서는 드문 편이다. 인터럽트 기반의 프로그래밍은 현대의 대부분의 CPU에서 직접적으로 지원된다. 인터럽트는 자동으로 로컬 레지스터 컨텍스트를 저장하고 이벤트에 반응하는 특정 코드를 실행하는 방법을 컴퓨터에 제공한다. 매우 기초적인 컴퓨터들은 모두 하드웨어 인터럽트들을 지원하며 이벤트가 발생할 때 실행될 코드를 프로그래머가 지정할 수 있게 한다.
프로그램이 운영 체제에 인터럽트를 발생시키는 경우도 있다. 이를테면 프로그램이 하드웨어에 접근하고자 한다면 운영 체제의 커널을 가로막을 수 있으며, 이를 통해 제어권을 커널에 넘겨준다. 그 뒤 커널은 요청을 수행한다. 프로그램이 메모리(또는 공유 자원)와 같은 추가 자원이 필요하면 커널이 집중할 수 있게 인터럽트를 발생시킨다.
- 커널
-
- 모드
보호 모드에서 사용할 수 있는 x86용 권한 링. 운영 체제는 어느 프로세스가 개별 모드에서 실행할 것인지 결정한다.
현대의 CPU는 여러 모드의 명령을 지원한다. 이러한 기능을 지원하는 CPU에는 두 가지 모드가 있다: 보호 모드, 수퍼바이저 모드. 수퍼바이저 모드는 메모리의 기록 및 삭제 방식을 제어하는 것과 그래픽 카드와 같은 장치와 통신하는 것과 같이 운영 체제의 커널이 하드웨어에 제한 없이 액세스해야 하는 낮은 수준의 태스크를 위해 사용한다. 반대로 보호 모드는 그 밖의 거의 모든 용도로 사용된다. 응용 프로그램들은 보호 모드 안에서 동작하며, 수퍼바이저 모드의 모든 것을 제어하는 커널과 통신해야만 하드웨어를 이용할 수 있다. CPU는 오래된 프로세서를 가상으로 구현하기 위한 가상 모드와 같이 보호 모드와 비슷한 다른 모드들을 지니고 있을 수도 있다. (이를테면 32비트에서 16비트 프로세서를, 아니면 64비트에서 32비트 프로세서를 가상으로 구현할 때)
컴퓨터가 처음 시동할 때 자동으로 수퍼바이저 모드에서 실행된다. 컴퓨터를 켜자마다 먼저 실행되는 몇 안 되는 프로그램들이 바이오스와 부트로더이며 운영 체제는 하드웨어에 제한 없이 접근한다. 그리고 운영 체제가 다른 프로그램에 대한 제어권을 보낼 때 CPU를 보호 모드에 놓을 수 있다. - 메모리 관리
멀티프로그래밍 운영 체제 커널은 현재 프로그램이 이용하는 모든 시스템 메모리를 관리해야 한다. 이로써 어느 특정한 프로그램이 다른 프로그램이 이미 사용하고 있는 메모리와 상호 작용하지 않게 한다. 프로그램이 시분할하므로 각 프로그램은 메모리에 독립적으로 접근해야 한다. - 가상 메모리
수많은 운영 체제는 하드 디스크와 램에 분산된 메모리를 이용하여 마치 가상 메모리로 불리는 메모리 덩어리가 연속적인 것처럼 프로그램을 속일 수 있다.
페이징이나 세그먼테이션과 같은 가상 메모리 어드레싱을 이용하면 커널은 어느 메모리를 각 프로그램이 주어진 시간에 사용할 수 있게 할지 설정할 수 있다. 그러므로 운영 체제가 여러 개의 태스크에 같은 메모리 위치를 사용할 수 있게 한다.
프로그램이 접근할 수 있는 메모리 범위에 없는 메모리에 접근하려고 하지만 그곳에 할당되면 커널은 프로그램이 마치 할당된 메모리를 초과 사용한 것과 같은 방식으로 인터럽트 처리한다. 유닉스에서 이러한 종류의 인터럽트를 페이지 실패라고 부른다. 커널이 페이지 실패를 감지하면 이러한 문제를 일으킨 프로그램의 가상 메모리 영역을 수정하는 것이 일반적이다. 이로써 요청된 메모리에 프로그램이 접근할 수 있게 한다.
현대의 운영 체제에서 자주 접근하지 않는 메모리는 일시적으로 디스크나 다른 매체에 저장하여 다른 프로그램에게 사용할 수 있는 공간을 제공해 준다. 이를 스왑 처리(swapping)라고 하며 이를 통해 여러 개의 프로그램이 특정한 메모리 영역을 차지할 수 있다. - 멀티태스킹
멀티태스킹은 여러 개의 독립적인 컴퓨터 프로그램을 하나의 컴퓨터에 실행시키는 것을 가리킨다. 마치 태스크들이 동시에 수행하는 것처럼 보여 준다. 대부분의 컴퓨터가 한 번에 최대 한 두개를 수행할 수 있고 이는 일반적으로 시분할을 통해 수행된다. 다시 말해 각 프로그램은 컴퓨터의 실행 시간의 일부를 사용한다.
운영 체제 커널은 스케줄러라는 프로그램이 포함되어 있는데 이 프로그램은 얼마나 많은 시간을 각 프로그램이 실행에 소비하게 할 것인지를 결정하며 여기서 실행 제어권이 프로그램에 넘어갈 수 있게 한다. 제어권은 프로그램이 CPU와 메모리에 접근할 수 있게 하는 커널로 말미암아 프로세스로 넘어간다. 나중에 다른 프로그램이 CPU를 사용할 수 있게 하기 위해 제어권은 같은 메커니즘을 통하여 커널로 반환된다. 커널과 응용 프로그램 간의 제어권 이동을 이른바 문맥 교환이라고 부른다. - 디스크 접근 및 파일 시스템
파일 시스템은 디렉터리(폴더)를 이용하면서 사용자와 프로그램이 컴퓨터 파일을 정리하고 정렬할 수 있게 해 준다.
디스크에 저장된 데이터로 접근하는 것은 모든 운영 체제의 기본 기능이다. 컴퓨터는 더 빠른 접근, 더 높은 신뢰성을 위해, 또 드라이브의 남은 공간을 더 잘 이용하기 위한 특정한 방식으로 구조화된 파일을 이용하여 디스크에 데이터를 저장한다. 파일을 디스크에 저장하는 이러한 방식을 파일 시스템이라고 부르며 파일이 이름과 특성을 가질 수 있게 한다. 또, 이러한 파일들을 디렉터리 트리로 정렬되는 특정 계급의 디렉터리와 폴더에 저장하게 한다.
초기의 운영 체제는 일반적으로 한 종류의 디스크 드라이브와 한 종류의 파일 시스템을 지원하였다. 초기의 파일 시스템들은 용량, 속도, 또 파일 이름과 디렉터리 구조의 종류에 제한이 있었다. 이러한 제한은 설계된 운영 체제의 제한에 반영되므로 특정한 운영 체제가 하나 이상의 파일 시스템을 지원하는 것을 매우 어렵게 만들었다.
더 단순한 수많은 운영 체제들은 기억 장치의 시스템에 접근하기 위한 제한된 옵션들을 지원하였는데, 유닉스와 GNU/리눅스와 같은 운영 체제들은 가상 파일 시스템(VFS)이라는 기술을 지원한다. 유닉스와 같은 운영 체제는 공통 API를 통해 접근하는 파일 시스템이나 디자인에 관계 없이 다양한 기억 장치를 지원한다. 그러므로 프로그램을 개발할 때 장치 접근에 대한 정보를 공부하지 않아도 되게 한다. VFS는 다양한 파일 시스템에, 특정한 장치 드라이버와 파일 시스템 드라이버를 사용하여 프로그램들이 무제한의 장치에 접근할 수 있는 기능을 운영 체제에 제공한다.
연결된 하드 드라이브와 같은 기억 장치들은 장치 드라이버를 통해 접근한다. 장치 드라이버는 드라이브의 특정한 언어를 이해하고 이 언어를 운영 체제가 모든 디스크 드라이브에 접근할 때 사용하는 표준 언어로 번역할 수 있다. 유닉스에서 이를 블록 장치의 언어라고 한다. - 장치 드라이버
장치 드라이버는 하드웨어 장치들과 상호 작용할 수 있도록 개발된 특정한 종류의 컴퓨터 소프트웨어이다.
장치 드라이버의 주된 설계 목적은 추상화이다. 하드웨어의 모델은, 특히 같은 종류의 장치라 하더라도 각기 다르다. 제조업체들은 더 신뢰할만한, 더 나은 성능을 제공하기 위해 더 새로운 모델들을 출시하고 이러한 새로운 모델들은 다르게 동작하기도 한다. 컴퓨터들과 운영 체제들은 현재든 앞으로든 모든 장치를 어떻게 제어할 것인지 예측하는 것은 불가능하다. 이러한 문제를 해결하기 위해 운영 체제들은 반드시 어떠한 종류의 장치가 제어될 것인지를 지시하여야 한다. 그러면 장치 드라이버의 기능이 이러한 운영 체제의 함수 호출을 장치 특유의 호출로 번역하게 된다. 이론적으로 새로운 방식으로 제어되는 새로운 장치는 적절한 드라이버를 사용할 수 있는 상황이라면 올바르게 동작한다. 새로운 드라이버는 운영 체제의 관점에서 장치가 평소처럼 동작하과 있음을 보증하게 된다.
비스타 이전의 윈도우, 2.6 미만의 리눅스 버전에서는 모든 드라이버 실행이 협동적이어서, 드라이버가 무한 루프에 진입하면 시스템이 정지하는 일이 발생한다. 더 최근에 나온 운영 체제들은 커널 선점을 사용한다. 이 경우 태스크 제공을 위해 커널이 드라이버를 간섭하며 장치 드라이버로부터 응답을 받을 때까지 자신을 프로세스로부터 분리시키며 더 많은 태스크를 부여할 수 있다. - 네트워킹
현재 대부분의 운영 체제는 다양한 통신 프로토콜, 하드웨어, 응용 프로그램을 지원한다. 다시 말해, 서로 비슷하지 않은 운영 체제를 실행하는 컴퓨터가 자원(유무선 연결을 이용한 연산, 파일, 프린터, 스캐너)을 공유하기 위해 같은 망에 참여할 수 있다. 네트워크는 컴퓨터의 운영 체제가 원격 컴퓨터의 자원에 접근하는 데 필수적이다. 마치 리소스가 로컬 컴퓨터에 바로 연결되어 있는 것처럼 보이게 만들어 준다. 여기에는 컴퓨터의 그래픽, 사운드 하드웨어를 공유하거나 네트워킹 파일 시스템을 이용하는 등 단순한 통신에서 나오는 모든 것을 포함한다. 일부 네트워크 서비스는 컴퓨터의 자원을 투명하게 접근할 수 있게 한다. 이를테면 SSH는 네트워크로 이어진 사용자들이 컴퓨터의 명령 줄 인터페이스에 직접 접근할 수 있게 한다. - 보안
컴퓨터의 보안은 수많은 기술이 올바르게 동작하고 있는 지에 달려 있다. 또, 운영 체제는 보안을 위하여 특정 환경에 대한 권한을 사용자나 프로그램에 개별적으로 설정하고 인증 프로세스를 제공한다. 인터넷 보안은 특히 여러 사용자가 사용하는 시스템에 적절하다. 시스템을 사용하는 각 사용자는 개인 파일을 다른 사용자가 읽을 수 없게 할 수 있다. - 사용자 인터페이스
명령 줄의 한 예. 각 명령어는 프롬프트 뒤에서 입력하면 되며 이에 대한 출력은 아래에 나타난다. 현재의 명령 프롬프트가 아래에 있다.
그래픽 사용자 인터페이스의 한 예. 프로그램들은 화면 위에 그림의 모습을 띠고 있으며 파일, 폴더, 응용 프로그램들은 아이콘과 기호의 모습을 띤다. 마우스는 컴퓨터를 탐색하는 데 쓰인다.
어떠한 종류의 입력을 받는 모든 컴퓨터는 사람이 컴퓨터와 소통할 수 있게 하는 사용자 인터페이스가 필요하다. 키보드, 마우스와 같은 장치들이 이러한 역할을 하지만 사용자 인터페이스는 이를 위한 소프트웨어로 이루어진다. 사용자 인터페이스는 역사적으로 컴퓨터 명령어를 한 줄씩 입력해 나가는 명령 줄 인터페이스와 일반적으로 창, 단추, 아이콘을 이루는 시각 환경이 존재하는 그래픽 사용자 인터페이스로 나뉜다. - 그래픽 사용자 인터페이스
<nowiki /> 이 부분의 본문은 그래픽 사용자 인터페이스입니다.
현대의 대부분의 컴퓨터 운영 체제는 그래픽 사용자 인터페이스(GUI)를 지원한다. 마이크로소프트 윈도우와 맥 OS와 같은 일부 컴퓨터 시스템에서 GUI는 커널에 통합되어 있다.
기술적으로 그래픽 사용자 인터페이스는 운영 체제의 서비스가 아니지만 운영 체제 커널에 통합하면 GUI가 출력 명령을 수행하는 데 필요한 수많은 문맥 교환을 없앰으로써 GUI를 더 반응적으로 만들 수 있다. 다른 운영 체제로는 그래픽 하부 시스템을 커널과 운영 체제로부터 분리시키는 모듈성이 있다. 1980년대 유닉스에서 VMS 등은 이러한 방식으로 만들어진 운영 체제였다. GNU/리눅스 및 맥 OS X 또한 이러한 방식을 취한다. 윈도우 비스타와 같은 현대의 마이크로소프트 윈도우는 거의 사용자 공간에 위치한 그래픽 하부 시스템을 포함하고 있지만 윈도우 NT 4.0과 윈도우 서버 2003 버전 사이의 그래픽 구현 루틴은 거의 커널 공간에 존재한다. 윈도우 9x는 인터페이스와 커널 사이의 구별이 거의 없다.
수많은 컴퓨터 운영 체제는 사용자가 원하는 인터페이스를 만들어 설치할 수 있게 하고 있다. X 윈도 시스템을 GNOME이나 KDE와 함께 쓰면 유닉스 및 유닉스 계열 시스템에서 이러한 설정을 할 수 있다. 수많은 윈도우 셸 치환을 통해 마이크로소프트 윈도우에서도 이러한 작업을 수행할 수 있는데, 윈도우 셸을 교체하는 방식을 쓰지만 윈도우로부터 셸 자체를 분리할 수는 없다.
- 모드
https://ko.wikipedia.org/wiki/%EC%9A%B4%EC%98%81_%EC%B2%B4%EC%A0%9C
https://ko.wikipedia.org/wiki/%EB%B6%80%ED%8C%85
'IT 관련 지식 > 컴퓨터일반' 카테고리의 다른 글
[UX] 저니맵 (0) | 2023.02.26 |
---|---|
C++ (0) | 2022.08.17 |
AngularJS | Java | C (0) | 2022.08.14 |