본문 바로가기

학부 수업 정리/시스템프로그래밍 (21-2)

(15)
[시스템] 15. Timers 1. Interval Timers alarm()은 초단위로만 설정이 되고 주기적 실행도 안되기 때문에 그것보다 유연하게 설정할 수 있는 타이머들을 알아보자. Interval Timer는 실제 시계, 유저공간 시계, 프로세스 시계 3가지 중에서 골라서 타이머를 작동시킬 수 있고, 주기적으로 몇초마다 실행시킬지도 정할 수 있다. 이때 alarm과 setitimer는 real-time timer로 같이 사용하면 위험하므로 하나만 써야한다. $\verb|ITIMER_REAL|$: Real Time 을 측정하고, SIGALRM 시그널을 전송한다. $\verb|ITIMER_VIRTUAL|$: user-space Time 을 측정하고, SIGVTALRM 시그널을 전송한다. $\verb|ITIMER_PROF|$: pr..
[시스템] 14. Sleeping 1. Sleeping Sleeping: 프로세스가 CPU 자원을 갖지 못하게 한다. 즉 해당 프로세스는 실행되지 못하고 가만히 있게 된다. REALTIME, MONOTONIC 시계는 Sleep 하는 동안 계속 시간이 흐르지만, PROCESS_CPUTIME, THREAD_CPUTIME 시계는 Sleep 하는동안 시간이 멈춘다. $\verb|sleep(int seconds)|$ seconds 만큼 재우는 Low Resolution Sleeping 함수 리턴값은 "Number of seconds not slept" 이다. 즉 Sleep에 성공하면 0을 리턴하고, 그렇지 않으면 0과 seconds 사이의 값을 리턴한다. (시그널 받는 경우 수면 방해함) $\verb|nanosleep(struct timespec..
[시스템] 13. Time & Clock 1. Time의 종류 Wall Time (Real Time): 실제 시간. Absolute Time을 측정하기 위해 사용됨. (ex 2021년 12월 8일) Monotonic Time: 상대적인 시간. Relative Time을 측정하기 위해 사용됨. 사용자가 임의로 변경할 수 없다. (ex 컴퓨터가 켜진 뒤로부터 지난 시간, 두 샘플에서 시간차이를 측정) Process Time: 프로세스가 user-space, kernel에서 사용된 시간. 프로세스 profiling 등에 사용됨. 프로세스 시간은 멀티 태스킹 환경에서 wall time보다 천천히 돌아가는 것처럼 보일 수 있다. 2. Hardware Clocks Real Time Clock (RTC): 컴퓨터가 꺼져도 시간이 흘러가는 것을 기록함. Hi..
[시스템] 12. I/O Redirection, Standard I/O Library 1. I/O Redirection 연산자 $\verb|command > filename|$ : Redirecting stdout. (파일에 내용 덮어쓰기됨) $\verb|command >> filename|$ : Appending stdout. (파일에 내용 추가됨) $\verb|command 2> filename|$ : Redirecting stderr. (Error 메시지를 출력함) $\verb|command >& filename|$ : Redirecting stdout, stderr. (> 와 2> 가 합쳐진 형태) 2. Duplicating FD $\verb|int dup(oldfd)|$ oldfd 가 가리키는 것과 같은 새로운 fd를 만든다. 이때 사용되지 않은 File Descriptor 중 ..
[시스템] 11. Multiplexed I/O, Memory Mapped I/O 1. 개요 어떤 Socket에서 read() 를 호출해서 네트워크로부터 데이터를 수신하려고 한다. 근데 아무도 데이터를 송신하지 않았다면 수신할 데이터가 없으므로 read() 시스템 콜이 리턴하지 않고 이를 호출한 프로세스를 Sleep 시킨다. 그러다가 데이터가 도착하면 read()가 리턴을 하고 프로세스가 깨어나게 된다. 이때 프로세스를 Sleep 시키지 않게 하기 위해서 IO Multiplexing을 이용한다. IO Multiplexing: IO와 관련된 시스템 콜을 호출했을 때 바로 IO를 처리한 후에 리턴될 수 있는지를 확인한다. 즉 Block이 되지 않을 File Discriptor 들을 확인해서 선택적으로 처리할 수 있게 된다. 2. select(), pselect() $\verb|int se..
[시스템] 10. File Offset 1. File Offset File Offset: Location in the file을 의미한다. read() 나 write() 콜이 다음에 어디에서 작업할지를 가리킨다. 파일이 오픈될 경우 시작점을 가리킨다. (offset 0) 2. lseek(): File Offset 위치 변경 $\verb|off_t lseek(fd, pos, origin)|$ 파일 offset 의 위치를 임의의 위치로 변경한다. 변경 모드는 아래 origin의 값에 따라 달라진다. $\verb|SEEK_CUR|$: 현재 위치 + pos 로 이동 $\verb|SEEK_END|$: (파일의 끝+1) + pos 로 이동 (pos가 -1이면 파일의 마지막 위치) $\verb|SEEK_SET|$: pos 로 이동 사용 예시 $\verb|..
[시스템] 9. File I/O 기초 1. 파일 시스템 용어 File Table: 오픈된 파일들을 저장하고 있는 리스트 File desciptors (fds): 파일의 인덱싱 방식 (int type, start at 0) File offset (position): 파일 내 포인터 포함해야할 헤더파일: $\verb|, , |$ 2. open(), creat(): Opening Files $\verb|int open(*name, flags)|$ $\verb|int open(*name, O_CREAT, mode)|$ 성공적으로 파일이 open 되면 fd에 파일이 Mapping 된다. flags: 반드시 $\verb|O_RDONLY, O_WRONLY, O_RDWR|$ 중 하나는 꼭 써야 한다. 그 외에는 비트 연산자로 $\verb|O_CREAT, ..
[시스템] 8. Thread 동기화 1. Race Condition in thread 아래 예제는 pthread_create 을 통해서 do_loop1, do_loop2 스레드를 생성하여 각 스레드에서 ncount를 증가/감소 하는 기능을 한다. 이때 실행 결과로 0이 나올 것을 예상하겠지만, 스레드끼리 ncount 값이 동기화가 안된 경우에는 0이 나오지 않을 수도 있다. 즉, 스레드끼리 Race Condition이 발생할 수 있으므로 Thread Synchronization 이 필요하다. volatile int ncount; int main(int argc, char *argv[]) { ncount = 0; // do_loop1, do_loop2 thread Create, and Join printf("counter = %d", nco..