School/운영 체제
스레드
코딩천재홍
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도 지원된다.