일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 |
30 | 31 |
- 프로세스
- error
- 학습
- 공부
- 딥러닝
- 회귀
- linux
- OpenCV
- C언어
- Windows10
- python
- 백준
- Windows 10
- 시스템프로그래밍
- C++
- 프로그래밍
- c
- 리눅스
- 운영체제
- 텐서플로우
- CV
- Computer Vision
- 턱걸이
- shell
- 백준알고리즘
- 쉘
- 코딩
- 알고리즘
- 영상처리
- TensorFlow
- Today
- Total
목록공부/시스템 프로그래밍 (15)
줘이리의 인생적기
프로세스가 파일을 읽고 쓸 때에 굉장한 메커니즘이 필요한다. 메모리 특정 공간에 파일을 미리 올려두고, 접근하기 위해서 프로세스가 메모리에 왔다갔다 할 수 있는 파일 처리 성능 개선 기법에 대해 알아보자 mmap 함수로 메모리에 올릴 수 있으며, 리턴값으로 성공과 실패를 알 수 있다. void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset) 첫 번째 인자 : 스타트 지점 지정 보통 NULL 이나 0 사용 두 번째 인자 : 길이 지정 세 번째 인자 : 보호 모드 설정 PROT_READ(읽기 가능) / PROT_WRITE(쓰기 가능) / PROT_EXEC(실행 가능) / PROT_NONE(접근 불가) 네 번째 인자 : ..
POSIX스레드라고 부르며, Pthread[피스레드]라고도 부른다. pthread는 저수준 API로 100여개의 함수를 제공한다. 유닉스 시스템의 핵심 스레딩 라이브러리이다. 헤더파일에 정의되어 있으며, pthread_로 모든 함수가 시작된다. 스레드 관리(생성, 종료, 조인, 디테치)와 관련된 함수, 동기화(뮤텍스)와 관련된 함수를 주로 익혀두면 좋다. 기본 라이브러리(glibc)와 분리된 libpthread 라이브러리에 구현되어 있어서 컴파일시에 -pthread 옵션이 필요하다. gcc -pthread test.c -o test 스레드 생성 pthread_t thread1; void *thread_function(void *ptr); ret = pthread_create(&thread1, NULL, ..
쉘을 사용하여 프로그래밍 가능하다. (DevOps를 위해 기본적으로 익혀둘 필요 있음) 쉘 스크립트가 필요할 때는, 서버가 다운되어 확인해보니 로그파일을 업데이트할 저장공간이 남지 않아 프로그램이 비정상 종료되었다. 자동으로 오래된 로그파일을 삭제하는 쉘 스크립트를 생성하고 주기적으로 실행함으로써 서버가 다운되는 문제를 해결할 수 있다. 파일의 가장 첫 라인은 #!/bin/bash로 시작한다. 실행 권한을 가지고 있어야 하며, 일반적으로 .sh의 확장자를 가지고 있다. 사전에 정의된 지역변수를 알아보자. $$ : 쉘의 프로세스 번호 $0 : 쉘스크립트 이름 $1 ~ $9 : 명령어의 해당 인수 $* : 쉘 이름 제외한 명령어의 모든 인수리스트 $# : 쉘 이름 제외한 인수의 개수 $? : 최근 실행한 명..
압축 명령 tar에 대해서 알아보자 70년대부터 있던 명령어이다. 이 명령어는 여러 파일을 묶는 명령어였으나, 압축까지 할 수 있도록 옵션을 추가했다. 주요 옵션은 x : 묶음 해제 c : 파일 묶음 v : 묶음/해제 과정을 화면에 표시 z : gunzip을 사용 f : 파일 이름 지정 압축 시 tar -cvzf 압축된파일이름 압축할파일이나폴더명 압축 풀 때 tar -xvzf 압축해제할이름
시그널(signal)은 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지 알려주는 기법이다. Ctrl + C로 프로세스를 종료시키거나, Ctrl + Z 로 프로세스를 중지시키는 것이 시그널 사용의 예이다. 시그널 종류는 kill -l 명령어를 통해 알 수 있다. SIGKILL 프로세스 죽이는 시그널 SIGALARM 알람 발생시키는 시그널 SIGSTP 프로세스 멈추는 시그널 SIGCONT 멈춰있는 프로세스 다시 실행시키는 시그널 SIGSEGV 프로세스가 다른 메모리영역 침범 시그널 각 프로세스에서 시그널 처리에 대해 동작 설정이 가능하다 - 시그널을 무시하게 - 시그널을 블럭시키게(블럭 풀어지면 프로세스에서 시그널 처리) - 프로그램 안에 등록된 시그널 핸들러로 재정의한 특정 동작 수행하게..
nice(), setpriority()라는 함수로 프로세스의 우선순위를 변경할 수 있다. root가 소유한 프로세스만 우선순위를 높일 수 있고, 다른 프로세스는 우선순위를 낮출 수만 있다. (스케쥴링 방식에 따라 순위 변경이 적용 안될 수 있음) #include int nice(int inc); #include int setpriority(int which, id_t two, int value); 위 전처리기와 함수 원형을 사용하여 두가지 방법으로 우선순위를 변경할 수 있다. #include int getpriority(int which, id_t who); 위 함수원형을 가지고 프로세스의 우선순위를 확인해볼 수 있다.

wait()시스템콜이 있는 이유는 fork()함수 호출 시 자식 프로세스가 종료할 때까지 부모 프로세스가 기다린다. 기다리지 않으면 부모 프로세스가 먼저 끝나서 자식 프로세스는 고아프로세스가 되어버린다. 리턴값은 자식프로세스의 pid이다. copy-on-write copy-on-write는 fork() 시스템콜이 4GB를 복사하는데 시간이 너무 오래걸린다는 문제점에서 출발했다. 자식프로세스 생성 시에 복사를 하지 않고 우선 부모 프로세스 페이지를 우선 사용한다. 읽기가 아니라 쓰기를 할 때 해당 페이지를 물리메모리에서 복사하고 분리한다. 분리한 후에는 업데이트된 물리 메모리의 page pointer를 자식 프로세스의 페이지테이블에서 업데이트한다. 장점은 프로세스 생성 시간을 줄일 수 있으며, 새롭게 할당..
프로세스 ID - 각 프로세스는 각 pid를 가지며, 최대값은 32768이다. - sudo vi /proc/sys/kernel/pid_max 에서 최대값을 확인할 수 있음. 프로세스 계층 - 최초 프로세스는 init 프로세스 이며 pid는 1이다. - 운영체제가 init프로세스를 생성한다. - 다른 프로세스는 init프로세스를 기반으로 생성된다. - ppid는 부모프로세스의 pid를 뜻한다. 소유자 관리 - 리눅스는 프로세스의 소유자와 그룹을 UID/GID 정수로 관리하며 서로 매핑되어 있다. - sudo vi /etc/passwd 에서 확인할 수 있다. PID 호출 함수 - getpid(), getppid()로 알 수 있다. #include #include #include int main() { pri..