일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Redirection
- bash shell 반복문
- exit()
- pane & desktop
- 개체 외곽 하이라이트 기준선 없애는 법
- msync
- background process
- 3Ds max 기초
- 후디니
- fork 시스템 콜
- ps 명령어
- bash shell 조건문
- Standard Stream
- foreground process
- 섭페에서 텍스처 추출
- bg 명령어
- houdini
- 뷰포트
- exec 시스템 콜
- bash shell 변수
- 생활코딩 복습
- Symmetry
- copy-on-write
- wait 시스템 콜
- mmap
- 추가 업로딩 중
- atexit()
- substance painter
- 3D 배경 그래픽
- 섭페
- Today
- Total
목록전체 글 (64)
Researcher to Developer
#Pthread 리눅스에서 Thread를 생성하고 관리하는 함수 - thread 표준 API POSIX 스레드 또는 Pthread 라고 부른다. - Pthread API 저수준 API로 100 여개의 함수 제공 복잡하지만 유닉스 시스템 핵심 스레딩 라이브러리 다른 스레딩 솔루션도 결국 Pthread 를 기반으로 구현되어 있으므로 익혀둘 가치가 있다. pthread API는 Semaphore를 포함하지 않는다. 리눅스 C언어에서는 어떻게 Pthread를 사용할 수 있을까? #Pthread 라이브러리 헤더 파일 모든 함수는 pthread_ 로 시작한다. 크게 두 가지 그룹으로 나뉜다. 1. 스레드 관리 : 생성, 종료, 조인, 디태치 함수 등 2. 동기화 : 뮤텍스 등 동기화 관련 함수 기본 라이브러리 (g..
# 쉘 스크립트 서버 작업 자동화 및 운영(DevOps)을 위해 기본적으로 익혀둘 필요가 있다. 쉘 명령어를 기본으로 하되, 몇 가지 문법이 추가된 형태 시스템 프로그래밍에서 꼭 익히는 내용 중 하나이다. 최근 perl 이나 python이 사용되고 있다. - 쉘 스크립트를 사용하는 경우 서버가 다운되어서 확인해보니 서버 저장공간이 하나도 남아 있지 않았다. 이유는 로그 파일이 많이 쌓였기 때문이었다. 로그 파일이 업데이트가 안되어 관련 프로그램이 비정상적으로 종료되었다. 어떻게 하면 자동으로 오래된, 혹은 일정 시간 경과한 로그 파일을 삭제할 수 있을까?? 이런 문제를 간단한 쉘 스크립트 생성 및 주기적 실행으로 해결할 수 있다. * 로그 파일 : 서버에 어떤 일이 있었고 어떤 동작을 했었는지 기록해놓는..
#시그널 (signal) 시그널은 IPC 기법 중 하나로 사용될 수 있지만 그 외 사용 방법도 있다. 유닉스에서 30년 이상 사용된 전통적인 기법이다. 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지를 알려주는 기법 시그널 사용 예 Default로 정의되어 있는 시그널이 OS에서 해당 프로세스에 전달 된다. Ctrl + C : 프로세스 종료시키기 Ctrl + Z : 프로세스가 background 프로세스로 바뀐다. #주요 시그널 시그널 종류와 각 시그널에 따른 기본 동작이 미리 정해져 있다. 대부분 내부적으로 시그널 번호가 매핑되어 있다. SIGKILL 프로세스를 죽여라 (슈퍼관리자가 사용하는 시그널로, 프로세스가 어떤 경우든 죽음) SIGALARM 알람을 발생한다. SIGSTP 프로세..
ipcs 현재 커널 공간에 생성되어 있는 message queue, 공유 메모리 segments, semaphore arrays 정보를 표시하는 명령어 #공유 메모리 (shared memory) 노골적으로 커널 영역에 메모리 공간을 만들고, 해당 공간을 변수처럼 쓰는 방식 메세지 큐 처럼 FIFO 방식이 아니라 해당 메모리 주소를 변수처럼 접근하는 방식 공유 메모리 key를 가지고 여러 프로세스가 접근이 가능하다. 메세지 큐와 마찬가지로 key를 가지고 있다. #공유 메모리 코드 예제 1. 공유 메모리 생성 #include #include #include int shmget(key_t key, size_t size, int shmflg); // key : 임의 숫자 또는 ftok 함수로 생성한 키 값 /..
#IPC Inter Process Communication Process는 기본적으로 서로 통신할 수 있는 방법이 없다. 둘 다 저장 매체에 접근할 수 있기 때문에 파일을 통해 공유할 수 도 있지만 실시간 공유의 어려움이 있어 추천되지는 않는다. 그래서 등장하게 된 것이 IPC 기법이다. 기본 개념은 이러하다. Process는 커널 공간을 공통적으로 가지고 있고 그렇기 때문에 물리 메모리의 특정한 주소를 공유할 수 있다. 이것이 가능하게 된 근거는 각 페이지 테이블의 커널 공간에 해당되는 주소가 둘 다 동일한 위치를 가리키도록 해놓으면 실제 메모리 상으로 공유가 가능하다. 즉, 커널 공간은 공유가 가능하다는 것을 기반으로 다양한 IPC 기법이 나오게 되었다. IPC 기법 중 pipe와 message qu..
#Priority-Based 스케쥴러 (우선 순위 기반) 종류 정적 우선 순위 스케쥴러 프로세스마다 우선 순위를 미리 지정한다. 동적 우선 순위 스케쥴러 스케쥴러가 상황에 따라 우선 순위를 동적으로 변경한다. #nice() 우선 순위를 변경하는 시스템 콜 프로세스 중 root가 소유한 프로세스만 우선 순위를 높일 수 있다. root로 실행해야만 가능하다. 다른 프로세스는 우선 순위를 낮출 수만 있다. 스케쥴링 방식에 따라 우선 순위가 적용될 수 도 있고 안될 수 도 있다. nice() 함수 사용의 예는 다음과 같다. #include int nice (int inc); // inc 값에 우선순위 값을 넣어주면 해당 우선순위를 우선 실행하도록 되어있다. #getpriority(), setpriority() ..
리눅스는 POSIX 호환 운영체제다. 리눅스는 POSIX에서 정한 시스템콜을 제공하고 있다. #리눅스 환경에서 프로세스 생성 과정 부모 프로세스 안에서 fork () 명령어를 넣고 동일한 데이터와 코드를 가진 별도의 프로세스 공간을 생성하고, (자식 프로세스) 부모/자식 프로세스 각각 fork의 () 함수 다음 줄 code에 Program Counter가 놓여서 리턴 값이 pid 값을 주는데 pid 값을 기반으로 부모/자식 프로세스를 구분 지을 수 있고 조건문을 사용해서 자식 프로세스인 경우에는 exec () 프로그램(시스템 콜)으로 실행 파일을 인자에 넣어서 실행 시키면 해당 코드 이미지로 자식 프로세스가 덮어씌워지고 프로세스가 다시 처음부터 실행하게 되어 덮어씌워진 코드 이미지를 읽어나가게 된다. 조..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cKuA1u/btqSdto6PzI/bJTrk3r9EhjSeh8CvDkFWK/img.png)
#copy-on-write 리눅스 프로세스 생성과 관련하여 생성 속도를 높이게 해주는 시스템 콜이다. 해당 기능을 이해 하기 위해서는 1. 리눅스 프로세스 구조와 2. 가상 메모리 시스템 간의 메커니즘 이해가 필요하다. #리눅스 프로세스 구조와 가상 메모리 시스템 리눅스에서는 프로세스당 4GB의 가상 메모리가 할당된다. 3(0xc0)~4(0xff)GB 이 공간은 커널 영역으로 여기에 운영 체제가 들어간다. 0~3(0xc0)GB 이 공간은 사용자 영역으로 실행 파일의 이미지가 들어간다. (TEXT, DATA, BSS, HEAP, STACK ) 프로세스 마다 커널 영역이 들어가 있는데 가상 메모리 시스템에 페이징 시스템을 이용하여 각 프로세스 마다 페이지 테이블이 생긴다. (가상 메모리와 물리 메모리의 주소..
#fork(), exec() 리눅스 프로세스 실행 과정에 필요한 두 가지 시스템 콜이다. fork() - 부모 프로세스로 부터 새로운 프로세스 공간을 만들고 부모 프로세스 데이터 복사 exec() - 새로운 프로세스를 위한 바이너리를 새로운 프로세스 공간에 덮어씌움 풀어서 설명하면 다음과 같다. 프로세스 내에서 fork()를 호출하면 새로운 프로세스에 대한 공간을 만들고 fork()를 호출한 프로세스(부모) 데이터를 복사하여 pid가 0이면 자식 프로세스, pid가 0보다 크면 부모 프로세스로 공간이 나뉘게 된다. 그리고 새로운 프로세스를 위한 코드 이미지를 새로운 프로세스 공간에 덮어씌운다. 그런데 fork() 함수 호출을 하면 자식 프로세스가 종료하기 전에 부모 프로세스가 끝나는 오류가 생길 수 있다..
#프로세스의 기본 구조 STACK = 함수 처리를 위한 영역 HEAP = 동적 메모리 DATA = 초기값이 있는 변수값 (int i=0;) BSS = 초기값이 없는 변수값 (int i;) TEXT = Code, 실행 코드 이미지 이 기본 구조에서 STACT, HEAP은 Code가 실행되면서 줄어들거나 커지거나 하지만 DATA, BSS, TEXT는 컴파일시 결정되는 영역이다. 아주 간단하게는 전체 메모리 공간을 만들고 프로세스 이미지(코드 이미지)를 해당 공간에 업로드하고 실행 시작(STACK, HEAP 처리)하므로써 프로세스를 생성한다고 볼 수 있다. #fork() 유닉스, 리눅스 시스템 콜 중 하나 새로운 프로세스 공간을 별도로 만들고, fork() 시스템 콜을 호출한 부모 프로세스 공간의 데이터을 모..
#Program, Precess, Thread 개념 프로그램 binary, code image, 응용 프로그램, Application 또는 실행 파일을 의미한다. 프로세스 실행 중인 프로그램을 의미한다. (메모리 적재 + 프로세스 상태 정보,PCB 포함) 스레드 리눅스 프로세스는 기본 스레드를 포함한다. 싱글스레드 프로세스 - 기본 프로세스 멀티스레드 프로세스 - 여러 스레드가 있음 #pid 최대값 각 프로세스는 해당 시점에 유니크한 pid를 가진다. 형태는 숫자이고 pid 최대값은 32768이다. 32768이 최대값인 이유는 부호형(signed) 16비트 정수값을 사용하기 때문인데 2의 15 제곱 승이 32768 이다. 다음의 명령어로 32768인 것을 확인할 수 있다. sudo vi /porc/sys..
#cp 명령 파일 복사(copy 의 약자) cp A B 일정 사이즈를 가지고 있는 A 파일을 B 파일로 복사 A 와 B 는 각각 물리적으로 ex.10MB 파일로 저장 copy하면 파일명은 달라질 것이고 inode 번호도 달라질 것이다. inode 구조부터 모든 정보를 별도의 새로운 공간에 복사하는 것 그래서 원본 파일의 내용을 바꿔도 복사한 파일에는 내용이 똑같이 바뀌어 있지 않다. cp -rf 디렉토리를 통째로 복사할 때 사용하는 명령어(서브 디렉토리, 파일 등 모든 것) * r - recursive (재귀 : 어떤 것을 정의할 때 자기 자신을 참조하라) * f - Y/N 묻지 말고 진행해라 rm 파일명 삭제할 파일명 rm -rf Y/N 묻지 말고 삭제해라 #cp(copy) 특징 1. copy하면 파일..