본문 바로가기

분류 전체보기

(48)
메모리 관리 메모리는 CPU와 디스크 사이의 주기억장치로 실행 중인 프로그램 들의 프로세스의 데이터들을 저장하는 공간이다. 즉, 메모리 관리는 말 그대로 메모리를 관리하는 기법으로 한정된 크기의 메모리를 보다 효율적으로 사용하는 방법이라고 할 수 있다. 그러면 OS는 메모리를 어떻게 관리해서 보다 효율적으로 사용자가 컴퓨터를 사용할 수 있게 해주는 걸까? 메모리는 일종의 아파트로 데이터라는 입주민이 들어올 수 있는 공간이다. 그리고 데이터가 저장될 공간을 지칭하는 쉽게 말해 데이터가 입주할 아파트 호수를 주소라고 한다. 따라서 모든 프로세스는 자신이 필요한 데이터를 디스크에서 가져와 메모리에 올려 놓고 CPU로 부터 자원을 할당받아 작업을 수행하는데, 문제는 컴퓨터에서 돌아가는 프로세스가 너무 많다는 것이다. 당장 ..
Dead Lock (교착 상태) 이번 시간에는 프로세스 동기화의 마지막 Dead Lock 을 알아보자. Dead Lock 은 교착 상태라고도 하며 가장 쉬운 예시로 시골에 가면 흔히 겪는 좁은 1차선 도로로 차를 운전하다가 반대편에서 차가 와서 서로 오도가도 못하는 상황을 생각하면 쉽다. 그리고 누구는 양보해서 긴 시간을 들여 빠져나가야하고 이는 프로세스도 똑같다. 운영체제에서 프로세스 간 교착 상태는 자원을 기다리다가 서로 Lock 된 상태로 대기하는 것을 의미하며 발생 조건은 다음과 같다. 1. 상호 배제 > 프로세스가 작업 중일 때 다른 프로세스는 접근할 수 없다. 2. 자원 비선점 > 자원을 할당 받은 프로세스의 자원을 다른 프로세스가 할당 받을 수 없다. 3. Hold & Wait > 자원을 할당 받으면 작업을 종료할 때 까지..
프로세스 동기화 문제 이번엔 지난 시간에 이어 유명한 프로세스 동기화와 관련된 예시를 몇 가지 살펴보려한다. 1. 생산자-소비자 중간의 원형 큐가 프로세스 A 와 프로세스 B 의 공유 버퍼(서로 접근하는 공유 메모리)라고 가정하자. 이때 A 는 항상 버퍼 큐에 데이터를 입력하고 반대로 B 는 항상 버퍼에서 데이터를 꺼내간다. 따라서 A 는 생산자, B 는 소비자의 역할이다. 우리는 프로세스 동기화에 의해 기본적으로 프로세스들의 공유 공간은 세마포어로 읽기와 쓰기가 동시에 일어나며 발생하는 데이터 불일치를 방지된다는 것을 알고 있다. 그런데 만약 A 가 데이터를 입력하려고 세마포어 자원을 획득한 상태에서 더 이상 입력할 공간이 없거나 반대로 B 가 데이터를 가져가려고 하는 순간 버퍼에 데이터가 없다면 어떻게 될까? 만약 세마포..
표현 가능한 이진트리 https://school.programmers.co.kr/learn/courses/30/lessons/150367 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr Level 3 간단해보이지만 일반적인 트리 노드 구성과 달라서 시간을 초과하다 못해 랜덤 함수로 반례 찾아가며 푼 문제 문제 설명이 상당히 난해해서 이해하는데만 20분 이상 걸린 것 같다. 쉽게 풀어쓰면 다음과 같다. 쉬운거 맞나? 1. 숫자 N 개가 Long 배열에 담겨서 들어온다. 2. 숫자를 이진 수로 변환하였을 때 포화 이진 트리로 만들 수 있는지 확인해야한다. 3. 단, 필요에 따라 더..
프로세스 동기화 프로세스 동기화는 멀티 프로세서 환경에서 다수의 CPU 가 여러 프로세스를 동시에 수행하며 발생하는 동일 데이터 동시 접근 간 발생하는 문제를 해결하기 위한 방법이다. 예를 들어 위와 같이 A 라는 프로세스는 val 라는 값을 1 증가 시키고 B 라는 프로세스도 val 값을 1 증가시키는 기능을 수행한다고 하자. 그렇다면 두 프로세스는 서로 다음과 같은 과정으로 작업을 수행할 것이다. 이 과정에서 만약 val 에 1이라는 값이 저장되어 있고 A 라는 프로세스가 먼저 요청을 수행한다고 가정하자. 그러면 A 는 val 의 현재 값인 1을 읽을 것이고 이후 코드를 실행해 2 라는 값을 메모리에 쓰려 할 것이다. 그런데 메모리에 값을 쓰기 전에 인터럽트가 발생해 B 프로세스로 문맥 교환이 일어나게 되면 아직 변..
프로세스 통신 프로세스는 기본적으로 각자 고유의 독립된 주소 공간을 가지며 서로의 주소 공간을 침범하는 것이 불가능하다. 만약 침범하게 되면 흔히 블루 스크린이 발생하거나 메모리 침범 오류가 발생하며 프로그램이 죽어버린다. 따라서 이번 시간에는 서로 다른 두 프로세스 간 어떤 방식으로 서로 데이터를 공유하는 지 알아보려한다. 프로세스 간 통신은 IPC 라고 하며 대부분 위에 언급된 7가지 내에서 설명한다. 물론 시대가 발전했으니 최신 프로세스 통신 방법이 더 생겼을 수도 있다. 1. Message Passing OS 커널에게 요청해 특정 프로세스에게 데이터를 전달하는 방법 (단 방향이기에 공유가 아니다) Message Passing 은 커널 System Call 기능을 활용한 IPC 로 위와 같이 2가지 방식으로 나뉜..
CPU 스케쥴링 프로세스는 CPU 는 수 많은 프로세스들을 처리할 때 어떤 방식으로 큐에서 대기하는 프로세스를 선정할까? 이번에는 CPU 의 프로세스 스케쥴링에 대해 알아보려고 한다. 먼저 CPU 의 처리 작업은 처리하는 대상에 따라 크게 2개로 나눌 수 있다. 1. I/O Burst : CPU 입출력 처리 2. CPU Burst : CPU 명령 처리 결국 CPU 가 수행하는 전체 처리 시간은 I/O Burst + CPU Burst 로 되어 있다고 봐도 무방하며 사용자가 누구냐에 따라서 또 어떠한 작업을 주로 처리하냐에 따라서 I/O Burst 와 CPU Burst 의 비율리 달라지게 된다. 그래서 I/O Burst 가 많은 프로세스를 I/O Bound Job, CPU Burst 가 많은 프로세스를 CPU Bound J..
탐색 알고리즘 이번에 알아볼 알고리즘은 가장 기본적인 선형 자료구조 탐색 알고리즘이다. 선형 탐색 알고리즘은 전제 조건으로 자료가 정렬되어있어야 한다. 정렬 알고리즘은 다음에 이어서 포스팅 하도록 하겠습니다 너무 많... 1. 완전 탐색 가장 간단하게 모든 원소를 탐색하는 방법 public static void main(String[] args) { int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int targetNum = 6; for(int idx = 0; idx < intArray.length; idx++) { if(targetNum == intArray[idx]) { System.out.println("Target Number Index : " + idx); break; } }..