포도가게의 개발일지

동시성 프로그래밍 본문

CS

동시성 프로그래밍

grape.store 2021. 9. 26. 15:17
반응형

동시성 프로그래밍이란 ?

 - 물리적으로는 하나의 일만 처리하지만 논리적으로 여러 일을 동시다발적으로 하는것
 - 8장에서 나왔듯이 timer interrupt등 다양한 시그널들을 통하여 코어가 일을 나눠서 하게 된다.

 

동시성 프로그램을 만들기 위해 세 개의 기본 접근방법이 제공되며

  • 프로세스
  • I/O 다중화
  • Thread

가 있다.

프로세스

- 8장에서 처럼 fork 등 chile process를 만들어 여러 프로세스를 만드는 기법

I/O 다중화

 

Thread

- 하나의 프로세스 안에 여러 thread를 만들어 일을 논리적으로 동시에 처리한다.

- 각 쓰레드는 고유의 정수 TID, 스택, 스택 포인터, 프로그램 카운터, 범용 레지스터, 조건 코드를 포함한 자신만의 context를 가진다.

- 하나의 프로세스 안에 가상 주소공간의 전체 내용(코드, 데이터, 힙, 공유라이브러리, 오픈한 file)을 공유한다.

- 특정 시점에서 메인 쓰레드(최초)는 peer thread를 생성하며 이때 부터 두 쓰레드가 동시에 돌아간다.

 

Pthread

- Posix Thread는 c 프로그램에서 쓰레드를 조작하는 표준 인터페이스이다.

2번째 매개변수는 항상 NULL이다
peer쓰레드가 종료되기를 기다리는 join 함수
다른 쓰레드가 접근하는 것을 막기 위핸 detach(분리) 함수
간단한 thread를 이용하여 multi concurrency echo서버 구현

공유변수(shared variables in Threaded Programs)

- Process와 달리 thread는 stack을 제외한 모든 자원을 공유하여 변수에 접근이 용이(사실 stack도 접근이 되긴하지만 분리시켜준다)

- 하지만 잘못된 스케쥴링(왜냐하면 core가 어떤 thread를 처리할지는 os에 달려있고 랜덤하게 일어나기때문)으로 잘못된 값을 도출 할 수 있다.

 

쓰레드에 count 처리 순서로 인해 
20000이 나와야 할 값이 이상한 값이 나오게 된다.
두개의 쓰레드가 동시에 공유변수에 접근했을때 일어나는 unsafe region에 들어가게 된다.

세마포어(Semaphores)

- 이러한 동시적으로 접근하는 것을 막기 위해 나온 알고리즘

- 그 유명한 다익스트라가 고안해 냈다.

- 핵심은 하나의 쓰레드가 그 변수에 접근해 있을때 다른 쓰레드들이 그 변수를 건들 수 없게 한다.

다른 쓰레드가 사용하고있을때 접근자체가 되지 못하며 unsafe region을 -1로 표기할 수 있다.
이렇게 변수에 작성을 끝내고 저장하고 넘겨줌으로써 정상적인 20000이라는 count에 도달 할 수 있다.

'CS' 카테고리의 다른 글

Kaist PintOS Project 2  (0) 2021.10.13
Kaist PintOS Project 1  (0) 2021.10.04
네트워크 프로그래밍 & Echo server  (0) 2021.09.22
동적 메모리 할당 part 2  (0) 2021.09.13
동적 메모리 할당  (0) 2021.09.10
Comments