본문 바로가기

학부 수업 정리

(43)
[시스템] 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..
[시스템] 7. Threads 1. Threads (스레드) 스레드는 프로세스의 실행단위를 의미한다. 각 스레드는 context of the process 에서 실행되며, 같은 코드와 전역 변수를 공유한다. 즉, 프로세스끼리는 자원 공유가 힘들었던 반면 스레드는 자원을 공유하기가 매우 편리하다. (동일 프로세스 내에서 스레드끼리 같은 메모리의 스택 영역에서 실행된다.) fork(): 자식 프로세스 생성 exec(): 새로운 프로세스로 대체 pthread_create(): 새로운 스레드 생성 2. pthread_create(): 스레드 생성 $\verb|int pthread_create(pthread_t *thread,|$ $\verb|const pthread_attr_t *attr, void* (*start) (void *), voi..
[시스템] 6. IPC (Inter Process Communication) 1. IPC 소개 Signal은 프로세스 사이에 메시지를 보내는 아주 간단한 방법이다. 하지만 전송할 수 있는 정보는 단순히 시그널 숫자 뿐이므로 프로세스들끼리 더 많은 메시지들을 전송하기 위해서는 IPC라는 새로운 방법이 필요하다. IPC의 종류에는 Pipe, Message Queue, Shared Memory, Shmaphore 가 있다. (수업에서는 Pipe와 Message Queue를 위주로 다루었다.) 2. Pipe 단방향 데이터 채널 FIFO - 큐처럼 작동 Stream (바이트) 단위로 전송하기 때문에 메시지의 경계가 존재하진 않는다. System Call: $\verb|pipe()|$ - 파이프 생성 / $\verb|read(), write()|$ 커맨드 창에서 파이프의 사용: $\text..
[시스템] 5. Race Condition & Signal Blocking 1. Race Condition - Simple 예제 시그널핸들러와 이 시그널을 호출하는 main() 함수에 둘 다 $\verb|*i = *i + value;|$ 코드가 있다고 생각하자. 이 코드를 어셈블리 코드로 나타내면 아래와 같다. (ecx, edx는 각 레지스터 이름에 해당하는 변수 이름을 임의로 지정하였다.) my_sighanler: ecx = *i; // movq (%rax), %ecx #1 ecx = ecx + value; // addl %eax, %ecx #2 *i = ecx; // movq %ecx, (%rax) #3 main: edx = *i; // movq (%rax), %edx #4 edx = edx + value; // addl %eax, %edx #5 *i = edx; // mo..
[시스템] 4. 어셈블리 기초 1. 메모리 주소의 표현 모드 $$\verb|D(Rb, Ri, S) -> Mem[Reg[Rb] + S*Reg[Ri] + D]|$$ 왼쪽의 표현식은 오른쪽 공식에 의해 생성되는 숫자로 나타낸다. 이 숫자가 메모리 주소가 된다. $\verb|Rb|$ : Base Register 주소 (16개의 정수 레지스터) $\verb|Ri|$ : Index Register 주소 (\%rsp 제외한 모든 레지스터) $\verb|S|$ : Scale - 1, 2, 4, 8 (Short, int, long 타입 보정용. 디폴트는 1) $\verb|D|$ : Constant Displacement - 1, 2, 4 bytes Expression Address Computation Address $\texttt{0x8(%rdx)..