프로세스 간의 정보를 주고 받거나, 하나의 공유된 영역을 사용할 경우에는 주의가 필요하다. 예를 들어 프로세스 A는 1번지 메모리 공간에 10이라는 값을 읽어 오고자하였으나, 프로세스 B가 프로세스 A가 읽는 직전에 20이라는 값으로 변경해 버리면 원하지 않는 값이 반환되는 결과가 발생한다. 이렇게 상호적으로 영향을 미치는 프로세스들을 Cooperating Process라고 한다. 이와 반대인 경우 Independent Process라고 한다. 각 프로세스로 인해 공유 데이터의 일관성을 보장하지 못하는 것을 막기 위해 동기화(Synchronization)가 필요하다. 앞서 말한 간단한 예시에서 원치 않는 값을 반환받지 않으려면, 프로세스 A → 프로세스 B의 순서를 보장할 경우 이와 같은 문제를 해결할 ..
프로세스 이전 글에서도 알 수 있듯이 프로세스는 현재 메모리에 적대되어 실행 중인 프로그램을 말한다. 운영체제에 따라 프로세스를 job, task 등으로 부르기도 한다. 프로세스 계층 구조 리눅스는 저장장치로 부터 메모리로 최초 적재 시에는 PID (Process ID : 프로세스를 구분할 수 있는 고유 식별 번호)가 0인 root process가 생성된다. root process는 init process를 생성한다. root process는 최초 생성 후에, 프로세스들을 스케줄링 할 때 swapper의 역활을 한다. init process의 경우 생성된 후, 사용자가 운영체제를 사용할 수 있는 환경을 구성한다. 예제의 프로세스 계층 구조는 depth가 3이지만 depth 2의 프로세스들도 자식 프로세스..
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는 루트 노드를 시작으로 모든 그래프 경로를 탐색하..