Linux中的五种I/O模型有:
阻塞I/O
非阻塞I/O
I/O多路复用
信号驱动I/O
异步I/O
通常有同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式。
阻塞I/O
这是最简单也是最常用的模型。当应用程序发起一个 I/O 操作...
阅读更多
fcntl(file control) 用于对已打开的文件描述符进行各种操作。
/*
* fd: 文件描述符
* cmd: 执行的操作
* arg: 类型和意义取决于cmd
*/
int fcntl(int fd, int cmd, ... /* arg */ );
获取/设置socket文件描述符...
阅读更多
socket是应用层与TCP/IP协议族通信的中间软件抽象层。它是一组接口,把复杂的TCP/IP协议族隐藏在socket接口中。
socket工作流程
TCP:
UDP:
socket
int socket(int domain, int type, int protocol);
domai...
阅读更多
可执行文件的加载
当我们在 Linux 下的bash下输入一个命令执行可执行程序时,
bash 进程会调用fork()创建一个新的进程,
新的进程调用execve()系统调用来执行指定的可执行程序。
bash进程继续返回等待刚才启动的新进程结束,然后继续等待用户的输入。
execve()的系统...
阅读更多
地址无关代码和非地址无关代码主要区别在于代码中的地址引用方式。
非地址无关代码
非地址无关代码所有的地址引用都是固定的绝对地址。编译器在编译时就确定了函数调用、全局变量访问等指令中的具体内存地址。
编译和链接:在链接阶段,链接器会为函数调用和全局变量访问生成绝对地址(这里的绝对不是指物理内存地址,而是...
阅读更多
页
页是操作系统进行内存管理的基本单位,在虚拟内存系统中,计算机将虚拟地址空间和物理内存都分割成固定大小的块,这些块就称为页,通常大小为4KB(也有更大页的支持,如2MB或1GB,称为大页或巨页)。
页是操作系统进行虚拟内存管理的基石。无论是分配内存、读写磁盘上的文件,还是进行进程间的内存共享,都是以页为单位来...
阅读更多
mmap()系统调用,用于将文件映射到进程的地址空间中。这个过程创建了一个虚拟内存区域,把对文件的操作转为对内存的操作,以此避免更多的lseek()与read()、write()操作,这点对于大文件或者频繁访问的文件带来显著的性能提升。
传统的读写文件
页缓存(page cache)是读写文件时的中间层,...
阅读更多
ELF (Executable and Linking Format) 是Linux 下标准的可执行文件格式,一个ELF文件主要用来表示3种类型的文件:
可执行文件 : 被操作系统中的加载器从硬盘中读取,加载到内存中去执行。
目标文件(.o) :被链接器读取,用来产生一个可执行文件或者共享文件。
共...
阅读更多