CS

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

whyHbr 2024. 3. 3. 15:37
728x90
반응형

ㅁhttps://www.inflearn.com/course/%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C/dashboard

 

[지금 무료] 개발자를 위한 컴퓨터공학 1: 혼자 공부하는 컴퓨터구조 + 운영체제 강의 - 인프런

베스트셀러 『혼자 공부하는 컴퓨터 구조 + 운영체제』 저자 무료 직강. 개발자들이 꼭 알아야 할 컴퓨터 구조, 운영체제 전공서 요약집., 개발자 필수지식 컴퓨터 구조와 운영체제강의 하나로

www.inflearn.com

 

 

Thread?

스레드는 프로세스를 구성하는 실행 흐름의 단위

하나의 프로세스는 하나 이상의 스레드를 가질 수 있다. 

하나의 프로세스를 여러 개의 스레드로서 동시에 실행이 가능하다.

 

실행 흐름이 여러 개인 멀티 스레드 프로세스, 프로세스를 이루는 여러 명령어 동시 실행이 가능하다.

 

 

스레드의 구성 요소 :  스레드 id, 프로그램 카운터(PC), 레지스터 값, 스택 등

실행에 필요한 최소한의 정보

 

프로세스를 이루는 스레드들은 최소한의 정보를 유지한 채 실행된다.

프로세스를 이루는 스레드들은 프로세스들의 자원을 공유하며 실행된다. 스레드 1,2,3 은 모두 같은 코드, 데이터 영역을 공유하고 있다.

 

여러 프로세스를 동시에 실행하는 것을 멀티 프로세스 라고 한다.

여러 스레드로서 프로세스를 동시에 실행하는 것을 멀티스레드 라고 한다.

 

 

프로세스끼리는 기본적으로 자원을 공유하지 않는다. 하지만 프로세스 간에 IPC (Inter Process Communication)를 사용해 자원을 주고박을 수 있다. 

스레드끼리는 같은 프로세스 내의 자원을 공유한다. 

 

 

IPC: Inter Process Communication 프로세스간 통신

동일 컴퓨터 안에서 발생하는 서로 다른 프로세스들 간의 통

 

공유하는 상태서 발생하는, 프로세스가 데이터를 공유할 때 메세지를 주고 받을 때 발생하는 문제를 어떻게 해결할 것인가.

 

IPC는 두가지 모델이 있다

공유메모리 : 공유 공간을 이용해 데이터를 주고 받음

생산자 소비자 문제 -  협력하는 프로세스들 간 가장 기본적인 문제. 생산자는 생성, 소비자는 소비

EX) 유뷰트 서버에서 폰으로 영상을 본다. 폰은 영상을 받아 계속 디스플레이 해야 함

유튜브 =  생성자, 폰 = 생성자

 

생성자는 버퍼를 채우고, 소비자는 버퍼를 소비하는데 버퍼를 무한대로 줄 수는 없다. 버퍼가 가득하면 생산자는 대기, 소비자는 소비한다.

버퍼가 비워져있다면 소비자는 대기한다.

버퍼를  공유 메모리로 만드는 것이 공유메모리 모델

공유 메모리는 영역을 말하는데, 생산자와 소비자가 공유하고 있는 영역이다.

 

부모 메모리 영역은 fork 로 생성한 자식 메모리 영역에 막 접근하면 안된다. 

부모 프로세스, 자식 프로세스가 접근 할 수 있는 영역은 공유 메모리로 관리한다. ->os가 관리해준다.메세지패싱아닌가?

 

메세지 패싱보다 빠르다

 

공유메모리의 단점: 메모리의 영역을 명시적으로 쓰고 액세스 하는 것들을 사용자가 다 해야함.

( 메모리 패싱은 위 일을 운영체제가 해줌 ㅋㅋ)

 

메시지 패싱 : 

메모리의 영역을 명시적으로 쓰고 액세스 하는 것들을 os가 패준다. 운영체제가 관리해주는 공유메모리라고 보면 된다. 메세지만 던지고 간다.

생산자와 소비자를 연결해주는 다이렉트 커뮤니케이션 링크를 만들어 전송해 메세지를 다이렉트로 보낼거고 복잡한건 os에게 맡기겠다

