-
프로세스와 스레드CS 지식/운영체제 2020. 10. 21. 19:35반응형
프로세스와 스레드
2020/08/17 - [CS 기초 지식] - 프로세스와 스레드
저번에 정리한 내용이 부족한 것 같아서 추가적으로 정리해본다.
- 프로세스
- 보조 기억장치에 기억되는 프로그램은 실행되기를 기다리는 명령어와 정적 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 프로세스가 된다.
즉, 실행 중인 프로그램이란 의미가 된다. - 다른 말로 풀면 OS에게 메모리 영역을 할당받아 실행되는 독립적인 프로그램의 인스턴스, OS로부터 시스템 자원을 할당받는 작업의 단위 라고 할 수 있음
- 할당받는 시스템 자원
- CPU 시간, 주소 공간, Code, Data, Stak, Heap 구조로 된 독립된 메모리 영역
- 프로세스는 각각 독립된 메모리 영역을 할당 받으며, 최소 1개의 스레드(메인 스레드)를 가지고 있다.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 직접적으로 접근이 불가하다.
- 다른 프로세스의 변수나 자료구조에 접근하려면 프로세스 간 통신(IPC)를 이용해야한다. (ex. 파이프, 파일, 소켓 등)
- 프로세스의 메모리 구조
- Code영역
- 프로그램을 실행시키는 실행 파일의 명령어가 올라감(바이너리 코드)
- 스택
- 함수나 프로시저를 호출하고 리턴할 때 복귀 주소나 지역변수, 파라미터 같은 일시적 데이터를 저장
- 힙
- 동적 할당을 위한 메모리 영역
- 데이터 영역
- 전역변수, static 변수 할당(초기화한 데이터 구조에 따라 읽고 쓰기가 가능)
- Code영역
- 보조 기억장치에 기억되는 프로그램은 실행되기를 기다리는 명령어와 정적 데이터의 묶음이다. 이 프로그램의 명령어와 정적 데이터가 메모리에 적재되면 프로세스가 된다.
- 스레드
- 실제로 상태변화를 하거나 컴퓨터에서 task로 사용하는 단위
- 즉, 프로세스가 할당받은 자원을 이용하는 프로세스 내부 작업의 흐름, 실행 단위임
- 프로세스 내에서 Stack만 각각 할당받고, Code, Data, Heap 영역은 공유함
- 각각의 스레드는 별도의 레지스터를 가지고 있다.(개별적 실행)
- 한 스레드가 프로세스의 자원을 변경하면 다른 스레드도 변경 결과를 즉시 확인 가능
- 멀티 스레드
- 스레드가 여러개 존재하는 것을 멀티 스레드라고 한다.
- 동시성(Concurrency) or 병렬성(Parallelism)으로 실행된다.
- 동시성은 context switching을 통해 진행, 병렬성은 멀티 코어가 개별 스레드를 동시에 실행
- 장점
- 일정 메모리 영역을 공유하기 때문에 스레드의 context switching은 프로세스 context switching보다 빠르다.(스위칭할 메모리 영역이 적기 때문)
- 또한, 스레드의 context switching은 캐시 메모리를 비울 필요가 없기 때문에 더욱 빠르게 실행된다. (응답시간 단축 + 오버헤드 줄어듦)
- 단점
- 공유 자원 중 동일한 자원에 동시에 접근할 때, 접근하는 순서를 정해줘야한다.(동기화 작업)
- 서로 데이터를 사용하다가 충돌이 일어날 가능성이 있음
- 다른 스레드에서 사용중인 변수나 자료구조에 접근해서 원하지 않은 결과가 나타남(서로 수정하기 때문에)
- 접근을 제어하다 보면 병목현상이 발생해서 성능 저하가 나타날 수 있다.
- 과도한 locking은 지양해야함
- 디버깅이 다소 까다로워 짐 ~> 버그 생성될 가능성 증가
- 오류로 인해서 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있음
- 공유 자원 중 동일한 자원에 동시에 접근할 때, 접근하는 순서를 정해줘야한다.(동기화 작업)
- 스레드 풀
- 스레드를 매번 만들지 않고 재사용하는 것이 효율적
- 동작 방식
- task queue에 task 추가
- thread pool이 task를 가져와서 놀고있는 thread에 작업 할당
- 각 thread는 작업 진행
- 완료된 thread는 완료 상태로 존재
- 프로세스 제어블록(PCB(Process Control Block))
- 프로세스들을 저장해서 스케줄링하는 control block
- OS의 스케줄러에 의해 Context Switching되는 프로세스의 정보 단위
- 구성
- PID, 프로세스 상태, PC(프로그램 카운터), 스케줄링 우선순위, 권한(자원 접근 권한), 부모/자식 프로세스 정보(트리 관계) 등
- 스케쥴링
- 프로세스를 생성해서 계속 실행하지 않고, 다른 프로세스를 실행하는 동안 대기 후에 다시 실행하는 순서를 반복한다.
- 이 실행 순서를 결정하는 것을 스케쥴링이라고 한다.
- 대부분의 OS에서는 우선순위 알고리즘과 라운드 로빈 알고리즘을 혼합해서 사용한다.
- 알고리즘 선택 기준
- 프로세서 사용률, 처리율, 반환시간, 대기시간, 반응시간
- 상태 변화
- 생성 -> 준비 -> 실행 <-> 대기 -> 종료 단계
- new -> ready -> running <-> waiting -> terminated로 표시
- 생성 -> 준비 -> 실행 <-> 대기 -> 종료 단계
- 스레드 제어블록(TCB(Thread Control Block))
- 스레드를 저장해서 스케줄링하는 Control block
- 프로세스 내의 스레드 라이브러리에 의해 스케줄링되는 정보 단위
- 스레드에서 자원은 어떻게 공유할까??
- 스택과 레지스터를 제외한 프로세스의 힙, 데이터, code 영역을 공유한다.
- 이 때, 동시에 한정된 자원에 접근하여 이용하는 경우가 발생할 수 있어서, 상황에 맞게 독점하도록 Mutex 또는 Semaphore를 이용해서 공유자원을 컨트롤한다.
- 하지만, 높은 우선순위를 가진 스레드들에게 CPU 시간을 독점해서 다른 스레드가 자원에 접근하지 못하는 기근 현상이나, 서로가 작업이 끝나기를 기다리는 무한 대기 상태의 deadlock, 과도한 lock으로 인한 병목현상이 일어날 수 있어서 적절한 스케쥴링과 lock 남용 자제가 필요함.
- 스케줄링은 크게 선점과 비선점 방식으로 나눌 수 있다. 선점 방식은 강제적으로 실행권을 빼앗는 것이고, 비선점 방식은 자발적으로 내려놓는 것
- 선점 방식에는 라운드 로빈이 대표적, 비선점 방식은 FIFO가 대표적, 둘 다 활용하는 것에는 우선순위가 대표적
- 라운드 로빈은 우선순위를 두지 않고, 순서대로 시간단위에 따라 CPU를 할당하는 스케줄링 방식
반응형'CS 지식 > 운영체제' 카테고리의 다른 글
뮤텍스와 세마포어 (0) 2020.10.21 Deadlock & Starvation (0) 2020.10.21 멀티 스레드의 임계 구역과 뮤텍스, 세마포어 (0) 2020.08.17 프로세스와 스레드 (0) 2020.08.17 PCB와 TCB (0) 2020.08.17 - 프로세스