3.5 페이징 시스템의 설계 이슈 페이징 시스템의 디자인 이슈 : 페이지 크기, 부하처리, 메모리를 굉장히 많이 쓰는 경우 처리 등 가상 메모리 시스템에서는 현재 사용하는, 참조되는 페이지 프레임만 교체할건데 어디서 교체하느냐? 3.5.1 로컬/전역 할당 정책 local은 프로세스가 만들어질 때 몇 개의 테이블을 사용해야 하는가를 알아야 함. 모름 -> 상수로 정함 -> 동작하면서 페이지 폴트 -> 폴트 횟수를 사렾보며 필요한 프레임의 개수 정해주기 -> 워킹셋의 크기 -> 잘 정해지면 잘 동작. 충분히 큰 페이지 프레임을 할당할 수 있음 but 충분히 확보 못하면 메모리에 로드 못하고 실행못하게 됨. 또 특정 프로세스에 몰아주면 그 프로세스가 안쓰는데도 다른프로세스도 못쓰는. 낭비되는 프레임이 생길 수..
3.4 페이지 교체 알고리즘 주소 변환 중 page table entry까지 갔어. 거기서 valid비트가 있다고 했는데, 페이지 테이블 엔트리에 적힌 페이지 테이블 번호가 없을 경우. 혹은 있는데 absent 비트가 세팅되어 있거나. -> 페이지 프레임의 실제 데이터가 존재하지 않느다는 것. 번호가 없다는건 주소 변환이 일어나지 않은거고, 밸리드 비트가 꺼져있는 경우는 있지만 present bit가 꺼져있는건. 하드웨어는 주소변환을 하고 코드나 데이터를 cpu로부터 가져와서 실행하는데(cpu는 주소변환 불가),알아서 처리해줘 하고 page fault -> 운영체제 코드(페이지 폴트 핸들러가 실행) 따라서 페이지 테이블 엔트리에 페이지 프레임 번호가 없을 수 있다 : none mapped page. 주소..
3.3.3 페이징 속도 향상 페이징 복습 MMU라는게 씨피유 안에 들어있는데, cpu에서 가상 주소를 내보내주면 mmu가 물리 주소로 바꾸어서 접근하게 됨. mmu안에 CLB존재. 그 밑엔 캐시 존재 페이지 테이블 엔트리 복습 페이지 테이블 엔트리만 보고는 안 쓰는걸 알 수 없음 -> 레퍼런스와 모디파이드 비트가 그래서 존재하는 것. 그리고 caching disabled field는 이게 새팅이 되면 이 페이지 프레임 내에 저장된 데이터를 cpu내 캐시에 캐시하지 말라는 것. 3.3.4 대용량 메모리를 위한 페이지 테이블 페이징 문제 2 : 페이지 테이블이 굉장히 크다 (가상 주소공간이 커지면) 해결 1 : 멀티 레벨 페이징 : 모든 페이지 테이블을 항상 메모리에 유지할 필요가 없다! 페이지 테이블 크기..
3.3 가상 메모리 리얼 메모리의 비효율성을 개선한게 가상 메모리 시스템 버츄얼 메모리 : 프로세스한테 피지컬 메모리에 대한 정보를 감춤 n이 바로 cpu가 한번에 처리할 수 있는 워드의 크기는 word size, CPU의 비트를 따라감. 프로세스는 무제한인 메모리 공간에서 실행할 수 있고다고 착각하게 됨 -> 특정 시점에 사용되는 부분만 메모리에 두고 실행시키면 되지 않냐? 가상주소는 페이지의 번호와 페이지 내부의 offset으로 표현이 됨 -> 32비트라고 했을 때, 페이지의 크기가 4k라고 하면 12bit가 offset, 나머지가 페이지 번호 virtual memory space에는 코드, 데이터, 힙, 스택이 존재. 물리 메모리 역시 똑같은 사이즈로 나누어짐. 물리메모리를 나눈건 페이지 프레임이라..
2.5.1 식샤하는 철학자 문제 : 제한된 개수의 자원을 배타적으로 접근하기 위해 경쟁하는 프로세스 모델링에 유용 다섯 명의 철학자가 앉아있다. 스파게티를 먹으려면 두 개의 포크가, 포크는 접시 사이에 있다. 먹거나, 쉬거나 할 수 있고 각 철학자는 해야할 일을 그대로 수행하며 중단되지 않아야 한다. 위 이미지는 잘못된 해법. 모두 동시에 왼쪽 포크를 집으면, 아무도 오른쪽 포크를 집을 수 없게 된다. state[N] : 현재 상태를 저장 뮤텍스 하나, 5개의 세마포어 선언, 5개의 쓰레드가 philosopher함수 실행 take_forks : 상호배제를 위해 mutex를 찾고, 테스트에서 상호배제를 위해 state를 hungry로 바꾼 후 테스트 함수 호출(자신의 번호를 인자로 받음) -> 테스트를 부..
2.4.6 스레드 스케쥴링 사용자 레벨 스레드 : 커널은 스레드의 존재를 인지 못하여 프로세스를 선택하고 할당시간만큼 프로세스에 cpu제어를 넘김. 커널 레벨 스레드 : 커널이 스레드를 선택하여 실행 차이점 : 성능(a>b) -> 스레드 문맥교환을 하려면 메모리 맵을 바꾸고 캐시를 무효화 하는 등의 동작 필요. But 커널 레벨 스레드에서는 한 스레드가 I/O에서 대기하는 경우 프로세스 전체를 중단시키지 않음. 2.5 전통적인 유닉스 스케쥴링은 그룹 개념이 없으며 1초에 한번씩 스케쥴링, 선점, 밴드(우선순위)로 나누어서 스케쥴링. 실제 계산할 땐 CPU시간을 반으로 줄이는 방법을 사용. 한 번 실행시키면 cpu시간을 증가시키니 우선순위를 낮춤. 반으로 줄이는건 우선순위를 높여주려고. 프로세스를 밴드 단..
2.3.7 모니터 : 고급 동기화 프리미티브 : 정확한 프로그램 작성을 도움(프로그래밍 언어 자체 지원 -> 세마포어의 위험성을 배제) 모니터의 속성 : 상호배제 성취 -> 단 하나의 프로세스만 한 순간에 모니터에서 활동 가능. But 프로세스가 진행할 수 없을 때 대기하는 방법도 필요. 버퍼가 가득 차면 생산자는 어떻게 블록되어야 하는가? -> 조건 변수와 wait, signal 연산을 통해 해결 두 프로세스가 동시에 모니터에서 활동하는 것을 피하기 위해, signal이후 어떻게 될 것인가에대한 규칙 필요 wait와 signal이 sleep와 wakeup과 유사하나, 자동적으로 상호배제가 이루어짐. 기찬아 이거 모르겠어 알려줘. 아이템 만들고 집어넣는다. 뺴고, 쓴다. 모니터를 선언하고, 컨디션은 꽉 ..