Ⅰ. 태스크 생성 문제와 동기화 처리

Ⅱ. 인터럽트 제어와 동기화 객체를 통한 동기화

1. 커널 자료구조를 위한, 동기화 객체 설계와 구현

2. 시스템 자료구조를 위한 동기화 함수 적용

(1) 스케줄러 함수에 동기화 코드 적용

(2) 키보드 함수에 동기화 코드 적용

//  스캔 코드를 내부적으로 사용하는 키 데이터로 바꾼 후 키 큐에 삽입
BOOL kConvertScanCodeAndPutQueue( BYTE bScanCode )
{
    KEYDATA stData;
    BOOL bResult = FALSE;
    BOOL bPreviousInterrupt;

    // 스캔 코드를 키 데이터에 삽입
    stData.bScanCode = bScanCode;
    
    // 스캔 코드를 ASCII 코드와 키 상태로 변환하여 키 데이터에 삽입
    if( kConvertScanCodeToASCIICode( bScanCode, &( stData.bASCIICode ),
            &( stData.bFlags ) ) == TRUE )
    {
        // 임계 영역 시작
        bPreviousInterrupt = kLockForSystemData();

        // 키 큐에 삽입
        bResult = kPutQueue( &gs_stKeyQueue, &stData );

        // 임계 영역 끝
        kUnlockForSystemData( bPreviousInterrupt );
    }

    return bResult;
}

//  키 큐에서 키 데이터를 제거
BOOL kGetKeyFromKeyQueue( KEYDATA* pstData )
{
    BOOL bResult;
    BOOL bPreviousInterrupt;

    // 임계 영역 시작
    bPreviousInterrupt = kLockForSystemData();

    bResult = kGetQueue( &gs_stKeyQueue, pstData );

    // 임계 영역 끝
    kUnlockForSystemData( bPreviousInterrupt );
    return bResult;
}