Memory & Data Management.

Slides:



Advertisements
Similar presentations
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Advertisements

Vision System Lab, Sang-Hun Han
Basic of Buffer Over Flow
Project #2-2. Pintos User Program
Linux/UNIX Programming APUE (The Environment of a UNIX Process)
Power C++ 제6장 포인터와 문자열.
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
Understanding of Socket and File I/O
6 레이스 컨디션.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
Linux System Programming
Department of Computer Engineering
System Call Linux Kernel 수업 3번째.
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
Linux System Programming
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Department of Computer Engineering
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
Network Lab. Seoung Hyeon, Lee
Linux System Programming
쉽게 풀어쓴 C언어 Express 제16장 파일 입출력 C Express Slide 1 (of 23)
자료 구조: Chapter 3 (2)구조체, 포인터
10장 메모리 관리.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
Department of Computer Engineering
25장. 메모리 관리와 동적 할당.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
Department of Computer Engineering
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Term Project Team Member
시스템 호출 read , write의 효율성 lseek test example – test1.c 실습 – 연습문제 2.8
파이프와 exec 시스템 호출 (ls | wc)
Geek-OS Project 정영진
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
Advanced Socket Programming
(ioctl, mmap, fsync&flush)
4장 파일.
6장 파일 및 레코드 잠금.
File Management.
Department of Computer Engineering
파일 시스템 인터페이스(File System Interface)
14주차.
FILE I/O 번째주 Dept. of Computer Science & Engineering
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
문자 디바이스 드라이버 임베디드 시스템.
제10장 파일 시스템 인터페이스(File System Interface)
Linux Programming Spring 2008
13장 프로세스 사이의 통신.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
운영체제 (Operating Systems) (Memory Management Strategies)
네트워크 프로그래밍의 이해 School of Electronics and Information.
제어문 & 반복문 C스터디 2주차.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
조 병 규 Software Quality Lab. 한국교통대학교
Byte Alignment ㈜ 웰컴정보시스템 김 정 은.
Department of Computer Engineering
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
8. 리눅스의 내부 군자삼락 [君子三樂] 청출어람이청어람 [ 靑出於藍而靑於藍 ] Why Linux ?
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
C.
3장 파일 다루기 한빛미디어(주).
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
Presentation transcript:

Memory & Data Management

Linux System Programming Contents 동적 메모리 관리 Memory Allocation Memory De-allocation 파일 잠금 협조형 잠금 공유파일 구역 잠금 교착상태(deadlock) 회피하기 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming 1. Memory Management in C C언어 에서 main memory 할당하기 특정 물리적인 주기억 공간을 직접 할당하지 않음 각 프로세스는 할당된 data 영역의 기억공간을 사용 구조체 (struct)로 선언된 데이터는 memory 할당을 한 뒤 사용해야 함 최대 할당 크기는 4GB, 32bit pointer 사용  Flat 32 bit memory Model © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming malloc() #include <stdlib.h> void *malloc(size_t size); - size_t : unsigned int - 결과는 pointer로 반환 한다 메모리 할당은 커널(kernel)에서 담당 물리적 메모리 한계를 넘는 요구시, swap공간(swap space)를 사용 Unix에서 swapping은 4096 bytes page 단위로 동작 virtual memory management의 Paging 기법 최대 할당할 수 있는 크기는 주기억공간 + swap공간 보다 작다 malloc()의 size를 넘어서는 메모리 사용시 error(segmentation fault !) © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming malloc() :간단한 메모리 할당 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define A_MEGABYTE (1024 * 1024) main() { char *some_memory; int megabyte = A_MEGABYTE; int exit_code = EXIT_FAILURE; some_memory = (char *)malloc(megabyte); if (some_memory != NULL) { sprintf(some_memory, "Hello World\n"); printf("%s", some_memory); exit_code = EXIT_SUCCESS; } exit(exit_code); © Yigeun Chae. Private propriraty, do not copy Linux System Programming

