운영체제 OS- 3장 Process

MinSeoCho·2022년 3월 5일
0

OperatingSystem

목록 보기
1/1
post-thumbnail

Process

1. Process란?

실행중인 프로그램(Execute program), OS의 기본 = Process 관리

→ 그림 추후 삽입 예정

Process의 구성

  • text = code section
  • data section = 전역 변수
  • heap section = 메모리 동적 관리 malloc ..new...
  • stack = 함수, 지역 변수 return

→ 그림은 추후에 삽입 예정

Process의 상태

  • new : process가 새로 실행된 상태
  • run(running) : cpu를 점유한 상태 (load해서 돌아가는 중)
  • wait(waiting) : timesharing/ I/O interrupt를 통새서 다른애가 돌아가거나 interrupt 끝나기기다리는 중
  • ready : I/O 대기하다가 signal이 와서 Queue에서 가서 기다린다.== 점유할 준비가 되었다.
  • terminate : 종료 일이 다 끝났다.

→ 상태 그림은 추후 삽입 예정

2. PCB = Process Control Block / TCB = task control block

프로세스가 필요한 자원 관리

c언어에선 structure를 통해서 관리

PCB의 구성 요소

  • 필수 구성 요소

    • Program Counter == 다음에 실행할 명령어 , 즉 다음에 memory에서 읽어와야하는애
    • CPU Register == IR DR 과 같이 메모리들 , context switch할때 필수
    • CPU Scheduler
    • 메모리 관리 정보
    • Accounting 정보
    • I/O 상태 정보
  • pcb를 만드는 이유

    • 프로세스가 갖는모든 자원들을 하나의 상태로 관리 하기 위해서

PCB의 작업 단위

일반적으로 PCB는

  • Single thread of excution = 1개의 분기
    • 그래서 문맥 교환이 이뤄지면 중단된 이후부터 진행을 함

→ 이렇게 하면 굳이 OS의 관리가 필요가 없음..!! 그래서 등장한것이

Thread(쓰레드)

  • multi processing 과 multi taking을 위해서
    • process도 여러개의 Thread로 실행(분산해서 동시 실행)
  • light weight를 위해서 process를 여러개로 쪼갠다.
  • 병렬 처리하기에 유용!

Multi Programming

  • 동시에 여러개를 실행 → 영어는 추후에 삽입 예정
  • 사용하는 이유??
    • CPU Maximaize를 위해서

CPU Maximaize

  • timesharing =cpu의 처리 속도 증가 자주 switching을 ㅗㅌ애서 제공
  • 활용성을 증가하기 위해서
  • Ready Queue와 wait Queue를 사용 → Linked list로 구현
    • Ready Queue : 사용 대기줄을 사용가능 : 만약 프로그램이 종료 되면(time out 되면 다시 ready queue의 뒤로 가서 대기
    • wait queue : i/o interrupt가 발생했을때 사용 이건 i/o 마다 생성이 되는 여러개 끝나면 Ready queue로 삽입

Context Switch

Os가 담당을 하며 현재 Process정보를 PCB의 PC에 저장 하며

불러올 PCB의 PC에서 restore해서 사용한다.

3. Fork()

parent 의 pid ≠0 이고, child의 pid ==0 이다.

새로운 Process 생성은 Fork()를 통해서 생성이 된다. == process Tree관계가 생성이 된다.

일반적인 fork는 부모의 메모리를 복사해서 사용

→ 그림 추후 삽입 예정

fork를 하는이유

내가 나와 같은 코드를 실행하는 것이 아닌 새로운 코드를 실행하고 싶기에 fork를 하기 떄문에..

자식코드에

if(pid==0){
 **execlp("내가 원하는 명령어 처리"); 
}**

이렇게 삽입을 해줘야 한다. execlp 뒤에적힌 코드는 실행되지 않으므로 주의해서 사용해야하낟.

parent & child 관계

  1. parent와 child 동시 실행

    이는 parent와 child가 concurrent하게 실행

  2. parent (wait) child 실행

    이는 child가 실행되고 종료를 해야 부모가 종료된다.

    wait()의 위치에 따라 child가 먼저 실행될 수도 있고 부모가 먼저 실행될 수 있따.

Orphan & Zombi

  • 부모 자식 간의 관계중 특이한 관계 2가지가 있다
  • Orphan == 고아로
    • 만약 부모가 자식 보다 먼저 끝난경우(wait를 하지 않음)
    • 부모가 자식을 기다리지 않음
  • Zombi ==부모가 살아 있으나 wait를 하지 않는 경우
    • 대표적인 예시로 Deamon이 있음(network를 위한 것으로 알고 았움)

      → 추후에 보강 예정

→ fork 코드 관련수정은 추후에..

fork하고나서

child에서 value를 바꿔도 parent에는 영향이 없음 왜냐면 주소를 그대로 복사를 하기 떄무네

4. IPC

프로세스간의 통신의 기초

프로세스들 같에 서로 데이터를 교환 할 수 있어야 하기 때문에 필요하다 대표적으로 2가지가 있는데

  1. shared Memory

    공유 메모리는 통신하는 프로세스 끼리 서로 공유하는 메모리를 만들어서 정보를 읽고 쓰게 한다.

  2. message passing

    내가 원하는 메세지 상자를 하나 만들어서 접근할 수 있는 사람들(생산자와 소비자)을 지정하고

    send()를 통해서 생산 recive()를 통해서 소비를 한다.

    1. direct & indirect → 이건 p가 c에게 직접 전송과, OS를 통해서 메세지를 보내는 방식으로 구분
    2. sync & async
    3. auto & named → 이건 누구에게 보내겠다 특정지어서 보내는 방식

    이렇게 다양한 방식이 있다.

이렇게 2가지 방식이 있다.

Producer- Consumer 방식

이 방식은 생산자는 정보를 생산하고, 소비자는 정보를 소비하는 방식이다.

Shared Memory로 공유

Buffer를 사용하여 (일반적으로 유한하고,Circuler를 사용한다.) Concurrent하게 연결하고

2개의 Pointer를 사용해서 1개는 input을 위한 1개는 output을 위한 것으로 사용

만약 input == output이면 비어 있으므로 소비를 못하고 input == buffer의 크기면 정보를 들어갈 수 없다.

단점으로... 여러개의 생산자와 소비자가 연결될 경우 복잡해진다..

Message Passing

주고 받기하는 하기!

  1. direct & indirect with naming
    • Direct
      • send(p,message) recive(q,message)방식으로 대칭성이 생기고, 1:1 통신을 한다.
      • P와 Q간의 2개만 서로 통신이 된다. 그리고 꼭 쌍으로 존재해야한다.
    • InDirect
      • ip 주소와 port 정보를 사용해서 연결
      • send(메일 박스 1, message) recive(메일 박스 1, message) 방식으로 통신을 하여 여러명의 생산자와 소비자가 1개의 메일 박스를 통해서 연결을 할 수 있따.
      • 이떄 OS는 read write create delete의 권한 만 주면된다 (메일박스에 관하여 process에게)
  2. Blocking(sync) & non Blocking(async)
    • Blocking
      • P가 send()를 완료할때까지 다른일을 하지 않는것, Q또한 recive를 할때 까지 다른일을 하지 않는것 완료했다는 message를 받을 때 까지 Block
      • ex) P 가 보내야하는 메세지 2GB buffer크기 1GB : 1gb를 보내두고 나머지 1GB를 보낼때까지 기다린다.
    • NonBlocking
      • P가 보낼 수 있는 만큼 send를 하고 다른일을 진행

