Linux-Syscall-64Bit 参考(持续更新,具体看我遇见了什么)
| 函数名 | 作用 | 定义 | |
|---|---|---|---|
| read | 从文件描述符读取数据 | ssize_t read(int fd, void *buf, size_t count); |
|
| write | 向文件描述符写入数据 | ssize_t write(int fd, const void *buf, size_t count); |
|
| open | 打开或创建一个文件 | int open(const char *pathname, int flags, mode_t mode); |
|
| execve | 用新程序替换当前进程的内存空间,并开始执行新程序 | int execve(const char *filename, char *const argv[], char *const envp[]);; |
|
| openat | 打开或创建一个文件与open类似,只不过它用在相对路径上的打开 | int openat(int dirfd, const char *pathname, int flags, mode_t mode); |
|
| newfstatat | 获取一个文件或目录的状态信息 | int newfstatat(int dirfd, const char *pathname, struct stat *buf, int flags);; |
|
| statfs | 获取文件系统的信息,如文件系统的总大小、可用空间、文件块大小等 | int statfs(const char *path, struct statfs *buf); |
|
| access | 检查调用进程对一个文件或目录的访问权限 | int access(const char *pathname, int mode); |
|
| poll | 监控多个文件描述符的状态变化(可读/可写/错误) | int poll(struct pollfd *fds, nfds_t nfds, int timeout); |
|
| futex | 快速用户空间互斥操作(线程同步原语) | int futex(int *uaddr, int futex_op, int val, const struct timespec *timeout, int *uaddr2, int val3); |
|
| recvmsg | 从套接字接收消息(支持分散读取和控制信息) | ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); |
|
| sendmsg | 通过套接字发送信息(支持聚集写入和控制信息) | int access(const char *pathname, int mode); |
|
| timerfd_settime | 设置基于文件描述符的定时器(高精度时钟) | int access(const char *pathname, int mode); |
|
| epoll_wait | 等待epoll实例上的I/O事件(高性能多路复用) | int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); |
|
| ioctl | 执行设备特定控制操作(万能设备接口) | int ioctl(int fd, unsigned long request, ...); |
根据命令不同会有变化 |
一些特殊名词的简易说明
套接字socket
是当代网络通信的基石,负责不同主机或者同一主机之间内进程通信的标准化接口。
值得注意的是这是单方面进行通信,跟所谓的TCP那种应答方式不同,它是由单个进程单方面的呼喊,如对方未采取响应的监听措施,那么这个socket通信只是单纯的自喊,无人搭理。
同样的自己未采取对应处理措施,对方也是单方面的呼喊
在常规中的网络通信也采用socket模式,与其说是模式不认识说是一种标准化的规范,它可用基于任何通信协议来完成它想要做的传输。


在Linux内核中的通信也是采用socket标准,但与常规的网络不同,在内核中由内核开发者定义单方面接收和处理的系统函数,由用户态的程序向内核态系统服务请求所需操作以及得到内核态的处理结果
状态大致上是 用户态--请求--->内核态--处理用户态请求和数据--->将数据从内核态复制到用户态--->内核态清除等待
用户态请求具体内核态服务,以及携带文件标识符(FD),预留地址(Address),特殊标识符(flags)
内核态通过FD-->查找文件表(file table)--->得到文件索引f_inode--->通过文件索引进行对应操作如读取数据---->将数据复制回用户态给的预留地址(如果需要特殊处理也是在这时候处理完成再复制回去)

为什么需要文件标识符FD?因为在Linux内核中一切皆为文件,因此内核也需要通过索引去读取到对应的块设备文件产生硬件交互过程
值得注意的是flags不仅仅是进行特殊处理,也有可能是预留机制,比如说告诉内核,如果产生拥堵的情况就不必要读取而是直接返回错误信息或者是原因给用户态即可,这样子可以极大的减少拥堵的情况。
当然内核态与用户态的交互方式远不止这一种。还有如bind()、listen()、accept()、connect()、sendmsg()、recvmsg()等)
时钟
在系统中所谓的时钟跟我们现实中的时钟不太一样,你可以理解为是它的闹钟。
内核负责用户态与硬件之间的桥梁,所需做的就是处理硬件与软件上的事情,让软件和硬件互相配合,来让用户的体验得到最佳。
在以前设计不太完美的年代,内核处理一些软件上的事情都有一些缺陷。比如说我软件明明在播放了,但是为什么我的硬件喇叭没有声音?或者说是我的声音和画面为什么不同步?
这是因为时钟设计的不够完善,可能是固定时间处理,就比如说用户态已经开始播放视频了,但内核还没能唤醒对应的喇叭硬件进行发声
这个就是所谓的“低精度时钟”
为什么不让内核实时都盯着用户态呢?
答:资源消耗会增大,就让你的CPU或者GPU一直处于唤醒状态,耗电量就直接芜湖起飞。
因此内核随着时钟算法的演进在逐步完善时钟,进行有效的唤醒硬件进行对应的工作。进行动态对硬件进行调整
如3ms后保存需要用到硬盘,5ms后要用到喇叭。高精度的时钟可以让内核唤醒硬件更加快速以及能够有效的降低消耗。
所以简单来讲就是能达到随时唤醒且延迟低,能够有效让内核管理硬件的唤醒算法称之为“高精度时钟”
注:可能我将的时钟有点奇怪,但这是我个人理解的时钟

浙公网安备 33010602011771号