본문 바로가기

# Foundation/운영체제

(10)
# Foundation/운영체제 운영체제 정리 🦖 ch09. 가상 메모리 논리적 메모리 개요 프로그램이 실행되기 위해서는 먼저 메모리에 적재되어야 했습니다. 가장 간단한 방법은 프로그램 전체를 메모리에 적재하는 것이지만, 프로그램의 크기가 물리 메모리보다 큰 경우에는 어떻게 메모리에 적재되어야 할까요? 가상 메모리 이러한 문제를 해결하기 위해 전체 중에서 사용할 부분만 적재하는 방식이 탄생했습니다. 프로그램이 필요한 전체 메모리를 논리적(가상적) 메모리로 바라보고, 이 중에서 현재 실행에 필요한 부분만 물리적 메모리에 옮겨다 놓는 식이죠. 이 방식을 사용하면 다음과 같은 장점을 얻을 수 있습니다. 메모리를 프로그램의 관점(논리적 관점)과 램의 관점(물리적 관점)으로 분리할 수 있다. 메인 메모리보다 큰 프로그램을 실행할 수 있다. 절대 실행되지 않는 코드는 적재되지 않는다. ..

2020. 11. 21. 00:52

# Foundation/운영체제 운영체제 정리 🦖 ch08. 메모리 관리 전략 기본 하드웨어 CPU가 직접적으로 접근할 수 있는 메모리는 CPU 레지스터와 RAM이 유일하며, 이외의 메모리는 CPU가 해당 메모리의 주소를 가져오는 것이 불가능합니다. 이 때 CPU 레지스터는 단일 클럭만에 연산이 가능한데 반해, RAM은 메모리 버스를 경유해야 하기 때문에 훨씬 많은 클럭이 소요되므로, 이 속도차이를 보완하고자 중간에 캐시 메모리를 둘 수 있습니다. 프로세스 메모리 프로세스 메모리 범위 각각의 프로세스는 자신만이 사용할 수있는(legal) 메모리 공간을 가지며, 운영체제는 각 프로세스가 합법적인 메모리 영역에만 접근할 수 있도록 강제해야 합니다. 따라서 현대 시스템은 기준 레지스터(BASE)와 상한 레지스터(LIMIT)를 두어 합법적인 메모리 영역을 표현하는데, 일반 프로세스는 [B..

2020. 11. 19. 22:22

# Foundation/운영체제 운영체제 정리 🦖 ch07. 교착상태 교착상태 개요 이전 챕터인 프로세스 동기화을 떠올려보면 공유자원을 요청한 작업은 해당 공유자원이 자신에게 할당될 때 까지 대기하고 있음을 알 수 있습니다. 그러나 지금까지는 공유자원이 1개인 작업만을 이야기했지만, 공유자원이 2개 이상 필요한 작업의 경우에는 어떨까요? 이러한 경우에는 교착상태라는 특이한 문제가 생길 수 있습니다. 두 개의 작업이 각각 고유자원을 소지하고 있는 상태에서, 상대의 고유자원을 요청하고, 반대편이 그것을 내놓을때 까지 기다리는 상황이죠. 양쪽 모두 고유자원을 내놓을 생각이 없다면, 이 둘은 반대편이 고유자원을 내놓길 기다리면서 영원히 대기하게 됩니다. 이미지 출처 : 땔감툰 필요조건 교착상태가 발생하려면 아래의 조건을 모두 만족해야 합니다. 상호배제 : 각 공유자원은 하나의 작..

2020. 11. 18. 18:53

# Foundation/운영체제 운영체제 정리 🦖 ch06. 프로세스 동기화 공유자원 문제 덮어씌우기 현대 시스템은 다중 처리기 시스템이므로 여러개의 작업이 동시에 실행될 수 있으며, 공유 메모리를 사용하여 작업들은 서로에게 영향을 주고받을 수 있습니다. 이러한 현대 시스템 작업의 특징을 병렬성과 협력성이라고 부릅니다. 만약 두 개의 작업이 하나의 공유 영역에 동시에 접근하면 어떤 일이 일어날까요? 아래와 같이 공유변수 v에 쓰기연산을 실행하는 쓰레드를 정의해보겠습니다. char v = 'X'; void assignToA(){ _sleep(1000); // 1초 대기 v = 'A'; } void assignToB(){ _sleep(0); // 0초 대기 v = 'B'; } int main() { thread a(assignToA); thread b(assignToB); a.joi..

2020. 11. 17. 20:23

