일부 작은 합이 시스템 프로그래밍을 개선하기 위해

일부 작은 합이 시스템 프로그래밍을 개선하기 위해

효율성을 개선하기 위해 버퍼를 사용하여

이유는 버퍼의 사용

의 제조에서 제어 포인트 명령 버퍼의기구를 사용하여 처리, 버퍼 정도로 왜 채용해야 하는가?

여기 버퍼의 크기를 고려 달성하기 위해 읽기 (), 쓰기 () 등의 핵심 기능을 호출 할 수 있습니다 먼저 실현의 cp 명령의, 본 cp 명령 버퍼의 역할에 지정된 시작 때마다 데이터는 버퍼에 기록된다 새 파일 후에는 버퍼를 채우기 위해 커널 함수를 호출해야하고 또한, 버퍼가 너무 작 으면, 필요, CPU가 지속적으로 커널 모드와 사용자 모드를 전환해야하는 커널 함수를 호출을 계속하는 것을 생각할 수있다, 심지어 극단적 인 예를 상상 시스템 호출은 오버 프로그램 자체의 실행 동안 생성. 우리가 그릴 수있는 버퍼 크게 CPU의 효율성을 향상시킬 수 있습니다.

버퍼에 데이터가없는 경우에는 입력의 경우, 각각의 스위치가 낭비하는 CPU가 판독 필요 데이터는 버퍼 안에 존재하고, 데이터가 가장 일회용 읽을 수있는 경우 등이 판독 될 경우 반면. 크게 CPU의 효율성을 향상시켰다. 그러나 또한 비상 전원 끄기, 다음 캐시 데이터를 따라서 손실 될 수 있습니다 때하는 문제로 이어질 것입니다.

데이터를 인쇄하는 경우 출력의 경우, 프린터는 CPU는 높은 속도, 낮은. 데이터는 다른 작업에 갈 수 있도록하는 것이 여러 인쇄는 CPU의 해방으로 구분되는 버퍼 방지 데이터로 배치됩니다.

그래서 I의 처리 효율을 향상시키기위한 버퍼 / O가 중요하다.

누가 명령의 효율성을 높이기

그리고는 쓰기 나에게 가져다 누가 명령 나머지는 단지 이러한 데이터 구조를 표시 할, 우리는 데이터 구조를 읽을 수있는 모든 방법을 사용하는 경우, 다음 버퍼가 한 번 더 utmp 파일 데이터 구조를 판독을 채울 수 있습니다 추가 그걸 얻기 위해 전화를 한 다음 커널 함수를 읽어?

카운터 가서 걸리는 시간의 수와 동일한 경우에 일회용 utmp 파일의 데이터 구조의 고정 된 수의 배열을 유지 제거 할 필요 달성하는 방법에 대해 생각하고 판독 카운터는마다 풋을 증가한다.

 5 #define NRECS 16
 6 #define NULLUT (struct utmp *)NULL
 7 #define UTSIZE (sizeof (struct utmp))
 8 
 9 static char utmpbuf[NRECS * UTSIZE];    
10 static int num_recs;           
11 static int cur_rec;            
12 static int fd_utmp = -1;   


15 struct utmp* utmp_next() {
16     struct utmp* recp;
17     if (fd_utmp == -1) {
18         return NULLUT;
19     }
20     if (cur_rec == num_recs && utmp_reload() == 0) {
21         return NULLUT;
22     }
23     recp = (struct utmp*) &utmpbuf[cur_rec * UTSIZE];
24     cur_rec ++;
25     return recp;
26 }
27 
28 int utmp_reload() {
29     int aimt_read;
30     aimt_read = read(fd_utmp, utmpbuf, NRECS * UTSIZE);
31     num_recs = aimt_read / UTSIZE;
32     cur_rec = 0;
33     return num_recs;
34 }

읽기 버퍼의 함수가 존재 여기 utmp_next, 그것은 이전에 정의 된 파라미터 구조체에 utmp *이며, 반환 값은 구조체에 utmp *는 버퍼에 저장된 이전 파라미터로 정의 구조에 대한 포인터된다 출력 구조, 구조 포인터가 직접 카운터의 출력과 동시에 작동 넣어 증분되고, 함수의 복귀 후, 그 카운터는 1로 리셋 cur_rec이다.

코스 utmp_reload 기능 중 우리가 직접 작성, 바이트의 비율을 나누어 아주 좋은 utmp 파일의 수를 결정하기 위해 직접 읽을 여기, 한 시간이 저장 배열에 16 utmp 파일 구조를 읽어 사용하는 버퍼 메커니즘입니다 한 단계는 현재 독서의 수를 결정하는 작업을 인수하면서 좀 더 중간 변수보다 것이다, 사실, 자신의 생각에이 치료를 제거하는 단계는 자신의 전에 서면으로 명확하게 작성하고, 코드를 간단하게 만들려고 노력 필요 .

주요 기능은 거의 변화 없음 :

32 int main() {
33     struct utmp* utbufp;
34     if (utmp_open(UTMP_FILE) == -1) {
35         perror(UTMP_FILE);
36         exit(1);
37     }
38     while ((utbufp = utmp_next()) != (struct utmp*)NULL) {
39         show_info(utbufp);
40     }
41     utmp_close();
42     return 0;
43 }

우리는 같은 설명이 작동 함수 호출 인터페이스를 달성하는 것입니다 show_info에있는 동안 데이터는 사용할 수 없습니다 있었는지 show_info 기능의 필요성을 다시 할 필요가 완료되지 수 있도록 카운터의 카운터 읽기가, 같은로드되어 있는지 여부를 확인, 결정하기 위해 한 단계를 필요로 볼 수 있습니다 기능.

커널 버퍼

스와는 디스크 I / O 작업의 효율성을 향상시키기 위해, 시간 및 일반 사용자를 소모 스위칭, 커널은 또한 액세스 속도를 개선하기 위해 버퍼링 기술을 사용합니다. 리눅스 시스템은 각 프로세스는 프로세스 버퍼라는 자신의 별도의 버퍼를 가지고 있지만, 버퍼 시스템은 또한 커널 버퍼 호출 한 커널. 사용자 공간 프로세스 요구 사항이 디스크에서 데이터를 읽을 때 데이터는 단지 커널 버퍼를 읽을 경우 커널, 커널 버퍼 디스크 데이터 블록의 사본을 버퍼링하므로 디스크에 데이터 블록, 커널은 직접하지 않습니다 디스크를 판독하지만,이 프로세스 버퍼로 데이터를 복사하는 버퍼 커널. 데이터는 커널 버퍼에 필요하지 않는 경우, 커널에 대응하는 데이터 블록이 요청 된 데이터, 처리 중단, 선착순 다른 프로세스 목록에 추가 될 때 요청 데이터의 실행 커널 것이다 디스크로부터 데이터 에센 블록 커널 버퍼를 읽은 후, 프로세스 버퍼에 데이터를 복사하고, 마지막으로 중단 과정을 깨워.

우리는 종종 등, 또한 우리가 디스크와 상호 작용을 직접하지 무엇을, 프로세스 버퍼에 버퍼 반대 쓰기 커널에서 읽기 버퍼 작업 교환 커널 버퍼 및 프로세스를하고있는, 쓰기, 읽기 .

문서의 작업을 재 작성 ##

우리가 많은 작업 파일에 데이터를 읽을 전에, 데이터 (디스플레이 또는 기타 서면 문서)를 사용하고, 여기 말했다 쓰기 데이터를 덮어 쓰기 동작하지 않거나 나는이 쓰기 작업을 사용합니다 용어가 아니라 직접 리눅스 파일 정보를 다시 작성되어 있지만, 예를 들어, 사람들은 현재를 보여주는, 이전에 기록 된 명령을 로그온 한 사용자 정보는 사용자의 utmp 파일에 저장된 정보를 변경하려면 어떻게 그것을 할?

첫 번째 생각은 쓰기,하지만에서 약간 우리가 다음 파일로 업데이트되는 파일, 덮어 쓰기를 직접 쓰는 경우에도 직접적으로 현재 파일을 덮어 쓰기 때문에 이것이 불가능하다는 것을 알 수 있습니다 생각하지만, 이번에는 우리가 사용해야합니다 다른 시스템 호출 lseek의합니다.

UNIX-같이 열려있는 각 파일 시스템과 UNIX 커널이 위치에 대한 포인터를 저장, 열려있는 모든 파일에서 오프셋 현재 파일 (오프셋 현재 파일)을가집니다. 최고 재무 책임자 (CFO)는 현재 파일의 파일 위치의 시작 바이트 수를 나타내는 일반적으로 음이 아닌 정수입니다. 사용 lseek의 기능은 파일 CFO 변경할 수 있습니다.

우리가 파일에서 데이터를 읽을 때, 커널 포인터 읽기 바이트 기능은 독서에 대한 모든 이유를 포함하는 지정된 바이트를 읽기 시작하는 곳에서 표시 한 다음 읽지 않은 다음 단어에 대한 파일 포인터, 포인트를 이동합니다 날, 쓰기 파일 작업이 유사하다.

예를 들어, 우리가 된 utmp 파일 덮어 쓰기 작업을하기 전에하고 싶은, 우리는 단지 lseek의 필요 (FD, N *를 sizeof (구조체는 utmp), SEEK_SET)는 utmp 파일 정보 표시 한 후 화면을 볼 수, 라인 N에 몇에 몇 가지의 첫 번째를 제거 할 필요가있다 파일 포인터 뒤로 쓰기되는 몇 가지 구조를 이동하기 위해, 그리고 해당한다.

시스템 호출 오류

전역 변수 errno를 통해 커널은 오류의 유형을 나타냅니다

errno에 에러 코드는 마지막 녹화 시스템입니다. int 형 코드는 errno.h에 정의 된 값입니다. errno는이 프로그램을 디버깅하는 중요한 방법입니다 확인하십시오. 이상은 C API 함수 리눅스 발생하면, 일반적으로 의지의 errno 변수 정수 값을 할당 (필수 errno.h 포함), 다른 값이 다른 의미를 나타낸다.

오류가 시스템 프로그래밍에 발생하면, 우리는 errno를 잘못된 이유의 값을보고 추측 할 수 있습니다. 이러한 오류가 의아해하지 않을 것이다.

#define EPERM        1  /* Operation not permitted */
#define ENOENT       2  /* No such file or directory */
#define ESRCH        3  /* No such process */
#define EINTR        4  /* Interrupted system call */
#define EIO          5   /* I/O error */
#define ENXIO        6  /* No such device or address */
#define E2BIG        7  /* Argument list too long */
#define ENOEXEC      8  /* Exec format error */
#define EBADF        9  /* Bad file number */
#define ECHILD      10  /* No child processes */

이것은 10의 제거를 의미하고, 모든 잘못된 정의는 우리가 허용 할 다른 처리) (perror는 함께있는 동안, 일반적으로 자신의 코드를 작성하는 우리가 errno를 사용할 수 있습니다 오류에 따라, 100 개 이상 할 수있다 우리 코드는 더 표준화이다.

게시 15 개 원래 기사 · 원의 찬양 (13) · 전망 9059

추천

출처blog.csdn.net/weixin_43122409/article/details/84535025