코딩천재홍 2021. 4. 14. 21:33

Motivation (왜 multithreaded programming 하는가?)

  • 하나의 프로세스가 여러 개 실행흐름을 가지는 것.
  • 프로그램안의 실행흐름을 스레드라고 한다.
  • 요즘 응용 프로그래밍들은 하나의 프로세스가 여러개 실행흐름 가지는 multithreaded programming 경우 많다.
  • 장점
    • 한 스레드는 update display, 다른 스레드는 데이터 가져오기, 스펠링 체크하는 것처럼 다양한 일을 하는 스레드들로 하나의 응용 프로그램이 구성될 수 있다. (multithread 예)
    • 코드를 간단하게 할 수 있다. 각자 하는 일을 하나의 스레드로 만들어서 처리하게 함으로써 전체 프로그램이 하나에 몰려있지 않게 함
    • 여러 thread가 돌아감으로써 효율성 개선할 수 있다.
    • 또한 운영체제 자체도 여러개의 thread로 구현되는 경우가 많다. 하나는 메모리 관리, i/o관리 ....
  • 일이 동시에 발생하는 것을 여러개의 process를 이용해 같은 효과 낼 수 있지만 여러 개 process 만드는 것은 여러개 thread 만드는 것보다 비용 많이 든다.

 

 

  • 서버에서 multithread 장점
    • 서버를 하나의 프로세스로 만들었다면 client 요청하면, 이 서버가 client 요청처리할 때까지 다른 요청들은 대기
    • server를 사용자가 덜 기다리게 하는 방법은 client 요청이 들어오면 요청을 처리할 수 있는 새로운 프로그램/ 프로세스를 만들어서 넘겨주고 서버는 다음 요청 받는 것
    • 응답성 좋아진다.
    • 사용자 요청 처리하는 process 만드는 것보다 스레드 만드는 것이 비용 훨씬 적게 든다.
    • client 요청 들어오면 요청 처리하는 스레드 생성해서 처리하고 서버는 요청 또 받아들이고 거기에 대한 스레드 생성해서 처리하는 형식

 

 

  • code, data, files 공유해서 효율적이다.
  • 실행흐름 돌아가기 위해서는 register 내용, 실행 순서 달라지므로 stack내용 달라진다. 따라서 각 스레드마다 stack, register 따로 가지고 있다.
  • 프로세스를 따로 만든다면 전체 똑같은 것 만들어지기 때문에 비효율적이다.
    • 프로세스 세개 만드는 것보다 스레드 세개 만드는 것이 비용 훨씬 적게 든다.

 

 

multithreaded program benefit

  • 응답성 개선
    • 스레드 일시키고 요청 받을 수 있다.
  • 자원 공유 
    • code, data, file 공유하기 때문에 Ipc 따로 필요 x
    • 스레드간 communicatio 필요없이 데이터를 주고 받을 수 있다.
  • 비용 적게듬, process 간 context switch보다 스레드간 context switch 빠르다.
  • scalability
    • 요즘 multiprocessor architecture (프로세스 여러개, 한 프로세스 core 여러개) 가진 cpu여러개인 컴퓨터가 늘어나고 있다.
    • cpu 여러개 있는 컴퓨터 잘 활용하려면 스레드가 많은 응용이 좋다. core 8개 → 8개 쓰레드 있으면 각각 core가 병렬적으로 수행할 수 있다.
    • multicore system이 많아지면서 스레드가 많은 프로그램이 더 유리하다.
    • 요즘 cpu 좋아져서 많은 수의 스레드를 처리할 수 있으니까 훨씬 더 장점있다.

 

concurrency vs parallelism

  • concurrency 
    • A라는 작업도 진행되고 B라는 직업도 진행 되는것. 병행이다. 함께나간다 
    • CPU 1개여도 병행성은 얻을 수 있다. 빨리 스위칭하면 작업들이 같이 진행되는 것처럼 보인다. (병행성)
    • 그러나 어느 순간에 cpu 실행하고 있는 프로그램은 하나이므로 병렬 성은 없다.
  • parallelism
    • 동시에 나가는 것아니라 어떤 한 시점에서 보면 A도 실행되고 있고 B도 실행되고 있다. 동시에 실행되고 있다.
    • cpu 2개 있다면 어느 순간에 작업이 여러개 실행되고 있다. (병렬성)

 

 

Multicore Programming

