Anything Is Possible

PCB and Interrupt(PCB와 인터럽트)

Programming/Java

PCB(Process Control Block, 프로세스 관리 블록) ?



  • 커널에 등록된 각 프로세스에 대한 정보를 저장하는 영역
  • 커널 공간(kernel space)내에 존재
  • OS는 PCB의 정보를 사용하여 프로세스를 관리


PCB의 구성

포인터 

프로세스의 현재상태 

 프로세스의 식별자

 프로세스의 우선 순위

 각종 레지스터

 기억장치 관리 정보

 입출력 정보

 기타 정보...



PCB에 저장되는 정보


  • 프로세스 고유번호(PID : Process Identification)
  • 프로세스 우선순위(Priority)
→ 우선순위 - 기반 스케줄링시 필요한 정보
  • 프로세스 현재 상태(Current state)
→ 프로세스가 할당받은 자원들의 리스트 또는 이들에 대한 한 포인터
  • 문맥 저장 영역(Context save area)
→ 실행중인 프로세스의 일시 중지 시 레지스터 문맥의 저장 영역

PCB에 저장되어야 할 정보는 운영체제에 따라 서로 다름
커널의 PCB 영역 참조 및 갱신 속도 개선은 시스템 전체 성능에 중요함




◇ 인터럽트와 문맥 교환 

인터럽트(Interrupt) ?

컴퓨터 시스템에서 예측하지 못했던 사건이 발생하는 상황을 말한다.



