이중 모드와 시스템 호출 운영체제는 응용 프로그램들이 자원에 접근하려할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호합니다. 예를 들어 프로그램 실행 중에 하드 디스크에 접근하여 데이터를 저장하려면 운영체제에 도움을 요청한 후, 운영체제가 커널 영역 내의 하드 디스크에 데이터를 저장하는 코드를 실행하여 응용 프로그램의 작업을 대신 수행합니다. 이러한 운영체제의 문지기 역할을 이중 모드라고 합니다. CPU가 명령어를 실행하는 방식을 사용자 모드 or 커널 모드로 구분하는 방식입니다. ① 사용자 모드 일반적인 응용 프로그램의 실행 모드. ② 커널 모드 커널 영역의 코드를 실행할 수 있는 모드.(자원 접근 명령) 이때 운영체제 서비스를 제공 받기 위해 (사용자 모드 → 커널 모드) or (커널 모드 →..
분류 전체보기
RAID란? 데이터의 안전성 혹은 높은 성능을 위해 여러 개의 하드 디스크나 SSD를 마치 하나의 장치처럼 사용하는 기술을 의미합니다. RAID 종류 1. RAID 0 여러 개의 보조기억장치에 데이터를 단순히 나누어 저장하는 구성 방식. 데이터를 분산하여 저장하는 것을 스트라이핑이라고 합니다. 단점: 저장된 데이터가 안전하지 않습니다. 여러 드라이브 중 하나에 문제가 생기면, 다른 모든 드라이브의 정보를 읽는데 문제가 발생합니다. 2. RAID 1 복사본을 만드는 방식. 동일한 데이터가 두 개 이상의 디스크에 동시에 저장되고, 하나의 디스크에 오류가 발생해도 다른 디스크의 데이터를 사용합니다. 이를 Mirroring 방식이라고 합니다. 단점: 디스크 개수가 한정되었을 때 사용 가능한 용량이 적어지는 단점..
낮은 전송률과 장치 컨트롤러 전송률이란 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표입니다. 전송률이 낮은 입출력 장치는 같은 시간동안 전송률이 높은 CPU, 메모리에 비해 적은 양의 데이터를 주고 받을 수 있어서 서로 간의 통신이 수월하지가 않겠죠. 이와 같은 이유로 입출력 장치는 컴퓨터에 직접 연결되지 않고 장치 컨트롤러(입출력 제어기, 입출력 모듈)라는 하드웨어를 통해 연결되어 컴퓨터 내부와 통신합니다. (장치 컨트롤러는 하나 이상의 입출력 장치와 연결) 1. 장치 컨트롤러의 역할 ① CPU와 입출력 장치 간 통신 중개 ② 오류 검출 ③ 데이터 버퍼링 : 버퍼라는 임시 저장 공간에 데이터를 조금씩 모았다가 한번에 전송 혹은 한번에 많이 받아 놓았다가 조금씩 전송하는 방법. 이를 통해 CPU..
명령어 사이클 프로그램은 수많은 명령어로 이루어져 있으며, CPU는 이 많은 명령어를 하나씩 처리합니다. 이때 프로그램 속 명령어들은 일정한 주기가 반복되며 실행되는데, 이 주기를 명령어 사이클이라고 합니다. 크게 인출 사이클과 실행 사이클로 구분합니다. ① 인출 사이클 메모리에 있는 명령어를 CPU로 가지고 오는 단계 ② 실행 사이클 인출한 명령어를 실행하는 단계 인출한 명령어를 바로 실행이 가능한 경우가 있지만 메모리 접근이 더 필요한 경우 간접 사이클이 포함될 수 있습니다. 인터럽트 인터럽트란 CPU의 작업을 방해하는 신호입니다. 어떤 상황에서 인터럽트가 발생하느냐에 따라 동기 인터럽트와 비동기 인터럽트로 나뉩니다. 통상적으로 인터럽트는 비동기 인터럽트를 의미합니다. 1. 동기 인터럽트 CPU가 실..
앞선 포스팅에서 CPU는 메모리에 저장된 명령어를 읽고, 해석하고, 실행하는 장치라 했습니다. 그리고 CPU 내부에는 계산기인 ALU, 명령어를 읽고 해석하는 제어장치, 작은 임시 저장 장치인 레지스터라는 구성 요소가 있습니다. 이번 장에서는 각 구성요소와 CPU 작동 원리를 학습합니다. ALU ALU는 계산기입니다. 1 + 2라는 계산을 위해서는 1, 2라는 피연산자와 +라는 수행 연산이 필요합니다. 그래서 ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들입니다. 그렇다면 ALU가 반환하는 정보는 무엇일까요? ① 수행 결과 수행 결과는 특정 숫자나, 문자, 메모리 주소가 될 수 있습니다. 그리고 이 결괏값은 바로 메모리에 저장되지 않고 일시적으로 ..
정보의 표현 컴퓨터가 받아들이고 처리하는 정보의 종류로는 프로그램 코드(program code)와 데이터(data)가 있습니다. 컴퓨터에서 그러한 정보들은 모두 2진수(binary)를 나타내는 비트(bit)들의 조합으로 표현됩니다. ※ 2진수로 음수 표현하는 방법 → "2의 보수"를 이용 양수를 음수로 표현할 때 2진수의 모든 비트를 뒤집고(1→0, 0→1), 1을 더하는 방법. 11 = 01101(2) -11 = 10010 + 1 = 10011(2) ※ 2진수로 문자 표현하는 방법 → "인코딩, 디코딩"을 이용 대표적인 인코딩 방법: UTF-8(모든 나라의 언어를 1~4 바이트로 표현하는 방법) 컴퓨터 프로그램은 C, Python 등과 같은 고급 언어를 이용해서 작성되며, 이를 컴파일러(Compiler..
컴퓨터는 프로그램 코드들을 정해진 순서대로 실행(execute)하는데, 그 과정에서 필요한 데이터를 읽어서(read), 처리(processing)하고, 결과를 저장(store)합니다. 메모리 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품입니다. 프로그램이 실행되면 해당 프로그램을 구성하는 명령어와 데이터가 메모리에 올라오는 것이죠. 메모리에는 저장된 명령어, 데이터의 위치는 주소를 통해 알 수 있습니다. CPU CPU는 프로세서(processor)라고 불리기도 하며, 메모리에 저장된 명령어를 읽어 들이고, 읽어들인 명령어를 해석하고, 실행하는 부품입니다. '프로그램의 실행'과 '데이터 처리'라는 중추적인 기능의 수행을 담당합니다. CPU의 역할과 작동 원리를 이해하기 위해서는 CPU ..
원형 리스트 연결 리스트의 꼬리 노드가 다시 머리 노드를 가리키는 모양입니다. 이중 연결 리스트 연결 리스트는 next 필드를 통해 뒤쪽 노드를 찾기는 쉬운 반면, 앞쪽 노드를 찾기 어렵습니다. 이 단점을 개선한 이중 연결 리스트는 뒤쪽 노드에 대한 포인터 뿐만 아니라 앞쪽 노드에 대한 포인터를 포함합니다. 원형 이중 연결 리스트 위 두 개념을 합친 연결 리스트입니다. 노드는 다음과 같이 앞쪽 포인터와 뒤쪽 포인터를 포함합니다. class Node: """원형 이중 연결 리스트용 노드 클래스""" def __init__(self, data: Any = None, prev: Node = None, next: Node = None) -> None: """초기화""" self.data = data self.p..
배열로 구현한 연결 리스트의 한계 [a, b, c, d]의 배열에서 a와 b 사이에 e을 삽입한다면 c, d를 하나씩 뒤로 이동해야합니다. 삭제하는 경우에도 마찬가지로 데이터를 옮겨야 하므로 효율적이지 않습니다. 파이썬의 연결 리스트 연결 리스트는 임의의 위치에 원소를 삽입하거나 삭제할 때 빠르게 수행할 수 있다는 장점이 있지만, 메모리와 속도 면에서는 배열보다 효율이 떨어집니다. 파이썬의 리스트는 이러한 연결 리스트의 자료구조가 아니라 모든 원소를 연속으로 메모리에 배치하는 '배열'로 내부에서 구현하고 있습니다. 그러므로 속도가 급격히 떨어지지는 않습니다. 또 원소를 하나씩 추가/삽입 시 내부에서 메모리를 해제하거나 확보하지 않습니다. 실제 필요한 메모리보다 여유 있게 미리 마련하기 때문입니다. 포인터..
일반적으로 파이썬에서 문자열 검색을 하려면 표준 라이브러리(in, not in)를 사용하는 것을 추천하지만, 사용하지 않는다면 브루트 포스법이나 보이어-무어법을 사용하는 경우가 많습니다. 보이어-무어법 KMP법보다 효율적이어서 실제 문자열 검색에서 널리 사용됩니다. 패턴의 끝 문자에서 시작하여 앞쪽을 향해 검사를 수행합니다. 이 과정에서 일치하지 않는 문자를 발견하면 미리 준비한 표를 바탕으로 패턴이 이동하는 값을 결정합니다. ① ABCXDEZCABACABAC에서 ABAC를 검색하는 과정 ② 텍스트와 패턴의 첫 문자를 위아래로 나란히 놓고 패턴의 마지막 문자 C에 집중합니다. X는 패턴 안에 포함되어 있지 않습니다. 패턴을 오른쪽으로 한칸씩 이동해도 말이죠. ③ 한번에 오른쪽으로 4칸을 밀어서 다음과 같..