우리는 주고 받기만 하면 되고, 주고 받을 때는 메일박스, 포트가 있어야 한다.

 

Communication links통신 링크 : 생산자와 소비자가 보내고 받는 두 개의 시스템 콜을 적용시킨 것.

이것이 설정되어 있어야 serve , receive 연산을 통해 메세지를 주고 받을 수 있다.

 

comm links 에는 세가지 방법이 있다

 1) direct, indirect

direct: 직접 제공한다. 각 프로세스가 누구와 상호작용 하는지 알아 명시적으로 이름을 붙여준다. (ex. 누구에게 주고 그 누구는 누구다)

이 방식에서 가장 중요한 것은 내가 누구한테, 누가 누구에게 주는 지 명시하는 것이다. 누구에게 준 것인지 자동적으로 생성 가능하다.

정확한 한 링크만 성립가능하다.

 

indirect: 무언가를 통해 제공, 매개체가 필요하다, 매개체를 mail box, port라고 한다.

send방식 (a, message) 특정 대상에세 보내지 않고 그냥 메일박스에 메세지를 넣는다

receive (a, message) : 메일 박스에서 가져간다.

두개의 프로세스가 메일박스를 공유할 때 링크가 생성된다. 링크는 여러 개의 프로세스와 협력하는데 문제 없다.

여러 개의 다른 링크가 존재할 수 있고 여러 명이 접속 할 수도 있고, 복잡한 커뮤니케이션 링크가 생성될 수 있다.

OS는 새로운 매일 박스를 생성하는 것, 매일 박스에게 기능 제공, 메일 박스 삭제 기능을 제공한다.

 

2) Synchronization

 

메세지 패싱 방법은 blocking, synchronous 동기식 방법과, non blocking, asynchronous 비동기식 방법이 있다.

 

blocking send : 메일박스에 들어가지 못한 메모리도 가져가도록 os 가 보장한다. 메세지를 다 받을 때 까지 블럭되어 있다.

non blocking send: 상대방의 수신 여부 상관하지 않음

block receive: 다 보낼 때가지 기다린다.

non blocking recieve:  상대방의 메세지가 오지 않아도 상관 없다

 

blocking은 발송자가 모든 메모리를 보낼 때 가지 기다린다. 완전히 끝내고 다른 일을 하기 때문에 동기화가 되어있다. 

단점은 일이 느리다. 

non blocking 은 상대가 다 못받아도 상관하지 않는다. 

상대한테 전송이 다 되었는지 확인 할 수 없는 비동기적인 방법이다.

장점은 프로듀서 입장에서 효율적이고 빠르다. 빠르게 전송해야만 하는 서비스에서 활용

 

Synchronous: 자식의 상태를 확인하고 준다.

Asynchronous : 때 되면 준다. 아무때나 생산 아무떄나 소비

 

 

Posix shared memory:

메모리 매트 파일 사용, 일일이 shm오픈, write, read , close 해야한다

 

Message passing pipes:

유닉스 초창기 매커니즘.

두 개의 프로세스가 소통하는 도구처럼 행동한다.

Unidirectional: 방향이 하나

Bidirectional: 양방향. 충돌가능성

Tow way comm – half duplex, full duplex.

파이프는 구현 상 부모자식 관계가 있어야 한다.

파이프는 네트워크서 사용하지 않는다. 네트워크에선 소켓을 쓴다.

 

Two way types of pipes :

named pipes: 부모자식 관계 없이, 부모가 파이프를 생성하면 자식과 소통하는데 사용. 두개의 파이프가 필요하다 (양방향 통신)

ordinary pipes: 여러 개의 파이프를 넣어 이름을 붙여줄 수 있는 것. 고도화된 파이프.

fork()하면 부모프로세스가 가동, 다음엔 자식 프로세스 가동. wait안했으니 동시에 가동된다

 

socket

다른 컴퓨터와 소통 가능하다. 네트워크서 사용한다 shared memory

ip를 가지고 다른 컴퓨터를 특정한다. 

소켓 연결 시 데이터 주고 받기 가능하다.

비트가 다르다면 소켓이 바꾼다. 그래서 RPC 등장

RPC: 원격에 있는 함수를 내가 호출하는 것이다.

ip address+ port number = 네트워크 상에 있는 컴퓨터 특정 가능

 

728x90