반응형

[Computer Science]/[운영체제(OS)] 48

[운영체제(OS)] 9-3) 연속 메모리 할당과 단편화

메모리는 일반적으로 운영체제용과 유저 프로세스용으로 구분합니다. 일반적으로는 여러 유저 프로세스가 메모리에 적재되어 있는 것이 바람직하며, 프로세스에 사용 가능한 메모리를 할당하는 방법을 고려해야 합니다. 1. 연속 메모리 할당 : 연속 메모리 할당이란 각 프로세스가 다음 프로세스와 적재된 영역과 인접한 영역에 적재되는 것입니다. 연속 메모리 할당에는 두 가지 분할 방식이 존재하며, 각각 고정 분할, 동적 분할이라 합니다. : 메모리를 고정된 크기의 여러 파티션(균등 분할 방식으로, 멀티프로그래밍의 정도는 파티션의 수에 의해 결정)으로 나누고, 각 파티션은 하나의 프로세스만을 포함할 수 있습니다. 파티션이 비어 있으면 입력 큐에서 프로세스가 비어있는 파티션에 로드됩니다. 프로세스가 종료되면 파티션을 다른..

[운영체제(OS)] 9-2) Static Linking vs. Dynamic Linking(shared Library)

링커에 대해서는 프로그램의 컴파일 과정 포스팅에서 간략하게 나왔는데요, 컴파일된 오브젝트 코드를 실행 파일로 Linking해주는 역할을 합니다. 이번 포스팅에서는 링킹의 종류를 알아보려 합니다. 1. Static Linking : 실행 파일을 만들 때 정적 라이브러리를 포함시켜 .exe 파일을 만드는 것입니다. * 정적 라이브러리 : 컴파일러와 링커에 의해 object 파일과 독립된 실행 파일을 생성하기 위해 대상 애플리케이션에 복사됨. 장점 : 링커가 프로그램이 필요로 하는 부분을 라이브러리에서 실행파일에 바로 복사하므로, 라이브러리가 필요 없어서 컴파일 시간이 단축됩니다. 직접 구현한 코드를 라이브러리화시켜서 기술 유출을 방지할 수도 있습니다. 단점 : 실행 파일 내에 라이브러리 코드를 저장하므로 메..

[운영체제(OS)] 프로그램의 컴파일 과정

메모리 관리를 본격적으로 배우기 앞서, 프로그램의 빌드(컴파일) 과정에 대해 알아보겠습니다. 컴파일 과정은 작게 Compiling, Linking과정으로 나뉩니다. - Source Code Compiling : 소스코드는 개발자가 이해하기 쉬운 언어이지 컴퓨터가 이해할 수 있는 언어가 아닙니다. Compiler는 이 코드를 Assembly 언어로 번역해주고, Assembler는 Assembly언어를 컴퓨터가 이해할 수 있도록 Low Level의 언어(이진수 파일)로 변환하는 과정을 거칩니다. 이 과정을 통틀어서 Compiling이라 합니다. - Object Code를 Executable 파일로 Linking : 이렇게 만들어진 오브젝트 코드를 Linker가 Linking해줍니다. Linker는 여러 소스..

[운영체제(OS)] 9-1. Memory-Management 메모리 시스템, 주소의 할당(Address Binding)

운영체제가 하는 일은 컴퓨터 하드웨어의 자원을 관리하는 일입니다. 컴퓨터 하드웨어에는 대표적으로 CPU, Memory, I/O가 있는데요, 그래서 운영체제가 하는 일은 CPU 관리, 메모리 관리, I/O 관리라고 볼 수 있겠습니다. 운영체제의 목적은 프로그래머가 메모리에 대해 잘 몰라도 하드웨어의 자원을 잘, 효율적으로 사용하게 하는 것입니다. 성능을 향상시키기 위해서는 여러 프로세스들이 주 메모리(Main Memory)를 공유해야 합니다. * 메인 메모리 : CPU가 직접 접근할 수 있는 메모리. CPU는 PC가 지시하는 연산을 수행한 후에 메인 메모리에 데이터를 저장하거나 필요한 데이터를 요구합니다. 메모리를 관리하는 방법은 단순 하드웨어 방식에서 페이징(paging), 파편화(segment) 방법까..

[운영체제(OS)] 8-3) 교착상태(Deadlock) 탐지, 회복

앞서서 배운 교착상태 방지, 회피 알고리즘을 사용하지 않을 경우에는 교착상태가 발생할 수 있으므로 탐지, 회복 알고리즘이 필요합니다. 1. 교착상태(Deadlock) 탐지 : 탐지 알고리즘은 교착상태가 얼마나 자주 일어나는지, 교착상태가 발생하면 몇 개의 프로세스가 연루되는지를 고려해야 합니다. 교착상태가 자주 일어난다면 탐지 알고리즘도 자주 돌려야하는데, 시간이 오래 지나면 못 쓰는 리소스가 묶이고 연루되는 스레드의 수가 늘어날 수 있기 때문입니다. 교착상태가 일어나는 시점 = 어떤 스레드의 자원 요청이 만족되지 못하는 시점 입니다. 극단적으로 스레드의 요청이 만족되지 못할 때마다 탐지 알고리즘을 돌리는 방법도 있습니다. 1) 각 Resource type이 한 개씩만 있는 경우 : 대기 그래프(wait..

[운영체제(OS)] 8-2) 교착상태(Deadlock) 예방, 회피

