실행중인 프로그램(Execute program), OS의 기본 = Process 관리
→ 그림 추후 삽입 예정
→ 그림은 추후에 삽입 예정
→ 상태 그림은 추후 삽입 예정
프로세스가 필요한 자원 관리
c언어에선 structure를 통해서 관리
필수 구성 요소
pcb를 만드는 이유
일반적으로 PCB는
→ 이렇게 하면 굳이 OS의 관리가 필요가 없음..!! 그래서 등장한것이
Os가 담당을 하며 현재 Process정보를 PCB의 PC에 저장 하며
불러올 PCB의 PC에서 restore해서 사용한다.
parent 의 pid ≠0 이고, child의 pid ==0 이다.
새로운 Process 생성은 Fork()를 통해서 생성이 된다. == process Tree관계가 생성이 된다.
일반적인 fork는 부모의 메모리를 복사해서 사용
→ 그림 추후 삽입 예정
내가 나와 같은 코드를 실행하는 것이 아닌 새로운 코드를 실행하고 싶기에 fork를 하기 떄문에..
자식코드에
if(pid==0){
**execlp("내가 원하는 명령어 처리");
}**
이렇게 삽입을 해줘야 한다. execlp
뒤에적힌 코드는 실행되지 않으므로 주의해서 사용해야하낟.
parent와 child 동시 실행
이는 parent와 child가 concurrent하게 실행
parent (wait) child 실행
이는 child가 실행되고 종료를 해야 부모가 종료된다.
wait()의 위치에 따라 child가 먼저 실행될 수도 있고 부모가 먼저 실행될 수 있따.
대표적인 예시로 Deamon이 있음(network를 위한 것으로 알고 았움)
→ 추후에 보강 예정
→ fork 코드 관련수정은 추후에..
fork하고나서
child에서 value를 바꿔도 parent에는 영향이 없음 왜냐면 주소를 그대로 복사를 하기 떄무네
프로세스간의 통신의 기초
프로세스들 같에 서로 데이터를 교환 할 수 있어야 하기 때문에 필요하다 대표적으로 2가지가 있는데
shared Memory
공유 메모리는 통신하는 프로세스 끼리 서로 공유하는 메모리를 만들어서 정보를 읽고 쓰게 한다.
message passing
내가 원하는 메세지 상자를 하나 만들어서 접근할 수 있는 사람들(생산자와 소비자)을 지정하고
send()를 통해서 생산 recive()를 통해서 소비를 한다.
이렇게 다양한 방식이 있다.
이렇게 2가지 방식이 있다.
이 방식은 생산자는 정보를 생산하고, 소비자는 정보를 소비하는 방식이다.
Buffer를 사용하여 (일반적으로 유한하고,Circuler를 사용한다.) Concurrent하게 연결하고
2개의 Pointer를 사용해서 1개는 input을 위한 1개는 output을 위한 것으로 사용
만약 input == output이면 비어 있으므로 소비를 못하고 input == buffer의 크기면 정보를 들어갈 수 없다.
단점으로... 여러개의 생산자와 소비자가 연결될 경우 복잡해진다..
주고 받기하는 하기!
IPC에는 대표적으로 2가지가 있음
표준화를 하기 위해서 제작이 된 아이지만... 잘 안쓰임..?
공유 메모리를 위한 방식...!
memory maped file을 사용함.
이렇게 사용이 된다
파이프는 2개의 프로세스가 통신 할 수 있는 전달자로 동작
UNIX 체제에서 사용된 IPC중 하나 고려해야하는 사항이 있음
일반적인(전통적인) 파이프에서는
P 와 Q의 1개의 쌍(읽고 쓸수 있는) fd[2] 를 각각 가져서 쌍을 이룰 수 있다.
일반적인 경우는 파이프를 생상ㄴ한 프로세스 이외에는 접근 할 수 없기 떄문에 parent가 pipe를 생산하고 fork로 생서한 자식 프로세스와 통신ㅇ을 하기 위해서 사용한다.
그리고 통신이 종료가 되면 파이프는 사라진다.
→ 그림 추후에 추가
지명 파이프에서는
p와 q 하나씩만 있어도 파이프 자체에 이름을 정하여 통신을 할 수 있게 한다.
통신 방향 양방향 가능 부모 자식 필요도 ㅇ하지 않고 지명 파이프가 구축 되면 여러 파이프 들이 사용할 수이싿.
소켓은 종단간의 연결로 IP + Port번호를 토애서 구분을 하여 연결을 한다.
대표적으로 ****
Java에서 활용
socket = TCP기반
data Stream UDP 기반
multicast Socket 여러 수신자에게 보낼 수 있다.
연결된 두 시스템 사이의 호출을 위해서 프로시저 호출을 추상화로 사용한다
== 원격에서 함수 호출 한다 와 동일
메세지 기반 통시을 진행 java의 rmi window의 dom이 대표 적이 예시이다.
procedure : 원격에 있는 함수
client : 함수를 호출
RPC client 쪽에 stub을 제공하여서 통신을 하내용을 숨기고, server에ㅓ 스켈레톤을 제공, 그런데 이때, 데이터의 정렬화가 필요하다.(송수신 관계에서 서로 다른 표준(littel endian & big endian)이 다를 수 있기 때문에...
여기서 데이터 직렬(serialize)한것을 를 Marshell이라고 한다. 통신을 할때는 기 marshell을 주고 받는다.
IPC는 컴퓨터 내부에서 RPC는 컴퓨터 외부에서 통신하는 것이라고 생각하면된다.