System Programming
-
[System Programming] Linux 명령어시스템 프로그래밍 2022. 12. 18. 12:53
cd (Change Directory) cd .. (이전 폴더로 이동) cd ~ (Home 디렉토리로 이동) cd / (Root 디렉토리로 이동) rm (remove) rm [파일이름 or 파일경로] rm -rf [폴더이름] ls (list) : 현재 디렉토리에 있는 파일을 보여줌 ps : 현재 실행되고 있는 프로세스를 보여줌. mkdir [폴더이름] : 현재 디렉토리 내에 폴더를 생성함. touch [파일이름 or 파일경로] : 현재 디렉토리 내에 파일을 생성함. mv (move) mv [변경 전 이름] [변경 후 이름] : 파일이름 변경 tar tar cvfz [압축 후 파일이름] [압축 전 디렉토리 or 파일경로] tar xvfz [압축해제 할 파일 이름] clear : 터미널 clear cat :..
-
[Malloc Lab] LIFO 방식의 Explicit List (명시적 리스트)시스템 프로그래밍 2022. 12. 4. 23:18
이번에는 Explicit List 방식으로 malloc / free 를 구현해보도록 하겠습니다. Introduction 에서 다뤘던 Explicit List 의 개념을 상기해보며 접근해봅시다. Explicit List 방식으로 다룰 때 가장 핵심은 Free Block 을 관리하는 Doubled Linked List 가 있다고 생각하는 것입니다. Free Block 중 가장 첫번째 가용 블럭은 prev로 NULL 을 가리키고 succ으로는 다음 free block 을 가리킵니다. 그리고 마지막 블럭의 succ 은 NULL을 가리킵니다. *prev = previous, succ = succeeding 그리고 LIFO 방식으로 가용블럭을 manage 할 것을 기억하며 가용블럭을 사용할 때는 가장 첫번째 fre..
-
[Malloc Lab] Implicit List시스템 프로그래밍 2022. 12. 4. 23:17
간접 리스트 방식으로 malloc, free 를 구현해보도록 하겠습니다. 간접 리스트 방식으로 구현하기에 앞서 Malloc / Free 를 구현할 때 유용한 매크로 변수, 매크로 함수, 메소드 들에 대한 설명을 첨부합니다. 먼저 mm_implicit.c 의 mm_init 메소드를 구현하겠습니다. mm_init 메소드는 동적 메모리 할당을 하기 위한 초기 힙 구조를 생성하는 메소드입니다. /* * Initialize: return -1 on error, 0 on success. */ int mm_init(void) { if ( (heap_listp = mem_sbrk(4*WSIZE)) == -1 ) // 초기 empty heap 설정 return -1; // heap_listp = 새로 생성되는 heap ..
-
[Malloc Lab] Introduction to Malloc Lab시스템 프로그래밍 2022. 12. 4. 23:11
이번 포스팅에서는 malloc lab의 기본 구성에 대해 알아보겠습니다. 먼저 malloc lab 의 가정은 다음과 같습니다. 1. 메모리는 워드 단위로 주소가 지정됩니다. (Malloc Lab 에서 1Word 는 4Bytes입니다.) 2. 응용 프로그램에서 무순의 할당과 반환 요청이 발생합니다. 반환 요청은 할당된 블록과 항상 pairing 이 되어야 합니다. 3. Allocator 는 이미 할당된 블록의 개수와 크기는 조정할 수 없습니다. 4. Allocator는 모든 할당 요청에 즉시 반응해야 합니다. 즉, 요청 순서를 변경하거나, 요청을 buffer 에 저장해 둘 수 없습니다. 5. Allocator 는 메모리 블록을 반드시 free Memory 에서 할당해야 합니다. 6. 블록들은 모든 주소 맞..
-
[System Programming] Shell시스템 프로그래밍 2022. 11. 22. 21:17
Shell이란 무엇인지 알아봅시다. 쉘(Shell)은 사용자의 명령을 처리해 주는 응용 프로그램입니다. 다음의 그림으로 쉘과 유저, 쉘과 커널의 관계에 대해 이해해봅시다. 즉 쉘을 통해서, 유저는 커널에 명령을 내리고 커널은 수행결과를 쉘을 통해 유저에게 보여주게 되는 것입니다. 조금 더 거시적인 관점에서 설명하면 하드웨어 커널 쉘 유저의 형태로 서로 communicate하는 것입니다. Shell의 종류로는 sh - Original Unix Bourne Shell, csh - BSD UNIX C Shell, tcsh - Enhanced C Shell, bash - Bourne-Again Shell이 있습니다. 앞으로 설명에서 사용될 Shell은 Bash Shell입니다. 쉘에서 처리할 수 있는 명령어는 ..
-
[Shell Lab] Trace07시스템 프로그래밍 2022. 11. 15. 22:00
Trace07은 built-in 명령어 jobs를 구현하는 문제입니다. jobs 명령어는 현재 실행 중인 작업들의 리스트를 출력해주는 함수입니다. 실행 중인 작업들의 리스트를 출력해주는 함수는 tsh.c 내부에 listjobs()로 구현이 되어있습니다. 먼저 listjobs 함수를 살펴보겠습니다. void listjobs(struct job_t *jobs, int output_fd); 함수 헤더를 살펴보니 paremeter로 jobs배열과 file_descriptor 를 받는 것을 알 수 있습니다. 이미 글로벌 변수로 jobs를 선언해 준 것이 있으니 첫번째 인자로는 jobs를 넣어주면 될 것 같고 file descriptor는 원래 프로세스가 파일을 다룰 때 사용하는 추상적인 값이지만 어떤 파일을 다뤄..
-
[Shell Lab] Trace05, Trace 06시스템 프로그래밍 2022. 11. 15. 21:59
Trace05 는 실행파일을 Background job 으로 실행시키는 문제입니다. trace05는 특정 형태로 출력할 것을 요구합니다. 이 형식을 확인하기 위해서 trace05.txt 파일을 열어봅시다. # # trace05.txt - Run a background job. # /bin/echo -e tsh\076 ./myspin1 \046 NEXT ./myspin1 & NEXT WAIT SIGNAL /bin/echo -e tsh\076 quit NEXT quit Trace05는 myspin1 실행파일을 & 를 이용해 백그라운드 job으로 실행시키는 것을 알 수 있습니다. tshref가 ./myspin1 &을 입력하면 어떤 것을 출력하는지 확인해봅시다. [숫자] (숫자) command 형태로 출력하는 ..
-
[Shell Lab] Trace02, Trace03, Trace04시스템 프로그래밍 2022. 11. 15. 21:58
Trace02 는 Foreground job의 형태로 실행파일을 실행시키는 문제입니다. 쉘에서 새로운 프로그램을 실행시키기 위한 방법은 1. fork()를 통해서 자식 프로세스를 생성하고 2. 자식 프로세스에서 execve 을 통해 새로운 프로그램을 실행시키는 것입니다. execve는 제어흐름을 변경하여 새로운 프로그램을 실행시키고 다시 원래 프로그램으로 돌아오지 않았다는 것을 복기하며 trace02를 진행해봅시다! Trace03, Trace04 는 각각 프로그램을 foreground job으로 argument 없이 실행, foreground job으로 argument를 갖고 실행하는 문제입니다. Trace02를 해결하면 execve 호출을 통해 같이 해결됩니다. 최종코드 void eval(char *c..