linux内核情景分析 UNIX环境高级编程 {进程 文件 内存}

FILE结构封装的是一个流,内核中的文件描述符是它的一部分。标准 IO 的缓存:全缓存,行缓存,无缓存。这个缓存是在应用层,进程间是隔离的。而内核中文件的缓存是进程间共享的,作为 inode 的一部分来管理的。

FILENO调用获得 FILE 结构的文件描述符,用于 dup2

mmap避免了两次数据拷贝,标准 IO 库的写产生了两次数据拷贝:应用程序和标准缓存,标准缓存和内核。所以 mmap 的读写效率要高。这也是 epoll 效率高的一个原因,它采用了内存映射。联想到 Windows WSASend 时,数据所占内存是被锁定的,肯定是为了减少系统和程序之间的内存拷贝而传送的地址,没有传数据。如果这样的话,在很多需要内核和应用程序之间传递数据的部分都可用内存映射提高效率。

mmap read/write 两条路线对文件的访问比较
无论是通过mmap 方式或 read/write 方式访问文件在内核中都必须经过两个缓存:一个是用 address_space 来组织的以页为基础的缓存;一个是以 buffer 来组织的缓存,但实际上这两
个缓存只是同一个缓冲池里内容的不同组织方式。当需要从文件读写内容时,都经过 add
ress_space_operation中提供的函数也就是说路径是一致的。
如果是用read/write 方式,用户须向内核指定要读多少,内核再把得到的内容从内核缓冲池拷向用户空间;写也须要有一个大致如此的过程。 mmap 的优势在于通过把文件的某一块内容映射到用户空间上,用户可以直接向内核缓冲池读写这一块内容,这样一来就少了内
核与用户空间的来回拷贝所以通常更快。但 mmap 方式只适用于更新、读写一块固定大小的文件区域而不能做像诸如不断的写内容进入文件导到文件增长这类的事。

一篇不错的mmap 分析 http://hi.baidu.com/interxuxing/blog/item/94e5b11a03919ed2ac6e750d.html

位置大于文件长度时Lseek 可以产生文件空洞。

多进程共享文件,读写的时候就有并发的问题,必须保证某些操作的原子性,比如尾部写。需要在open 时就加上 O_APPEND 标志。进程间的锁就是记录锁。通过 fcntl 来实现,按实现分为建议锁和强制锁,建议锁是由程序主动检查锁的情况,强制锁是由系统保证锁的作用。记录锁在父子进程间没有继承关系。

Select/Poll解决的是阻塞的问题。 SIGPOLL/SIGIO 是异步 IO 技术,没有研究,和 WINDOWS 下的异步 IO 差不多,不知道和 IOCP 有没有相似的地方。

Redv/Writev效率上没提高,只是把内存拷贝从英语层放到内核中了,但是至少少去了应用程序管理缓存的麻烦。缺点是难以处理一次写没有完全成功的情况,这个问题在 WINDOWS 下的 WSASend 也存在同样的问题。所以写的缓存还是放在一起好。

用户线程共享地址空间,但是每个线程的栈是独立的,我的理解是每个线程的栈空间是在进程的堆栈空间分的一部分,实际上各个线程之间是可以相互访问栈上的数据的。Pthread 是在应用层实现的线程。

内核线程,用户线程,进程是有区别的。用户线程有独立的系统栈,但没有独立的用户空间。内核线程没有用户空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值