| 동기 입출력

- 애플리케이션은 입출력 함수를 호출한 후 입출력 작업이 끝날때까지 대기

- 입출력 작업이 끝나면 입출력 함수는 리턴하고 애플리케이션은 입출력 결과를 처리하거나 다른 작업을 진행

 

 

| 비동기 입출력

- 애플리케이션은 입출력 함수를 호출한 후 입출력 작업의 완료 여부와 무관하게 다른작업 수행

- 입출력 작업이 끝나면 운영체제는 작업 완료를 애플리케이션에게 알려줌. 이때 애플리케이션은 다른 작업을 중단하고 입출력 결과를 처리

 

| Overlapped 모델(비동기 입출력 + 비동기 통지)

 

사용 절차

1. 비동기 입출력을 지원하는 소켓 생성

2. 비동기 입출력을 지원하는 소켓 함수 호출

3. 운영체제는 소켓 입출력 작업 완료를 애플리케이션에게 알려주고(= 비동기 통지), 애플리케이션은 결과를 처리

 

 

비동기 함수 -> 확장함수 

 

| Asynchronous Procedure Call (APC)

 

콜함수 -> 사용자

콜백함수 -> 운영체제]]

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

프로세스 스케쥴링  (0) 2019.10.01
Signaled vs Non signaled  (0) 2019.09.30
프로세스간의 통신  (0) 2019.09.30
timer 함수  (0) 2019.09.26
1.3 쓰레드의 동기화  (0) 2019.09.25

| 일반 OS 와 RTOS

 

- 일반 OS는 비선점형 OS와 선점형 OS가 있다.

 

비선점형 OS은 실행 중인 프로세스보다 높은 우선순위의 프로세스가 등장한다고 해서 실행의 대상을 바로 변경하지 않는다.

선점형 OS는 현재 실행 중인 프로세스보다 높은 우선순위의 프로세스가 등장하면 스케줄러에 의한 실행순서가 적극 조정된다.

 

- RTOS는 softRTOS와 hardRTOS가 있다.

 

| 우선순위 스케줄링 알고리즘

 

우선순위가 높은 프로세스가 먼저 실행됨, 선점형 OS의 대표적인 특징

 

| 라운드 로빈 스케줄링 알고리즘

 

우선순위가 같은 프로세스들간 형평성 유지를 위해, 정해진 시간 간격만큼 실행을 하고 우선순위가 동일한 다른 프로세스에게 CPU할당을 넘기는 방식으로 제공된다. 오로지 형평성을 위해서

 

| 스케줄링 알고리즘에 의해서 스케줄링이 진행되는 시점

 

1. 매 타임 슬라이스에 맞춰서 스케줄러 동작

2. 프로세스가 생성 및 소멸될 때마다 스케줄러 동작

3. 현재 실행 중인 프로세스가 블로킹 상태에 놓일 때마다 스케줄러 동작

 

| Priority Inversion

 

우선순위 프로세스가 뒤 바뀌는 현상

 

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

비동기 서버 모델 모음  (0) 2019.10.08
Signaled vs Non signaled  (0) 2019.09.30
프로세스간의 통신  (0) 2019.09.30
timer 함수  (0) 2019.09.26
1.3 쓰레드의 동기화  (0) 2019.09.25

- 커널 오브젝트는 두가지의 상태를 지닌다 signaled 상태(신호를 받은 상태) , non singnaled 상태(신호를 받지 않은 상태)

- 프로세스 커널 오브젝트의 상태는 한번 signaled 상태로 변하면 다시 non-signaled 상태로 변경되지않는다.

 

| 커널 오브젝트의 두 가지 상태를 확인하는 용도의 함수

 

- waitforsingleobject

 

DWORD WaitForSingleObject(

      HANDLE hHandle,

       DWORD dwMilliseconds

);

 

hHandle이 가르키는 커널 오브젝트가 singled상태가 되었을 때 반환한다. 커널 오브젝트가 singled 상태가 될 때 까지 기다리는 함수이다. dwMilliseconds는 커널 오브젝트가 singled 상태가 될 때까지 기다릴 수 있는 최대 시간을 밀리세컨드 단위로 지정하는 용도로 사용하는 인자이다. 만약 상수를 INFINITE로 전달하는 커널 오브젝트가 singled상태가 될 때 까지 무한정 대기함

 

- waitformultipleobject

 

DWORD WaitForMultipleObjects(

   DWORD nCount,

   const HANDLE *lpHandles,

   BOOL bWaitAll,

   DWORD dwMilliseconds

);

 

