취업,면접 대비

면접 대비 운영체제 공부 (abraham 3장 Process)

studying develop 2019. 12. 8. 18:40

초기 컴퓨터 시스템은 한 번에 하나의 프로그램만을 실행하도록 허용하였다. 그 프로그램은 시스템에 완전한 제어를 갖고 시스템의 모든 자원에 접근할 수 있었다.

오늘날의 컴퓨터 시스템들은 메모리에 다수의 프로그램들이 적재되어 병행 실행된다. 다양한 프로그램을 더 견고하게 제어하고 구획화 하기 위해서 실행 중인 프로그램을 말하는 프로세스의 개념이 생겼다. 프로세스는 현대의 시분할 시스템의 작업의 단위다.

운영체제는 커널에 포함시키지 않는편이 더 좋다고 판단된 다양한 시스템 작업들도 처리해야 한다. 그러므로 하나의 시스템은 프로세스들의 집합체이다. 즉, 운영체제 프로세스들은 시스템 코드를 실행하고, 사용자 프로세스들은 사용자 코드를 실행한다.

이런 모든 프로세스들은 잠재적으로 병행 실행이 가능하고, CPU는 이들 프로세스들 가운데서 다중화된다.

결국 시분할 시스템이기에 CPU를 어떤 프로그램 할당해야 하는가에 문제가 생기는 것 같다.

3.1.1 프로세스 (Process)

프로세스란? 프로세스의 구성

프로세스는 프로그램 카운터의 값과 처리기 레지스터의 내용으로 되는 현재 활동을 포함한다. 메모리 상에서 프로세스는 스택,힙,데이터,텍스트 영역으로 구성된다.

스택 : 함수의 매개변수,복귀 주소,로컬 변수와 같은 임시적인 자료를 가진다.
데이터 섹션 : 전역 변수들을 수록한다.
힙 : 프로세스 실행 중에 동적으로 할당되는 메모리.
텍스트 : 프로그램 코드.

프로그램 그 자체는 프로세스가 아니다 프로그램은 명령어 리스트를 내용으로 갖는 디스크에 저장된 파일으로 수동적인 존재이다

프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적인 존재다

프로세스의 실행

a.out , prog.exe를 클릭시 실행 파일이 메모리에 적재되게 된다.

프로세스가 실행되는 과정에서 많은 프로세스들을 생성할 수 있다. 예를 들면 사용자가 메일 프로그램의 서로 다른 복사본을 실행하거나, 또는 동일 사용자가 웹 브라우저 프로그램의 여러 복사본을 호출할 수 있다. 3.4절에서 할 예정.

프로세스 자체가 다른 개체를 위한 실행 환경으로 동작할 수 있다는 사실의 좋은 예시는 JVM이다. 대부분의 상황에서 실행 가능한 Java 프로그램은 Java 가상기계 안에서 실행된다. JVM은 적재된 Java 코드를 해석하고 그 코드를 대신하여 원 기계어를 이용하여 행동을 취하는 프로세스이고 이런 방식으로 프로그램을 실행한다.

3.1.2 프로세스 상태 (Process State)

new : 프로세스가 생성 중이다.
running : 명령어들이 실행되고 있다.
waiting : 스로세스가 어떤 사건이 일어나기를 기다린다.
ready : 프로세스가 처리기에 할당되기를 기다린다.
terminated : 프로세스의 실행이 종료되었다.

운영체제마다 다를 수 있다. 하지만 어느 운영체제든 하나의 프로세스만이 running상태에 있다.

3.1.3 프로세스 제어 블록(Procss Controll Block)

각 프로세스는 운영체제에서 프로세스 제어 블록(PCB Process Controll Block)에 의해 표현된다. 프로세스 0가 실행되다가 인터럽트 또는 시스템 호출에 의해서 다른 프로세스 1이 호출되면 PCB0에 P0의 상태를 저장하고 PCB1으로 부터 P1의 상태를 다시 적재하고 인터럽트 또는 시스템 호출을 실행한다.

아래의 것들을 저장한다.

프로세스 상태 : new, ready, running , waiting, halted 등이다.

프로그램 카운터 : 프로세스가 이 다음에 실행할 명령어의 주소를 가리킨다.

CPU 레지스터들: CPU 레지스터는 컴퓨터의 구조에 따라 다양한 수와 타입을 갖는다. 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터들과 상태 코드 정보가 포함된다.