1. 교착상태(Deadlock) 처리 방법 1) 문제를 무시하고 교착상태가 절대 발생하지 않는 척(?)하기 : 교착상태를 해결하는 데 비용이 더 많이 들기 때문에 무시합니다. 교착상태가 지속될 경우 시스템 성능을 저하시킬 수 있기 때문에 수작업으로 다시 시작해야할 필요가 있습니다. 2) 교착상태를 예방, 회피하는 protocol을 사용 - 예방 : 교착상태 발생 조건 4가지 중 적어도 하나 이상 성립하지 않도록 합니다. - 회피 : 프로세스가 사용할 리소스에 대한 부가적인 정보를 얻은 후에 프로세스를 기다려야할지 결정합니다. 3) 교착상태를 허용한 후 회복 : 교착상태가 발생했는지 조사하는 알고리즘, 복구 알고리즘을 사용합니다. 2. 교착상태(Deadlock) 방지 방법 (조건 중 하나만 끊어도 방지 가..

[운영체제(OS)] 8-1) 교착상태(Deadlock)란?

1. 교착상태(Deadlock) : 두 개 이상의 프로세스, 스레드가 서로 자원을 얻지 못해 다음 처리를 못하는 상태, 무한히 자원을 기다리는 상태를 말합니다. 멀티 프로그래밍 환경에서 한정된 자원을 얻기 위해 서로 경쟁하는 상황에서, 한 프로세스가 자원을 요청했을 때 그 자원을 동시에 사용할 수 없는 경우 프로세스는 대기 상태에 들어갑니다. 이 대기상태로 들어간 프로세스들이 실행 상태로 변경될 수 없을 때 교착 상태가 발생합니다. System Model : System은 유한한 수의 리소스로 구성이 되며, 정상적인 작동 모드에서 프로세스는 다음과 같은 순서로만 리소스를 사용할 수 있습니다. 1) 요청(Request) : 프로레스가 리소스를 요청하고, 얻을 때까지 대기합니다. 2) 사용(Use) : 프로..

[운영체제(OS)] 7) 고전적인 동기화 이슈

1. 유한 버퍼 문제(The Bounded-Buffer Problem) : 다른 말로는 생산자-소비자 문제(Producer and Consumer Problem)이라 합니다. 유한한 저장공간으로 n개의 버퍼가 존재하며, 각 버퍼는 한 항목(item)을 저장할 수 있습니다. 생산된 데이터는 버퍼에 일단 저장하고, 생산자는 버퍼가 가득 차면 더 넣을 수 없고, 소비자는 버퍼가 비면 뺄 수 없습니다. (ex) 컴파일러 - 어셈블러, 서버 - 클라이언트 : buffer size == count일 때 무한루프를 돌면서 기다리게 되는데 CPU가 다른 일을 하지 못하게 됩니다(busy wait). 이런 상황을 피해서 성능을 높여주기 위해 세마포어를 사용합니다. 버퍼가 가득 차있다면 생산자쪽에 semaphore가 bl..

[운영체제(OS)] 6-2) Mutex Lock, Semaphores

이전 포스팅에 나왔던 임계구역 요구사항을 충족시키기 위해 하드웨어 명령어로 락을 걸고 푸는 등의 하드웨어 기반의 해결책도 있지만 구현 난이도가 어려워 보편적인 응용 프로그래머가 쓸 수 없는 문제가 있습니다. 따라서 임계구역 문제를 해결하기 위한 소프트웨어 도구가 개발되었고, 이번 포스팅에서는 어떤 것들이 있는지를 알아볼겁니다. : 임계구역을 보호하고, 여러 프로세스가 한꺼번에 경쟁하는 것을 방지합니다. 프로세스는 임계구역에 진입하기 전에 반드시 락을 획득해야 하고, 임계영역 사용 종료 시 락을 해제합니다. 락 사용 가능 여부는 Boolean 변수를 사용합니다. 하지만 spinlock(아래 예시 코드의 while문)이라는 busy waiting이 여전히 존재합니다. : Mutex lock보다 더 정교하게 ..

[운영체제(OS)] 6-1) 프로세스 동기화 - 임계구역(Critical-Section)

* 데이터 정합성 이슈 : 동시에 공유 데이터에 접근하면 데이터 불일치가 발생합니다. 데이터 일관성을 유지하려면 협력 프로세스간의 순차적인 실행을 보장하는 매커니즘이 필요합니다. * 무한 버퍼 : 버퍼의 크기에 실질적인 한계가 없음 * 유한 버퍼 : 버퍼의 크기가 고정되어 있음. 버퍼가 비어있으면 소비자는 대기해야하고, 모든 버퍼가 차있으면 생산자가 대기해야 함. * 경쟁 상황 : 여러 프로세스 중 누가 먼저 공유 데이터에 접근하는지. : 하나의 프로세스가 접근 중일 때 다른 프로세스가 접근할 수 없는 코드 segment. 각 프로세스에는 임계 구역이라고 하는 부분이 존재하며, 일반적으로 entry section ~ critical section ~ exit section, remainder sectio..

반응형