# Foundation/운영체제 운영체제 정리 🦖 ch05. CPU 스케줄링 CPU 스케줄링 개념 하나의 시스템에서 여러개의 프로세스가 실행되고 있을 때 Running 상태의 프로세스가 CPU를 사용하지 않는 입출력 기능을 요구했다고 가정해봅시다. 예를 들어, 다음과 같은 상황이 있겠네요. 사용자에게서 키보드 입력을 요청한다. 파일을 읽거나 쓴다. 프로세스는 해당 입출력이 끝날 때 까지 대기해야 하므로, CPU 사용권을 계속 붙잡고 있어도, 무엇하나 못하는 상태로 볼 수 있겠고 다른 프로세스가 유효하게 사용할 수 있었던 CPU 시간을 낭비한 것과 같아집니다. 이것을 CPU가 놀고있다라고 볼 수 있겠죠. 따라서 운영체제는 프로세스가 CPU를 사용하지 않는 기능을 실행하면 그 프로세스는 더 이상 CPU를 유효하게 사용하지 못하므로, 해당 프로세스의 CPU 이용권을 빼앗아 다른 프로세..

2020. 7. 30. 16:46

# Foundation/운영체제 운영체제 정리 🦖 ch04. 다중 스레드 프로그래밍 스레드 개념 스레드는 CPU 이용의 기본 단위이며 프로세스를 이루는 단위이기도 합니다. 각각의 스레드는 스레드 ID 프로그램 카운터 레지스터 집합 스택으로 구성되며, 메모리 측면에서 보면 스레드 개인 메모리 + 프로세스 공유 메모리에 접근할 수 있습니다. 왜 필요한가? 현대 운영체에 스레드가 도입된 이유는 종래에는 프로세스가 하나의 동작밖에 하지 못했다는 것 입니다. 첫 번째 예시로 웹서버를 생각해보겠습니다. 현대는 각 클라이언트마다 하나의 스레드를 만들어 대응하고 있지만, 예전에는 각 클라이언트마다 하나의 프로세스를 만들어 대응해야 했기 때문에, 엄청난 병목을 감수할 수 밖에 없습니다. 프로세스를 생성하는 작업은 매우 무겁거든요. 두 번째 에시로 맞춤법을 교정해주는 워드프로세서를 생각해보겠습니다. 이 ..

2020. 7. 28. 15:44

# Foundation/운영체제 운영체제 정리 🦖 ch03. 프로세스 프로세스 프로세스의 개념 비공식적으로 프로세스란 실행 중인 프로그램을 가르킵니다. 다음과 같이 텍스트 영역, 데이터 영역, 힙 영역, 스택 영역, 자유 공간이 할당된 프로그램 이상의 개념이며 프로그램 카운터를 갖는 능동적 개체입니다. 잡(Job)은 프로세스의 별칭입니다. 프로세스의 상태 프로세스는 실행되면서 그 상태가 변화합니다. 각 프로세스는 다음 상태들 중 하나입니다. 생성 (New) : 프로세스가 생성 중 입니다. 실행 (Running) : 해당 프로세스의 명령어가 실행 중 입니다. 대기 (Waiting) : 입출력의 완료 신호를 기다리고 있습니다. 준비 (Ready) : 프로세스의 실행 순번이 오길 기다리고 있습니다. 종료 (Terminated) : 프로세스가 종료되었습니다. 한 가지 시나리오를 ..

2020. 7. 27. 20:55

# Foundation/운영체제 운영체제 정리 🦖 ch02. 운영체제 구조 운영체제 서비스 각각의 운영체제는 설계된 목적과 자신만의 고유한 기능이 있습니다. 운영체제들은 해당 목적을 효율적으로 달성하기 위해 각기다른 디자인과 알고리즘을 선택하지만, 보편적으로 다음 기능들은 공통으로 제공됩니다. 단일 사용자 기능 사용자 인터페이스 운영체제는 하드웨어와 사용자 사이를 중재하는 소프트웨어이므로, 사람이 사용하기 편리한 형태의 인터페이스를 제공해야 합니다. 보통 CUI 또는 GUI중 하나를 선택하지만, 경우에따라 두 개 다 지원하는 운영체제도 있습니다. 프로그램 실행 운영체제는 폰 노이만 구조에 따라 프로그램을 메모리에 적재하여 실행시킬 수 있어야 하며, 프로그램이 비정상적으로 종료된 경우에는 원인을 파악한 뒤 디스플레이할 수 있어야 합니다. 입출력 연산 프로세스는 파일, 키보드와 같..

2020. 7. 26. 11:44