CPU- 스케줄링 정보: 프로세스 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수들을 포함한다.

(오 우선 순위, 스케줄 큐에 대한 포인터 핀토스에서 무수히 많이봄)

메모리 관리 정보: 운영체제에 의해 사용되는 메모리 시스템에 따라 기준 레지스터와 한계 레지스터의 값, 운영체제가 사

용하는 메모리 시스템에 따라 페이지 테이블 또는 세그먼트 테이블 등과 같은 정볼르 포함한다.

회계 정보 : CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, 잡 또는 프로세스 번호 등을 포함한다.

입출력 상태 정보 : 프로세스에게 할당된 입출력 장치들과 열린 파일의 목록 등을 포함한다.

3.1.4 스레드 (Thread)

이제 까지 논의한 프로세스 모델은 프로세스가 단일의 실행 스레드를 실행하는 프로그램임을 암시했다. 이 단일 제어 스레드는 프로세스로 하여금 한 번에 단지 한 가지 일만 실행하도록 허용한다. 예를 들면 사용자는 동일한 프로세스 내에서 문자를 입력하면서 동시에 철자 검사기를 실행할 수 없다.

현대 운영체제는 한 프로세스가 다수의 실행 스레드를 가질 수 있도록 허용한다. 그들은 프로세스가 한 번에 하나 이상의 일을 수행할 수 있도록 허용한다. 이런 특성은 다중 처리기 시스템에서 이익이다. 여러 스레드가 병렬로 실행될 수 있다. 스레드를 지원하는 시스템에서는 PCB는 각 스레드에 관한 정보를 포함하도록 확장된다.

리뷰 : 다중 프로그래밍(multi programming)은 CPU가 항상 수행할 작업을 하나 가지도록 작업을 구성함으로써 CPU 이용률을 증가 시킨다. 다중 프로그래밍 시스템은 여러 가지 시스템 자원을 효율적으로 이용할 수 있는 환경을 제공하지만, 사용자를 위한 컴퓨터 시스템과 상호 작용은 제공하지 않는다. 시분할 또는 멀티 태스킹(multi-taskgin)은 다중 프로그래밍의 논리적 확장이다. 시분할 시스템에서는 CPU가 다수의 작업들을 교대로 수행하지만, 매우 빈번하게 교대가 일어나므로 프로그램이 실행되는 동안에 사용자들은 각자 자기의 프로그램과 상호 작용할 수 있다.

정리하면서 내가 느끼기에는 일단 다중 프로그래밍, 멀티 태스킹은 모두 싱글 CPU상황에서의 발생된 개념들 같다. 나중에 중요한 문제로 이제 CPU가 여러개인 다중 코어 프로그래밍이 4.3 Multithreading models 에서 소개될 것이다.

3.2 프로세스 스케줄링 (Process Scheduling)

다중 프로그래밍(multi programming)의 목적은 CPU의 이용을 최대화하기 위하여 항상 어떤 프로세스가 실행되도록 하는 데 있다. 시분할 (multi-tasking)의 목적은 각 프로그램이 실행되는 동안 사용자가 상호 작용할 수 있도록 프로세스들 사이에서 CPU를 빈번하게 교체하는 것이다. 이 두 목적을 달성하기 위해 프로세스 스케줄러는 CPU에서 실행 가능한 여러 프로세스들 중에서 하나의 프로세스를 선택한다.

3.2.1 스케줄링 큐 (Scheduling queue)

job queue : 시스템에 들어온 모든 프로세스로 구성된다.
ready queue: 준비 완료 상태에서 실행을 대기하는 프로세스들
device queue: 디스크와 같이 특정 입출력 장치를 대기하는 프로세스들의 리스트를 장치 큐(deviece queue)라 한다.

queueing diagram: 프로세스 스케줄링의 공통적인 표현 방식.

3.2.2 스케줄러 (Scheduler)

장기 스케줄러(job scheduler) : 디스크에 저장되어 나중에 실행될 때까지 기다리는 프로세스들을 선택하여 실행하기 위해 메모리로 적재한다. 즉 다중 프로그램의 정도(메모리에 있는 프로세스들의 수)를 제어한다.

단기 스케줄러(CPU Scheduler) : 실행 준비가 완료되어 있는 프로세스들 중에서 선택하여 그중 한개를 CPU로 할당한다.

