일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 연결 리스트
- RxJS
- 웹팩
- 코딩테스트
- 큐
- GraphQL
- 프로그래머스
- 릿코드
- alexnet
- APOLLO
- C
- 컨테이너
- 배열
- cors
- 자바스크립트
- 포인터
- 자료구조
- 프론트엔드
- RT scheduling
- 연결리스트
- 알고리즘
- 브라우저
- 스택
- vue3
- pytorch
- 프로세스
- 이진탐색
- 해시테이블
- 타입스크립트
- Machine Learning
- Today
- Total
목록운영체제, 컴퓨터 구조 (19)
프린세스 다이어리

1. 요구 페이징(Demand Paging) 컴퓨터가 프로그램을 실행할 때, 어느 페이지 블록을 어느 시점에 물리 메모리에 적재해야 하는지 판단해야 한다. 메모리의 용량은 제한적이기 때문이다. 프로세스와 관련한 모든 데이터를 메모리에 미리 올려놓고 실행하는 '선행 페이징' 개념이 있지만 이는 한정된 메모리 활용에 비효율적이다. 이와 반대로 '요구 페이징'이라는 개념이 있다. 모든 데이터를 메모리에 적재하지 않고, 실행 중에 필요한 시점이 오면 그때그때 적재한다는 의미다. - 선행 페이징: 프로세스 관련 모든 데이터를 물리 메모리에 미리 적재 후 실행 -> 현실성x - 요구 페이징: 실행 중 필요한 시점에 필요한 데이터만 물리 메모리에 적재 -> 현실적, 페이지 교체 알고리즘 필요 프로세스 A에서 어떤 한..

페이징 시스템은 물리 메모리를 효율적으로 활용하는 데 있어서 여러 역할을 한다. 그 중에 '공유 메모리'라는 개념이 있다. Process A와 Process B가 별도로 있는 상황에서, A, B의 특정 공간이 공유된다고 가정해 본다. 물리 메모리엔 두 공간이 아닌 하나의 공간만 확보해 놓고, 페이지 테이블에서 프로세스의 각 주소를 변환할 때 해당 물리 주소를 동일하게 가리키게 해 놓으면 그 메모리 공간을 함께 공유할 수 있다. 1. 각 프로세스의 커널 메모리 공간은 물리 메모리 공간을 공유 공유 메모리의 개념을 프로세스의 4GB~3GB 영역의 커널 공간에 적용해 보면, 각 프로세스의 커널 공간에 대한 페이지 테이블에서 동일한 메모리 공간을 가리키게 하면 된다. 즉 프로세스마다 커널 영역을 다 갖고 있는 ..

리눅스의 프로세스의 페이징 시스템에서는 0GB~4GB를 모두 4KB 단위 페이지로 나누어서 Page Table을 만들어서 가상 주소와 물리 주소로 매칭한다. 한편 페이지 테이블도 결국 메모리에 올려야 하는데 전체 4GB를 몽땅 쪼개서 테이블을 만들어 놓는다면 쓸데없이 많은 메모리 공간을 차지하게 된다. 만약 실제로 돌리는 간단한 C언어 프로그램이 10KB라면 4GB 전체를 페이지 테이블로 만드는 건 메모리 공간 낭비다. 1. 메모리 공간을 절약해주는 다중단계 페이징 시스템 다중단계 페이징 시스템이란, Page Directory로 영역을 구분하여, 그 중에 데이터가 있는 디렉터리만 페이지 테이블을 만들어 메모리 공간을 절약하는 개념이다. 전체 페이지 32bit 중, 12bit는 원래대로 페이지 주소로부터의..

1. 페이징 시스템이란 앞서 가상 메모리의 개념에 대한 글에서, CPU는 가상 메모리 주소만을 참조하고 필요할 때만 물리 메모리 주소를 참조한다고 정리했다. 그러면 어떤 단위로 물리 메모리를 활용하는지 궁금증이 생긴다. 왜냐하면 물리 메모리를 한 번에 4GB를 써 버리면 필요한 때만 물리 메모리를 쓴다는 의미가 없기 때문이다. 이 고민은 페이징 시스템(Paging System)으로 해결을 한다. 가상 메모리의 메커니즘은 다양한데, 페이징 시스템이 그중 가장 메이저 한 방식이라고 한다. 페이징 시스템은 물리 메모리에 크기가 동일한 사이즈로 페이지 단위를 만들어 올리는 방법이다. 리눅스 운영체제에서는 4KB 단위로 페이징을 한다. 이 의미는 물리 메모리인 0~4GB를 4KB 단위로 모두 주소를 쪼개서 페이지..

