관리 메뉴

사과하는 제라스

시스템 프로그래밍 기말고사 본문

카테고리 없음

시스템 프로그래밍 기말고사

Xerath(제라스) 2022. 6. 15. 07:17

목차

    728x90
    반응형

    시스템 프로그래밍 기말고사

     

    OS - I/O 디바이스, CPU,메인메모리

    프로세스 - 메모리단에 올라가는 그림, 코드 데이터, , 스택

    스레드 - 프로세스에 이어서 자연스럽게~~

    IPC - 이어서 자연스럽게 써라

    ----------------------------------------------------------------------------------------------------------------------

    시스템 내의 프로세스는 독립적 or 협력적임.

     

    협력적 프로세스는 공유 데이터와 더불어 타 프로세스에게 영향을 주거나 받을 수 있음.

    이때 협력적 프로세스는 프로세스 간 통신(IPC, Inter Process Communication)이 필요함.

     

    IPC에는 두가지 모델이 있음. -> 메시지 전달, 공유 메모리

    1) 메시지 전달 모델 : 적은 양의 데이터 전달

    분산시스템에서 구현 Easy.

    시스템 호출을 사용해서 구현함 ∴ 커널 간섭 등 부가적인 시간 소비 작업들이 필요하기 때문에 공유메모리 모델보다 느림.

     

    A 프로세스가 메시지를 커널(OS를 가장 효율적으로 쓰기 위한 프로그램)에 올리고 B 프로세스가 갖다씀.

    (커널에 올라가는 CPU 자원을 쓰는 방법 : 1. API, 2. 시스템 콜(응.프에서 OS단의 자원을 필요하다고 하면 시스템 콜로 넘겨 받음.))

     

     

     

    2) 공유메모리 모델 : 대량 데이터 전달

    공유메모리 영역이 구축되면 모든 접근이 일반 메모리 접근으로 취급 -> 커널의 도움이 필요 X.


    컴퓨터 시스템의 구성요소 : 1. HW, 2. OS, 3. 응용프로그램, 4. 사용자

     

    OS는 응용프로그램과 사용자 간의 HW 사용을 제어하고 조정하는 역할로 HW를 효율적으로 쓰게 한다.

     

    자원할당자 : CPU시간, 메모리 공간, 파일 저장공간, 입출력 장치 등을 관리

    제어프로그램 : 오류와 컴퓨터의 부적절한 사용을 방지

     

    커널 : 컴퓨터에서 항상 실행되는 유일한 프로그램

    시프 : OS와 연관되어 있으나 반드시 커널에 포함할 필요 X

     

    *사건의 발생 여부는 HW나 SW에서 발생한 인터럽트에 의해 알 수 있음.

     

    OS는... 

    1) CPU 관점에서 프로세스를 생성 및 제거를 하고 동기화와 통신을 멀티 프로세스

    2) 메모리 관점에서 프로세스에 의해 사용중인 메모리 영역 추적, 프로세스나 데이터를 메모리로 적재 및 내보내기 결정, 메모리 할당 반환

    3) IO 관점에서 HW장치의 특이점을 사용자에게 숨기기. 버퍼링, 캐싱


    프로세스는...

     

    프로세스는 실행 중인 프로그램, 프로세스의 실행은 순차적 형태로 진행된다. 실행될 때 메모리에 적재될 시 프로세스로 다양한 부분으로 이루어 짐 -> 1.프로그램 코드 2. 프로그램 카운터와 프로세스 레지스터를 포함한 현재 진행 중인 활동, 3. 임시 데이터를 저장하는 스택, 4. 전역 변수를 저장하는 데이터 섹션, 5. 실행 중 동적으로 할당되는 메모리 영역인 힙으로 이루어진다.

     

    프로그램은 디스크에 저장된 실행파일(수동적개체), 프로세스는 능동적 개체 -> 프로그램이 메모리에 적재될 때 프로세스가 됨, 하나의 프로그램은 여러 개의 프로세스가 될수있음

    New : 프로세스가 생성되는 중인 상태 / Running : 명령어가 실행중인 상태 / Waiting : 프로세스가 어떤 사건이 일어나기를 기다리고 있는 상태 / Ready: 프로세스가 처리기가 할당되기를 기다리고 있는 상태 / Terminated : 프로세스가 실행을 완료한 상태 -> 프로세스 상태는 계속 변함

    프로세스 제어 블록(태스크 제어 블록) : 프로세스 상태,프로그램 카운터 등 각 프로세스와 관련된 정보가 저장되는 곳

    프로세스 스케줄링 : CPU 사용을 최대로 하는 것이 목표, 시간을 나눠 쓰기 위해 CPU프로세스를 빠르게 전환시키는 것 ->프로세스 스케줄러가 실행 가능한 프로세스 중에서 다음 차례에 CPU에서 실행할 프로세스를 선택함, 프로세스는 잡큐, 준비큐, 장치 큐와 같이 다양한 스케줄링 큐 사이를 이주함

    문맥 교환 : 인터럽트는 OSCPU의 현재작업을 빼앗아 커널루틴을 실행할 수 있게함, CPU가 다른 프로세스로 전환될 때, 시스템은 문맥 교환을 통하여 예전 프로세스의 상태를 저장하고 새 프로세스의 저장된 문맥을 적재하도록 해야함, 프로세스의 문맥은 PCB에 표현됨, 이런 문맥 교환 시간 동안 시스템이 유용한 일을 하지 않기 때문에 오버헤드임

    부모 프로세스는 자식 프로세스를 생성하고 PID를 통하여 식별되고 관리됨, 자식은 부모가 가진 자원의 부분을 공유함-> fork()를 통해 자식 프로세스를 생성하며 자식은 그 공간에 프로그램을 적재함

    프로세스가 종료될 때는 자원을 OS에 반환하고 부모 프로세스는 자식 프로세스의 정상 종료를 보장하도록 해야함, 하지만 이를 고려하지 않을 경우 부모 프로세스가 없는 자식 프로세스를 좀비 프로세스라고 하며 부모 프로세스는 wait() 시스템 콜을 사용하여 정상종료하도록 해줘야한다.

    프로세스 최종 정리 : 프로세스란 실행 중인 프로그램이다. 프로그램이란 디스크에 저장된 코드와 정적 데이터이고 프로세스란 OS로부터 프로세스 제어 블록을 얻는다는 것이다. 여기서 프로세스 제어 블록이란 OS가 해당 프로세스를 위해 관리하는 자료구조로서 프로세스 구분자, 메모리 관련 정보, 각종 중간값이 저장되어있다. OS는 여러 프로세스를 실행시킬 때 오류가 발생하지 않도록 상태 전이를 통해 관리하는데 상태에는 생성, 준비, 실행, 완료, 대기 상태가 있다. 또한 프로세스 당 메모리 구조가 하나씩 존재하는데 code, data, heap, stack 영역으로 구성되어있다. 여러 프로세스가 실행될 때는 CPU가 고속으로 여러 프로세스를 순서를 정해서 실행하는데 스케줄링을 통해 CPU에 할당되는 순서 및 방법을 결정한다. 이때 CPU 사용을 최대로 하는 것을 목표로 하며 스케줄러가 다음 차례에 실행할 프로세스를 선택한다. 이런 프로세스의 전환은 CPU를 차지하던 프로세스가 나가고 새로운 프로세스를 받아들이는 문맥교환을 통해 이뤄지는데 프로세스 제어 블록의 내용도 다시 세팅된다. 또한 프로세스는 자식 프로세스를 생성함으로써 여러 작업을 동시에 처리할 수 있는데 이때 고아 프로세스가 생성되지 않도록 주의해야한다.


    스레드는...

    CPU 스케줄러가 CPU에 전달하는 일 한, CPU가 처리하는 작업의 단위는 프로세스로부터 전달받은 스레드 -> OS 입장에서의 작업 단위는 프로세스, CPU 입장에서의 작업 단위는 스레드 + 프로세스끼리는 약하게 연결되어있는 반면 스레드끼리는 강하게 연결되어 있음

    멀티스레드: 프로세스 내 작업을 여러 개의 스레드로 분할함으로써 작업의 부담을 줄이는 기법

    멀티태스킹: OSCPU에 작업을 줄 때 시간을 잘게 나누어 배분하는 기법

    멀티프로세싱: CPU를 여러 개 사용하여 여러 개의 스레드를 동시에 처리하는 작업

    CPU 멀티스레드: 하드웨어적인 방법으로 하나의 CPU에서 여러 스레드를 동시에 처리하는 병렬 처리 기법

    Fork() 호출로 프로세스를 복사하면 코드영역과 데이터 영역의 일부가 메모리에 중복되어 존재하게 되는 낭비요소가 발생 -> 따라서 정적영역의 데이터를 공유함으로써 자원의 낭비를 막고 효율성을 향상시키기 위한 멀티스레드의 필요성 -> 멀티스레드는 응답성 향상, 자원 공유, 효율성 향상, 다중 CPU 지원의 장점이 있으나 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가 생기면 전체 프로세스에 영향이 미쳐지게 되는 단점이 있음, 예를 들어 인터넷 익스플로러 여러 개의 화면을 동시에 띄웠는데 그중 하나에 문제가 생기면 전체가 종료되는 것

    스레드는 커널레벨스레드와 유저레벨스레드로 나뉘는데 커널레벨스레드는 OS커널이 지원하고 관리하는 객체이고 유저레벨스레드는 라이브러리가 제공하는 객체이다. 보통 유저레벨스레드가 커널레벨스레드보다 생성과 관리가 빠른데, 커널 간 간섭이 없기 때문이다.

    커널스레드와 사용자스레드의 연결형태에 따라 3가지 모델로 구분되는데 N:1 모델은 하나의 커널 스레드에 여러 사용자 스레드가 연결된 것이고 1:1 모델은 각 유저 스레가 각 하나의 커널 스레드와 대응되는 형태고, N:N 모델은 많은 유저스레드가 적거나 같은 수의 커널 스레드로 다중화 되어 있는 형태이다.

    프로그램을 구현할 때 연산량 증가, 모듈화, 편의성 등의 이유로 하나의 작업을 여러 개의 프로세스로 구성하거나 여러 개의 스레드로 구성한다. 멀티프로세스는 시스템 자원을 많이 사용하고 프로세스 간 통신이 어려운 반면 여러 개의 프로세스 중 하나에 문제가 발생하면 그 문제가 다른 프로세스로 확산 되지 않지만 멀티스레드는 시스템 자원은 적게 소모하고 스레드 간 통신은 쉽지만 공유 메모리의 동기화가 문제가 된다.

    스레드 최종정리: 스레드란 CPU 스케줄러가 CPU에 전달하는 일 하나, 즉 프로세스가 할당 받은 자원을 이용하는 실행 단위이다. OS의 작업 단위를 프로세스라고 하면 CPU의 작업 단위를 스레드라고 할 수 있다. 스레드는 프로세스 주소 공간 중 코드, 데이터, 힙이 공유되며 스택만이 스레드 별로 할당된다. 따라서 스레드 간에는 이 공유 메모리를 이용해 상호작용할 수 있다. Fork() 호출로 프로세스를 복사하면 메모리에 중복되는 내용이 존재하게 되어 낭비요소가 발생되기 때문에 자원을 공유하는 멀티스레드를 통해 자원의 낭비를 막고 효율성을 향상시킬 수 있다. 그러나 멀티스레드는 자원을 공유하기 때문에 장점도 있지만 단점도 있다. 한 스레드에 문제가 생기면 전체 프로세스에 영향이 미치는데 인터넷 인스플로러 하나에 문제가 생기면 전체가 종료되는 것이 그 예이다. <스레드는 크게 커널 스레드와 사용자 스레드로 나뉘는데 커널 스레드는 OS 커널이 지원하고 관리하는 객체이고 사용자 스레드는 라이브러리가 제공하는 객체이다. 사용자 스레드가 커널 간 간섭이 없기 때문에 커널 스레드보다 생성과 관리가 빠르다. 이런 사용자,커널 스레드의 연결 형태에 따라 1:N, N:N, 1:1모델의 형태가 있다.> 멀티스레드는 멀티프로세스와도 자주 비교되곤 하는데 멀티프로세스는 자원을 많이 사용하고 프로세스 간 통신도 어렵고 문맥 전화 중 아무런 작업이 수행되지 않아 오버헤드가 있지만 다른 프로세스로 확산 되지 않지만 멀티스레드는 자원은 적게 소모하고 스레드간 통신은 쉽지만 공유 메모리의 동기화가 문제가 된다.


    IPC는...

    협력적 프로세스가 필요한 이유 : 정보공유, 계산속도향상, 모듈성, 편리함

    IPC란 프로세스 간 통신으로 프로세스들끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법을 뜻한다. 커널 영역에서 IPC라는 내부 프로세스간 통신을 제공하게 되고, 프로세는 커널이 제공하는 IPC를 이용해서 프로세스간 통신을 할 수 있게 된다. IPC에는 공유 메모리와 메시지 전달 모델이 있다.

    공유 메모리 모델 : 두 개 이상의 프로세스들이 주소 공간의 일부를 공유하며, 공유한 메모리 영역에 읽기/쓰기를 통해 통신을 수행한다. 프로세스가 공유 메모리 할당을 커널에 요청하면, 커널은 해당 프로세스에 메모리 공간을 할당해주게 되고 이후 어떤 프로세스건 해당 메모리 영역에 접근할 수 있다. 공유 메모리가 설정되면, 그 이후의 통신은 커널의 관여 없이 진행이 가능하다. 커널의 관여 없이 메모리를 직접사용하여 IPC 속도가 빠르고 프로그램 레벨에서 통신 기능을 제공하여, 자유로운 통신이 가능하다. 하지만 메시지 전달 방식이 아니기에 데이터를 읽어야 하는 시점을 알 수 없다. 예를 들어, 프로세스 A가 공유 메모리에 데이터를 전달해도 프로세스 B가 그것을 알 수 없기에 별도의 동기화 기술이 필요하다. 동시에 같은 메모리 위치를 접근하는 위치가 발생할 수 있기에 공유 메모리에 접근할 프로세스 간의 LOCK 메커니즘이 필요하다.

    메시지 전달 모델 : 커널 메모리 영역에 메시지 전달을 위한 채널을 만들어서 협력하는 프로세스들 사이에 메시지 형태로 정보를 Send/receive하는 방법이다. 커널을 경유하여 메시지를 송/수신자끼리 주고 받으며, 커널에서는 데이터를 버퍼링한다. 예를 들어, A프로세스가 커널로 메시지를 보내면 커널이 B에게 메시지를 보내주는 방식이다. 프로세스간 메모리 공유 없이 동작이 가능하다. 커널에서 데이터의 주고 받는 것을 컨트롤할 수 있어 별도의 동기화 로직이 없어도 되지만 커널의 통해서 데이터를 주고 받기 때문에 shared memory 모델보다 느리다.

    -메시지 전달 모델 종류

    Direct communication : 통신하려는 프로세스의 이름을 명시적으로 표시하여 메시지를 직접 전달하는 방식이다. A프로세스가 B프로세스에게 메시지를 전달하고 싶을 때, 커널에게 직접적으로 수신자 A프로세스가 메시지를 전달한 후 커널이 B프로세스에게 해당 메시지를 전달하는 방식이다. 프로세스 간 링크는 유일하며 대부분 양방향으로 구성된다.

    Indirect Communication : mailbox를 통해 메시지를 간접 전달하는 방식이다. Port로 전송만 하면 되기 때문에 복잡한 communication link를 만들 수 있으며, N:N 관계가 가능하다. 예를 들어 A프로세스가 B프로세스에게 메시지를 전달하고 싶을 때, 커널 내부 특정 포트에 메시지를 저장해놓고, B프로세스가 해당 포트에 접근하여 메시지를 전달하는 방식이다.

    메시지 전달 모델 예시 [파이프] : 두 개의 프로세스를 파이프로 연결하여 하나의 프로세스는 데이터를 쓰기만 하고 다른 프로세스는 데이터를 읽기만 하며 데이터를 통신한다. 1:1 통신이면서 한 쪽 방향으로만 데이터가 이동한다. 주로 부모-자식 간의 단방향 통신으로 사용된다. 용량 제한이 있기 때문에 파이프가 가득 차면 더 이상 쓸 수 없다. 한 쪽 프로세스는 단지 읽기만 하고 다른 프로세스는 단지 쓰기만 하는 단순한 데이터 흐름에 적합하다.

    메시지 전달 모델 예시 [소켓] : 소켓을 이용하여 Client-server구조로 데이터 통신을 하며, 원격에서 프로세스 간 데이터를 공유할 때 사용한다. 프로세스는 포트 번호를 이용하여 통신하려는 상대 프로세스의 소켓을 찾아간다. 범용적인IPC로서 양방향 통신이 가능하다.

    728x90
    반응형