티스토리 뷰
노트북, 컴퓨터, 스마트 폰 등 IT 장비에서 실행하는 애플리케이션은 기능만 올바르게 동작만 하면 문제없습니다. 하지만, 애플리케이션이 많이 실행되면, IT 장비에 부하가 발생하게 됩니다. 부하가 발생하면, 어떻게 될까요? IT장비가 먹통이 되고, 전원을 껐다가 다시 키면 해결됩니다. 왜 전원을 다시 껐다가 다시 키면 정상적으로 다시 동작할까요? 이러한 호기심에 대한 답은 운영체제입니다. 운영체제는 컴퓨터를 구성하는 장비를 제어하는 소프트웨어입니다.
이번 포스팅에서는 운영체제의 개념 및 역할에 대해 설명하겠습니다.
운영체제의 정의
일반적으로 운영체제가 무엇이냐고 물으면, 대부분 GUI(Graphic User Interface)가 있는 윈도우, 안드로이드, IOS, 리눅스 등을 운영체제라고 말할 것입니다. 윈도, 안드로이드, IOS, 리눅스의 공통점은 무엇일까요? 공통점이 무엇인지 생각해보면서 아래 내용을 읽어보시면, 한결 쉽게 이해하실 수 있습니다.
운영체제는 관점에 따라 정의가 나누어집니다. 일반 사용자 관점에서는 시스템을 조작하기 위한 터치스크린, 음성인식, GUI 화면이 운영체제로 인식될 수 있으며, 시스템 관점에서는 CPU, I/O 메모리, 메모리 공간관리 등을 수행하는 자원 할당자(Resource Allocator)가 운영체제가 됩니다. 일반 사용자 관점에서는 여기까지만 OS의 정의를 읽어도 문제가 없습니다. 하지만 운영체제를 시스템 관점으로 이해한다면, 애플리케이션을 효율적, 효과적, 안전하게 개발하고 운용할 수 있습니다.
컴퓨터 사용자는 크롬, 카카오톡, 웹 브라우저 등 애플리케이션 프로그램을 조작하고, 애플리케이션은 운영체제에게 실행을 요청하고, 운영체제는 사용 가능한 컴퓨터 하드웨어의 자원을 이용하여 애플리케이션에서 요청한 작업을 수행하고 응답합니다. 유저, 애플리케이션, 운영체제, 하드웨어 간 상호작용하면서 컴퓨터가 동작합니다.(아래 그림 참조)
컴퓨터 - 유저 상호작용(Interaction)
- 하드웨어 : CPU, I/O, Memory와 같은 자원
- 애플리케이션 프로그램 : 하드웨어 자원으로 문제를 해결하는 수단
- 유저 : 애플리케이션 프로그램을 사용하는 사람
- 운영체제 : 하드웨어 자원을 애플리케이션에게 적절히 배분해주는 수단
운영체제의 역할
앞서 시스템 관점의 운영체제는 자원 할당자라고 정의하였습니다. 애플리케이션을 실행한다는 것은 CPU, Memory, Disk 등 자원(=Resource)을 사용한다는 것을 의미합니다. 수많은 애플리케이션이 컴퓨터 자원을 사용하기 위해, 각 구성요소들이 어떻게 자원 사용 여부를 서로 알릴 수 있을까요? 컴퓨터 시스템의 구성요소를 살펴보겠습니다. 컴퓨터는 CPU, Memory, Disk 장치가 있고, 이들은 서로 Bus라는 것으로 이어져 있습니다. 각 구성요소는 Bus를 통해 전기신호를 주고받아 서로 필요에 따라 제어합니다. CPU는 프로그램을 실행하고, 저장할 데이터는 메모리 또는 Disk에 저장됩니다. 사용자는 모니터를 컴퓨터의 동작을 확인하며 마우스, 키보드를 조작하며, 사용자와 운영체제는 서로 계속 상호작용 합니다.
CPU, I/O 컨트롤러
CPU는 Disk, Memory 등 주변 장치로부터 신호를 주고받아야 하는데, 어느 특정 장치의 작업이 완료될 때까지 계속 기다린다면, 컴퓨터는 어느 한 장치 때문에 아무런 작업을 수행할 수 없게 됩니다. 작업을 요청하고, 응답이 올 때까지 계속 기다는 처리 방식을 동기식(Synchronous)이라고 하며, 작업을 요청하고, 응답이 올 때까지 기다리지 않는 다른 작업을 수행하다가 응답이 왔을 때, 그때 다시 처리하는 방식을 비동기식(Asynchronous)이라고 합니다.
컴퓨터 시스템이 비동기식으로 처리할 수 있는 원리는 무엇일까요? 바로 인터럽트(Interrupt)라는 기능을 지원하기 때문에 컴퓨터 구성요소들은 비동기식으로 동작이 가능합니다. CPU 이외의 장치들을 I/O Controller라고 부릅니다. 인터럽트의 동작원리는 먼저, CPU가 I/O 컨트롤러에게 요청을 하고, I/O 컨트롤러는 작업을 수행합니다. 다음으로, I/O 컨트롤러는 작업이 완료된 후 상태에 해당하는 ready, output, complete, error 신호를 생성하여 CPU에게 전송합니다. CPU는 I/O 컨트롤러의 신호를 받기 전에는 다른 명령어들을 실행을 하다가, I/O 컨트롤러로부터 신호를 받으면 그때 서야 I/O 응답에 대한 작업을 처리합니다.
Interrupt
- Interrupt : CPU에게 Event를 알려 이를 처리하도록 하는 메커니즘
- Interrupt Service Routine : Interrupt 신호가 발생할 경우, 처리해야 하는 일련의 과정
- Interrupt Vector : 인터럽트 서비스 루틴의 시작 주소를 저장하고 있는 Index Table
- Interrupt 동작 방식 : CPU가 유저 프로그램 실행 도중 인터럽트 신호가 발생하면, Interrupt Vector를 참조하여 Interrupt Service Routine을 찾아서 실행한 후 인터럽트 처리가 완료되면, 다시 실행하던 유저 프로그램을 실행함 (비동기 Events 처리)
- 중요 처리 작업을 진행할 때 인터럽트가 발생한 경우, 즉시 처리용 인터럽트, 후순위 처리 인터럽트를 구분하여 처리, 우선순위를 부여하여 처리
- 여러 장치로부터 인터럽트 요청이 왔을 때, 모든 인터럽트 처리 루틴을 다 확인해야 하는가? 인터럽트 벡트 테이블 이용, Chainning 구조로 처리 루틴 실행
스토리지 (Stroage)
애플리케이션은 CPU에 의해 실행되는 명령어의 집합이 볼 수 있고, 명령어는 디스크에 저장되어 있습니다. 애플리케이션이 실행될 때, 디스크에 저장된 프로그램이 메인 메모리로 인출(Fetch)되고, CPU는 메인 메모리에 저장된 명령어를 가져와서 실행합니다.
운영체제도 마찬가지로, 컴퓨터의 전원이 켜지면 메인 메모리에 저장되어 CPU에 의해 하나씩 실행되는 구조입니다. 컴퓨터가 켜질 때 가장 먼저 실행되는 프로그램을 Bootstrap program이라고 부르며, 주로 운영체제를 메인 메모리로 옮기는 역할을 합니다.
RAM은 전원이 차단되면 저장 내용이 삭제되는 휘발성이 있고, ROM은 전원이 차단되어도 삭제되지 않는 비휘발성이 있습니다. 전원이 켜지면 운영체제를 로딩해야 하는 고정적인 일을 수행하는 부트스트랩 프로그램은 EEPROM에 저장되어있습니다.
CPU가 프로그램을 실행하는 일련의 과정은 아래와 같습니다.
- Fetch(메인 메모리에 저장된 명령어를 CPU의 Register로 인출하는 과정)
- Encode (명령어의 Operand를 메인 메모리로부터 인출하여 Register에 저장하는 과정)
- Execute (명령어와 Operand를 가지고 실행) 과정으로 실행됨
- Store (명령어 실행 결과를 다시 메인 메모리에 저장함)
메인 메모리에는 산술 연산, 논리 연산, 주소 계산과 같은 명령어와 숫자, 문자와 같은 데이터가 저장되어 있는데, 데이터와 명령어를 같이 저장하는 구조를 폰 노이만 구조라고 하고, 데이터와 명령어를 분리해서 저장하는 구조를 하버드 구조라고 합니다. 폰 노이만 구조는 명령어와 데이터를 같은 공간에 저장하다 보니, 병목현상이 발생합니다.
메모리의 종류를 살펴보면 CPU안에 있는 Register와 Cache, 주기억장치애 해당하는 RAM, 보조기억장치인 HDD, SSD가 있습니다. 속도는 CPU와 가까이 위치할수록 빠릅니다. Register > Cache > Main Memory > SSD > HDD 순으로 메모리의 속도가 빠릅니다. 메모리의 속도는 입력과 출력(Input & Output)의 시간이 짧을수록 성능이 좋다고 말합니다.
정리해보면, 운영체제는 CPU, I/O 컨트롤러, 스토리지 제어를 통해, 애플리케이션이 원활하게 구동될 수 있도록 최적의 실행 환경을 유지하는 역할을 합니다. 운영체제가 제 역할을 하지 못한다면, 애플리케이션은 원활하게 구동되지 않고 사용자는 시스템이 자주 멈추는 현상을 겪게 됩니다.
'IT 기술' 카테고리의 다른 글
클린코드 작성원칙(Naming, Style,주석, DeadCode,Method, SOLID) (0) | 2022.07.19 |
---|---|
멀티 프로세서와 멀티 코어의 차이점 (0) | 2022.07.18 |
Oracle Database 메모리 구조 (PGA, SGA) (0) | 2022.07.16 |
Notion으로 업무 일정 관리하기 (0) | 2022.07.15 |
TCP/UDP 통신의 특징 (0) | 2022.07.14 |
- Total
- Today
- Yesterday
- AWS
- iframe 태그 찾기
- token
- API Gateway 캐싱
- 스프링부트빌드
- 멀티코어 멀티프로세서
- MPA
- springboot build
- 테스팅 자동화
- 디자인패턴
- 디자인패턴 구조패턴
- springboot 실행
- 스프링부트실행
- codesmell 유형
- selenium
- SPA
- TCP/UDP
- notion
- 스프링부트 restapi
- python
- 코드스멜 유형
- oracle pga sga
- OSI 7계층
- 클린코드작성원칙
- springboot restapi
- 클린코드작성법
- notion 업무일정관리
- springboot rest api 서버
- oracle 메모리
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |