관리자

1. naming

위가 아래보다 느리다.

 

compiler는 log 파일을 이용하는데, this.size와 this.elementData.length는 동일하지 않기 때문이다.(값은 동일하지만.)

 

this.size = this.elementData.length

for (int i = 0; i < this.size; i++) {
	
    if ( i >= this.elementData.length) throw new AIOBE();

}
// this.size = this.elementData.length

for (int i = 0; i < this.elementData.length; i++) {
	
    if ( i >= this.elementData.length) throw new AIOBE();

}

youtu.be/oH4_unx8eJQ?t=2178

 

2. implicit null check

if ( this.elementData == null ) throw new NPE();

this.elementData.length

 

C언어를 생각해보면 

this.element가 null일 때, this.element.length에 접근하면 segmentation fault가 발생한다.

java는 segmentation fault를 NPE로 wrap한다.

이 과정이 쉽고 빠르다고 한다.

 

 

3. Garbage Collection(Stop The World)

Garbage collection을 하기 위해서는 모든 thread를 정지시켜야한다.

thread를 정지시키는 방식이 꽤 재미있다.

 

poison page라는 개념을 이용한다.

JIT은 주기적으로 각 thread에 poison page를 읽으라는 명령어를 집어넣는다.

Garbage Collection이 필요하면 page를 unmap해서,

모든 thread에서 segmentation fault가 발생하도록 한다.

 

youtu.be/oH4_unx8eJQ?t=2868

 

4. loop peeling

youtu.be/oH4_unx8eJQ?t=3161youtu.be/oH4_unx8eJQ?t=3161

 

5. inlining & iterator is not a synthetic sugar

- inlining: youtu.be/oH4_unx8eJQ?t=3512

- iterator is not a synthetic sugar: youtu.be/oH4_unx8eJQ?t=4075

 

 

'언어 > Java' 카테고리의 다른 글

jvm internal - 1. Runtime Data Area  (0) 2021.01.30
JVM internal - 0.Overview  (0) 2021.01.30
what jit likes and dislikes  (0) 2021.01.17
java 동작 원리  (0) 2021.01.17
Java ME vs SE vs EE, JRE  (0) 2021.01.12

코드는 compile, link, execute의 3가지를 거쳐 프로그램으로 실행된다.

 

대부분의 컴퓨터 언어는

  • compiler가 object file을 생성하고, linker가 object file을 연결하여 executable file을 만든다.
  • compiler는 platform dependent하기 때문에(target machine, OS의 영향을 받기 때문에)
    언어 개발자들은 platform마다 알맞은 compiler를 새로 만들어야 했다.
  • 일반 프로그래머들(high-level languge로 프로그래밍을 하는 사람)은 코드를 조금만 수정해도
    실행하기 위해서는 처음부터 compile을 해야했다.
    더보기
    (프로그램 사이즈가 큰 경우엔 compile에만 상당한 시간이 걸리기도 한다.)
    compile이 끝나고 실행하는데, 오타 때문에 수정된 부분을 제대로 확인도 못하고
    다시  긴 compile을 기다려본 적이 있다면 얼마나 귀찮은지 공감할 것이다.

 

interpreter로 동작하는 언어는

  • compile, link, execute의 단계가 존재한다기보다는
  • 코드 statement를 읽을 때마다 high-level statement를 low-level로 conversion하여 수행한다.
  • interpreter는 3가지 유형으로 나뉜다.

 

 

java는 compiler와 interpreter가 혼합된 형태이다.

  1. java compiler(javac)가 high-level code로부터 bytecode(.class file)를 생성한다.
    (bytecode는 object file이 아니다.)
  2. jvm이 bytecode를 이용하여 interpreter처럼 statement를 읽을 때마다 동적으로 link-execute를 수행한다.
    (bytecode가 jvm interpreter의 object file처럼 동작한다.
    linker가 존재하지 않고 동적으로 link를 수행한다는 것이 다르다)

장점

- platform independent하다. jvm이 os에 dependent 하지만 java compiler는 platform independent 하다.

windows에서 코드를 작성하고 compile한 뒤 linux에서 실행할 수 있다.

 

 

참고한 자료

www.cs.cmu.edu/~jcarroll/15-100-s05/supps/basics/history.html

 

How Java Works

Most computer languages use the "compile-link-execute" format. You start with source code and the compiler converts this program into a  low-level program. In most compiled languages, the file containing the resulting low-level code is called an object 

www.cs.cmu.edu

 

 

'언어 > Java' 카테고리의 다른 글

jvm internal - 1. Runtime Data Area  (0) 2021.01.30
JVM internal - 0.Overview  (0) 2021.01.30
what jit likes and dislikes  (0) 2021.01.17
jit optimization - 흥미로운 사실1  (0) 2021.01.17
Java ME vs SE vs EE, JRE  (0) 2021.01.12
  1. docker에서 port open

  2. generate config file
    jupyter server --generate-config

-> ~/.jupyter폴더에 jupyet_server_config.py가 생성된다.

  1. update jupyet_server_config.py
    c.ServerApp.password_required = True
    c.ServerApp.port = 8888
    
    c.NotebookApp.ip = '*'
    c.ServerApp.allow_origin = '*'
    c.ServerApp.allow_root = True
  2. jupyter lab --port=8888

 

https://jupyter-notebook.readthedocs.io/en/stable/public_server.html

Cgroup:

- Control Group

- Process Group 단위로 Resource를 제한하고 격리시키는 Linux의 기능

- 주로 Containe의 Resource 제어를 위해 사용됨

 

Cgroup 제어:

1. cgroupfs

- cgroup를 제어하기 위한 File System

- Linux Kernel 내부에서 관리

- Cgroup 제어는 Directory의 생성, 삭제, File 변경에 의해 이루어짐.

- resource type별로 cgroupfs가 존재한다.

따라서 하나만 존재하지 않는다.

-  `/sys/fs/cgroup`: 기본 경로

`/sys/fs/cgroup/memory` : memory를 관리하는 cgroup

- systemd가  `/sys/fs/cgroup`에 cgroupfs를 mount함

 

 

2. systemd

- linux의 init process

- daemon process를 제어하는 역할

- cgroup 제어 기능은 systemd의 daemon process를 관리 기능의 일부.

daemon process의 resource를 제어하는데 사용됨.

 

 

 

참고한 자료

tech.kakao.com/2020/06/29/cgroup-driver/

 

'linux, docker, kubernetes' 카테고리의 다른 글

apt vs apt-get 비교(APT, dpkg)  (0) 2021.01.10
docker centos, ubuntu systemctl(service)  (0) 2021.01.10
linux remote ssh 접속  (0) 2021.01.10

Windows에서 unix를 기준으로 작성된 source code를 사용할 수 있도록 runtime environment를 제공하는 POSIX(Portable System Interface).

 

Cygwin의 설치 디렉토리는 unix system의 root directory과 비슷한 구성을 가지고 있다.(/bin, /home 같은)

 

처음 개발된 이유도, linux 기반으로 만들어진 프로그램을 손쉽게 Windows에서도 빌드하기 위해서이다.

 

아래 두 가지로 구성된다.

- DLL: API(C standard library 형태)

- unix 시스템을 사용하는 것 같은 느낌을 주는 software tools and application로 구성되어있다.

 

아래의 다양한 feature를 갖는다.

+ Recent posts