IPC에는 대표적으로 2가지가 있음

  1. POSIX shared memory
  2. Pipe

4-1. POSIX 공유 메모리

표준화를 하기 위해서 제작이 된 아이지만... 잘 안쓰임..?

공유 메모리를 위한 방식...!

memory maped file을 사용함.

  1. fd = shm.open(name, O_CREATE | O_RDWR, 0666)
  2. ftrybcate(fd, 4096) 4096바이트 만큼 읽어온다.
  3. mmap(0, SIZE=4096, PORT_READ, PORT_WRITE,MAP_SHARED,fd,0);

이렇게 사용이 된다

4-2. PIPE

파이프는 2개의 프로세스가 통신 할 수 있는 전달자로 동작

UNIX 체제에서 사용된 IPC중 하나 고려해야하는 사항이 있음

  1. 파이프가 단방향인가 양방향인가
  2. 양방향이라면 half duplex인가 full duplex인가
  3. 통신 프로세스가 parent child관계여야 하는가
  4. 네트워크도 가능한가(socket) 한 pc안에서만 가능한가

일반적인(전통적인) 파이프에서는

P 와 Q의 1개의 쌍(읽고 쓸수 있는) fd[2] 를 각각 가져서 쌍을 이룰 수 있다.

일반적인 경우는 파이프를 생상ㄴ한 프로세스 이외에는 접근 할 수 없기 떄문에 parent가 pipe를 생산하고 fork로 생서한 자식 프로세스와 통신ㅇ을 하기 위해서 사용한다.

그리고 통신이 종료가 되면 파이프는 사라진다.

→ 그림 추후에 추가

지명 파이프에서는

p와 q 하나씩만 있어도 파이프 자체에 이름을 정하여 통신을 할 수 있게 한다.

통신 방향 양방향 가능 부모 자식 필요도 ㅇ하지 않고 지명 파이프가 구축 되면 여러 파이프 들이 사용할 수이싿.

네트워크 ㅘㄴ경에서 서버와 통신

Socket

소켓은 종단간의 연결로 IP + Port번호를 토애서 구분을 하여 연결을 한다.

대표적으로 ****

Java에서 활용

  • socket = TCP기반

  • data Stream UDP 기반

  • multicast Socket 여러 수신자에게 보낼 수 있다.


RPC

연결된 두 시스템 사이의 호출을 위해서 프로시저 호출을 추상화로 사용한다

== 원격에서 함수 호출 한다 와 동일

메세지 기반 통시을 진행 java의 rmi window의 dom이 대표 적이 예시이다.

procedure : 원격에 있는 함수

client : 함수를 호출

RPC client 쪽에 stub을 제공하여서 통신을 하내용을 숨기고, server에ㅓ 스켈레톤을 제공, 그런데 이때, 데이터의 정렬화가 필요하다.(송수신 관계에서 서로 다른 표준(littel endian & big endian)이 다를 수 있기 때문에...

여기서 데이터 직렬(serialize)한것을 를 Marshell이라고 한다. 통신을 할때는 기 marshell을 주고 받는다.

IPC는 컴퓨터 내부에서 RPC는 컴퓨터 외부에서 통신하는 것이라고 생각하면된다.

profile
열심히 하자..!

0개의 댓글