프로그램은 논리적인 조각으로 구성되어있고, 이 조각들을 세그먼트라고 부른다. 이 세그먼트 단위로 물리 메모리를 매핑하여 가상메모리 기법 사용. 소스텍스트(소스코드)와 같은 것들이 하나의 가상주소를 구성 -> 각각 물리 메모리에 매핑시켜 필요한 세그먼트만 물리 메모리로 로드시켜 프로세스 실행 : 세그멘테이션 기법 논리적으로 펼치면 이런 형태가 됨. 세그먼트 번호와 offset을 통해서 주소를 만들어 냄. 5개의 세그먼트가 있음 -> 3비트 필요. '매핑의 단위가 페이지가 아닌 세그먼트 단위다'를 기억. 세그먼트 단위는 프로그램의 크기와 상이 : 가변 -> 문제 발생 : 메모리에 공간이 없을 때 덜 사용하는 세그멘트를 쫓아내고 필요한 세그먼트를 로드하게 됨. -> 가상메모리 기법 자체가 물리메모리보다 큰 프..
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로 바꾼 후 테스트 함수 호출(자신의 번호를 인자로 받음) -> 테스트를 부..