Syscall系统调用分析

Syscall意义

内核提供用户空间程序与内核空间进行交互的一套标准接口,这些接口让用户态程序能受限访问硬件设备,比如申请系统资源,操作设备读写,创建新进程等。用户空间发生请求,内核空间负责执行,这些接口便是用户空间和内核空间共同识别的桥梁,这里提到两个字“受限”,是由于为了保证内核稳定性,而不能让用户空间程序随意更改系统,必须是内核对外开放的且满足权限的程序才能调用相应接口。
在用户空间和内核空间之间,有一个叫做Syscall(系统调用, system call)的中间层,是连接用户态和内核态的桥梁。这样即提高了内核的安全型,也便于移植,只需实现同一套接口即可。Linux系统,用户空间通过向内核空间发出Syscall,产生软中断,从而让程序陷入内核态,执行相应的操作。对于每个系统调用都会有一个对应的系统调用号,比很多操作系统要少很多。
安全性与稳定性:内核驻留在受保护的地址空间,用户空间程序无法直接执行内核代码,也无法访问内核数据,通过系统调用
性能:Linux上下文切换时间很短,以及系统调用处理过程非常精简,内核优化得好,所以性能上往往比很多其他操作系统执行要好。

以writev系统调用函数举例分析系统调用函数作用

writev将多个数据存储在一起,将驻留在两个或更多的不连接的缓冲区中的数据一次写出去(wyq:应该是从内存的缓冲区直接写入到文件,即写入到磁盘中存储起来)。
简介
UNIX和WINSOCK提供了不同的实现方法UNIX系统下,使用writev,可以指定一系列的缓冲区,收集要写的数据,使可以安排数据保存在多个缓冲区中,然后同时写出去,从而避免出现Nagle和延迟ACK算法的相互影响。
readv/writev 函数及存储映射 I/O
原创aisxyz 最后发布于2018-01-19 00:57:02 阅读数 77 收藏
展开
readv 和 writev 函数可用于在一次函数调用中读、写多个非连续缓冲区,有时也称这两个函数为散布读(scatter read)和聚集写(gather write)。

#下面是c++的程序语言编程
#include <sys/uio.h>
ssize_t readv(int fd, const struct iovec *iov, int iovcnt);
ssize_t writev(int fd, const struct iovec *iov, int iovcnt);
                     /* 两个函数的返回值:已读或已写的字节数;若出错,返回 -1 */
struct iovec{
    void    *iov_base;    // starting address of buffer
    size_t   iov_len;     // size of buffer
};

这两个函数的第二个参数 iov 都是指向 iovec 结构数组的一个指针,该数组中的元素由 iovcnt 指定,其最大值受限于 IOV_MAX。readv 函数将读入(wyq:应该是从文件中读入,也就是从磁盘读入)的数据按 iov[0]、iov[1] 直至 iov[iovcnt-1] 的顺序散布到缓冲区中。它总是先填满一个缓冲区后再填写下一个。writev 函数则按照同样的顺序将缓冲区中的数据聚集输出到文件中。
存储映射 I/O 能将一个磁盘文件映射到存储空间中的一个缓冲区上,通过操作该缓冲区可以在不使用 read 和 write 的情况下间接地操作底层文件。为使用这种功能,应首先告诉内核将一个给定的文件映射到一个存储区域中。这可用 mmap 函数来实现。

发布了31 篇原创文章 · 获赞 0 · 访问量 2817

猜你喜欢

转载自blog.csdn.net/yaqiang2017/article/details/104148344
今日推荐