프로세스 생성의 목적

  1. 같은 프로그램의 처리를 여러 개의 프로세스가 나눠서 처리하기 위해. - fork() 함수
  2. 전혀 다른 프로그램을 생성하기 위해. - execve() 함수

 


1. fork() 함수

  1. fork() 실행 - 프로세스를 새로 만든다.
  2. 자식 프로세스용 메모리 영역을 작성하고 거기에 부모 프로세스의 메모리를 복사한다.
  3. fork() 함수의 리턴값이 각기 다른 것을 이용하여 부모 프로세스와 자식 프로세스가 서로 다른 코드를 실행하도록 분기한다.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>

static void child()
{
        printf("I'm child! my pid is %d.\n", getpid());
        exit(EXIT_SUCCESS);
}

static void parent(pid_t pid_c)
{
        printf("I'm parent! my pid is %d and the pid of my child is %d.\n", getpid(), pid_c);
        exit(EXIT_SUCCESS);
}

int main(void)
{
        pid_t ret;
        ret = fork();
        if (ret == -1)
                err(EXIT_FAILURE, "fork() failed");
        if (ret == 0) {
                // child process came here because fork() returns 0 for child process
                child();
        } else {
                // parent process came here because fork() returns the pid of newly
                // created child process (> 1)
                parent(ret);
        }
        // shouldn't reach here
        err(EXIT_FAILURE, "shouldn't reach here");
}

// pid_t: 프로세스 번호(pid)를 저장하는 타입(t)이라는 의미

 


2. execve() 함수

  1. 실행 파일을 읽은 다음 프로세스의 메모리 맵에 필요한 정보를 읽어 들인다.
  2. 현재 프로세스의 메모리를 새로운 프로세스의 데이터로 덮어쓴다.
  3. 새로운 프로세스의 첫 번째 명령부터 실행한다.

즉, 전혀 다른 프로그램을 생성하는 경우, 프로세스의 수가 증가하는 것이 아니라, 기존의 프로세스를 별도의 프로세스로 변경하는 방식으로 수행된다.

 

구체적으로 보면 일단 실행 파일을 읽고 프로세스의 메모리 맵에 필요한 정보를 읽어들인다. 실행 파일은 프로세스의 실행 중에 사용하는 코드와 데이터 외에도 아래와 같은 정보가 필요하다.

매핑

-코드를 포함한 데이터 영역의 파일상 오프셋, 사이즈, 메모리맵 시작주소.

-코드 외의 변수 등에서의 데이터 영역에 대한 같은 정보(오프셋, 사이즈, 메모리 맵 시작주소)

-최초로 실행할 명령의 메모리 주소

 

코드 영역과 데이터 영역의 ‘메모리 맵 시작 주소’가 필요한 이유는 cpu에서 실행되는 기계언어 명령은 고급언어로 쓰인 소스코드와는 다르게 특정 메모리 주소를 지정할 필요가 있기 때문이다.

 

c = a + b 코드를 기계언어로 바꾸면 다음과 같이 메모리 주소를 직접 조작하는 명령으로 변환(컴파일) 된다.

이렇게 읽어드린 정보로 위의 매핑 이미지와 같은 구조를 형성한다.

그 후 엔트리 포인트 에서부터 실행한다.

 

더보기
  • 두 줄이 하나의 정보 세트
  • 16진수로 표기
  • .text = 코드 영역, .data = 데이터 영역
  • 메모리 맵 시작 주소: 첫 줄의 네 번째 필드
  • 파일상의 오프셋: 첫 줄의 다섯 번째 필드
  • 사이즈: 둘째 줄의 첫 번째 필드

 

execve

#include <unistd.h>

int execve(const char *filename, char *const argv[], char *const envp[]);


출처: https://www.it-note.kr/157 [IT 개발자 Note]

 

 

fork and exec

  1. 프로세스를 새로 만든다.
  2. 부모 프로세스는 echo hello 프로그램을 생성한 뒤 자신의 프로세스 ID와 자식의 프로세스 ID를 출력하고 종료한다.
  3. 자식 프로세스는 자신의 프로세스 ID를 출력하고 종료한다.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>

static void child()
{
	char *arg[] = {"/bin/echo", "hello", NULL};
	printf("I'm child! my pid is %d.\n", getpid());
	fflush(stdout);
	execve("/bin/echo", arg, NULL);
	err(EXIT_FAILURE, "exec() failed");
}

static void parent(pid_t pid_c)
{
	printf("I'm parent! my pid is %d and the pid of my child is %d.\n", getpid(), pid_c);
	exit(EXIT_SUCCESS);
}

int main(void)
{
	pid_t ret;
	ret = fork();
	if (ret == -1)
		err(EXIT_FAILURE, "fork() failed");
	if (ret == 0)
	{
		//child process came here because fork() returns 0 for child process
		child();
	} else {
		//parent process came here because fork() returns the pid of newly
		//created child process (>1)
		parent(ret);
	}
	// shouldn't reach here
	err(EXIT_FAILURE, "shouldn't reach here");
}

 

 

https://www.it-note.kr/157

'Linux_Ubuntu' 카테고리의 다른 글

tar 파일 압축 및 해제  (0) 2022.03.10
ubuntu 한글 설정  (0) 2021.06.15
ps 명령어 사용법  (0) 2021.06.11
VI Editor 사용법  (0) 2021.06.11
Ubuntu 18.04 설치 및 환경 셋팅 (RTX 3090, 2080) 및 기타 Tips  (0) 2021.06.11

https://omnil.tistory.com/155

 

'Linux_Ubuntu' 카테고리의 다른 글

tar 파일 압축 및 해제  (0) 2022.03.10
프로세스 생성  (0) 2021.06.17
ps 명령어 사용법  (0) 2021.06.11
VI Editor 사용법  (0) 2021.06.11
Ubuntu 18.04 설치 및 환경 셋팅 (RTX 3090, 2080) 및 기타 Tips  (0) 2021.06.11

nn.Conv2d(3, 32, 3, padding=1)

 

첫번째 parameter 인 3은 input_channel_size가 되겠습니다. 여기서 input_channel_size는 Input Image의 RGB depth 인 3이 되겠습니다. (즉, 32*32 Image 3장이 들어간다고 보면 되겠습니다.)

 

두번째 parameter 인 32는 output_volume_size입니다. 즉, conv1 layer를 거쳐 몇장의 필터를 만들어 내고 싶은가? 입니다. 32장의 필터를 만들어 내고 싶으므로, 32가 되겠습니다.

 

세번째 parameter는 kernel_size입니다. Filter_size라고도 불리기도 하는데, 말 그대로 filter의 사이즈를 정의하는 것입니다. 3*3 filter를 사용하고 싶기 때문에 3을 기입했습니다.

 

네번째 parameter 인 padding=1은 padding을 줄지 말지 여부와 padding 사이즈를 지정해 줍니다. 저는 padding 을 임의로 1 주었습니다.

 

마지막으로, stride는 따로 주지는 않았지만, 따로 주지 않으면 default로 stride=1 속성이 지정됩니다.

 


Conv_Size

 

예제 1) 

  1. 227 - 11 + (2 * 0) = 226
  2. 226 / 4 = 54
  3. 54 + 1 = 55

예제 2) 소수점이 있는 경우, 소수점을 버림

  1. 64 - 7 + (2 * 0 ) / 2 = 28.5 
  2. 28 + 1 = 29

예제 3)

  1. 32 - 5 + (2 * 2) / 1 = (27 + 4 ) / 1 = 31
  2. 31 + 1 = 32

예제 4) Input size가 다른 경우

  1. (32, 64) - 5 + (2 * 0)  / 1 = ((32-5, 64-5 / 1 )
  2. ((27, 59) / 1 ) + 1 = 28 * 60 
  3. out.shape >> torch.Size([1, 1, 28, 60])

예제 5)

  1. 64 * 32
  2. out.shape >> torch.Size([1, 1, 64, 32])

 

출처:

1. https://wegonnamakeit.tistory.com/48

2. https://teddylee777.github.io/pytorch/conv2d-output-size-%EA%B3%84%EC%82%B0%EB%B2%95

# https://wolfy.tistory.com/243
import torch
import torch.nn as nn


def conv_start():
return nn.Sequential(
nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3), # padding size를 왜 4로 했지? 계산하면 3이 맞는것 같은데...
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)


def bottleneck_block(in_dim, mid_dim, out_dim, down=False):
layers = []
if down:
layers.append(nn.Conv2d(in_dim, mid_dim, kernel_size=1, stride=2, padding=0))
else:
layers.append(nn.Conv2d(in_dim, mid_dim, kernel_size=1, stride=1, padding=1))
layers.extend([
nn.BatchNorm2d(mid_dim),
nn.ReLU(inplace=True),
nn.Conv2d(mid_dim, mid_dim, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(mid_dim),
nn.ReLU(inplace=True),
nn.Conv2d(mid_dim, out_dim, kernel_size=1, stride=1, padding=0),
nn.BatchNorm2d(out_dim),
])
return nn.Sequential(*layers)


class Bottleneck(nn.Module):
def __init__(self, in_dim, mid_dim, out_dim, down: bool = False, starting: bool = False) -> None:
super(Bottleneck, self).__init__()
if starting:
down = False
self.block = bottleneck_block(in_dim, mid_dim, out_dim, down=down)
self.relu = nn.ReLU(inplace=True)
if down:
conn_layer = nn.Conv2d(in_dim, out_dim, kernel_size=1, stride=2, padding=0),
else:
conn_layer = nn.Conv2d(in_dim, out_dim, kernel_size=1, stride=1, padding=0),

self.change_dim = nn.Sequential(conn_layer, nn.BatchNorm2d(out_dim)) # 더해주기 위해 차원 맞춰주기

def forward(self, x):
identity = self.change_dim(x)
x = self.block(x)
x += identity
x = self.relu(x)
return x


def make_layer(in_dim, mid_dim, out_dim, repeats, starting=False):
layers = []
layers.append(Bottleneck(in_dim, mid_dim, out_dim, down=True, starting=starting))
for _ in range(1, repeats):
layers.append(Bottleneck(out_dim, mid_dim, out_dim, down=False))
return nn.Sequential(*layers)


class ResNet(nn.Module):
def __init__(self, repeats: list = [3, 4, 6, 3], num_classes=1000):
super(ResNet, self).__init__()

 


1512.03385.pdf
0.78MB

https://wolfy.tistory.com/243

https://deep-learning-study.tistory.com/534

'Deep Learning' 카테고리의 다른 글

앞으로 봐야 할것들  (0) 2021.06.18
환영합니다!  (0) 2021.06.11

Normalization

  • 값의 범위(scale)를 0~1 사이의 값으로 바꾸는 것
  • 학습 전에 scaling하는 것
    • 머신러닝에서 scale이 큰 feature의 영향이 비대해지는 것을 방지
    • 딥러닝에서 Local Minima에 빠질 위험 감소(학습 속도 향상)
  • scikit-learn에서 MinMaxScaler

 

 

Standardization

  • 값의 범위(scale)를 평균 0, 분산 1이 되도록 변환
  • 학습 전에 scaling하는 것
    • 머신러닝에서 scale이 큰 feature의 영향이 비대해지는 것을 방지
    • 딥러닝에서 Local Minima에 빠질 위험 감소(학습 속도 향상)
  • 정규분포를 표준정규분포로 변환하는 것과 같음
    • Z-score(표준 점수)
    • -1 ~ 1 사이에 68%가 있고, -2 ~ 2 사이에 95%가 있고, -3 ~ 3 사이에 99%가 있음
    • -3 ~ 3의 범위를 벗어나면 outlier일 확률이 높음
  • 표준화로 번역하기도 함
  • scikit-learn에서 StandardScaler

 

 

Regularization

  • weight를 조정하는데 규제(제약)를 거는 기법
  • Overfitting을 막기위해 사용함
  • L1 regularization, L2 regularizaion 등의 종류가 있음
    • L1: LASSO(라쏘), 마름모
    • L2: Lidge(릿지), 원

 

 

출처:

1. https://realblack0.github.io/2020/03/29/normalization-standardization-regularization.html

 

[딥러닝] 정규화? 표준화? Normalization? Standardization? Regularization?

딥러닝을 공부하다 보면 “정규화” 라는 용어를 참 자주 접하게 된다. 그런데 애석하게도 Normalization, Standardization, Regularization 이 세 용어가 모두 한국어로 정규화라고 번역된다. 이 세가지 용어

realblack0.github.io

2. https://blog.naver.com/PostView.nhn?blogId=qbxlvnf11&logNo=221476122182&categoryNo=52&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView 

 

머신 러닝 - Normalization, Standardization, Regularization 비교

Normalization, Standardization, Regularization의 공통점은 'Overfitting을 방지하기 위해 사용...

blog.naver.com

 

ps [옵션]

출처: https://jhnyang.tistory.com/268

 

 

ps 출력 필드

  • UID: 해당 프로세스의 소유주를 나타내며 이는 프로세스의 활동 권한을 뜻한다.
  • PID: 시스템에서 부여하는 해당 프로세스 고유 번호이다.
  • PPID: 프로세스를 생성한 프로세스(Parents Process)의 PID이다.
  • C: 스케줄러에 의해 현재 활동중인 프로세스를 표시하며 '0'으로 표시된 것은 휴지 상태를 나타낸다.
  • STIME: 프로세스가 시작된 시간을 시:분:초로 표시한다
  • TTY: 프로세스가 제어되는(연결된) 터미널을 표시한다. '?'는 제어 터미널이 연결되어 있지 않음을 뜻한다.
  • TIME: CPU 사용시간이 시:분 형태로 출력된다. 이는 사용자가 느끼는 수행시간이 아니라, 프로세스가 스케줄링되어 실제 수행한 시간의 합을 의미한다. 10분간 프로그램을 수행하였는데, 실제 CPU 사용할 때간은 10초를 기록할수 있다.
  • CMS: 실행 명령어를 보여준다.
  • F: 프로세스 프레그(flag)를 의미한다. 별 의미는 없다.
  • S: 프로세스의 상태를 표시한다.
    • O = 현제 수행중
    • S = 처리가 종료되기를 대기함
    • R = 방금 생성된 프로세스로, 처리되기를 기다림
    • Z = 핸들링 할수 없는 좀비(Zombie) 프로세스 (제거 대상)
    • T = 추적 모드(trace)로 수행되어, 일시 중단 되었다.
  • PRI: 스케줄링된 우선순위, 낮을수록 높다.
  • NI: 우선순위를 계산하기 위한 nice 값
  • ADDR: 프로세스의 메모리 시작 주소
  • SZ: 프로세스가 점유하고 있는 메모리 용량
  • WCHAN: 프로세스 상태가 S 일 때 프로세스는 어떠한 처리가 종료되길 기다린다. 이때 처리되고 있는 수행의 메모리 시작 주소

출처: http://jkkang.net/unix/system/process.txt

 


 

* 트리 형태로 출력

* pstree
    * -p : 프로세스명과 PID 함께 출력
    * -n : PID 순서로 출력

pstree -p grep chrome

 

 


 

가장 많이 쓰이는 명령어

  • ps -ef | grep name

example

2번째 열: 프로세스 고유 ID (PID)

3번째 열: 부모 프로세스 ID (PPID)

 

프로세스 종료 방법:

kill -9 PID

 

 



출처: 

https://www.delmaster.net/194 [delmaster blog]

https://ghostweb.tistory.com/828

 

ubuntu 프로세스 강제 종료시키기 (프로세스 먹통 일 때)

ubuntu를 사용하다 보면 코딩 문제, 프로세스 문제 등으로 프로세스를 강제 종료해야 할 때가 있는데요. 이번에는 강제 종료에 대해서 알아보도록 할게요. 1. 터미널에서 프로세스 종료하기 터미

ghostweb.tistory.com

https://www.delmaster.net/194

 

리눅스 ps - 실행중인 프로세스 확인

[실행중인 프로세스 리스트 출력] * ps [옵션] * 옵션 * -a : 다른 사용자의 프로세스도 출력 * -x : 사용자가 로그아웃 한 이후에도 실행중인 프로세스 출력 * -u : 각 프로세스마다 사용자 이름, 시작

www.delmaster.net

https://arer.tistory.com/150

 

[리눅스]ps명령어(프로세스 확인 명령어, 특정 프로세스 확인)

리눅스 프로세스 확인 명령어 - ps명령어 리눅스 OS관리 시 프로세스를 확인하는 경우가 매우 많이 있다. 이때 사용하는 명령어가 ps(Process Status)명령어이다. ps명령어는 현재 실행중인 프로세스

arer.tistory.com

 

'Linux_Ubuntu' 카테고리의 다른 글

tar 파일 압축 및 해제  (0) 2022.03.10
프로세스 생성  (0) 2021.06.17
ubuntu 한글 설정  (0) 2021.06.15
VI Editor 사용법  (0) 2021.06.11
Ubuntu 18.04 설치 및 환경 셋팅 (RTX 3090, 2080) 및 기타 Tips  (0) 2021.06.11

1. VI Editor란?

- 각종 문서를 편집할 수 있는 텍스트 기반의 편집기

- 리눅스 뿐만 아니라 유닉스 계열의 모든 운영체제에서 사용하는 편집기

 

2. Vi Editor 실행 (Ubuntu 18.04)

- 1) 터미널창 실행: Ctrl + Alt + "t"

- 2) vi + Enter     or     vi 파일명.타입 + Enter

3. 입력모드와 명령모드

- 1) 입력 모드 : 메모장과 같이 텍스트를 자유롭게 편집하는 모드

- 2) 명령 모드 : 다양한 명령을 내리는 모드

- esc로 모드 변경 가능!

 

4. Vi Editor 명령어: esc로 명령모드 입력모드 변경 가능

- 1) 입력

  • i  : 현재 커서에서 입력
  • a : 현재 커서 다음 뒤치에서 입력

 

- 2) 삭제

  • x   : 커서가 위치한곳 삭제
  • dw: 커서가 위치한 곳부터 단어 삭제
  • dd: 한 줄 삭제

 

- 3) Back

  • u : 방금 한 명령 취소

 

- 4) 복사, 붙여넣기

  • yy    : 현재 줄 복사
  • yw   : 한 단어 복사
  • ynw : n개의 단어 복사
  • p      : 다음 줄에 붙여넣기

 

- 5) 위치 이동

  • 0 (숫자) : 줄 맨 앞 = Shift + ^
  • $ : 줄 맨 뒤
  • ( : 문단 맨 앞
  • ) : 문단 맨 뒤
  • H : 왼쪽으로 이동
  • ㅣ : 오른쪽으로 이동
  • J  : 밑으로 이동
  • K : 위로 이동

- 6) 기타 명령어

  • c -> w -> esc : 커서 위치부터 $ 표기된 곳 까지 삭제
  • r -> 원하는 글자 : 커서 위치를 원하는 글자로 대체함

 

 

- 7) 마지막 행 명령어

  • :w  : 저장
  • :w 파일명  : 파일명으로 저장
  • :q   : vi 종료
  • :q!  : 강제 vi 종료
  • :wq : 저장 후 종료
  • :wq! : 저장 후 강제종료
  • /문자열  : 앞부터 문자열 검색    n: 다음, shift + n: 이전
  • ?문자열 : 뒤부터 문자열 검색     n: 다음, shift + n: 이전

 

- 8) 파일 및 함수 찾기

  • 파일 찾기: find . -name 파일이름
  • 함수 찾기: grep 함수이름 *.파일형식 -r

'Linux_Ubuntu' 카테고리의 다른 글

tar 파일 압축 및 해제  (0) 2022.03.10
프로세스 생성  (0) 2021.06.17
ubuntu 한글 설정  (0) 2021.06.15
ps 명령어 사용법  (0) 2021.06.11
Ubuntu 18.04 설치 및 환경 셋팅 (RTX 3090, 2080) 및 기타 Tips  (0) 2021.06.11

1. 선형 함수

Linear_Function

선형함수의 조건

 

1. Superposition (중첩의 원리) : 

Superposition(중첩의 원리)

2. Homogeneity (동질성) :  a는 상수.

Homogeneity(동질성)

Example) y = 3x

 


 

 

2. 비선형 함수

Non_Linear_Function_1
Non_Linear_Function_2

위의 그림들은 Superposition(중첩의 원리)와 Homogeneity(동질성) 계산을 하면 성립하지 않는다.

그리고 Deep Learning에서는 input data에 대해서 선형, 비선형을 따지는게 아니고,

W (Weight)에 대해서 선형, 비선형을 따지는겁니다.

'수학 > 선형대수' 카테고리의 다른 글

04. 벡터 방정식  (0) 2021.11.10
03. Dot Product의 성질 - 선형대수  (0) 2021.11.09
02. Norm과 Dot Product - 선형대수  (0) 2021.11.09
01. 벡터 (Vector) - 선형대수  (0) 2021.11.09

+ Recent posts