Kernel Synchronization (Windows) 유니프로세서 시스템에서는 인터럽트 마스크를 사용해서 전역 자원에 대한 접근을 보호한다. 멀티프로세서 시스템에서는 스핀락을 사용한다. - 스핀락을 사용하는 스레드는 선점되지 않는다. (스핀락을 사용하는 스레드가 선점되면 데드락 발생) 사용자 레벨에서 동작하는 디스패처 객체를 제공한다. 이는 뮤텍스, 세마포어, 이벤트, 타이머로 작동된다. 타이머는 시간이 만료되면 하나 이상의 스레드에게 알린다. 이벤트는 조건변수와 유사하게 작동한다. - 어떤 조건을 만족하면 기다리던 스레드에게 notify() 디스패처 객체는 신호가 있는 상태(객체 사용 가능), 신호가 없는 상태(스레드가 차단됨)으로 나뉜다. 디스패처 객체마다 waiting queue가 있다. 오브..
학교강의필기장/운영체제론
while(test_and_set(&lock)); // CS lock = false; test_and_set : 인자로 들어온 값을 true로 변경하고, 변경 전 target의 값을 반환한다. 스핀락을 구현하기 위해, 인자로 lock이 들어간다고 할 때, 이미 누군가 임계구역에 들어가 있어서 lock이 사용중이라면 true를 반환하므로 true를 반환하는 동안에는 임계구역에 접근을 막는다. 만약 false를 반환했다면 임계구역에 들어가 있는 스레드가 없는 것이므로, 자신이 임계구역에 들어간다. 임계구역에서 벗어날 때는 lock을 false로 바꾼다. while(compare_and_swap(&lock, 0, 1) != 0); // CS lock = false; compare_and_swap : 첫 번째 ..
공유데이터에 대한 동시 액세스는 데이터 불일치를 초래할 수 있기에 협력하는 프로세스의 순서대로 실행되도록 보장하는 스레드 동기화가 필요하다. => 임계구역을 설정해야한다! 각 프로세스는 임계구역에 접근하기 전에 권한을 요청하고, 임계구역이 끝나면 권한을 놓아준다. 임계구역 문제를 해결하기 위해 3가지 조건이 필요하다. 상호배제(mutual exclusion) - 오류가 발생하지 않도록 한 스레드만 진입 가능 진행(progress) - 임계구역에 들어간 프로세스가 없을 때 들어가려는 여러 프로세스가 있을 때 어떤 프로세스가 들어갈지 결정해야함 유한대기(bounded waiting) - 한 번 임계구역에 들어간 프로세스는 그 다음에 다시 들어갈 때 제한을 둬야하고, 모든 스레드는 유한시간 내에 해당 임계구역..
Real-Time CPU Scheduling Event latency : 이벤트가 발생한 시점부터 해당 이벤트를 처리하는데 걸리는 시간 실시간 시스템의 성능에 영향을 미치는 두 가지 유형의 대기시간이 있다. - interrupt latency : 인터럽트가 발생한 시점부터 해당 인터럽트를 처리하는 루틴이 시작되는 데까지 걸리는 시간 - dispatch latency : 현재 프로세스를 CPU에서 제거하고 다른 프로세스로 전환하는데 걸리는 시간 Dispatch Latency 1. 커널 모드에서 실행중인 프로세스의 선점(preemption) : 기존 프로세스를 실행중이던 CPU에게 그 실행을 중지시킴 2. 낮은 우선순위 프로세스가 높은 우선순위 프로세스가 필요로 하는 자원을 해제(release)하는 것. ..
CPU 스케줄러는 준비 큐에 있는 프로세스 중에서 선택하고 CPU 코어를 그 중 하나에 할당한다. 큐는 다양한 방식으로 정렬될 수 있다. CPU 스케줄링 결정은 프로세스가 다음 중 하나의 상태로 전환될 때 발생한다. 1. 실행 중인 상태에서 대기 상태로 전환될 때 2. 실행 중인 상태에서 준비 상태로 전환될 때 3. 대기 상태에서 준비 상태로 전환될 때 4. 종료될 때 실행 중인 상태에서 대기 상태로 전환될 때와 종료될 때는 비선점(nonpreemptive)이다. -> CPU를 안놔줌 running -> ready 일때와 waiting -> ready 일때는 선점(preemptive)이다. -> CPU를 한정된 시간만 사용 공유 데이터에 대한 액세스를 고려해야함 - 경쟁상태 발생 가능 커널 모드에서 선..
대부분의 현대 애플리케이션은 멀티스레드 방식으로 동작한다. 커널은 일반적으로 멀티스레드 방식으로 구현된다. 서버의 경우, 클라이언트로부터 요청이 들어오면 새로운 스레드를 생성해서 해당 요청을 처리하고 서버는 추가적인 요청을 위해 계속 리스닝한다. 스레드끼리는 code, data, files는 공유하고 registers, stack, PC는 독립돼있다 프로세스 생성에 비해 스레드 생성은 가볍다. 코드를 단순화하고 효율성을 높일 수 있다. 멀티스레드 방식의 장점은 다음과 같다. - 응답성 : 프로세스의 일부가 블로킹되어도 계속해서 실행을 지속할 수 있다. - 자원공유 : 스레드는 프로세스의 자원을 공유하기에 공유 메모리 / 메시지 전달보다 쉽게 자원을 공유할 수 있다. - 경제성 : 프로세스 생성보다 스레드..
Direct Communication (직접 통신) 프로세스는 서로를 명시적으로 이름을 지정한다. send(P, message) : 메시지를 프로세스 P에게 보낸다. receive(Q, message) : 메시지를 프로세스 Q에게서 받는다. 통신 링크의 특성 - 링크는 자동으로 설정된다. - 링크는 정확히 하나의 쌍 프로세스와 연관된다. - 각 쌍 사이에는 정확히 하나의 링크가 있다. - 링크는 단방향일 수도 있지만, 일반적으로 양방향이다. Indirect Communication (간접 통신) 메시지는 mailbox(또는 port)에서 직접적으로 보내고 받는다. - 각 mailbox는 고유한 ID를 가진다. - 프로세스는 mailbox를 공유할 때만 통신할 수 있다. 통신 링크의 특성 - 프로세스가 공..
Process Concept 프로세스는 실행 중인 프로그램을 의미하고, 프로세스 실행은 순차적인 방식으로 진행돼야한다. 프로그램 코드(텍스트 영역) : 실행 코드를 포함한다. 현재 활동(PC, 프로세서 레지스터 ..) : 프로세스의 현재 실행 상태를 나타냄 스택 : 일시적인 데이터를 저장함. 함수, 매개변수, 반환주소, 지역 변수 등 데이터 섹션 : 전역 변수를 포함한다. 힙 : 실행 시간에 동적으로 할당되는 메모리를 포함한다. 프로그램은 수동적인 개체, 프로세스는 활성적인 개체. 하나의 프로그램은 여러 개의 프로세스가 될 수 있음. Process State New: 프로세스가 생성 중 Running: 명령이 실행 중 Waiting: 프로세스가 어떤 이벤트가 발생할 때까지 기다림 Ready: 프로세스가 ..