
Pthread 란? thread 표준 API - POSIX 스레드 또는 Pthread(피-스레드)라고 부름 Pthread API - 저수준 API로 100여개의 함수 제공 - 복잡하지만, 유닉스 시스템 핵심 스레딩 라이브러리 - 다른 스레딩 솔루션도 결국 Pthread를 기반으로 구현되어 있으므로, 익혀둘 가치가 있음 Pthread 라이브러리 1. 헤더 파일에 정의 2. 모든 함수는 pthread_로 시작 3. 크게 두 가지 그룹 1) 스레드 관리: 생성, 종료, 조인, 디태치 함수 등 2) 동기화: 뮤텍스(상호배제)등 동기화 관련 함수 Pthread 라이브러리 기본 라이브러리(glibc)와 분리된 libpthread 라이브러리에 pthread구현되어 있으므로 컴파일시 명시적으로 -pthread 옵션 필..

쉘 스크립트 1. 쉘을 사용해서 프로그래밍을 할 수 있음 2. 서버 작업 자동화 및 운영(DevOps)을 위해 기본적으로는 익혀둘 필요가 있음 3. 쉘 명령어를 기본으로 하되, 몇가지 문법이 추가된 형태 4. 시스템 프로그래밍에서 꼭 익히는 내용 중 하나 쉘 스크립트의 예 문제점 서버가 어느날 다운되었다. 확인해보니 서버 저장공간이 하나도 남지 않음. 로그파일 업데이트가 안되어 관련 프로그램 비정상 종료 이유는 로그파일이 많이 쌓여있음. 어떻게 하면 자동으로 오래된 로그파일을 삭제할까? 해결 간단한 쉘 스크립트 생성 및 주기적 실행(crontab) 기본 문법 1. 쉘 스크립트는 파일로 작성 후, 파일을 실행 2. 파일의 가장 위의 첫 라인은 "#!/bin/bash"로 시작 3. 쉘 스크립트 파일은 실행 ..

시그널(signal) 1. 유닉스에서 30년 이상 사용된 전통적인 기법 2. 커널 또는 프로세스에서 다른 프로세스에 어떤 이벤트가 발생되었는지를 알려주는 기법 → ctrl + c : 프로세스 종료시키기(시그널 사용 예) → ctrl + z : 해당 프로세스가 백그라운드 프로세스로 미리 정의되어있는 시그널이 OS에서 해당 프로세스에 전달 주요 시그널 - 시그널 종류와 각 시그널에 따른 기본 동작이 미리 정해져있음 - 내부적으로는 시그널 번호가 다 있다. 1. SIGKILL: 프로세스를 죽여라 2. SIGALARM: 알람을 발생한다. 3. SIGSTP: 프로세스를 멈춰라(Ctrl + z) 4. SIGCONT: 멈춰진 프로세스를 실행해라 5. SIGINT: 프로세스에 인터럽트를 보내서 프로세스를 죽여라(Ctr..

다양한 IPC 기법 1. file 사용 2. Message Queue 3. Shared Memory 4. Pipe 5. Signal 6. Semaphore 7. Socket → 프로세스 A와 B가 서로 통신할 필요가 있을 경우가 있어서 IPC 기법이 나왔다. 저장 매체를 접근 할 수 있기 때문에 파일을 통해서 데이터를 공유할 수 있다. 다만, 파일에 프로세스 A 가 뭔가를 사용했을 때 프로세스 B가 알아차릴 수 있는 방법이 없다. 그래서 커널 공간이 물리 메모리에 특정한 주소를 공유 할 수 있다. 각 페이지 테이블에 커널 공간에 해당하는 주소를 둘 다 동일한 위치를 가리키도록 써 놓으면 결과적으로 가상메모리로는 공유가 안되는 것 처럼 보이지만 실제 메모리상으로 공유 가능하다. 커널 공간이 공유되어서 다양..

exit() 시스템 콜 : 프로세스 종료 → exit 인자로 status (프로세스 종료 상태를 나타내는 번호) 를 넘겨 준다. ( exit(0) => 0으로 넘겨주면 정상 종료 ) exit 함수는 비정상 종료할때 호출하는 것이 일반적. C 언어에서 실행파일 종료 할때 return 0; 많이 쓰인다. exit(0) 은 비정상적 종료일 때, 강제로 프로세스를 죽일 경우 사용된다. 운영체제에서 실행 할 때 _start() 라는 함수를 실행. _start() 함수 안에 main 함수가 호출되도록 되어 있음. main 함수로 호출하면 main 함수에 코드 주소를 가리키게 해서 메인 함수가 바로 실행 되는 것처럼 보임. 메인 함수에서 return 0 으로 끝나면 main 함수 밑에 있는 코드 실행하게 된다. ex..

리눅스 프로세스 - 프로세스 당 4GB 가상 메모리 할당 - 사용자영역(0GB ~ 3GB), 커널영역(3GB ~ 4GB) 커널 영역에는 운영체제, 커널이미지가 들어간다. User Space 에는 실행 프로그램 이미지가 들어간다. ( heap, bss, data, text ) → 각 프로세스마다 커널 이미지가 들어간다. 공간이 1GB. 커널은 동일한 이미지. 가상메모리 시스템과 연결해 가상메모리 시스템에 페이지 시스템을 생각해보면 각 시스템마다 페이지 테이블이 생긴다. 페이지 테이블은 가상메모리와 물리메모리 주소를 매핑을 시켜 놓은 테이블. 커널의 일부 이미지가 물리메모리 CPU에 실행되고 있다면, 커널 일부 페이지를 가상 메모리와 매핑해 놓은 페이지 테이블에 들어 갈 수 있다. 프로세스 B가 실행하다가 ..

wait() 시스템콜 1. wait함수를 사용하면, fork()함수 호출시 자식 프로세스가 종료할 때까지, 부모 프로세스가 기다림 2. 자식 프로세스와 부모 프로세스의 동기화, 부모 프로세스가 자식 프로세스보다 먼저 죽는 경우를 막기 위해 사용 → 하나의 프로세스 안에서 fork, 자식프로세스가 생기면 그 안에서 exec 실행되고 종료(exit) 부모 프로세스에 wait라고 적어 놓으면 자식프로세스가 끝날 때까지 기다린다. 자식 프로세스가 다 끝나면 디폴트로 SIGCHID 라고 하는 시그널이 부모프로세스에 보내지게 된다. 부모프로세스는 시그널을 받을 때까지 기다리게 되고 받으면 wait 밑에 있는 코드를 실행하게 된다. wait()없이 부모 프로세스가 먼저 끝나버리면 문제가 된다. 왜냐하면 자식 프로세스..

exec() 시스템콜 exec() 을 실행이 되면 새로운 프로세스를 만들지 않고 현재 프로세스 공간을 exec안에 인자로 실행파일 이름/인자 등을 넣어준다. 해당 프로세스 공간에 덮어 씌운다. (TEXT, DATA, BSS 영역을 덮어씌운다.) 새로운 실행파일처럼 동작을 한다. exec() 시스템콜 family execl() 와 execlp() 시스템콜 사용법 → default 로 대부분 bin이 path로 설정되어 있으므로 execlp 첫번째 인자는 디폴트로 설정되어 있는 환경변수 path값을 참조해서 실행파일을 실행하므로 파일이름만 execle() 시스템콜의 사용법 → execle 은 execlp 의 NULL 인자 까지는 똑같다. 맨 마지막에 string 변수가 들어간다. string 변수를 미리 선..