커널 오브젝트가 둘 이상이고, 이들의 핸들이 배열로 묶여 있다면 이 함수를 활용하는것이 효과적

nCount : 배열에 저장되어 있는 핸들의 개수를 전달

lpHandles : 핸들을 저장하고 있는 배열의 주소정보를 전달

bWaitAll : 관찰대상이 하나라도 singled상태인지 모두 singled상태가 되면 반환할 것인지 결정짓는다

 

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

비동기 서버 모델 모음  (0) 2019.10.08
프로세스 스케쥴링  (0) 2019.10.01
프로세스간의 통신  (0) 2019.09.30
timer 함수  (0) 2019.09.26
1.3 쓰레드의 동기화  (0) 2019.09.25

메일슬롯 방식의 IPC

 

- 메일슬롯 방식은 파이프와 더불어 대표적인 IPC 기법

- 메일슬롯은 브로드캐스팅 방식의 통신을 지원

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

프로세스 스케쥴링  (0) 2019.10.01
Signaled vs Non signaled  (0) 2019.09.30
timer 함수  (0) 2019.09.26
1.3 쓰레드의 동기화  (0) 2019.09.25
1.2 쓰레드의 생성과 소멸  (0) 2019.09.25

BOOL SetWaitableTimer(
   HANDLE hTimer,
   const LARGE_INTEGER *lpDueTime,
   LONG lPeriod, // 0이하 이면 한번만 실행
   PTIMERAPCROUTINE pfnCompletionRoutine,
   LPVOID lpArgToCompletionRoutine,
   BOOL fResume
)
;

 

다양한 방법

- timer 스레드를 하나 더 생성해서 timer가 끝나면 signaled상태로 전환 , 스레드 200개 생성 방법

- 전체를 관장하는 메인스레드를 하나 만든다. 

 

 

구현해야할 것 

- 랜덤으로 우선순위 스레드 5개를 생성

- 스레드 200개 생성

- 30분마다 빈자리 체크

 

- cpu 친화도

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

Signaled vs Non signaled  (0) 2019.09.30
프로세스간의 통신  (0) 2019.09.30
1.3 쓰레드의 동기화  (0) 2019.09.25
1.2 쓰레드의 생성과 소멸  (0) 2019.09.25
1.1 쓰레드  (0) 2019.09.24

- 쓰레드의 실행순서를 정의하고, 이 순서에 반드시 따르도록 하는 것이 쓰레드 동기화이다.

 

- 메모리 접근에 있어서 동시접근을 막는 것 또한 쓰레드의 동기화에 해당한다.

 

| 쓰레드 동기화의 두 가지 방법

 

- 유저 모드 동기화 -> 동기화 진행 과정에서 커널의 힘을 빌리지 않는다. 성능상의 이점이 있다.

 

- 커널 모드 동기화 -> 동기화에 관련된 함수가 호출될 때 마다 커널 모드로의 변경이 필요하고 , 이는 곧 성능의 저하로 이어진다. 그러나 유저 모드 동기화에서 제공하지 못하는 기능을 제공받을 수 있다.

 

 

 

| 임계영역 접근 동기화 (criticla section)

 

- 둘 이상의 쓰레드가 동시에 실행할 경우 문제가 발생할 수 있다. 이러한 문제를 일으키는 코드 블록을 가르켜 임계 영역이라고 한다.

 

- 배타적 접근 (한 순간에 하나의 쓰레드만 접근)이 요구되는 공유 리소스(전역변수와 같은)에 접근하는 코드 블록을 의미한다.

 

 

 

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

프로세스간의 통신  (0) 2019.09.30
timer 함수  (0) 2019.09.26
1.2 쓰레드의 생성과 소멸  (0) 2019.09.25
1.1 쓰레드  (0) 2019.09.24
3. 커널 오브젝트  (0) 2019.09.23

| 쓰레드의 생성

 

- createThread -> 쓰레드 생성함수

 

1. ipThreadAttributes : 프로세스를 생성하는 함수에도 동일한 매개변수가 존재한다. 앞서 우리는 이 매개변수를 통해서 핸들의 상속 여부를 결정함 여기서도 같은 의미로 사용 NULL이 전달되면 생성되는 핸들은 자식 프로세스 생성 시 상속 대상에서 제외

 

2. dwStackSize : 쓰레드 생성 시 해당 쓰레드를 위한 스택이 별도로 생성됨 이때 생성되는 쓰레드의 스택 크기를 지정하기 위한 매개변수다. 만약, 0이 전달되면 디폴트 스택 크기인 1M바이트가 적용된다.

 