1. 가상 메모리란? 등장 배경과 개념 우리 PC는 대부분 폰 노이만 구조 기반으로, 프로그램의 코드는 무조건 메모리에 올려서 실행되어야 한다. 즉 프로세스가 실행되려면, 각 프로세스마다 충분한 메모리를 할당받아야 한다. 리눅스 프로세스는 하나에 4GB인데, 통상적인 메모리는 8GB 또는 16GB다. 멀티 프로세스로 프로그램을 실행시킨다고 가정했을 때 동시에 2개에서 4개 정도만 프로그램을 실행시킬 수 있다. 더 많은 프로세스를 동시에 실행하려면 메모리가 더 커져야 하는데 현실적으로 비용이 많이 든다는 한계가 있다. 따라서, 여러 프로세스를 돌릴 수 있는 구조가 필요해지면서 가상 메모리의 개념이 등장했다. 물리 메모리만 사용한다고 가정을 했을 때, 단순하게 생각해 보면 물리 메모리에 Process A와 ..

제목의 답부터 말하자면 둘 중에 뚜렷하게 좋고 나쁨이 갈리는 게 아니다. 프로세스와 스레드 각각의 특성과 장단점이 있기 때문에 운영체제의 복잡성이나 프로그램의 특성 등을 고려해서 채택된다. 1. 프로세스와 스레드의 특징 차이 프로세스란 실행 중인 프로그램으로, 1개의 CPU가 한 번에 한 프로세스만을 실행할 수 있고 프로세스 간 데이터 접근이 불가하다는 특징이 있다. 스레드란 한 개의 프로세스 안에 여러 개의 프로세스를 동시에 생성 및 실행 가능한 구조다. 프로세스 안에서는 모든 스레드끼리 데이터에 접근이 가능하다. 멀티프로그래밍을 구현할 때 CPU가 어떻게 콘텍스트 스위칭을 하는지 이전 글에 정리해 두었다. 프로세스를 한꺼번에 여러 개 실행하는 것처럼 보이기 위해 CPU는 레지스터의 도움을 받아서 사용..

1. 프로세스의 구조 프로세스는 크게 stack, heap, data, code로 구성되어 있다. 프로그램 소스가 컴파일되어 기계어로 code 부분에 저장이 되고, 글로벌 변수는 data에 저장이 되고, 함수 및 지역변수 등이 선언되면 stack으로 들어간다. stack - 임시 데이터(함수 호출, 로컬 변수 등) 저장 heap - 코드에서 동적으로 만들어지는 데이터 저장 data - 변수, 초기화된 데이터 code(text) - 컴파일된 코드 이렇게 프로세스가 구성되어 CPU가 코드를 읽으며 실행을 한다. 위에 파이썬 코드에서는 heap 영역에 해당하는 변수는 없지만 C에서 malloc() 동적 메모리 할당 시 heap 공간에 메모리가 생성이 된다. int main() { int *data; data ..

1. 인터럽트란 CPU가 프로세스 a를 실행 중일 때, 파일 읽기의 끝이 나서 block 상태에서 running 상태로 돌아가야 한다고 가정해 보자. 그럼 누가 CPU에게 파일 읽기가 끝났다고 알려줄까? 바로 인터럽트 기술이 기본적으로 OS에 구현되어 있기 때문에 가능하다. 인터럽트는 일종의 이벤트로, CPU에게 정보를 알려주는 기술이다. 이전 글에서 CPU가 실행 중인 프로세스를 강제로 중단하고 다른 프로세스로 갈아타게 만드는 걸 스케줄러가 담당한다고 하였는데, 그 스케줄러 코드를 실행하게 하는 것이 인터럽트다. 2. 인터럽트 발생 상황 예시 CPU가 코드를 한 줄 한 줄 읽는데 집중하다가 인터럽트가 필요하면 즉시 실행을 멈춘다. 이때 실행을 멈춰야 하는 3가지 주요 상황이 있다. 2-1. 입출력 하드..