which
which는 특정명령어의 위치를 찾아주는 명령어이다.

BASH
which find

  /bin/find

검색 가능한 모든 경로에서 해당 명령어를 찾음

BASH
which -a find

  /bin/find
  /usr/bin/find

where

whereis는 명령어의 실행파일위치, 소스위치, man 페이지파일의 위치를 찾아주는 명령어이다.

BASH
whereis find

  find: /bin/find /usr/bin/find /usr/share/man/man1/find.1.gz

locate

locate는 다양한 패턴의 파일들을 찾고자 할 때 매우 유용하게 사용되는 명령어이다.

현재 시스템에 존재하는 *.bak 에 해당하는 파일 찾기

BASH
locate *.bak

특정패턴에 해당하는 파일들 가운데 지정한 개수만큼 검색

BASH
locate -n 10 *.conf



블로그 이미지

낭만가을

,

touch

touch는 파일의 날짜시간정보를 변경하는 명령어이다. 즉 아무런 옵션없이 사용하면 서버의 현재시간으로 파일의 최근사용한 시간(access time)과 최근변경 시간(modification time)을 변경한다. 만약 특정옵션이 사용되지 않는다면 파일의 크기가 0인 빈 파일을 생성한다. -t 라는 옵션을 사용하면 서버의 현재시간이 아닌 지정된 시간으로 파일의 날짜시간정보를 변경한다.

touch [옵션] 파일명

빈 파일 생성

BASH
touch newfile

현재시간으로 파일 날짜정보 변경

BASH
touch -c newfile

파일의 날짜정보를 마음대로 변경(YYYYMMDDhhmm 형식)

BASH
touch -t 201306141200 newfile  

지정한 파일의 날짜시간정보를 지정한 다른 파일의 날짜시간정보와 동일하게 변경(newfile을 oldfile의 날짜정보와 같게 변경)

BASH
touch -r oldfile newfile



 

블로그 이미지

낭만가을

,

JVM이란?

프로그래밍/OS 2018. 4. 21. 12:09


우선 JVM이란?


자바 가상 머신이라 부른다.

자바와 운영체제사이에서 중계자 역할을 한다.

자바가 운영체제 종류에 영향받지 않고 돌아갈 수 있도록 한다.

메모리 관리를 자동으로 해준다 (GC)


여기서 중요한 것은 운영체제와 플랫폼 종류에 의존적이지 않고 독립적으로 JAVA프로그램이 실행된다.






위 그림을 설명하면...


Java Compiler(자바 컴파일러)에 의해 Java source(.java) 파일은  Byte code로 변환된다.


Class Loader(클래스 로더)는 이 변환된 Byte code(.class) 파일을 JVM 내로 class를 로드하고 Link작업을 통해 

배치 등 일련의 작업을 한다. 또 런타임시 class를 load한다.


Execution Engine(실행 엔진) 은 Class Loader를 통해 JVM 내부로 넘어와 Runtime Data Area(JVM 메모리)에 배치된 

Byte code들을 명령어 단위로 실행시킨다.


GC(Garbage Collector)는 어플리케이션이 생성한 객체의 생존 여부를 판단하여, 더이상 참조되지 않거나 null 인 객체의 메모리를 해체시켜

메모리 반납을 한다. 


Runtime Data Areas(JVM 메모리) 런타임 데이터 영역은 JVM메모리로 Java 어플리케이션이 실행하면서 할당받은 메모리영역이다.


세분화하자면 6개(Method, Runtime Constant Pool, Heap, Stack, PC Register, Native Method Stack)의 영역으로 나뉜다.




출처 : http://hoonmaro.tistory.com/19



6개 메모리 영역의 용도와 특징


(화질이 좋지 않으니 클릭해서 보시길.)



끝으로 Heap Area를 좀 더 살펴보면....


Young Generation : 객체가 생성될 때 저장된다. 즉 막 생성된 객체들의 인큐베이터이다. 생성된 기간이 흐르고, 우선순위가 낮아지면

                          Young 세대의 객체들은 Old세대로 이동하게 된다. 이 영역에서 객체가 사라질 때는 Minor GC 수행된다.


Old(Tenured) Generation : Young Generation 영역에 있는 객체가 오래되서 저장되는 공간이다.

                                   이 영역에서 객체가 사라질 때는 Major GC(Full GC) 수행된다.


Permanent Generation :  클래스 로더에 의해 로든되는 클래스, 메소드 등에 대한 메타 정보가 저장되는 영역으로 JVM에 의해 사용된다.                                  리플렉션을 사용하여 동적으로 클래스가 로딩되는 경우에 사용된다. 



또 Method와 Runtime Constant Pool , Heap 영역은 모든 스레드에서 공유할 수 있다.

블로그 이미지

낭만가을

,


Java 가상 머신 내부에는 각 스레드에 Java 스택이 주어집니다. Java 스택에는 스레드가 호출 한 각 메소드의 로컬 변수, 매개 변수 및 리턴 값을 포함하여 다른 스레드가 액세스 할 수없는 데이터가 들어 있습니다. 스택의 데이터는 기본 유형 및 객체 참조로 제한됩니다. JVM에서는 실제 객체의 이미지를 스택에 배치 할 수 없습니다. 모든 오브젝트는 힙에 상주합니다.


https://stackoverflow.com/questions/1208695/where-methods-live-stack-or-in-heap



Thread별로 현재 수행중인 메소드의 정보를 저장하는 곳이다. 이러한 정보를 Stack Frame이라 하며, Stack Frame은 Local Variable Section, Operand Stack, Frame Data로 나뉜다. 


- Local Variable Section


메소드의 파라미터 변수, 로컬 변수를 배열에 저장하여 인덱스를 통해 접근한다. Primitive Type의 변수들은 Fixed된 크기로 할당되지만, Object나 배열같은 Reference Type은 가변의 Reference가 저장된다. (자바는 모든 객체를 Reference로 전달 된다는 걸 알고 있을 것이다.)


다시 말해 Object는 Reference가 저장된다. 그러므로 Reference Type의 변수들은 접근을 하기 위해선 저장된 Reference정보를 가지고 실제 객체가 저장되어있는 Heap이라는 공간에 찾아간다. 이는 메모리 점프를 많이 하게 되므로, Primitive Type의 변수보다 비용이 많이 든다.


-Operand Stack


이도 Local Variable Section과 같이 Array로 구성되어 있다. Operand Stack은 JVM이 프로그램을 수행하면서 연산을 위해 사용되는 데이터 및 그 결과를 저장 하는 곳이다. 


-Frame Data


Constant Pool Resolution정보와 Method가 정상 종료 했을때의 정보, Exception 정보들을 저장하고 있다. Constant Pool Resolution은 바로 Method Area에 저장되어 있는 Constant Pool의 Pointer 정보이다




'프로그래밍 > OS' 카테고리의 다른 글

리눅스 which ,where ,locate  (0) 2018.07.21
리눅스 touch - 파일생성 및 파일의 날짜정보 변경  (0) 2018.07.21
JVM이란?  (0) 2018.04.21
JVM(JavaVirtualMachine)  (0) 2018.04.21
Process 와 Thread 의 차이  (0) 2018.04.16
블로그 이미지

낭만가을

,
JVM(JavaVirtualMachine)이란

- Java의 중간 코드를 실행할 수 있는 주체
- Java와 OS사이의 중개자 역할
- Java가 OS에 종속되지 않고 사용가능하게 해줌.
- 메모리 관리 기능(용도에 따라 여러 영역으로 나누어 관리),
 Garbage Collection을 제공

Java 프로그램과 일반 프로그램의 실행구조는 아래와 같다.

https://www.slideshare.net/ssuser4ff81c/java-56998433

왼쪽이 Java , 오른쪽이 그외 JVM을 사용하지 않는 언어들로 작성한 프로그램의 실행 구조이다. 앞서 설명한 바와 같이 Java의 경우는 JVM이 OS로 부터 메모리 사용권한을 받아 프로그램을 실행시켜주기 때문에 JVM이 지원하는 모든 OS들에 독립적일 수 있다.

아래의 Java의 실행과정을 보면

https://www.slideshare.net/ssuser4ff81c/java-56998433

사용자가 Java로 작성한 코드(.java)는 컴파일러를 거쳐서 중간코드인 Java Byte Code(.class)로 나오고 이를 JVM에서 실행하는것을 확인할 수 있다.

JVM의 구성
https://www.slideshare.net/ssuser4ff81c/java-56998433

- Class Loader= 모든 클래스는 참조되는 순간에 동적으로 JVM에 Link되며 메모리에 로딩되는데, 동적 클래스 로딩은 Class Loader을 통해서 이루어 진다.
JVM은 클래스에 대한 정보를 알지 못하기때문에 main이 실행되기 전에 Class Loader가 클래스를 로딩할 때 필요한 정보를 구하고, 클래스가 올바른지 검사한다.