인터럽트의 일반적인 종류


  • 입출력 인터럽트(I/O interrupt)
  • 클럭 인터럽트(clock interrupt)
  • 콘솔 인터럽트(console interrupt)
  • 프로세스간 통신 인터럽트(interprocess communication interrupt)
  • 시스템 호출 인터럽트(system call interrupt, SVC interrupt)
  • 프로그램 오류 인터럽트(program check interrupt)
  • 하드웨어 검사 인터럽트(machine check interrupt







'Programming > Java' 카테고리의 다른 글

프로세스 상태 전이도(Process State Diagram)  (0) 2018.01.08
GitHub(깃허브) 사용법  (0) 2017.12.26
JAVA 메모리 구조  (0) 2017.12.21

프로세스 상태 전이도(Process State Diagram)

Programming/Java

# 프로세스(Process)의 개념

  • 실행 중이 프로그램(작업)
  • Procedure가 활동 중인 것
  • 운영체제(OS)가 관리하는 실행의 단위




#프로세스의 상태(Process State)

○ 생성(New) 상태

→ 프로세스가 생성되었지만 아직 운영체제에 의해 실행가능하게 되지 못 한 상태


○ 준비(Ready) 상태

→ 프로세스가 실행을 위해 CPU(Processor)를 할당받기를 기다리는 상태


○ 실행(Run) 상태

→ 프로세스가 CPU(Processor)를 할당받아 실제로 실행되는 상태


▒ 디스패치(Dispatch) ?

- Ready 상태의 프로세스가 CPU를 할당받아 Run 상태로 전이되는 과정

▒ Time Runout?

- Run 상태의 프로세스에 할당된 CPU 사용시간이 완료되어 Ready 상태로 되돌아가는 과정


○ 종료(Exit)상태

→ 프로세스가 실행이 완전히 끝나고 CPU 할당이 해제된 상태


○ 대기(Wait)상태

→ 프로세스가 CPU(Processor)를 할당받아 실행되다가 어떤 사건이 발생(ex. 입 · 출력 작업이 완료)할 때까지 멈추어 있는 상태


▒ Wake Up?

- 대기(Wait) 상태에 있던 프로세스가 기다리던 어떤 사건의 발생(입 · 출력 작업이 완료)으로 인해 나머지부분의 실행을 위해 준비(Ready) 상태로 전이되는 과정


'Programming > Java' 카테고리의 다른 글

PCB and Interrupt(PCB와 인터럽트)  (0) 2018.01.09
GitHub(깃허브) 사용법  (0) 2017.12.26
JAVA 메모리 구조  (0) 2017.12.21

GitHub(깃허브) 사용법

Programming/Java

새로운 저장소 만들기


폴더를 하나 만들고, 그 안에서 아래 명령을 실행하세요.

git init 

새로운 git 저장소가 만들어집니다. 




저장소 받아오기


로컬 저장소를 복재(clone)하려면 아래 명력을 실행하세요.

git clone / 로컬/ 저장소 / 경로

원격 서버의 저장소를 복제하려면 아래 명령을 실행하세요.

git clone 사용자명@호스트 : / 원격 / 저장소 / 경로




작업의 흐름


여러분의 로컬 저장소는 git이 관리하는 세 그루의 나무로 구성되어 있어요.

1. 작업 디렉토리(Working directory) - 실제 파일들로 이루어져있음

2. 인덱스(Index)는 준비 영역(staging area)의 역할을 함

3. HEAD는 최종 확정본(commit)을 나타냄




추가와 확정(commit)


변경된 파일은 아래 명령어로 (인덱스에) 추가할 수 있어요.

git add <파일 이름>

git add *

이것이 바로 git의 기본 작업 흐름에서 첫 단계에 해당됩니당.

하지만 실제로 변경 내용을 확정하려면 아래 명령을 내려야 합니다.

git commit -m "이번 확정본에 대한 설명"

자, 이제 변경된 파일이 HEAD에 반영되었어요.

하지만, 원격 저장소에는 아직 반영이 안되었어요.




변경 내용 발행(push)하기


현재의 변경 내용은 아직 로컬 저장소의 HEAD안에 머물고 있어요.

이제 이 변경 내용을 원격 서버로 올려봅시다. 아래 명령을 실행하세요.

git push origin master

(다른 가지를 발행하려면 master를 원하는 가지 이름으로 바꿔주세요.)

만약 기존에 있던 원격 저장소를 복제한 것이 아니라면, 

원격 서버의 주소를 git에게 알려줘야 합니당.

git remote add origin <원격 서버 주소>

이제 변경 내용을 원격 서버로 발행할 수 있어용!




가지(branch)치기


가지는 안전하게 격리된 상태에서 무언가를 만들 때 사용합니당.

여러분이 저장소를 새로 만들면 기본으로 master가지가 만들어져요.

이제 다른 가지를 이용해서 개발을 진행하고, 나중에 개발이 완료되면

master가지로 돌아와 병합하면 됩니당.

아래 명령으로 "feature_x"라는 이름의 가지를 만들고 갈아탑니다.

git checkout -b feature_x

아래 명령으로 master가지로 돌아올 수 있어요.

git checkout master

아래 명령을 치면 가지를 삭제할 수 있어요.

git branch -d feature_x

여러분이 새로 만든 가지를 원격 저장소로 전송하기 전까지는 

다른 사람들이 접근할수 없어요. 

git push origin <가지 이름>




갱신과 병합(merge)


여러분의 로컬 저장소를 원격 저장소에 맞춰 갱신하려면 아래 명령을 실행하세요.

git pull

이렇게 하면 원격 저장소의 변경 내용이 로컬 작업 디렉토리에 

받아지고(fetch), 병합(merge)된 답니다.

다른 가지에 있는 변경 내용을 현재 가지(예를 들면, master가지)에 

병합하려면 아래 명력령을 실행하세용.

git merge <가지 이름>

첫번째 명령이든, 두번째 명령이든 git은 자동으로 변경 내용을 병합하려고해요.

문제는 항상 성공하는게 아니라 가끔 충돌(conflicts)이 일어나기도 한다는거~ㅜ

이렇게 충돌이 발생하면, git일 알려주는 파일의 충돌 부분을

직접 수정해서 병합이 가능하도록 해야 합니다.

충돌을 해결했다면 아래 명령으로 git에게 아까의 파일을 병합하라고 알려줘요!

git add <파일 이름>

변경 내용을 병합하기 전에 , 어떻게 바뀌었는지 비교도 가능해용.

git diff <원래 가지> <비교 대상 가지>




꼬리표(tag) 달기


소프트웨어의 새 버전을 발표할 때마다 꼬리표를 달아놓으면 좋아요.

(물론 꼬리표는 SVN 등에 이미 존재하는 기능이지만,)

아래 명령을 실행하면 새로운 꼬리표인 1.0.0을 달수 있어요.

git tag 1.0.0 1b2e1d63ff

위 명령에서 1b2e1d63ff부분은 꼬리표가 가리킬 확정본 식별자입니다.

아래 명령으로 확정본 식별자를 얻을 수 있어요.

git log

확정본 식별자의 앞부분 일부만 입력해도 꼬리표를 불일 수 있지만, 

그 일부분이 반드시 고유하다는 조건이 필요해요.




로컬 변경 내용 되돌리기


만약 여러분이 (물론 그럴 일은 없겠지만) 실수로 무언가 잘못한 경우,

아래 명령으로 로컬의 변경 내용을 되돌릴 수 있어요.

git checkout -- <파일 이름>

위 명령은 로컬의 변경 내용을 변경 전 상태(HEAD)로 되돌려줍니당

다만, 이미 인덱스에 추가된 변경 내용과

새로 생성한 파일은 그래도 남는답니다.


만약, 로컬에 있는 모든 변경 내용과 확정본을 포기하려면, 

아래 명령으로 원격 저장소의 최신 이력을 가져오고, 

로컬 master 가지가 저 이력을 가리키도록 할 수 있어요.

git fetch origin

git reset --hard origin/master




유용한 힌트


git의 내장 GUI

gitk

콘솔에서 git output을 컬러로 출력하기

git config color.ui true

이력(log)에서 확정본 1개를 딱 한 줄로만 표시하기

git config format.pretty oneline

파일을 추가할 때 대화식으로 추가하기

git add -i




'Programming > Java' 카테고리의 다른 글

PCB and Interrupt(PCB와 인터럽트)  (0) 2018.01.09
프로세스 상태 전이도(Process State Diagram)  (0) 2018.01.08
JAVA 메모리 구조  (0) 2017.12.21

JAVA 메모리 구조

Programming/Java


자바 메모리 구조



※ 메모리 구조를 알아야 하는 이유는? 

  • 같은 기능의 프로그램을 사용하더라도 메모리 관리에 따라 성능이 좌우됨

  • 메모리가 제대로 관리되지 않을 경우 속도저하 현상이나 튕김 등의 서비스의 영향이 생김

  • 한정된 자원(메모리)을 효율적으로 사용하여 최고의 성능을 내기 위함



자바 프로그램의 실행구조


메모리 구조를 알아보기 전, 자바 프로그램이 실행되는 순서를 먼저 이해하는 것이 좋다.

프로그램이 실행되기 위해서는 윈도우나 리눅스같은 운영체제(OS)가 제어하고 있는 시스템의 리소스의 일부인 메모리(RAM : 주기억장치)를 제어할 수 있어야 한다. java이전의 C같은 언어로 만들어진 프로그램은 이러한 이유 때문에 운영체제(OS)에 종속되어 실행되게 되어 있었다.

반면, java프로그램은 JAM(Java Virtual Machine) 이라는 프로그램만 있으면 실행이 가능하다. JVM이 OS에게서 메모리 사용권한을 할당받고 JAM이 자바 프로그램을 호출하여 실행하게 된다. OS에서는 독립되었지만 JVM이라는 프로그램에 종속적이게 된다.(JVM을 실행시키고 다시 JVM이 프로그램을 실행시키는 방식이다 보니 OS에서 직접 제어 받는 방식보다는 속도면에서 느리다.)

JVM이란?

  • Java Virtual Machine
  • JAVA와 OS 사이에서 중계자 역할
  • JAVA가 OS에 구애받지 않고 재사용을 가능하게 해 줌
  • 메모리 관리 기능(Garbage Collection)


자바프로그램 실행 과정과 JVM메모리 구조


프로그램이 실행되면, JVM은 OS로부터 이 프로그램이 필요로 하는 메모리를 할당받고, JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

  • JAVA Source : 사용자가 작성한 JAVA 코드
  • JAVA Compiler : JAVA 코드를 Byte Code로 변환시켜주는 기능
  • Class Loader : Class파일을 메모리(Runtime Data Area)에 적재하는 기능
  • Execution Engine : Byte Code를 실행 가능하게 해석해주는 기능
  • Runtime Data Area : 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간


Runtime Data Area


1. 클래스 영역

Method Area, Code Area, Static Area로 불려진다.

  1. Field Information : 멤버변수의 이름, 데이터 타입, 접근 제어자에 대한 정보

  2. Method Information : 메서드의 이름, 리턴타입, 매개변수, 접근제어자에 대한 정보

  3. Type Information : - Type의 속성이 Class인지 Interface인지의 여부 저장

    - Type의 전체이름(패키지명+클래스명)
    - Type의 Super Class의 전체이름
    (단, Type이 Interface이거나 Object Class인 경우 제외)
    - 접근 제어자 및 연관된 interface의 전체 리스트 저장

  4. 상수 풀(Constant Pool)
    - Type에서 사용된 상수를 저장하는 곳(중복이 있을 시 기존의 상수 사용)
    - 문자 상수, 타입, 필드, Method의 symbolic reference(객체 이름으로 참조하는 것)도 상수 풀에 저장

  5. Class Variable
    - Static 변수라고도 불림
    - 모든 객체가 공유 할 수 있고, 객체 생성 없이 접근 가능

  6. Class 사용 이전에 메모리 할당
    - final class 변수의 경우(상수로 치환되어) 상수 풀에 값 복사


2. 스택 영역

  • Last In First Out (LIFO) 방식
  • 메서드 호출 시마다 각각의 스택프레임(그 메서드만을 위한 공간)이 생성되게 됨.
  • 메서드 안에서 사용되어지는 값들 저장, 호출된 메서드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장
  • 메서드 수행이 끝나면 프레임별로 삭제


3. 힙 영역

  •  new 연산자로 생성된 객체와 배열을 저장하는 공간

  •  클래스 영역에 로드된 클래스만 생성가능

  • Garbage Collector를 통해 메모리 반환

  1. Permanent Generation

    - 생성된 객체들의 정보의 주소 값이 저장된 공간

  2. New Area
    - Eden : 객체들이 최초로 생성되는 공간
    - Survivor : Eden에서 참조되는 객체들이 저장되는 공간

  3. Old Area : New Area에서 일정시간이상 참조되고 있는 객체들이 저장되는 공간


4. Native 매소드 영역 (Native method stack area)

  • 자바 외의 다른 언어에서 제공되는 메소드들이 저장되는 공간


5. PC 레지스터 (PC Register)

  • Thread가 생성 될 때마다 생성되는 공간

  • Thread가 어떤 부분을 어떤 명령으로 실행할 지에 대한 기록

  • 현재 실행되는 부분의 명령과 주소를 저장


Garbage Collection


  • 참조되지 않은 객체들을 탐색 후 삭제

  • 삭제된 객체의 메모리를 반환

  • Heap 메모리의 재사용


  1.  Minor Garbage Collection

    i) New 영역에서 일어나는 Garbage Collection
    ii) Eden영역에 객체가 가득 차게 되면 첫 번째 Garbage Collection 발생
    iii) Survivor1 영역에 값 복사
    iv) Survivor1 영역을 제외한 나머지 영역의 객체들을 삭제
    v) Eden영역과 Survivor1영역의 메모리가 기준치 이상일 경우, Eden 영역에 생성된
    객체와 Survivor1영역에 있는 객체 중 참조되고 있는 객체가 있는지 검사
    vi) 참조되고 있는 객체를 Survivor2 영역에 복사
    vii) Surviver2 영역을 제외한 영역의 객체들을 삭제
    viii) 일정시간이상 참조되고 있는 객체들을 Old영역으로 이동
    ix) 반복

  2. Major Garbage Collection (Full Garbage Collection)

    i) Old영역에 있는 모든 객체들을 검사
    ii) 참조되지 않은 객체들을 한꺼번에 삭제
    iii) Minor Garbage Collection에 비해 시간이 오래 걸리고 실행 중 프로세스가 정지


'Programming > Java' 카테고리의 다른 글

PCB and Interrupt(PCB와 인터럽트)  (0) 2018.01.09
프로세스 상태 전이도(Process State Diagram)  (0) 2018.01.08
GitHub(깃허브) 사용법  (0) 2017.12.26