3.2.3 문맥 교환(Context Switch)

CPU를 다른 프로세스로 교환하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이 작업은 문맥 교환이라 한다. 문맥 교환 발생시, 커널은 과거 프로세스의 문맥을 PCB에 저장하고, 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구한다.

3.3 프로세스에 대한 연산 (Operation on Process)

exec() : 이 시스템 호출은 이진 파일을 메모리로 적재하고 , 이때 exec() 시스템 호출을 포함하는 원래의 프로그램의 메모리 이미지를 파괴한다. 그리고 그 프로그램의 실행을 시작한다.

wait() : 부모는 자식이 종료될 때까지 준비 완료 큐에서 자신을 제거하기 위해 wait() 시스템을 호출한다.그리고 자식 프로세스가 종료 되기 기다리고 자식 프로세스가 종료되면, 부모 프로세스는 wait() 호출로부터 재개하여, exit() 시스템 호출을 사용하여 종료한다.

3.4 프로세스간 통신 (Interprocess Communication)

운영체제 내에서 실행되는 병행 프로세스들은 독립적이거나 또는 협력적인 프로세스들일 수 있다. 프로세스가 시스템에서 실행 중인 다른 프로세스들에게 영향을 주거나 받지 않는다면 독립적인 프로세스라고 말한다. 다른 프로세스와 데이터를 공유하지 않는 프로세스는 독립적이다. 프로세스가 시스템에서 실행 중인 다른 프로세스들에게 영향을 주거나 받는다면 협력적인 프로세스들이다. 프로세스 협력의 허용 이유에는 몇가지 이유가 있다.

  1. 정보 공유
  2. 계산 가속화
  3. 모듈성
  4. 편의성

협력적 프로세스들은 데이터와 정보를 교환할 수 있는 프로세스간 통신(IPC) 기법을 필요로 한다. 프로세스간 통신에는 shared memory 와 message passing 두 모델이 있다.

메시지 전달 시스템은 시스템 호출을 사용하여 구현되므로 커널 간섭 등의 부가적인 시간 소비 작업들이 필요하므로 공유 메모리 모델이 메시지 전달 보다 빠르다.

공유 메모리 시스템은 공유 메모리 영역 구축시에만 시스템 호출이 필요하다. 공유 메모리 영역 구축시 모든 접근은 일반적인 메모리 접근으로 취급되어 커널의 도움이 필요없다.

많은 처리 코어를 가진 시스템은 메시지 전달이 공유 메모리보다 더 나은 성능을 보인다.
공유 메모리는 공유 데이터가 여러 캐시 사이에서 이주하므로 발생하는 캐시 일관성 문제로 성능 저하가 발생한다.
즉 시스템의 처리 코어의 수가 증가 할수록 IPC로 메시지 전달이 더 선호되는 것을 볼 수 있다.

3.4.2.3 버퍼링 (Bufferring)

이 부분을 개념적으로 모른다는 것을 분산 컴퓨팅 수업때 알았다...버퍼가 프로세스간 메시지 전달시(IPC)에 사용 된다는 것을 몰랐음 ㅠㅠ

통신이 직접적이든 간접적이든 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어 있다. 큐의 구현은 기본적으로 3가지 방식이 있다.

  1. 무용량(zero capacity) 큐의 최대 길이가 0이다. 즉, 링크는 자체 안에 대기하는 메시들을 가질 수 없다. 이 경우에, 송신자는 수신자가 메시지를 수신할 때까지 기다려야 한다.

  2. 유한 용량(bounded capacity): 큐는 유한한 길이 n을 갖는다. 최대 n개의 메시지가 그 안에 들어 있을 수 있다. 새로운 메시지가 전송될 때 큐가 만원이 아니라면, 메시지는 큐에 놓이며, 송신자는 대기하지 않고 실행을 계속한다.

  3. 무한 용량: 큐는 잠재적으로 무한한 길이를 갖는다. 따라서 메시지들이 얼마든 큐 안에서 대기할 수 있다.

겨울방학때 뒤에 프로그래밍 프로젝트 해보자

 

[새로운 리눅스 명령어 만들기 ]  https://www.geeksforgeeks.org/custom-commands-linux-terminal/

 

Custom commands for linux terminal - GeeksforGeeks

Linux operating system allows users to create commands and execute them over the command line. To create a command in Linux, the first step is… Read More »

www.geeksforgeeks.org