<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 文件系統,第 6 部分:內存映射文件和共享內存 > 原文:<https://github.com/angrave/SystemProgramming/wiki/File-System%2C-Part-6%3A-Memory-mapped-files-and-Shared-memory> ## 操作系統如何將我的進程和庫加載到內存中? 通過將文件的內容映射到進程的地址空間。如果許多程序只需要對同一文件的讀訪問(例如/ bin / bash,C 庫),則可以在多個進程之間共享相同的物理內存。 程序可以使用相同的機制將文件直接映射到內存中 ## 如何將文件映射到內存? 將文件映射到內存的簡單程序如下所示。需要注意的要點是: * mmap 需要一個 filedescriptor,所以我們需要首先`open`該文件 * 我們尋求所需的大小并寫入一個字節以確保文件足夠長 * 完成后調用 munmap 從內存中取消映射文件。 此示例還顯示預處理器常量“ **LINE** ”和“ **FILE** ”,其中包含當前正在編譯的文件的當前行號和文件名。 ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <string.h> int fail(char *filename, int linenumber) { fprintf(stderr, "%s:%d %s\n", filename, linenumber, strerror(errno)); exit(1); return 0; /*Make compiler happy */ } #define QUIT fail(__FILE__, __LINE__ ) int main() { // We want a file big enough to hold 10 integers int size = sizeof(int) * 10; int fd = open("data", O_RDWR | O_CREAT | O_TRUNC, 0600); //6 = read+write for me! lseek(fd, size, SEEK_SET); write(fd, "A", 1); void *addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); printf("Mapped at %p\n", addr); if (addr == (void*) -1 ) QUIT; int *array = addr; array[0] = 0x12345678; array[1] = 0xdeadc0de; munmap(addr,size); return 0; } ``` 我們的二進制文件的內容可以使用 hexdump 列出 ``` $ hexdump data 0000000 78 56 34 12 de c0 ad de 00 00 00 00 00 00 00 00 0000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000020 00 00 00 00 00 00 00 00 41 ``` 細心的讀者可能會注意到我們的整數是用最不重要的字節格式編寫的(因為那是 CPU 的結束)并且我們分配了一個字節太多的文件! `PROT_READ | PROT_WRITE`選項指定虛擬內存保護。可以將選項`PROT_EXEC`(此處未使用)設置為允許 CPU 在內存中執行指令(例如,如果映射可執行文件或庫,這將非常有用)。 ## 內存映射文件有什么好處 對于許多應用程序,主要優點是: 簡化編碼 - 文件數據立即可用。無需解析傳入的數據并將其存儲在新的內存結構中。 文件共享 - 在多個進程之間共享相同數據時,內存映射文件特別有效。 對于簡單順序處理的注意事項,內存映射文件不一定比`read` / fscanf 等標準的“基于流”的方法更快。 ## 如何在父進程和子進程之間共享內存? 簡單 - 使用沒有文件的`mmap` - 只需指定 MAP_ANONYMOUS 和 MAP_SHARED 選項! ```c #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> /* mmap() is defined in this header */ #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <string.h> int main() { int size = 100 * sizeof(int); void *addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); printf("Mapped at %p\n", addr); int *shared = addr; pid_t mychild = fork(); if (mychild > 0) { shared[0] = 10; shared[1] = 20; } else { sleep(1); // We will talk about synchronization later printf("%d\n", shared[1] + shared[0]); } munmap(addr,size); return 0; } ``` ## 我可以為 IPC 使用共享內存嗎? 是!作為一個簡單示例,您可以保留幾個字節,并在您希望子進程退出時更改共享內存中的值。共享內存是一種非常有效的進程間通信形式,因為沒有復制開銷 - 這兩個進程實際上共享相同的 _ 物理 _ 內存幀。 [轉到文件系統:第 7 部分](https://github.com/angrave/SystemProgramming/wiki/File-System,-Part-7:-Scalable-and-Reliable-Filesystems)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看