CPU라는 하드웨어 자원을 여러 프로세스들이 효율적으로 사용하기 위해, 스케줄링 과정이 필요하다. 다음에 실행할 프로세스를 선택하는 알고리즘을 통해 스케줄링을 하게 된다. 상황에 따라 효율적인 CPU 스케줄링이 오히려 성능 감소를 야기 할 수 도 있다. Scheduling Critria CPU 스케줄링의 효율성을 판단하는 기준은 다음과 같다. CPU Utilizaiton Throughput Turnarround Time Wating Time Response Time Preemptive VS Non-Preemptive 다양한 CPU 스케줄링을 알기에 앞서 선점(Preemptive), 비선점(Non-Preemptive) 방식에 대한 이해가 필요하다. Preemptive 선점은 말그대로 특정 프로세스가 CPU..

프로세스 메모리에 할당되어 실행중에 있는 프로그램 (program in execution)을 말한다. 프로그램은 일반적으로 저장장치에 저장되어 아무일도 하지 않는 상태이다. 프로세스를 job, task 등으로 말하기도 한다. 프로세스 상태 New : 저장장치로 부터 프로그램을 메모리에 할당한 경우이다. Ready : New 상태에서 초기화 과정 후 실행할 준비가 완료되거나, Running 상태에서 인터럽트가 발생한 경우이다. Running : 스케줄러를 통해 다음에 실행될 프로세스로 선택된 경우 Running 상태로 바뀌어 작업을 수행한다. Wating : I/O와 이벤트를 처리하는 것은 지연시간이 크므로 이와 같은 경우 Waiting 상태 후 다시 Ready로 간다. Terminated : 프로세스를 ..

운영체제를 이용하는 모든 사용자가 별도의 권한을 확인하지 않고, 파일을 저장할 수 있다면 어떻게 될까? 악의적인 프로그램을 실행할 경우 타인의 저장공간을 침범하여 데이터를 손실시킬 수 있는 상황이 발생할 수 도 있다. 또한, 운영체제를 종료하는 명령어와 같은 실행시 치명적인 명령어를 사용할 경우도 비슷한 상황이 발생한다. Dual Mode 운영체제는 특권 명령(Privileged Instructions)을 지정하고 일반 사용자는 사용하지 못하게 막았다. Applications에서 특권 명령 사용이 필요할 경우 인터럽트를 발생시켜 kernel mode에 진입 후, 운영체제를 통해 처리하고자 하는 작업을 처리한다. (특권 명령이 사용 가능한 kernel mode와 반대인 user mode는 CPU 레지스터에..

운영체제란? 운영체제는 컴퓨터의 자원들을 사용할 수 있는 환경을 제공한다. 다양한 하드웨어를 사용할 수 있도록 편의성을 제공한다. 다수의 사용자가 사용하거나, 여러 개의 프로그램이 실행될 경우 적절히 실행되도록 관리한다. 즉, 컴퓨터의 하드웨어의 관리와 사용자가 적시적재에 사용할 수 있는 환경을 제공한다. 부팅(Booting) 컴퓨터 부팅 과정은 크게 2가지로 나뉘게 된다. 첫번째는 POST(Power-On-Self-Test)를 통해 컴퓨터의 각 장치에 대한 점검을 진행하는 과정이다. 두번째는 부트로더(Boot loader)를 통해 저장장치 내에 운영체제와 관련된 데이터를 메모리에 적재하는 과정이다. 위의 과정을 마치게 되면 정상적으로 운영체제를 사용할 수 있다. 운영체제의 계층적 위치 운영체제의 계층적..
정렬 방식 자주 사용하는 정렬 방식은 크게 2가지로 나눌 수 있다. 첫 번째로 2중 반복문을 사용하는 Bubble, Select, Insert 정렬이다. 두 번째는 분할-정복 방법을 사용하는 병합, 퀵 정렬이다. 2중 반복문을 사용하는 정렬 방식 해당 방식은 최악의 경우 시간복잡도는 O(N^2)이 된다. 이와 같은 이유는 2개의 반복문을 통해 값을 비교하기 때문이다. Bubble Sort 서로 인접한 두 원소를 검사하여 정렬하는 방식을 사용한다. swap이 더 이상 발생하지 않으면, 중단하여 불필요한 반복문을 실행하지 않을 수 있다. def bubble_sort(nums): for i in range(len(nums)): swap = False for j in range(1, len(nums)): if ..

그래프 탐색 방법 그래프를 탐색하는 방법중 DFS(Depth First Search와 BFS(Breadth First Search)를 간단한 예시를 통해 이해하고자 한다. 두 방식은 각각 Stack과 Queue를 통해 구현할 수 있으며, 그래프 방문 여부를 체크하여 중복으로 탐색하는 것을 방지하여야 한다. 그래프를 코드로 나타내기 그림 1의 그래프에 대한 노드 정보를 코드로 나타내면 다음과 같다. graph = { 'A': ['B', 'C'], 'B': ['A', 'D'], 'C': ['A', 'E', 'F'], 'D': ['B', 'G'], 'E': ['C', 'H'], 'F': ['C'], 'G': ['D'], 'H': ['E'], } DFS 그림 2는 루트 노드를 시작으로 모든 그래프 경로를 탐색하..

Recursion? 재귀는 특정 함수 내에서 함수 자신을 다시 호출하는 것을 의미한다. 재귀는 Stack의 특성을 그대로 반영하여, 가장 최근에 호출된 함수 부터 처리되는 방식으로 진행된다. 재귀를 잘 다룰 수 있다면 DFS와 백트래킹, 트리 탐색과 같은 문제를 해결 할때 효율적으로 접근할 수 있게 된다. 이진 트리 순회 그림 1과 같은 이진 트리가 있을 경우, 3가지 방식으로 트리를 순회할 수 있다. 첫 번째는 전위 순회로 1-2-4-5-3-6-7 순서로 트리를 순회한다. 두 번째는 중위 순회로 4-2-5-1-6-3-7 순서로 트리를 순회 한다. 마지막으로 후위순회는 4-5-2-6-7-3-1로 순회한다. 트리를 순회하는 것은 재귀 호출을 통해서 구현 할 수 있다. Simple Tree Travel de..
Linked List? 단순한 선형 배열(리스트)을 선언하면 메모리를 연속적으로 할당한다. 만약, 배열 내의 값 삭제가 필요하거나 추가가 필요한 경우 값들의 자리 교체가 필요하다. 이와 달리 연결 리스트는 연속적인 공간을 사용하지 않고, 각각의 노드들을 연결한 구조로 연결되어 중간의 값 삭제가 빈번하게 일어나는 자료를 관리하기에 보다 효율적이다. Single Linked List class Node: def __init__(self, data): self.data = data self.next = None class SingleLinkedList: def __init__(self, data): self.head = Node(data) def add(self, data): node = self.head w..