5. Semaphores ㈜아이티즌 기술연구소

Slides:



Advertisements
Similar presentations
POSIX thread SSLab. 신장열. CONTENTS Thread 의 생성 및 종료 Join and detach Cleanup handler Mutex Condition variable Thread signal Thread cancel.
Advertisements

돈과 빈곤. 가난은 장애다 “ 이발소 건물 주인 아저씨는 휠체어를 타고 다녔어. 장애인이었지. 하지만 아버지 앞에서 는 늘 당당했어. 아버지하고 얘기를 나눌 때 면 아버지는 늘 무릎을 꿇으셨지. 눈을 맞춰 야 하니까. 위에서 내려다볼 수는 없잖아, 건 물 주인을. 그.
Copyright © 2015 Pearson Education, Inc. 6 장 : 프로그래밍 언어.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
스택 스택 추상자료형 스택 스택의 구현 스택의 응용 한빛미디어(주).
2016학년도 2학기 일반대학원 모집 공과대학 스마트섬유융합전공
IF(Infinite Fork) 유닉스 시스템 / 정상훈 / 이재형
제 3 장 변수와 자료형.
Project #2-2. Pintos User Program
C++ Espresso 제1장 기초 사항.
MicroC/OS-II Structure
제 4 장 프로세스 Section 1 프로세스의 개념 Section 2 프로세스 스케줄링
제 6장 프로세스 간 동기화 및 통신 6.1 개요 6.2 병행 처리의 문제점
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
Chapter 13 – 병렬 프로그래밍과 병렬 처리
6장 트리.
공유 메모리[1] 공유 메모리 공유 메모리 생성: shmget(2) 같은 메모리 공간을 두 개 이상의 프로세스가 공유하는 것
컴퓨터 과학 개론 √ 원리를 알면 IT가 맛있다 컴퓨터 과학도를 위한 첫 전공서 ehanbit.net.
14. 입출력 다중화 김진홍
제 6 장 프로세스 동기화 (Process Synchronization)
Chapter 03 배열, 구조체, 포인터.
임베디드 운영체제 (리눅스 중심) Lecture #2.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
Multi-thread Programming
Ch 14. System Thread.
4장 병행 프로세스 병행성의 원리를 이해한다 병행 프로세스 수행과 관련된 상호 배 제 해결방안을 알아본다
제2절 법인세의 계산구조와 세무조정 1. 각 사업연도소득에 대한 법인세 계산구조 회계와 사회 결산서상 당기순이익
MicroC/OS-II Lab. 경희대학교 컴퓨터공학과 조 진 성.
MicroC/OS-II 1. Miscellaneous
head data link data link data link NULL a b c
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
데이터베이스 실험실 석사 2학기 김기훈 TCP/IP Socket Programming… 제 17장 멀티쓰레드 기반의 서버구현 데이터베이스 실험실 석사 2학기 김기훈
Micro C/OS-II 2. Task Management
운영체제 허상복 컴퓨터시스템 연구실
게임 품질 관리 QA 업무 스킬 – 버그 리포팅 GameQA.co.kr
Synchronization.
MicroC/OS-II 3. Memory Management ITISN Technical Lab.
성탄절을 향한 길에서.
제7장 추정과 가설 검정.
CHAP 8:우선순위큐 C로 쉽게 풀어쓴 자료구조 생능출판사 2011.
4 병행 프로세스와 상호배제.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
adopted from KNK C Programming : A Modern Approach
컴퓨터 개론 및 실습 Dept. Computer Eng. Hankuk University of Foreign Studies
배열과 연결리스트 연결리스트 배열 메모리 할당이 연속적이어서 인덱스 사용시 검색이 빠르다.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제 6 장 프로세스 동기화 (Process Synchronization)
3장 운영체제 2C 김주성.
* 프로그램을 간단히 하기 위해 malloc 성공체크는 안 함
MicroC/OS-II Concept of Real Time System
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
마이크로소프트 박종호.
4. Time Management 아이티즌 기술연구소
자바 5.0 프로그래밍.
U N I X 창원대학교 전자계산학과 김병찬.
병행 프로세서 과목 : 운영체제 학번 : 이름 : 조장호.
Lecture 7 복잡한 구조 프로그래밍 프로그램 짤 때의 마음가짐 invariant list set
기업회생 절차.
C 코드최적화 세명대학교 AI연구실 양승조.
C 프로그램을 위한 동시성 커버리지 측정 기법 송지영 SWTV KAIST.
Chapter 08 조건문.
천국 가는 길 천국 가는 길 ♧ 천국 가는 길 ♧ 1. 죄와 사망(지옥) 1) 사람의 3가지 공통점 - 죄인, 죽음, 심판
03. 병행 프로세스(Parallel Process)
김진승 한국물리학회 교육위원장, 전북대학교 물리학과
8단계 3층을 완성한다 Case 1 Case 2 Case 3 Case 4
3장 병행 프로세스 2A 박훈.
제3장 선교 구역.반장학교 제1단계.
3장 – 병행 프로세스 A 김정문.
Ch.11. 이진영상처리를 이용한 영상인식.
Presentation transcript:

5. Semaphores ㈜아이티즌 기술연구소 MicroC/OS-II 5. Semaphores ㈜아이티즌 기술연구소 ITISN Technical Lab

5. 상호배제(Mutual Exclusion) 기능 1/6 상호배제의 필요성 공유자원의 사용 시 태스크간 충돌 방지 목적 예) 공중화장실은 한번에 한 명만 들어가도록 문고리가 필요함 공유자원(Shared Resource) 여러 태스크가 함께 사용할 수 있는 자원 태스크간의 가장 쉬운 정보 교환 수단 경쟁 환경에 놓여(Race Condition) 상호배제 필요 공유자원의 독점 액세스 방법 인터럽트 비활성화/활성화 Test-And-Set(TAS) 스케줄링 locking/unlocking// 다른테스크(?)의 진입을 막는다 세마포어, 메시지 메일박스, 메시지 큐 ITISN Technical Lab

5. 상호배제(Mutual Exclusion) 기능 2/6 1. 인터럽트 비활성화/활성화 uC/OS-II 매크로를 이용한 인터럽트 비활성화/활성화 OS_ENTER_CRITICAL / OS_EXIT_CRITICAL 두 태스크간 혹은 태스크와 ISR이 자료를 공유할 때 사용 가장 쉬우면서 빠른 방법(단, 비활성화 시간 너무 길지 않도록 해야 함) void Function (void) { OS_ENTER_CRITICAL(); // 임계영역 진입 . . /* 여기서 공유 데이터를 액세스할 수 있다*/ OS_EXIT_CRITICAL(); // 임계영역 탈출 } 임계 영역(Critical Section) - 한번 진입하면 완료될 때 까지 방해 받지 않는 코드의 영역 - Multi thread 작업 시 상호 배제 목적으로 사용 ITISN Technical Lab

5. 상호배제(Mutual Exclusion) 기능 3/6 2. TAS 동작 방식(Test-And-Set Operation) 전역변수를 이용한 자원 접근 제어 전역변수 사용 중 인터럽트 걸리지 않도록 하는 방식 커널에 의지하지 않은 공유자원 사용 가능 인터럽트 비활성화; if (전역변수==0) // 자원 사용 가능 { 전역변수=1; // 전역변수에 사용 중 표시 인터럽트 활성화; 자원 액세스; // 공유자원의 사용 전역변수=0; // 전역변수에 사용 완료 표시 } Else // 자원 사용 불가 인터럽트 활성화; // 나중에 다시 시도 ITISN Technical Lab

5. 상호배제(Mutual Exclusion) 기능 4/6 3. 스케줄러 locking/unlocking 스케줄링을 막아서 다른 태스크의 실행을 막는다. OSSchedLock()/ OSSchedUnlock() 항상 쌍으로 사용해야 함 사용시 주의 요함! 태스크가 OSSchedLock() 호출한 뒤 태스크 대기상태로 만드는 함수 OSTimeDly(), OSTimeDlyHMSM(), OSTaskSuspend(), OSSemPend()를 호출하면 안됨 => 시스템 다운 void Function (void) { OSSchedLock(); // 스케줄러 비활성화 . . /* 여기서 공유 데이터를 액세스할 수 있다 다른 태스크 실행 불가 */ OSSchedUnlock(); // 스케줄러 활성화 } ITISN Technical Lab

5. 상호배제(Mutual Exclusion) 기능 5/6 4. 세마포어(0을 포함한 양의 정수) 커널이 제공하는 자료구조 “저에게 열쇠를 주세요. 누가 쓰고 있으면 기다리겠습니다.” 세마포어 ITISN Technical Lab

5. 상호배제(Mutual Exclusion) 기능 6/6 세마포어의 3단계 동작 과정 INITIALIZE: 세마포어 초기값 설정 WAIT: 세마포어 유효성 검사: 0 보다 크면 사용 가능함 세마포어를 1 감소 시키고 태스크 계속 실행 세마포어가 0일 경우: 대기목록에 기록하고 기다림 SIGNAL: 세마포어의 사용 완료를 알림 가장 우선순위가 높은 태스크  세마포어 우선획득 OS_EVENT * SharedDataSem; // INITIALIZE Void Function (void) { INT8U err; OSSemPend(SharedDataSem, 0, &err); // WAIT /* 공유 자원 사용 (인터럽트 허용됨) */ OSSemPost(SharedDataSem); // SIGNAL } ITISN Technical Lab

세마포어 기능 두 종류의 세마포어 2개의 구성요소 공유자원에의 접근제어(상호배제)// 공유매모리 접근제어 이벤트 발생의 통보 두 개의 태스크 간 통신에서 수신(읽기)과 발신(쓰기)을 동기 화 시킴 두 종류의 세마포어 바이너리 세마포어 : 0, 1 // 상호배제 때 사용 카운팅 세마포어 : 0 ~ 같은 종류인 n개의 자원// 메모리 나눔 2개의 구성요소 16비트 unsigned 정수 : 세마포어 카운트를 저장 (2의 16승=655535개) 태스크 리스트 : 세마포어 카운트가 0보다 크게 되기를 기다리 는 태스크들(우선순위가 높은 태스크가 실행) ITISN Technical Lab

세마포어의 구성요소 세마포어 카운트값(0~65535)을 갖는 16비트의 부호 없는 정수 세마포어 카운트 값이 0보다 커질 때를 기다리고 있는 태스크의 대기 리스트 세마포어 값 예) 1-> 바이너리 <세마포어와 관련된 ECB> 세마포어 자료형 ITISN Technical Lab

이벤트 컨트롤 블록(ECB:Event Controll Block) 개요 이벤트 컨트롤 블록의 사용(책153, 154참조) ISR과 태스크, 태스크와 태스크간의 상호작용 관리 목적 커널 오브젝트 (OS_EVENT 구조체) 세마포어, 뮤텍스, 메일박스, 메지 큐의 구현 기본 요소 ISR 태스크 ECB (1)신호전송 (2)신호 기다림 (3)선택적 신호대기 타임아웃 설정 태스크 ECB ISR (1)신호 (2)대기 태스크 ECB(세마포어) (4)대기/신호 (3)타임아웃 ITISN Technical Lab

이벤트 컨트롤 블록(ECB) 자료구조 typedef struct { INT8U OSEventType; INT8U OSEventGrp; INT16U OSEventCnt; void * OSEventPtr; INT8U OSEventTbl[…]; } OS_EVENT; 사용 용도를 나타냄 OS_EVENT_TYPE_SEM OS_EVENT_TYPE_MUTEX OS_EVENT_TYPE_MBOX OS_EVENT_TYPE_Q 대기중인 태스크의 우선순위 그룹 세마포어의 경우 : 카운트 뮤텍스의 경우 : PIP 구조체를 가리키는 포인터 (단,메시지 박스나 큐인 경우) OS_EVENT_TYPE_MBOX OS_EVENT_TYPE_Q 이벤트를 대기중인 태스크의 목록 ITISN Technical Lab

ECB 자유 리스트 자유리스트를 이용한 빠른 메모리 관리 이벤트 생성 시 노드 1개 빼서 제공 이벤트 종료 시 노드를 리스트에 추가 이벤트 종류: 세마포어, 뮤텍스, 메일박스, 메시지큐 .OSEventType .OSEventCnt .OSEventPtr .OSEventGrp 6 5 4 7 3 2 1 62 61 60 63 59 58 57 56 OSEventFreeList ITISN Technical Lab

태스크, ISR, 세마포어의 관계 OSSemPend() 사용X OSSemDel() 사용X 태스크 태스크 또는 N N ISR OSSemCreate() OSSemDel() OSSemPost() OSSemAccept() OSSemPend() OSSemQuery() 태스크 태스크 또는 N N ISR ISR OSSemPost() OSSemAccept() OSSemDel() 사용X OSSemPend() 사용X ITISN Technical Lab

세마포어 관련 연산 세마포어 생성 - OSSemCreate() 세마포어 삭제 - OSSemDel() 세마포어 대기 - OSSemPend() // 블러킹 함수 세마포어 반환 - OSSemPost() 세마포어 대기 없이 얻기 - OSSemAccept()// nonblocking 함수 (세마포어 받는 함수) 세마포어 상태 얻기 - OSSemQuery() ITISN Technical Lab

1. 세마포어 생성 - OSSemCreate() OS_EVENT * OSSemCreate( INT16U value // 세마포어 초기 값(0~65,535) ); // 리턴값: 세마포어로 할당된 ECB의 포인터, 에러 시 NULL 반환 1. OS_SEM_EN 활성화 해야 사용 가능 2. 세마포어를 생성하고 초기화 한다. OS_EVENT * DispSem; Void main(void) { OSInit(); // uC/OS-II 초기화 DispSem = OSSemCreate(1); // 세마포어 생성 OSStart(); // 멀티태스킹 시작 } ITISN Technical Lab

2. 세마포어 삭제 - OSSemDel() OS_EVENT * OSSemDel( OS_EVENT * pevent, // 삭제할 세마포어 포인터 INT8U opt, // OS_DEL_NO_PEND(대기 작업 처리 후 삭제) // OS_DEL_ALWAYS(무조건 삭제) INT8U *err // 에러코드를 가리키는 포인터 ); 리턴값: NULL(성공 시), 실패 시 다음과 같이 err에 에러 정보 OS_NO_ERR // 정상 삭제 OS_ERR_DEL_ISR // ISR에서 세마포어 삭제를 시도한 경우 OS_ERRINVALID_OPT // 옵션을 잘못 지정한 경우 OS_ERR_TASK_WAITING // 대기중인 태스크가 있을 경우 OS_ERR_EVENT_TYPE // pevent가 세마포어를 가리키지 않는 경우 OS_ERR_PEVENT_NULL // NULL 포인터를 넘겨준 경우 (예) DispSem= OSSemDel(DispSem, OS_DEL_ALWAYS, &err); ITISN Technical Lab

3. 세마포어 대기 - OSSemPend() void OSSemPend( OS_EVENT * pevent, // 세마포어 포인터 INT16U timeout, // 최대 대기 시간(최대 65,535 클럭틱) INT8U *err // 에러코드 포인터 ); 1. 공유자원에 접근할 때 대기 줄에서 기다린다. 2. err의 종류 OS_NO_ERR 세마포어 획득 성공 OS_TIMEOUT 기다리다 지쳤음 OS_ERR_EVENT_TYPE pevent가 세마포어를 가리키지 않음 OS_ERR_PEND_ISR ISR에서 호출 시 에러 발생 OS_ERR_PEVENT_NULL pevent가 NULL 포인터일 경우 (예) OSSemPend(DispSem, 0, &err); 우선순위가 높은 태스크가 끝날때까지 기다림 // 세마포어가 신호를 받는 경우만 다음 라인이 실행된다. ITISN Technical Lab

4. 세마포어 반환 - OSSemPost() INT8U OSSemPost( OS_EVENT * pevent // 세마포어 포인터 ); // 리턴: 에러코드 OS_NO_ERR 세마포어로 정상적 신호 전송 완료 OS_SEM_OVF 세마포어 값이 범위를 넘을 경우 OS_SEM_EVENT_TYPE pevent가 세마포어를 가리키지 않을 경우 OS_SEM_PEVENT_NULL pevent가 NULL포인터 일 경우 void TaskX(void * pdata) { INT8U err= OSSemPost(DispSem); switch(err){ case OS_NO_ERR: break; } ITISN Technical Lab

5. 세마포어 대기없이 얻기 - OSSemAccept() INT16U OSSemAccept( OS_EVENT * pevent // 세마포어 포인터 ); // 리턴값: 세마포어가 0보다 클 경우 1 감소, 이전 값 리턴 // 사용할 수 없는 경우 0 리턴 1. 자원 사용 가능여부, 이벤트 발생 여부 확인 용도 2. 용도는 OSSemPend()와 유사하나 블럭되지 않음 - ISR내에서 세마포어 사용시 적합 OS_EVENT * DispSem; void Task(void * pdata) { INT16U value= OSSemAccept(DispSem); // 자원사용가능 여부확인 if(value>0) {} // 사용 가능하므로 계속 진행 } ITISN Technical Lab

6. 세마포어 상태 얻기 - OSSemQuery() INT8U OSSemQuery( OS_EVENT *pevent, // 세마포어 포인터 OS_SEM_DATA *pdata // 정보를 받을 OS_SEM_DATA 포인터 ); // 리턴: 에러코드 OS_NO_ERR 호출이 성공한 경우 OS_ERR_EVENT_TYPE 세마포어 포인터가 아닌 경우 OS_ERR_PEVENT_NULL pevent가 NULL인 경우 OS_SEM_DATA 구조체 멤버 INT16U OSCnt; // 현재 세마포어 값 INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; // 대기 테이블 INT8U OSEventGrp; // 대기 그룹 ITISN Technical Lab