목록분류 전체보기 (40)
개발계발
리스트 컴프리헨션이란? 기존 리스트를 기반으로 새로운 리스트를 만들어내는 구문 예를 들어, 홀수인 경우 2를 곱해 출력할 경우 리스트 컴프리헨셩을 사용하지 않는다면 아래와 같이 코드를 짜야한다. a = [] for n in range(1, 11): if n % 2 == 1: a.append(n*2) print(a) 위 코드에 리스트 컴프리헨션을 적용하면 아래와 같이 간단하게 작성할 수 있다. print([n * 2 for n in range(1, 11) if n % 2 == 1]) 위 식의 각 부분을 좀 더 개념적으로 정리하자면 아래와 같다. [expression for item in iterable if condition] - 'expression' : 각 아이템에 대해 실행되는 표현식 - 'item'..
가상메모리란? 실행하고자 하는 프로그램을 일부만 물리 메모리에 적재해서 실제 메모리의 크기보다 더 큰(많은) 프로세스를 실행할 수 있는 기술이다. 그럼 가상메모리가 적용되기 전 메모리는 어떻게 사용됐나? 연속 메모리 할당 이전 포스팅에서 설명했듯이 메모리를 운영체제의 영역과 사용자영역으로 나눈 뒤 사용자 영역에 연속적으로 메모리를 할당하는 방식을 이용했다. 예를 들어, 메모리가 0~999번지까지 있다고 가정하고 아래의 그림을 보자. -> 메모리의 0~299번지는 운영체제 영역이고, 300~999번지는 사용자 영역으로 CPU의 경계 레지스터에 의해 연속적으로 프로세스가 적재되는 방식이다. 언뜻 보면 문제가 없어보이지만, 외부 단편화라는 문제가 발생한다. 메모리에 더 여러가지 프로세스가 적재돼 있는 상황을 ..
저번 포스팅에서 동기화 기법에 대해 알아봤는데, 이 때 잠금을 사용하면 작업이 더 이상 진행되지 않는 교착 상태에 빠지는 경우가 있다. 이번 포스팅에서는 이 교착상태의 원인과 해결방법에 대해 알아보고자 한다. 교착상태란? 2개 이상의 작업이 동시에 이루어질 때, 서로의 작업이 끝나기만 기다리며 작업이 더 이상 진행되지 않는 상태 교착상태 발생조건 교착상태가 발생하기 위해서는 상호 배제, 점유와 대기, 비선점, 원형 대기 4가지 조건이 모두 만족돼야한다. 상호 배제 - 한 자원을 한 번에 하나의 프로세스만 이용 가능 점유와 대기 - 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태 비선점 - 다른 프로세스가 사용 중인 자원을 강제로 뺏을 수 없음 원형 대기 - 프로세스들이 원의 형태로 자원을 ..
동기화란? 프로세스(스레드)들 사이의 자원의 일관성을 보장하고 수행 시기를 맞추는 것으로 크게 2가지로 나뉜다. - 실행 순서 제어 : 올바른 순서대로 실행되도록 - 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스(스레드)만 접근하게 하기 실행 순서제어를 위한 동기화 어떤 값을 쓰고자하는 프로세스와 읽고자 하는 프로세스가 실행 중일 때, 이 두 프로세스의 실행 순서는 쓰고나서 읽어야 한다. 이렇게 프로세스를 올바른 순서로 실행되게 하는 것이 실행 순서제어 동기화이다. (이 동기화는 별 거 아닌 것 같지만 중요한 것은 상호 배제이다.) 상호 배제를 위한 동기화 공유 자원의 동시 사용으로 인해 결과값이 달라지는 상황을 피하기 위해 사용 상호 배제를 하지 않았을 때 발생하는 대표적인 문제로 생산..
CPU 스케줄링이란 운영체제가 프로세스들에게 CPU 자원을 분배하는 것을 말한다. CPU 스케줄링이 필요한 이유 각 프로세스 별로 입출력장치를 이용하는 시간과 CPU를 이용하는 시간에 차이가 있다. 입출력이나 디스크 백업을 자주 이용하는 프로세스(입출력 집중 프로세스) vs 복잡한 수학 연산, 그래픽 처리 작업 등을 자주 이용하는 프로세스(CPU 집중 프로세스) 위 예시에서 전자는 입출력을 위한 대기 상태에 더 많이 머무르게 되고, 후자는 실행 상태에 더 많이 머무르게 되는데, 이처럼 각 프로세스 별로 CPU사용에 대한 우선순위가 다르다. 위처럼 간단한 예시의 두 가지 프로세스가 동일하게 CPU를 할당 받는 것은 비합리적이기 때문에 CPU 스케줄링이 필요하다. 스케줄링 큐 운영체제는 프로세스들을 줄 세워..
스레드란 실행의 단위로, 프로세스를 구헝하는 실행의 흐름 단위이다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 스레드를 이용하면 하나의 프로세스에서 여러 부분을 동시에 실행할 수 있게 된다. -> 스레드라는 개념이 도입되기 전에는 모든 프로세스가 한 번에 하나의 작업만을 처리할 수 있었지만, 스레드 도입 후 하나의 프로세스가 한 번에 여러 일을 동시에 처리할 수 있게 됨(프로세스를 구성하는 여러 명령어를 동시에 실행 가능) 스레드는 위의 그림과 같이 한 프로세스 내에서 각기 다른 ID, 레지스터 값, 스택을 갖고 있기 때문에 각기 다른 코드를 실행할 수 있다. -> *주의*: 각 스레드만의 독립적인 영역이 있는 것이 아니라, 프로세스의 자원을 공유한다. 멀티 프로세스 vs 멀티 스레드 여러 ..