3. ipStartAddress : 쓰레드로 동작하기 위한 함수. 다시 말해서 쓰레드의 main 역할을 하는 함수를 지정하는 전달인자

 

4. ipParameter : 쓰레드 함수에 전달할 인자를 지정하는 용도로 사용

 

5. dwCreationFlags : 쓰레드의 생성 및 실행을 조절하기 위해 사용되는 전달인자

 

6. ipThreadld : 쓰레드의 ID를 전달받기 위한 변수의 주소값 전달

 

7. 마지막으로 함수 호출이 성공하면 생성된 쓰레드의 핸들이 반환된다.

 

- dwMilliseconds : 쓰레드의 실행을 멈추기 위한 시간 정보를 Millsecond 단위로 지정한다. 0을 인자로 전달할 경우 자신에게 현재 할당된 타임 슬라이스를 포기하고 우선순위가 같은 다른 쓰레드에게 실행의 기회를 양보한다. 만약 우선순위가 같은 쓰레드가 존재하지 않는다면 바로 이어서 실행을 재개한다.

 

 

| 쓰레드의 소멸

 

- return문을 통해 쓰레드를 종료하는 것이 가장 이상적

 

- dwExitCode : 커널 오브젝트에 등록되는 쓰레드 종료코드를 지정한다.

현재 실행중인 쓰레드를 종료하고자 할 때 호출하는 함수, return만큼 선호되는편이다.

 

- TerminateThread : 외부에서 쓰레드를 종료시키고자 할 경우 ,외부에 의한 강제 종료

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

timer 함수  (0) 2019.09.26
1.3 쓰레드의 동기화  (0) 2019.09.25
1.1 쓰레드  (0) 2019.09.24
3. 커널 오브젝트  (0) 2019.09.23
2. 프로세스  (0) 2019.09.20

- 컨텍스트 스위칭으로 인한 성능저하가 예상될때 이를 줄일 수 있는 방법으로 저장하고 복원하는 컨텍스트 정보의 개수를 줄이면 가능함

 

| 프로세스와 쓰레드의 비교

 

- 쓰레드는 하나의 프로그램 내에서 여러 개의 실행 흐름을 두기 위한 모델이다.

- 쓰레드는 프로세스처럼 완벽히 독립적인 구조가 아니다. 쓰레드들 사이에는 공유하는 요소들이 있다.

- 쓰레드는 공유하는 요소가 있는 관계로 컨텍스트 스위칭에 걸리는 시간이 프로세스보다 짧다.

 

| 쓰레드의 특성 

 

1. 쓰레드마다 스택을 독립적으로 할당 -> 스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수등 함수 호출에 필요한 메모리 영역이므로 실행 흐름의 추가를 위한 최소 조건이 독립된 스택의 제공이다.

 

2. 코드 영역을 공유함 

 

3. 데이터 영역과 힙을 공유한다.

 

 

| 커널 레벨 쓰레드와 유저 레벨 쓰레드

 

- 커널 레벨 쓰레드 : 커널이 쓰레드를 지원할 경우 쓰레드 관리가 커널 영역에서 이뤄짐

- 유저 레벨 쓰레드 : 커널이 지원하지 않을 경우에 라이브러리를 통해서 제공받아야 하는데 이러한 경우 유저 영역에서 쓰레드의 관리가 이뤄진다.

 

| 메모리 활용 대상

- 유저 영역 : 사용자에 의해서 할당되는 메모리 공간

- 커널 영역 : 유저 영역을 제외한 메모리 공간 

 

| 커널 모드 & 유저 모드

 

- window 운영체제가 동작하는 두 가지 모드

- 커널 모드와 유저 모드의 차이점은 프로세스가 유저 모드에서 동작할때는 커널모드로의 접근이 불가

커널 모드일때는 모두 접근 가능

- 모드의 전환은 시스템에 부담을 주는 일이다.

- 커널모드와 유저모드를 제공하는 것은 프로세서이다. 

 

 

 

'프로그래밍 > 시스템프로그래밍' 카테고리의 다른 글

1.3 쓰레드의 동기화  (0) 2019.09.25
1.2 쓰레드의 생성과 소멸  (0) 2019.09.25
3. 커널 오브젝트  (0) 2019.09.23
2. 프로세스  (0) 2019.09.20
1. 스레드 개요  (0) 2019.09.19

+ Recent posts