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

 

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

 

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

 

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

 

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

 

 

 

| 임계영역 접근 동기화 (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

- 블록킹 서버 모델에서 send recv 함수의 문제점은 데이터를 받을때까지 무한정으로 대기하기때문에 비효율적

 

- select 모델의 함수

 

int select (

    int nfds,

    fd_set *readfds,

    fd_set *writefds,

    fd_set *exceptfds,

    const struct timeval *timeout

) ;

 

readfds : 가독성을 점검 할 소켓 세트에 대한 선택적 포인터

wirtefds : 쓰기 가능성을 점검 할 소켓 세트에 대한 선택적 포인터

exceptfds : 오류 점검 할 소켓 세트에 대한 선택적 포인터\

 

 

| WSAAsyncSelect 모델

 

- 윈도우 메시지 형태로 소켓과 관련된 네트워크 이벤트를 처리 -> 멀티스레드를 사용하지 않고 여러개의 소켓 처리 가능 

 

'프로그래밍' 카테고리의 다른 글

19/10/15 겜서실  (0) 2019.10.15
19/10/1 이벤트 스레드, 스레드 풀  (0) 2019.10.01

- 커널은 컴퓨터를 운영하는데 있어서 중심이 되는 운영체제의 핵심 부분 (일반적으로 커널과 운영체제는 같은 의미로 사용됨)

 

- 커널 오브젝트는 커널에서 관리하는 중요한 정보를 담아둔 데이터 블록

 

| 커널 오브젝트의 이해 

 

- 프로세스 상태 정보와 우선순위 정보는 운영체제 내부에 저장되어야 한다. 그리고 두가지 정보가 변경될 때마다 갱신되어야함 그래야 프로세스 스케줄러가 이 정보를 바탕으로 프로세스를 관리할 수 있음 

 

- 프로세스를 관리하기 위한 구조체를 window 운영체제 개발자들이 정의함 편의상 '프로세스 관리 구조체'로 가칭함

프로세스가 생성될 때 마다 '프로세스 관리 구조체' 변수가 하나씩 생성되고 새롭게 생성된 프로세스 정보들로 초기화 됨 -> 커널 오브젝트

 

| 이외의 커널 오브젝트

 

- 프로세스 생성뿐만 아니라 프로세스내에서 프로그램 흐름을 구성하는 쓰레드를 생성할때도,  IPC를 위해 사용되는 파이프나 메일슬롯을 생성할 때에도 커널 오브젝트를 생성, window에서 파일을 생성할때도 커널 오브젝트가 생성됨

 

| 커널 오브젝트의 조작

 

- 프로그래머가 직접적으로 커널 오브젝트를 조작하는것은 불가능하지만 MS에서 제공하는 시스템함수로 간접적 조작은 가능하다.

 

| 프로세스의 우선순위(Priority) 변경

 

- 핸들은 커널 오브젝트에 할당되는 숫자에 지나지않는다.

- window는 커널 오브젝트를 생성할 때 마다 핸들이라는 '정수값'을 하나씩 부여한다.

 

 

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

1.3 쓰레드의 동기화  (0) 2019.09.25
1.2 쓰레드의 생성과 소멸  (0) 2019.09.25
1.1 쓰레드  (0) 2019.09.24
2. 프로세스  (0) 2019.09.20
1. 스레드 개요  (0) 2019.09.19

- 실행중인 프로그램

- 프로세스의 CPU 할당 순서 및 방법을 결정짓는 일 '스케줄링' 이때 사용되는 알고리즘 '스케줄링 알고리즘'

- 실제로 프로세스를 관리하는 운영체제 요소 (모듈)를 가리켜 '스케줄러'라고 한다.

 

프로세스의 상태변화 

1. 프로세스의 생성 -> Ready 상태로의 전환 -> Ready상태에서 스케줄러에 의해 선택전까지 대기

2. Ready상태에서 스케줄러에 의해 실행 -> Running

3. Running상태에서 우선순위에 의해 Ready상태로의 전환

4. Running상태에서 Blocked상태로의 전환 -> 데이터 입출력에 관한 일을 수행하는 경우(프로그램 실행의 상당 부분을                                                              입출력에 소모하기 때문), Blocked상태는 스케줄러에 의해 선택될수없음

5. Blocked상태에서 Ready상태로의 전환 -> 입출력이 완료된 Blocked 상태의 프로세스는 Ready 상태로 전환

 

- Ready상태의 프로세스는 스케줄러에 의해 바로 실행 가능 , Blocked상태의 프로세스는 불가능

 

컨텍스트 스위칭

- 예) 프로세스 A 관련 레지스터 정보는 메모리에 저장 , 프로세스 B와 관련된 레지스터 정보는 CPU의 레지스터에 복원

- 컨텍스트 스위칭은 시스템에 많은 부담이 된다.

 

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

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

본문은 '윈도우 시스템 프로그램을 구현하는 기술'을 바탕으로 개인적인 공부를 위해 작성했습니다.

 

1.1 스레드 개요

 

- 프로세스가 생성되면 최소 하나의 스레드인 '메인 스레드'가 생성 된다.

- 멀티 스레딩 프로그램을 위해 별도의 스레드를 생성할 수 있다.

- 메인 스레드와 자식 스레드는 차이가 없다.

- 둘 다 커널 객체로서의 스레드이다.

- 커널 영역에서 커널 객체로 존재한다.

 

1.2 스레드의 요소

 

- 스레드 ID

- 스레드 자체의 보안 문맥을 가질 수 있다.

- 해당 프로세스의 상태를 표현하는 CPU 레지스터 집합 요소 - 스레드 문맥

- 커널 모드와 유저 모드를 위한 두 개의 스레드 스택

- 스레드 지역(TLS)라고 불리는 사적 저장 영역

- 스레드는 자신만의 고유한 메시지 큐를 갖는다.

 

- CreateThread 함수 호출 시 스레드 ID 획득가능

- 스레드가 자신의 ID를 알고 싶으면 GetCurrentThreadId 함수를 호출

- 윈도우의 기본 스케줄링 단위는 '스레드'

 

1.3 스레드 스택

- 개별 스레드는 자신만의 스택을 가상 주소 공간 내에 갖게 된다.

- 데이터 영역에는 코드상에서 사용한 상수(문자열 포함)와 전역 변수 , 정적 변수가 그 곳에 위치

- 힙에는 동적으로 할당된 메모리 블록이 위치

- 스택에는 모든 지역 변수가 위치 함수로 전달되는 매개변수와 리턴값의 반환에 사용

- 함수 호출 시에 호출이 완료되었을 때 복귀해서 실행해야 할 코드의 다음 명령어의 위치를 저장하기 위한 IP레지스터    정보가 저장

 

 

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

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


애니메이션을 설정할때 


 Has Exit Time을 체크해두면 모든 애니메이션을 실행한다.






+ Recent posts