동기화 이슈를 해결하기 위한 방안으로 Mutual Exclusion 이 있음
Mutual exclusion 상호배제
:임계구역에 하나의 스레드만 들어간다. 여러 스레드가 변경하는 공유 변수에 대해 Exclusive Access를 적용하여 어느 한 스레드가 공유변수를 갱신하는 동안 다른 스레드가 접근하지 못하도록 막는 것.
동일한 자원을 여러 쓰레드가 동시에 읽을시, 동기화 이슈가 발생할 수 있음
Semaphore 를 동기화 이슈를 해결하는데 활용할 수 있음
Semaphore 세마포어
:임계구역에 여러개의 스레드가 들어갈 수 있다.
- 바쁜 대기
wait()은 S가 0이라면, 임계영역에 들어가기 위해, 반복문 수행
바쁜대기, busy waiting -> 멈춤이 없다. -> CPU에 부하를 걸리게 함P(s): wait(S) { while s <= 0 // 대기 S--; // 다른 프로세스 접근 제한 (1감소) }
- 대기 큐
S가 음수일 경우, 바쁜 대기 대신, 대기큐에 넣는다.wait(S) { S->count--; if (S->count <= 0) { add this process to S->queue; // 대기 block() // 블록, sleap() } }
wakeup() 함수를 통해 대기큐에 있는 프로세스 재실행
signal(s) { S->count++; if (S->count >=1) { remove a process P form S->queue; wakeup(P) // 깨우기 } }
교착상태 - 두 개 이상의 작업이 서로 상대방의 작업이 끝나기만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
교착상태의 발생 조건 - 모두 성립해야 발생
상호 배제 : 하나의 프로세스가 자원을 사용중일 때 다른 프로세스는 그를 사용할 수 없다.
점유 대기 : 최소 하나의 자원을 점유하고 있으면서 다른 프로세스가 사용중인 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재한다.
비선점 : 다른 프로세스가 자원을 사용중인 경우 그 사용이 끝날 때 까지 강제로 뺏을 수 없다.
순환 대기 : 프로세스의 집합에서 순환형태로 자원을 대기하고 있어야 한다.
기아상태 : 특정 프로세스의 우선 순위가 낮아서 원하는 자원을 계속 할당받지 못하는 상태를 말함.
교착 상태와의 차이
교착상태는 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태를 말하고 기아 상태는 프로세스가 원하는 자원을 계속 할당 받지 못하는 상태이다. 즉 교착 상태는 여러 프로세스가 동일한 자원 점유를 원할 때 발생하고 기아 상태는 여러 프로세스가 자원을 점유하기 위해 경쟁 할 때 특정 프로세스는 영원히 자원 할당을 받지 못하는 것이다.
메모리가 물리 메모리보다 많아 보이게하는 기술로, 프로세스가 여러개라도 실제 특정 시점에 사용하는 메모리는 작다는 점에 착안한 것이다.
: CPU에 코드 실행시, 가상 주소 메모리 접근이 필요할 때, 해당 주소를 물리 주소값으로 변환해주는 하드웨어 장치이다.
: 물리 메모리에 크기가 동일한 사이즈로 페이지 단위를 만들어 올리는 방법이다. 리눅스 운영체제에서는 4KB 단위로 페이징을 한다. 이 의미는 물리 메모리인 0~4GB를 4KB 단위로 모두 주소를 쪼개서 페이지라고 하고 번호를 붙인다는 말이다. 페이지 번호를 기반으로 가상 주소와 물리 주소가 매핑되어 사용된다.
1단계: 해당 프로세스에서 특정 가상 주소 접근을 시도한다.
2단계: 해당 프로세스의 데이터 영역에서 Page 번호를 확인한다.
3단계: 해당 Page 가 물리 메모리에 있으면, 해당 페이지의 첫부분을 가리키는 물리 주소를 Page Table에서 알아낸다.
4단계: 해당 페이지의 첫부분을 가리키는 물리 주소에 변위값을 더해서, 가상 주소에 해당하는 물리 주소를 접근한다.
페이지 정보를 단계를 나워서 생성한다. 필요없는 페이지는 생성하지 않기 때문에 공간 절약이 가능하다.
페이지 번호를 나타내는 bit를 구분해서 단계를 나눕니다. (리눅스의 경우 3간계로 나뉘어지는데 최근에는 4단계로 나뉘어지기도 합니다.)
: CR3 - 선형 주소를 실제 물리적 주소로 바꾸기 위한 첫번째 작업은 페이지 디렉토리를 찾는 것이며 이 페이지 디렉토리의 위치 정보는 CR3( Control Register 3 )레지스터의 11비트에서 31비트 사이의 20비트를 통하여 얻게된다.
windows에서 프로세스의 스위칭이 일어 날 때마다 CR3 레지스터의 페이지 디렉토리 PFN을 바꾸어 줌으로써 해당 프로세스가 사용하는 가상 메모리를 전혀 다른 물리적 주소와 매핑시킬수 있게 한다.
: 향후에 프로세스가 접근할 페이지들은 미리 물리 메모리에 넣어놓는다면, 페이지 폴트를 줄일 수 있음
여러 프로그램을 한 번에 실행하면 하드디스크와의 입출력이 계속되어 프로그램이 정지한 것 같은 현상이 발생할 수 있다.
메모리가 꽉 찬 이후 새로운 프로그램을 올리기 위해 기존 프로그램을 스왑 영역에 옮기는 횟수가 증가하기 때문이다.
: 서로 크기가 다른 논리적 단위인 세그먼트로 분할하여 가상 메모리를 관리하는 기법
: MMU
: I/O 장치는 데이터 전송을 위해 인터럽트를 사용하여 전송 준비 상태를 CPU에 알린다.
: IDT(Interrupt Descriptor Table)
컴퓨터 부팅 시 운영체제가 IDT에 인터럽트들을 기록하고,
인터럽트가 발생하면 IDT를 확인하여 Interrupt 번호에 해당하는 함수를 호출해서 인터럽트를 처리하게 됩니다.