- Execution Engine= Class Load 작업 후 , Byte Code는 Runtime Data Area에 배치된다. JVM은 Method(=Class) Area의 Byte Code를 Execution Engine에 제공하여 Class에 정의된 내용대로 실행하게 된다.
즉 Execution Engine이란 ByteCode를 실행하는 Runtime Module이다. 
※ Runtime Module의 방식은 Interpreter랑 JIT(just in time) Compiler 방식이 있다.

- Runtime Data Areas = 프로그램을 수행하기 위해 OS에서 할당 받은 메모리 공간

https://www.slideshare.net/ssuser4ff81c/java-56998433

1. Class(=Static=Method) 영역
사용하는 클래스 파일의 바이트 코드가 로드되는 곳으로 static 변수의 값 그리고 멤버 변수, 메소드 등 클래스에 대한 정보=metadata(값아님)가 JVM이 종료될때 까지 유지된다.
이렇게 Class 영역에 바이트 코드가 올라가는 것을 ClassLoding 이라고 하며  ClassLoding 이 되야 하는 이유는 메소드를 호출하기 위해서는 먼저 그 메소드를 갖고 있는 클래스 파일(바이트 코드)이 메모리에 로딩되어 있어야 하기 때문이다.

2. Stack 영역
지역변수와 매개변수가 저장되는 곳으로 메소드가 호출되거나 로프문안으로 들어왔을때 스택영역에 메모리를 할당한다. 지역문 안에서만 임시 할당 되있다가 지역문이 끝나면 삭제된다.

3. Heap 영역
기본형 변수를 제외한 참조형 변수들이 가르키는 곳(주소)에 내용이 저장되는 영역이다. 흔히 new를 통해 생성된 인스턴스가 저장되는 곳이다.

예를 들어  아래와 같은 A라는 클래스가 있다고 가정했을때

public static void main(String[] args) { A sample= new A(); }

 이렇게 메인 메소드에서 sample 인스턴스를 생성하게 되면 
Stack영역에는 지역변수인 sample과 sample의 내용이 저장된 주소값이 저장되고
Heap영역에는 sample 안에 있는 인스턴스 변수인 int a와 String str이 저장되게 된다.

즉 new 로 생성된 객체의 내용은 Heap영역에 저장되고 참조형 변수인 sample은 main함수 안에 있는 지역변수 이므로 Stack영역에 저장되는 것이다.

※힙 영역에 저장된 내용들은 참조형 변수가 참조하지 않게 되어 가비지가 되면 가비지 컬렉터에 의해 제거되거나 JVM이 종료되면 제거된다.

- GC(Garbage Collector)
참조되지 않은 객체들을 탐색 후 삭제 후 , 삭제된 객체의 메모리를 반환한다.
※ stop-the-world = GC을 실행하기 위해 JVM이 어플리케이션 실행을 멈추는 것으로 GC를 실행하는 Thread를 제외한 나머지 Thread는 모두 작업을 멈춘다. (stop-the-world를 줄이기 위한것이 GC 튜닝)


블로그 이미지

낭만가을

,

Process:

  • An executing instance of a program is called a process.
  • Some operating systems use the term ‘task‘ to refer to a program that is being executed.
  • A process is always stored in the main memory also termed as the primary memory or random access memory.
  • Therefore, a process is termed as an active entity. It disappears if the machine is rebooted.
  • Several process may be associated with a same program.
  • On a multiprocessor system, multiple processes can be executed in parallel.
  • On a uni-processor system, though true parallelism is not achieved, a process scheduling algorithm is applied and the processor is scheduled to execute each process one at a time yielding an illusion of concurrency.
  • Example: Executing multiple instances of the ‘Calculator’ program. Each of the instances are termed as a process.

Thread:

  • A thread is a subset of the process.
  • It is termed as a ‘lightweight process’, since it is similar to a real process but executes within the context of a process and shares the same resources allotted to the process by the kernel.
  • Usually, a process has only one thread of control – one set of machine instructions executing at a time.
  • A process may also be made up of multiple threads of execution that execute instructions concurrently.
  • Multiple threads of control can exploit the true parallelism possible on multiprocessor systems.
  • On a uni-processor system, a thread scheduling algorithm is applied and the processor is scheduled to run each thread one at a time.
  • All the threads running within a process share the same address space, file descriptors, stack and other process related attributes.
  • Since the threads of a process share the same memory, synchronizing the access to the shared data withing the process gains unprecedented importance.


블로그 이미지

낭만가을

,