multicore 이나 multiprocessor 시스템이 잘 활용할려면 program 맞게 짜야한다.

  • Dividing activities
    • 작업을 core 2개를 동시에 돌리기 위해서 core1에 시킬일, core2에 시킬일 나눠야 한다. a, b작업이 동시에 실행되도 아무런 문제 없는 것 나눈다.
  • Balance
    • c1은 바쁜데 c2 한가하면 core 두개 사용한다는 효율이 떨어진다. 두개의 일의 양 균형 맞춘다.
  • Data Splitting
    • a 작업에서 사용되는 데이터, b에서 사용하는 데이터 구별된다면 a에 처리하는 데이터, b에 처리하는 데이터 나누어서 처리되도록 데이터를 나눈다.
  • Data dependency
    • core 2는 core1 결과 받아서 core 2 실행되야 하낟고 하면 동기화해줘야 한다. 
  • testing and debuggig
    • 병렬 프로그램 짜게 되면 testing, debugging 어려움

multicore에 적합한 프로그램으로 작성하는 것은 상당히 노력이 많이 드는 일이다. 

요즘 program language들은 작업을 병렬로 실행되게 지정하면 알아서 위에 특성들 지원해준다.

 

 

 

병렬 프로그램 종류

  • Data parallelism (데이터 병렬)
    • 각 core, 각 처리기에 데이터를 나눠주는 것을 데이터 병렬성이라고 한다.
    • ex) 배열 세 부분으로 쪼개서 각 배열의 합 구하고 전체 다 더해서 전체 배열의 합 구하기
  • Tast parallelism (Task 병렬)
    • 하나의 Data를 가지고 서로 다른 작업을 core에 assign 하는 것을 task 병렬이라고 한다.
    • ex) c1은 배열에서 가장 작은 수 구하고 c2는 배열에서 가장 큰 수 구하기
  • 요즘엔 cpu가 core 수가 많아지고 하나의 core에 여러개의 trhead를 실행시킬수 있는 능력 가지고 있는 경우 많다.

 

 

Amdahl's Law

  • cpu 개수에 따라서 작업하는 속도가 cpu가 1개에 비해서 몇배로 증가하는가 규칙화 한 것.
  • S - serial portion (serial하게 해야될 부분)
  • N - cpu 개수

cpu개수를 많이 늘려도 S부분이 크면 별의미 없다. S는 시간을 줄일 수 없으니까 cpu 커지면 커질수록 s의 영향이 많아진다. multicore 효과 올릴려면 s부분 적어야 된다.

 

 

 

사용자 스레드와 커널 스레드

  • 사용자스레드 실행이 되다가 커널의 서비스가 필요할 때 커널 스레드로 들어가야 한다. 그 후 커널 스레드가 처리해 준다.
  • 사용자 스레드와 커널 스레드가 관계를 맺어야 하는데 커널스레드와 사용자 스레드가 어떤 방식으로 연결 되는가
    • many to one
    • one to one
    • many to many

 

 

  • many to one
    • 사용자 스레드 여러 개 있다면 사용자 스레드는 하나의 커널 스레드로 연결 되는 경우
    • 모든 사용자 스레드가 사용자 레벨에서 스레드가 여러개인데, 커널 스레드는 결국 1개만 있다.
      • ex) 커널 스레드를 이용하여 printer 해야 한다. 그 동안 kernel block 되있어서 user thread로 커널 스레드를 이용하지 못한다. 
    • 병행성 현저히 떨어진다. I/O가 끝나고 리턴되야 다른애들이 커널 스레드 받아서 다른일 할 수 있기 때문
  • ONE to one model
    • 사용자 스레드 1개당 커널 스레드 1개 대응
    • 사용자가 새로운 스레드 만들면 거기에 해당하는 커널 스레드가 생겨나는 방식
    • 커널 스레드 하나 block 되도 다른 core들은 다른 커널 스레드 실행할 수 있음
    • many to one보다 병렬성 좋다.
    • 문제점
      • 만약 사용자가 스레드 엄청 많이 만든다면 대응되는 커널 스레드 만들어줘야 하므로 다른애들은 피해받게 된다.
      • 사용자 스레드 수 통제할 수 없기 때문에 몇개 만들어졌는지 예측할 수 없다.
    • 요즘은 스레드 많이 만들수 잇는 환경이고 부담감 많이 줄어들었다.
  • Many to many
    • 사용자 수준에서 돌아가는 스레드 숫자 여러개고 커널 레벨에서도 스레드가 여러개 돌아가고 있다.
    • 커널 레벨 스레드수는 사용자 레벨 스레드 수보다 작다.
    • ex) 사용자 스레드 수 : 100, 커널 스레드 수 :10 → 커널 스레드 1개가 대략 10개의 슬레드를 multi flexing 하는 것
    • one to one 보다 병행성 떨어지지만 many to one보다는 병행성 좋다.
    • 장점 : 미리 커널 스레드 개수의 최대 개수를 지정할 수 있다.
    • 단점 : 한 커널 스레드가 10개 맡고 있다고 할때 이용하다가 block 되면 다음 것들 진행 안된다.
  • two level model
    • 보통 many to many으로 매칭 되고 필요하면 one to one도 지원된다.