프로세스, 스레드, 멀티스레드

Siwoo Pak·2021년 9월 12일
0

컴퓨터공학

목록 보기
5/8

프로세스

  • 맥의 활성상태보기에서 보면 실행 중인 애플리케이션들, 하나하나를 프로세스라고 부름
  • 디스크에 있는 것은 프로그램, 메모리에 로드된 것은 프로세스
  • 스택, 힙, 데이터, 코드로 나뉘어짐

프로세스의 상태

  • new:프로세스가 처음 생성되었을 때
  • ready:프로세스가 프로세서에 할당되기를 기다릴 때
  • running:프로세스가 할당되어 실행될 때
  • waiting: 프로세스가 이벤트를 기다릴 때
  • terminated: 프로세스가 실행을 마쳤을 때

PCB(process control block)

  • 각각의 프로세스는 자신의 정보 묶음인 PCB를 갖음
  • PCB 담기는 정보들
    • Process state: 프로세스의 상태.
    • Program counter: 해당 프로세스가 이어서 실행해야 할 명령의 주소를 가리키는 카운터.
    • CPU registers: 프로세스가 인터럽트 이후 올바르게 작업을 이어가기 위해 참조하는 CPU 레지스터 값.
    • CPU-scheduling information: 프로세스의 중요도, 스케줄링 큐 포인터 등 스케줄링 파라미터 정보.
    • Memory-management information: base, limit 레지스터 값, 페이지 테이블 등 메모리 시스템 정보.
    • Accounting information: 사용된 CPU 총량, 프로세스 개수, 시간 제한 등.
    • I/O status information: 프로세스에 할당된 입출력 장치 목록, 열린 파일 목록 등.

스레드, 멀티스레드

  • 프로세스의 작업 흐름
  • 하나의 프로세스가 한번에 하나의 작업만 수행하는 것은 싱글스레드
  • 하나의 프로세스가 동시에 여러 작업을 수행하는것을 멀티스레드
  • 프로세서와 메모리가 발전하면 가능해진 기술
  • 밀티프로그래밍 시스템이니까 프로세스를 여러 개 돌려도 되는데 스레드로 나누는 이유는
    • 두 프로세스가 하나의 데이터를 공유하려면 메시지 패싱이나 공유 메모리 또는 파이프를 사용해야 되는데, 효율도 떡락, 개발자가 구현, 관리하기도 번거로움
    • 프로세스 사이 컨텍스트 스위치가 계속 일어나면 성능 저하가 발생, 스레드 전환에도 컨텍스트 스위치가 일어나지만 속도가 더빠름

Multithreaded Server Architecture

  • 서버와 클라이언트 사이에도 멀티스레드를 구현함.
  • 클라이언트가 서버에게 요청을 보내면 서버는 새로운 스레드를 하나 생성해 요청을 수행.
  • 프로세스를 생성하는 것보다 스레드를 생성하는 것이 더 빠르기 때문.

Multicore Programming

  • 멀티코어 혹은 멀티프로세서 시스템을 구현할 때 동시성과 병렬성을 알아야 함.
  • 동시성은 싱글 프로세서 시스템에서 사용되는 방식, 프로세서가 여러 개의 스레드를 번갈아가며 수행함으로써 동시에 실행되는 것처럼 보이게 하는 방식.
  • 병렬성은 멀티코어 시스템에서 사용되는 방식, 여러 개의 코어가 각 스레드를 동시에 수행하는 방식이다.

User Threads and Kernel Threads

  • 유저 스레드: 사용자 수준의 스레드 라이브러리가 관리하는 스레드.
  • 스레드 라이브러리: POSIX Pthreads, Win32 threads, Java threads.
  • 커널 스레드는 커널이 지원하는 스레드.
  • 커널 스레드를 사용하면 안정적이지만 유저 모드에서 커널 모드로 계속 바꿔줘야 하기 때문에 성능이 저하, 반대로 유저 스레드를 사용하면 안정성은 떨어지지만 성능이 저하되지는 않는다.

Multithreading Models

  • Many-to-One Model
    하나의 커널 스레드에 여러 개의 유저 스레드를 연결하는 모델이다. 한 번에 하나의 유저 스레드만 커널에 접근할 수 있기 때문에 멀티코어 시스템에서 병렬적인 수행을 할 수가 없다. 요즘에는 잘 사용되지 않는 방식이다.
  • One-to-One Model
    하나의 유저 스레드에 하나의 커널 스레드가 대응하는 모델이다. 동시성을 높여주고, 멀티프로세서 시스템에서는 동시에 여러 스레드를 수행할 수 있도록 해준다. 유저 스레드를 늘리면 커널 스레드도 똑같이 늘어나는데, 커널 스레드를 생성하는 것은 오버헤드가 큰 작업이기 때문에 성능 저하가 발생할 수 있다.
  • Many-to-Many Model
    여러 유저 스레드에 더 적거나 같은 수의 커널 스레드가 대응하는 모델이다. 운영체제는 충분한 수의 커널 스레드를 만들 수 있으며, 커널 스레드의 구체적인 개수는 프로그램이나 작동 기기에 따라 다르다. 멀티프로세서 시스템에서는 싱글프로세서 시스템보다 더 많은 커널 스레드가 만들어진다.
  • Two-level Model
    Many-to-Many 모델과 비슷한데, 특정 유저 스레드를 위한 커널 스레드를 따로 제공하는 모델을 말한다. 점유율이 높아야 하는 유저 스레드를 더 빠르게 처리해줄 수 있다.

Thread Pools

스레드를 요청할 때마다 매번 새로운 스레드를 생성하고, 수행하고, 지우고를 반복하면 성능이 저하된다. 그래서 미리 스레드 풀에 여러 개의 스레드를 만들어두고 요청이 오면 스레드 풀에서 스레드를 할당해주는 방법을 사용한다.

참고: 공룡책으로 정리하는 운영체제(멀티쓰레드 프로그래밍)

profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글