운영체제(OS)

    [운영체제] 자바의 동기화 도구

    Java의 모든 객체는 락을 가지고 있다. 이 때, Synchronized메서드를 실행하기 위해서는 락을 얻어야 하는데 다음 2가지 상황이 발생할 수 있다. 1 ) 락을 요청했지만 만약 이미 실행중인 p가 있는 경우 -> 다른 p는 대기해야 한다. (진입 집합) 2 ) sync에 있던 p가 특정 조건을 기다려야 하는 경우 -> 대기 집합 [Java 모니터를 이용한 생산자/소비자] insert(E item) / E remove() 가 주요 함수 public synchronized void insert(E item) { while (count == BUFFER_SIZE) { // 버퍼가 꽉 차 있으면 try { wait(); 대기 } catch { InterruptedException ie } buffer[..

    [운영체제] POSIX 동기화

    POSIX는 동기화 도구로 다음 3가지를 제공한다. 1 ) mutext lock #include // mutex를 사용하기 위함. pthread_mutex_t mutex; // pthread_mutex_t 데이터형 사용. pthread_mutex_init(&mutex, NULL); pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); 2 ) semaphore #include // 세마포 사용을 위함. // 이름이 있는 세마포 sem_t *sem; // sem_t 데이터 형 사용 sem = sem_open("SEM", O_CREAT, 0666, 1); // 이름이 없는 세마포 sem_t sem sem_init(&sem, 0, 1) // 2번 인자 -> 0 ..

    [운영체제] 고전적 동기화 문제들

    고전적인 동기화 문제들에는 3가지가 있다. 1 ) 유한 버퍼 문제 → 생산자와 소비자는 크기가 n인 유한 버퍼를 공유하여 동기화 → mutex : 초기화 1로 (바이너리 동기화) → empty : 생산자가 버퍼가 비어있는지 확인할 때 사용 (counting 동기화) → full : 소비자가 버퍼가 가득 차 있는지 확인할 때 사용 (counting 동기화) 2 ) readers-writers 문제 → 여러 프로세스가 자료를 공유함 → 리더가 활동할 때는 다른 리더들이 공유 데이터에 접근 가능 → 기록자가 활동할 때는 상호배제가 보장되어야 함. 다양한 변형 문제가 존재함 data set semaphore rw_mutex = 1; semaphore mutex = 1; // 상호 배제 read_count 변경 ..

    [운영체제] 동기화를 위한 하드웨어 지원

    [운영체제] 동기화를 위한 하드웨어 지원

    피터슨의 방법은 하드웨어 지원을 요구하지 않기 때문에 소프트웨어 기반 해결책이라고 함. → 임계구역 문제를 해결하기 위한 3가지 하드웨어 명령어가 제시됨. 다음과 같은 상황을 가정해보자. x = 100의 연산과 flag = true의 연산은 서로 아무련 관련이 없다. ->만약 컴파일러가 flag = true를 먼저 실행한다면 예상과 다른 값이 나와버린다. 이러한 문제를 해결하기 위해 하드웨어 명령어를 제시한다. 1 ) 메모리 장벽 : memory barrier() 위로 선언된 모든 문장들이 실행 되어야 그 다음 문장이 실행됨. while(!flag) memory_barrier(); print x; x = 100; // x가 적재 되는 것을 보장 memory_barrier(); flag = true; 2 ..

    [운영체제] 스레드 스케줄링

    사용자 수준 스레드는 스레드 라이브러리에 의해 관리되고, 커널은 그들의 존재를 알지 못한다. CPU상에 실행되기 위해서는 LWP를 통한 간접적인 방식일지라도 사용자 수준 스레드는 연관된 커널 수준 스레드에 사상되어야 한다. [경쟁 범위] 1 ) 프로세스-경쟁-범위(PCS) : 동일한 프로세스에 속한 스레드들 사이의 CPU경쟁 2 ) 시스템-경쟁-범위(SCS) : CPU상에 어느 커널 스레드를 스케줄 할 것인지 결정 [Pthread 스케줄링] pthread_attr_getscope(&attr, &scope) // 현재 스코프가 뭔지 가져옴. scope == PTHREAD_SCOPE_PROCESS scope == PTHREAD_SCOPE_SYSTEM pthread_attr_setscope(&attr, PTH..