이 글의 사진과 내용은 공룡책 과 컴퓨터학부 수업인 운영체제 강의자료를 기반으로 작성했습니다.
Processor와 Memory 부분이 컴퓨터 내부장치에 해당하고, 입출력 장치을 컴퓨터 외부장치라 부른다.
컴퓨터는 외부장치에서 내부장치로 데이터를 읽어와 각종 연산을 수행한 후, 그 결과를 외부장치로 다시 내보내는 방식으로 업무를 처리한다.
이때 컴퓨터 내부로 데이터가 들어오는 것을 입력(input)
이라 하고, 컴퓨터 외부 장치로 데이터가 나가는 것을 출력(output)
이라고 한다.
메모리 및 입출력 장치 등의 각 하드웨어 장치에는 컨트롤러
라는 것이 붙어 있다.
컨트롤러는 각 하드웨어 장치마다 존재하면서 이들을 제어하는 작은 CPU라고 할 수 있다.
OS는 컴퓨터가 부팅되었을 때부터 항상 수행되면서 각종 자원들을 관리해야 하므로 항상 메모리에 올라가 있다.
하지만 OS의 모든 코드를 다 메모리에 상주시키면 메모리의 낭비가 발생하게 된다. 따라서 OS 중 항상 메모리에 올라가 있는 부분은 전체 OS 중 핵심적인 부분에 한정되며, 이 부분을 커널(kernel)
이라고 한다.
Dual Mode in OS by setting mode bit
시스템의 중요한 동작들을 OS
가 관리한다.
Why dual mode(or multi-mode)?
OS 그 자체와 다른 시스템의 구성요소들을 보호하기 위해서다.
Timer가 동작되면 기존 프로그램을 멈춘 다음, User 모드에서 Kernel 모드로 이동시킨 후 그 다음 프로그램을 수행시킨다.
User program이 CPU를 독점(monopolizing)
하는 것을 막아준다.
시분할 시스템(time-sharing system)
구현에 사용된다.
컴퓨터에서 연산을 한다는 것은 CPU가 무언가 일을 한다는 뜻이다.
각 장치마다 이를 제어하기 위해 설치된 장치 컨트롤러는 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리를 가지고 있는데, 이를 로컬버퍼(local buffer)
라고 부른다.
디스크나 키보드 등에서 데이터를 읽어오는 경우, 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다.
이때 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러(controller)가 담당한다.
로컬버퍼로 읽어오는 작업이 끝났는지를 메인 CPU가 지속적으로 체크하는 것이 아니라 장치에 있는 컨트롤러가 인터럽트를 발생시켜 CPU에 보고하게 된다.
이때 인터럽트(interrupt)
란 컨트롤러들이 CPU의 서비스가 필요할 때 이를 통보하는 방법을 말한다.
기본적으로 CPU는 매 시점 메모리에서 명령(instruction)을 하나씩 읽어와서 수행한다.
이때 CPU 옆에는 인터럽트 라인(interrupt line)
이 있어서, CPU가 자신의 작업을 하던 중간에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리한다.
즉, CPU는 명령 하나를 수행할 때마다 인터럽트가 발생했는지 확인한다.
OS는 각종 HW 및 SW 자원 관리뿐 아니라 사용자 프로그램에 필요한 서비스도 제공한다. 그 중 한가지가 인터럽트 처리루틴이다.
CPU는 하던 일을 잠시 멈추고 이 인터럽트가 발생하였을 때 OS 커널 내에서 해당 인터럽트의 처리를 위해 정의된 코드를 찾아 수행한다.
이때 수행하는 일은 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해두는 일이다.
OS는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터(interrupt vector)
를 가지고 있다.
인터럽트 벡터
란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조를 말한다.
실제 처리해야할 코드는 인터럽트 처리루틴(interrupt service routine) 또는 인터럽트 핸들러(interrupt handler) 라고 불리는 다른 곳에 정의된다.
Software interrupt 또는 Internal interrupt
Trap
의도적이다.
예시) system call
이벤트 수행하고 나면 “next” 명령으로 간다.
Fault
의도치 않는 실수이지만 복구 가능하다.
예시) page fault
“current” 명령을 재수행하거나 중단한다.
Abort
의도치 않는 실수이고 복구 불가능하다.
예시) illegal instruction
현재 프로그램이 멈춘다.
인터럽트 핸들링(interrupt handling)이란 인터럽트가 발생한 경우에 처리해야 할 일의 절차를 의미한다.
OS는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어블록
(Process Control Block: PCB)이라는 자료구조를 둔다.
PCB는 각각의 프로그램마다 하나씩 존재하며 해당 프로그램의 어느 부분이 실행 중이었는지를 저장하고 있다.
프로그램 A가 실행되던 중에 인터럽트가 발생하면 A의 현재 상태를 PCB에 저정한 후 CPU의 제어권이 인터럽트 처리루틴으로 넘어가게 되며, 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 이어지게 되는 것이다.
동기식 입출력은 프로그램 A가 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 프로그램 A의 후속 작업을 수행할 수 있는 방식을 말한다.
동기식 입출력에서 CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원을 낭비하게 된다.
DMA(Diredt Memory Access)
원칙적으로 메모리는 CPU에 의해서만 접근할 수 있는 장치이다.
CPU 외의 장치가 메모리의 데이터에 접근하기 위해서는 CPU에게 인터런트를 발생시켜 CPU가 이를 대행하는 식으로만 가능하다.
하지만, 컨트롤러가 CPU에게 인터럽트를 발생시키면 CPU는 컨트롤러의 로컬버퍼와 메모리 사이에서 데이터를 옮기는 일을 하게 된다.
모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU의 업무가 방해를 받게 되어 CPU 사용의 효율성이 떨어지는 문제점을 발생하게 된다.
이러한 비효율성을 극복하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 DMA
라고 부른다.
DMA는 일종의 컨트롤러로서, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역할을 한다.
이때 DMA는 블록(block) 이라는 큰 단위로 정보를 메모리로 읽어온 후에 CPU에게 인터럽트를 발생시켜서 해당 작업의 완료를 알려준다.
이러한 방식으로 CPU에게 발생하는 인터럽트의 빈도를 줄여 CPU를 좀 더 효율적으로 관리하고 입출력 연산을 빠르게 수행할 수 있게 된다. (interrupt 낮추고, CPU 성능 높이는)
Northbridge(= Memory Controller Hub) : PC motherboard 에 있는 핵심 로직 칩셋에서 두개의 칩 중 하나이다.
CPU, Memory, Graphic card에 직접적으로 연결 O
매우 빠른 의사소통을 처리한다.
PCle bus를 통해 “southbridge”로 연결된다.
Southbridge(= I/O Controller Hub) : 모든 컴퓨터 I/O 기능들을 관리하는 칩이다.
USB, audio, serial, BIOS 등등
CPU에 직접적으로 연결 X
정규 표현식
은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. -위키백과-어떤 텍스트 내에서 특정한 형태나 규칙을 가진 문자열 을 찾기 위해 그 형태나 규칙을 나타내는 패턴을 정의하는 식이다.
Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용된다.
Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있다.
Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("^[a-zA-Z]*$"); //영문자만
String val = "abcdef"; //대상문자열
Matcher matcher = pattern.matcher(val);
System.out.println(matcher.find());
}
}
위 예제는 Matcher 클래스의 find() 메서드를 활용하여 대상문자열이 영문자인지 검증하는 예제이다.
영문자가 맞다면 ture 그렇지 않다면 false가 출력된다.
우아한테크코스에서 왼손님과 포비님이 유튜브로 진행한 코수타에서
제 기준으로 중요한 내용 혹은 알면 좋은 내용들을 정리해봤습니다.
자세한 얘기를 듣고 싶은 분들은 아래의 링크(URL)를 통해 들어주시면 좋을 것 같습니다!
스스로 문제를 해결하자.
취업 준비생을 위한 10개월간 무료교육과정
현장지향형 교육 운영
독학으로 3~6개월간 독학한 친구들이 프리코스를 참여한다면, 합격할 수 있다고 본다.
함께 하는 교육자분들이 현장 경험이 최소 2년 이상인 게 장점이라 본다.
level 1,2는 과제 진행 → 현장 개발자들에게 1대1 코드 리뷰를 받아볼 수 있다.
강의식, 이론 기반보다는 실무+능동+주도적인 교육기관이다.
과제 기반 교육을 운영
강의는 최소한으로 할 예정
*짧은 기간 동안 코드에 대해서 읽기 좋은, 유지 보수, 리팩토링 → 경험들을 배울 것임.
함께 성장, 학습하기 위해서 만든 커뮤니티.
peer 코드 리뷰 - 서로 의견 공유
아고라 - 학습에 관련한 토론, 질의응답
학습 컨텐츠 공유 - 내가 학습을 해서 블로그나 외부 학습자료를 공유
스스로 먼저 해보는게 중요하다. (자기주도학습)
2주차 첫번째 부터 시작한다.(11월 1일)
1주차 끝난 이후에, 코치분들이 공통 피드백을 나갈거다.
다음 주차에 공통 피드백을 반영할 예정이다.
이 글의 사진과 내용은 공룡책 과 컴퓨터학부 수업인 운영체제 강의자료를 기반으로 작성했습니다.
OS
는 컴퓨터 하드웨어 바로 윗단에 설치되는 소프트웨어.
각종 SW들은 위의 그림과 같이 HW와 OS가 한 몸으로 존재하는 컴퓨터 시스템 위에서 수행되는 것으로 볼 수 있다.
컴퓨터 전원을 On 하면, OS는 이와 동시에 실행된다.
OS 중 항상 필요한 부분만을 전원이 On과 동시에 메모리에 올려놓고 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용하게 된다.
이때 메모리에 상주하는 운영체제의 부분을 커널(kernel)
이라고 부르며 이를 좁은 의미의 운영체제라고도 부른다.
즉 커널은 운영체제 코드 중에서도 핵심적인 부분을 뜻한다.
컴퓨터 HW와 User 사이에 OS가 존재하므로, OS의 역할은 HW를 위한 역할
과 User를 위한 역할
의 두 가지로 나누어볼 수 있다.
HW
쪽에서는 User가 직접 다루기 힘든 각종 HW를 OS가 관리하는 역할을 하며, User
에게는 편리한 Interface를 제공하는 역할을 한다.
OS의 두 가지 주요 기능
[1] 컴퓨터 시스템 내의 자원을 효율적으로 관리하는 것 -> 중요한 핵심 기능
[2] .컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공하는 것
OS를 자원관리자(resource manager)
라고 부르기도 한다.
자원
이란 CPU, Memory, HardDisk 등 HW 자원뿐 아니라 SW 자원까지를 통칭해서 부르는 말이다.OS는 사용자 및 프로그램들 간에 자원이 형평성 있게 분배되도록 하는 균형자
역할도 함께 수행해야 한다.
효율성이 가장 큰 목표이지만 이로 인해 일부가 지나치게 희생되지 않게 하는 형평성 역시 OS가 고려해야할 목표이다.
이 밖에도 OS는 사용자와 OS 자신을 보호하는 역할을 담당하기도 한다.
OS를 분류하는 기준 동시 작업
이 있다.
동시 작업을 지원하는 여부
단일작업용 OS : 한 번에 하나의 프로그램만 실행 시킬 수 있다.
다중작업용 OS : 2개 이상의 프로그램을 처리할 수 있다.
OS가 다중작업을 처리할 때에는 여러 프로그램이 CPU와 메모리를 공유하게 된다. 참고로 컴퓨터 1개당 CPU는 1개만 존재한다.
하지만, CPU의 처리 속도가 워낙 빨라 짧은 시간의 규모로 여러 프로그램들이 CPU에서 번갈아 실행된다. 그렇기 때문에 사용자 입장에서는 여러 프로그램이 동시에 실행되는 것처럼 보인다. 이와 같이 CPU의 작업시간을 여러 프로그램들이 조금씩 나누어 쓰는 시스템을 시분할 시스템
이라고 부른다.
CPU와 달리 메모리
의 경우 여러 프로그램들이 조금씩 메모리 공간을 보유하며 동시에 메모리에 올라가 있을 수 있다.
이처럼 메모리 공간을 분할해 여러 프로그램들이 동시에 메모리에 올려놓고 처리하는 시스템을 다중 프로그래밍 시스템
이라고 부른다.
다중작업용 OS경우 여러 프로그램을 같이 실행시키지만
대화형 시스템
이라고 부른다.다중작업, 시분할, 다중 프로그래밍, 대화형 시스템은 모두 여러 프로그램이 하나의 컴퓨터에서 동시에 실행된다.
다중처리기 시스템
은 하나의 컴퓨터 안에 CPU가 여러 개 설치된 경우를 뜻하므로 앞의 용어들과는 의미가 다르다.
CPU가 여럿 있는 컴퓨터는 서로 다른 CPU에서 여러 프로그램이 동시에 실행될 수 있어 처리가 더욱 빨라지지만,
OS를 분류하는 또다른 기준은다중 사용자에 대한 동시 지원
이다.
OS를 분류하는 또 다른 기준은 작업을 처리하는 방식
이다.
코드가 많아지고 길어질수록 나중에 기능을 수정할때마다 코드를 갈아엎어야 하는 경우가 많다.
한마디로 유지보수가 너무 불편한 경우가 있다.
그래서 프로그래머들이 유지보수성, 애플리케이션의 확장성, 그리고 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지는 효과를 가질 수 있기 때문에 Spring MVC라는 구조를 만들었다.
Model : 데이터와 관련된 부분
View : 사용자한테 보여지는 부분
Controller : Model과 View를 이어주는 부분
Model은 Controller와 View에 의존하지 않아야 한다.(Model 내부에 Controller와 View에 관한 코드가 있으면 안된다.)
View는 Model
에만 의존해야하고, Controller에는 의존하면 안된다. (View 내부에 Model 코드만 있을 수 있고, Controller 코드는 있으면 안된다.)
View가 Model로부터 데이터를 받을 때, 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
Controller는 Model
과 View
에 의존해도 된다.(Controller 내부에는 Model과 View의 코드가 있을 수 있다.)
View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.