대학/시스템소프트웨어
-
Assembly대학/시스템소프트웨어 2022. 12. 12. 22:38
레지스터와 명령어에 대해 살펴보자. (x86 아키텍쳐의 GAS/GNU format에 대해 다룹니다) - Register 레지스터 설명 %eax 데이터를 저장 %edx 데이터를 저장 %ecx 데이터를 저장 %ebx 데이터를 저장 %esi ? %edi ? %esp stack의 top. 즉 stack frame의 끝을 가리킴 %ebp stack frame의 시작을 가리킴 %eip program counter. 현재 실행중인 라인을 가리킴 레지스터 안에는 기본적으로 메모리의 주소가 저장되어 있다. (e.g. %eax = 0x8048b90) (%eax)와 같이 레지스터에 괄호를 치는 경우에는 레지스터가 가리키는 메모리주소에 담긴 값을 가리킨다. (e.g. (%eax) = 100 ) 상수는 $표시를 앞에 붙여 사용..
-
Linking대학/시스템소프트웨어 2022. 12. 11. 19:45
여러개의 분할된 ELF(Executable and Linkable Format)파일을 연결하는 과정을 linking이라고 부른다. 이 과정을 컴파일러의 linker가 수행하게 되는데, 그 동작 과정을 살펴보자. - Static linking 1. Symbol resolusion 심볼이란 함수 이름, 변수 이름 등 사람이 보기 편한 이름들을 말하며 이는 symbol table에 의해 관리된다. symbol resolusion은 이러한 심볼을 기계가 알아들을 수 있도록 이름을 주소값으로 바꾸는 작업을 말한다. 2. Relocation 분리되어있는 영역을 하나의 영역으로 합친다. 이 때, 코드의 위치가 변하게 되기 때문에 주소 값 역시 변하게 된다. 그 변화하는 주소 값을 계산하는 역할을 수행한다. linki..
-
Memory Management대학/시스템소프트웨어 2022. 12. 11. 18:58
프로세스는 CPU에 의해 위와 같은 가상 메모리 영역을 할당받게 되고, 이 가상 메모리는 MMU(Memory Management Unit)에 의해 실제 DRAM의 메모리 영역에 매핑된다. malloc으로 메모리를 할당받을 수 있고, realloc으로 메모리 영역을 확장할 수 있다. 하지만 경우에 따라 realloc시 메모리 영역을 통째로 복사해야 하는 경우가 생긴다. 이런 경우 성능저하 이슈가 생길 수 있는데, 이런 경우를 줄이기 위해 메모리 공간을 할당부터 관리까지 세심한 노력이 필요하다. 지금부터 그 노력의 흔적을 살펴보자. 메모리를 위와 같이 words 단위로 관리한다고 가정하자. (실제로 1word = 32B or 64B 이렇게 하고있긴 함) 만약 p = malloc으로 메모리 공간을 할당 받았는..
-
Synchronization대학/시스템소프트웨어 2022. 12. 11. 16:29
두 개 이상의 스레드가 하나의 메모리 공간을 동시에 참조하는 경우, 레이스 컨디션이 발생하여 프로그램을 실행할 때 마다 다른 결과가 출력되는 일이 발생할 수 있다. 이를 방지하기 위해 동기화를 하고, critical section(임계 영역)에 접근할 수 있는 스레드의 수를 제한한다. 동기화를 달성하기 위한 방법으로 mutex와 semaphore가 있다. - Mutex mutual exclusion(상호 배제)의 약자로 lock이라고도 한다. 기본적인 아이디어는 임계 영역에 진입할 때는 스레드가 뮤텍스를 잠그고, 나갈 때 잠금을 해제하는 아이디어이다. 즉, 잠겨있는 뮤텍스 아래로는 실행이 불가능하다. 뮤텍스를 사용할 때 주의할 점은, 임계영역으로 진입한 스레드가 뮤텍스를 풀기 전 중지되면 안된다는 것이다..
-
Threads대학/시스템소프트웨어 2022. 12. 11. 15:51
프로그램의 실행 흐름으로 c에서는 보통 posix threads library를 이용하여 구현한다. 스레드의 주된 활용법은 I/O, 네트워크 통신 등 처리시간이 오래 걸리거나, 언제 종료될지 모르는 동작을 수행하면서 동시에 다른 중요한 동작을 수행해야 할 때, 대기시간이 긴 동작을 자식 스레드에게 위임하는 방식으로 주로 활용한다. - pthread_create void *processfd(void *arg) { char buf[BUFSIZE]; int fd; ssize_t nbytes; fd = *((int *)(arg)); for ( ; ; ) { if ((nbytes = read(fd, buf, BUFSIZE)) < 0) break; // process buf data } return NULL; } ..
-
Inter-Process Communication대학/시스템소프트웨어 2022. 10. 23. 01:23
- IPC 프로세스간 통신을 위한 메커니즘으로 두 개의 기본적인 모델이 있다. Message System (이 중 하나가 Message queue) Shared Memory - Pipe pipe는 부모-자식 프로세스간 통신에서 사용하는 메커니즘으로 반이중(단방향) 통신방식을 사용한다. pipe는 파일로 취급되며, chennel 이라고도 불린다. pipe() 시스템 콜 함수를 사용하면, 두 개의 파일 지시자가 반환되는데, 파이프의 파일 지시자 0번째 인덱스는 읽기, 1번째 인덱스는 쓰기에 사용된다. int fd[2]; pipe(fd); if (fork()) { // parent close(fd[0]); write(fd[1], "How are you?", 12); } else { // child close(..
-
Timer대학/시스템소프트웨어 2022. 10. 22. 22:57
- RTC (Real-Timer Clocks) 컴퓨터 시스템의 시간, 날짜 등을 추적하는 장치로, 1초에 한 번 실행하여 시간을 추적한다. 1초에 한 번 실행되는 이유는, 메인보드에 있는 베터리 전력을 아껴쓰기 위해서이다. (전원이 꺼져있어도 수행되어야 하기에 보조 베터리를 쓰는데, 이게 크기가 작음) - System Clock System Clock는 시스템의 전원이 공급되는 순간 RTC에 저장된 시간 정보를 가져와 초기화된다. 그 후, PIT(Programmable Interval Timers)가 일정 주기마다 Timer interrupt(tick)를 발생키시는데, 이를 CPU가 캐치하여 System Clock의 값을 증가시킨다. 즉, PIT가 발생시키는 Timer interrupt는 가장 중요한 i..
-
Exceptional Control Flow 2 - Signal대학/시스템소프트웨어 2022. 10. 22. 22:17
- Signal 시그널은 OS가 어떤 이벤트가 일어났음을 프로세스에게 알리는 것이다. 다음의 예시 상황을 가정해보자. int *ptr; ptr = 0x00000100; 이렇게 합법적으로 할당받은 메모리 공간이 아닌 곳에 접근할 경우, Segmentation violation exception이 발생한다. 이런 exception 들은 CPU에서 kernel에 전달되고, kernel(OS)는 이 코드를 실행시킨 프로세스에게 signal을 보내게 된다. 시그널을 받은 프로세스가 취할 수 있는 행동은 다음 세가지 행동 중 하나이다. 시그널을 무시한다. 프로세스를 종료한다. 개발자가 정의한 시그널 핸들러로 시그널을 처리한다. 시그널은 들어왔다고 바로 처리되는게 아니다. 프로세스가 ready 상태에서 시그널이 도착..