malloc()관련 reference codes memory1.c : 간단한 memory allocation memory2.c : 모든 physical memory allocation memory3.c : 최대 할당 가능한 memory 크기 시험(동시에 여러 프로세스가 동작 때 이상 발생) memory4.c : memory 한번 남용해 보기 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming memory1.c 간단한 메모리 할당 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define A_MEGABYTE (1024 * 1024) main() { char *some_memory; int megabyte = A_MEGABYTE; int exit_code = EXIT_FAILURE; some_memory = (char *)malloc(megabyte); if (some_memory != NULL) { sprintf(some_memory, "Hello World\n"); printf("%s", some_memory); exit_code = EXIT_SUCCESS; } exit(exit_code); © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming memory2.c 모든 물리 메모리 할당 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define A_MEGABYTE (1024 * 1024) main() { char *some_memory; size_t size_to_allocate = A_MEGABYTE; int megs_obtained = 0; while (megs_obtained < 16) { some_memory = (char *)malloc(size_to_allocate); if (some_memory != NULL) { megs_obtained++; sprintf(some_memory, "Hello World"); printf("%s - now allocated %d Megabytes\n", some_memory, megs_obtained); } else { exit(EXIT_FAILURE); exit(EXIT_SUCCESS); © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming memory3.c 유효한 메모리 크기 측정 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define ONE_K (1024) main() { char *some_memory; int size_to_allocate = ONE_K; int megs_obtained = 0; int ks_obtained = 0; while (1) { for (ks_obtained = 0; ks_obtained < 1024; ks_obtained++) { some_memory = (char *)malloc(size_to_allocate); if (some_memory == NULL) exit(EXIT_FAILURE); sprintf(some_memory, "Hello World"); } megs_obtained++; printf("Now allocated %d Megabytes\n", megs_obtained); exit(EXIT_SUCCESS); © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming memory4.c 메모리 남용해 보기 #include <unistd.h> #include <stdlib.h> #define ONE_K (1024) main() { char *some_memory; char *scan_ptr; some_memory = (char *)malloc(ONE_K); if (some_memory == NULL) exit(EXIT_FAILURE); scan_ptr = some_memory; while(1) { *scan_ptr = '\0'; scan_ptr++; } exit(EXIT_SUCCESS); © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming Null Pointer 접근 memory 공간에 자리 잡지 않은(즉 할당이 안된) 데이터 Unix/Linux에서는 허용하지 않음 #include <unistd.h> #include <stdlib.h> #include <stdio.h> main() { char *some_memory = (char *)0; printf("A read from null %s\n", some_memory); sprintf(some_memory, "A write to null\n"); exit(EXIT_SUCCESS); } 결과: A read from null (null) : GNU C library에서는 null 문자 제공 segmentation fault(core dumped) : null string에 쓰기는 error © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming 또 다른 null pointer 접근 예 #include <unistd.h> #include <stdlib.h> #include <stdio.h> main() { char z = *(const char *)0; printf("I read from location zero\n"); exit(EXIT_SUCCESS); } 결과: segmentation fault(core dumped) : memory 위치 0로 부터 직접 읽기, 이는 허용되지 않음 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming free() : 할당된 메모리 해제 #include <stdlib.h> void free(void *ptr_to memory); - 이전에 할당된 메모리를 pointer를 통하여 접근 - 접근 한 뒤 release 한번 해제 한 memory공간은 그 프로세스에 다시 할당된다는 보장이 없음(다른 프로세스에서 사용 가능성이 있음) 따라서 free()를 시행한 memory pointer는 다시 접근 불가 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming free()의 예 #include <stdlib.h> #define ONE_K (1024) main() { char *some_memory; int exit_code = EXIT_FAILURE; some_memory = (char *)malloc(ONE_K); if (some_memory != NULL) { free(some_memory); exit_code = EXIT_SUCCESS; } exit(exit_code); © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming 그외 memory관리 함수 #include <stdlib.h> void *calloc(size_t no_of_element, size_t element_size); void *realloc(void *existing_memory, size_t new_size); calloc()은 malloc()과 유사하나 동일 data형식에 대하여 array형태로 memory allocation시행(0으로 채움) 연속된 memory를 할당한다는 보장이 없음(주의!!) - realloc()은 이미 할당된 메모리 블록의 크기를 확장 이미 할당된 영역에서 연장할 수 없다면 다른 빈 공간으로 이동 따라서 반드시 새로 return되는 pointer를 사용해야 함 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming 2. File Locking Linux는 다중 사용자/다중 프로세스 환경 특정 파일이나 특정 device를 일시 독점적 사용이 필요 예 lpr process에 의한 특정 프린터 출력 시 충돌 방지 필요 /dev/modem의 사용 시 특정 프로세스에서 독점 사용 필요 File locking은 Linux의 중요 기능 Locking method 파일 전체 잠금: atomic way 파일 부분 잠금: 파일 내용중 특정 부분만 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming 잠금 표식 파일 생성 Printer daemon에 의한 다수 출력물 충돌 방지 /usr/spool/lpr/lock file을 일시 생성, 프린트 완료 후 제거 위 파일을 잠금 표식 파일(Locking Indicator file) 일종의 binary Semaphore 파일의 생성은 low level system call 사용 open(), read(), write(), close() © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming Locking file creation #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> main() { int file_desc; int save_errno; file_desc = open("/tmp/LCK.test", O_RDWR | O_CREAT | O_EXCL, 0444); if (file_desc == -1) { save_errno = errno; printf("Open failed with error %d\n",save_errno); } else { printf("Open succeeded\n"); exit(EXIT_SUCCESS); 동작 방법 % lock1 Open Succeeded Open failed with error 17 errno : /usr/include/errno.h참조 이 프로그램은 종료 된 뒤에도 lock file은 계속 존재 따라서 실행 중에만 lock file을 사용하는 critical section을 사용하기 위해서는 다른 방법 필요 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

File locking: Critical section #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> const char *lock_file = "/tmp/LCK.test2"; main() { int file_desc; int tries = 10; while (tries--) { file_desc = open(lock_file, O_RDWR | O_CREAT | O_EXCL, 0444); if (file_desc == -1) { printf("%d - Lock already present\n", getpid()); sleep(3); } 따라서 실행 중에만 lock file을 사용하는 critical section을 사용하기 위해서는 다른 방법 필요 프로그램 수행 중 독점적인 기능을 사용할 때는 lock file을 생성한 뒤 locking을 하고 해제(release)를 할 시점에는 close() -> unlink() 함수 사용 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming continue! else { /* critical region */ printf("%d - I have exclusive access\n", getpid()); sleep(1); (void)close(file_desc); (void)unlink(lock_file); /* non-critical region */ sleep(2); } } /* while */ exit(EXIT_SUCCESS); 실행 방법 % rm /tmp/LCK.test2 % lock2 & lock2 두 프로세스에서 동시에 locking을 시도하게 되고 먼저 시작된 프로세스에서 lock file을 생성하고 critical section에 들어 감 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming fcntl() : 파일 구역 잠그기 #include <fcntl.h> int fcntl(int fildes, int command, struct flock, *flock_struct); command: 잠금 명령 (F_GETLK, F_SETLK, F_SETLKW) struct flock : short l_type = F_RDLCK(공유잠금),F_UNLCK(해제),F_WRLCK(배타적잠금) short l_whence = SEEK_SET, SEEK_CUR, SEEK_END (unistd.h에 정의) off_t l_start = 파일내 영역중 잠금의 시작 (bytes) off_t l_len = l_start 부터의 잠금영역의 크기 (bytes) pid_t l_pid = 잠금 프로세스의 pid © Yigeun Chae. Private propriraty, do not copy Linux System Programming

Linux System Programming fcntl() continue ! command: 잠금 명령 F_GETLK : 잠금 정보 구하기, 실제 lock하지 않음, 다른 프로세스에 의한 locking 방지, flock 구조체 전체 사용 * 이미 다른 프로세스에 의해 잠긴 경우 : flock구조체에 정보 채워서 반환 * 잠겨 있지 않는 경우 : flock 구조체 변경 없이 반환 * file의 locking정보 구하기 실패하면 –1 반환 F_SETLK : 실제 locking, l_type, l_pid만 사용 F_SETLKW : F_GETLK 시행 후 다른 프로세스에 의해 잠긴 경우 waiting명령 struct flock : short l_type = F_RDLCK(공유잠금),F_UNLCK(해제),F_WRLCK(배타적잠금) short l_whence = SEEK_SET, SEEK_CUR, SEEK_END (unistd.h에 정의) off_t l_start = 파일내 영역중 잠금의 시작 (bytes) off_t l_len = l_start 부터의 잠금영역의 크기 (bytes) pid_t l_pid = 잠금 프로세스의 pid © Yigeun Chae. Private propriraty, do not copy Linux System Programming

fcntl() : example code - p1 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> const char *test_file = "/tmp/test_lock"; main() { int file_desc; int byte_count; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res; /* open a file descriptor */ file_desc = open(test_file, O_RDWR | O_CREAT, 0666); if (!file_desc) { fprintf(stderr, "Unable to open %s for read/write\n",test_file); exit(EXIT_FAILURE); }/* if */ lock대상 파일은 100bytes 크기 위치는 /tmp/test.lock 두개의 영역에 걸쳐 locking © Yigeun Chae. Private propriraty, do not copy Linux System Programming

fcntl() : example code – p2 /* put some data in the file */ for(byte_count = 0; byte_count < 100; byte_count++) { (void)write(file_desc, byte_to_write, 1); }/* for */ /* setup region 1, a shared lock, from bytes 10 -> 30 */ region_1.l_type = F_RDLCK; region_1.l_whence = SEEK_SET; region_1.l_start = 10; region_1.l_len = 20; /* setup region 2, an exclusive lock, from bytes 40 -> 50 */ region_2.l_type = F_WRLCK; region_2.l_whence = SEEK_SET; region_2.l_start = 40; region_2.l_len = 10; /tmp/test.lock file에 먼저 100byte의 “A”로 채우기 첫번째 locking영역 10 – 30 byte 구역 을 구조체 flock에 입력, 공유잠금 두번째 locking영역 40 – 50 bytes 구역을 구조체 flock에 입력, 배타잠금 © Yigeun Chae. Private propriraty, do not copy Linux System Programming

fcntl() : example code – p3 /* now lock the file */ printf("Process %d locking file\n", getpid()); res = fcntl(file_desc, F_SETLK, &region_1); if (res == -1) fprintf(stderr, "Failed to lock region 1\n"); res = fcntl(file_desc, F_SETLK, &region_2); if (res == -1) fprintf(stderr, "Failed to lock region 2\n"); /* and wait for a while */ sleep(60); printf("Process %d closing file\n", getpid()); close(file_desc); exit(EXIT_SUCCESS); }/* main */ Test 방법 예제 프로그램은 lock3.c reference code로 lock4.c가 있음 두 파일을 compile ! % lock3 & % lock4 두 프로세스가 경쟁적으로 lock file을 사용 © Yigeun Chae. Private propriraty, do not copy Linux System Programming