https://www.cnblogs.com/hhddd-1024/p/17732334.html
https://panzhongxian.cn/cn/2022/01/what-is-posix-indeed/
https://www.cnblogs.com/alexliu2360/p/5674345.html
https://zhuanlan.zhihu.com/p/392588996
POSIX 是可移植操作系统接口 Portable Operating System Interface of UNIX 的缩写, POSIX 标准定义了操作系统应该为应用程序提供的接口标准,是在各种UNIX操作系统上运行的软件的一系列 API标准的总称。
一个POSIX API函数可以由一个系统调用实现,也可以通过调用多个系统调用来实现,还可以完全不使用任何系统调用。
C库提供了POSIX的绝大部分API,同时,内核提供的每个系统调用在C库中都具有相应的封装函数。
一般情况下,应用程序通过应用编程接口(API),而不是直接通过系统调用来编程。这点很重要,因为应用程序使用API实际上并不需要和内核提供的系统调用对应。一个API定义了一组应用程序使用的编程接口。它们可以调用一个系统调用,也可以通过调用多个系统调用来实现,而不使用任何系统调用也可以。实际上,API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却不同。
POSIX API 主要涉及文件操作、进程管理、线程管理、信号处理、网络通信等方面。
POSIX线程
与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以pthread_开头的
要使用线程库中的函数,要通过引入头文件<pthread.h>
链接这些线程函数库时要使用编译器命令的-lpthread选项
RTEMS的pthread.h, rtems/cpukit/include/rtems/posix/pthread.h :
目前只允许用户为 POSIX 初始化线程指定入口点和堆栈大小。
设备和面向类的函数
termios机构
该结构在<termios.h>中定义,在控制特定的终端I/O特性中要用到。
函数原型:
#include<termios.h>
speed_t cfgetospeed(const struct termios *termios_p);
int cfsetospeed(struct termios *termios_p,speed_t speed);
speed_t cfgetispeed(const struct termios *termios_p);
int cfsetispeed(struct termios *termios_p,speed_t speed);
以上这些接口被用来在termios结构获得和设定输入与输出的波特率值。
IO多路复用
https://blog.csdn.net/weixin_41859900/article/details/130906873
IO多路复用是一种能够同时监控多个文件描述符的技术,其能够使得一个线程同时处理多个IO事件,提高系统的性能。Linux下主要有select、poll和epoll等系统调用可实现IO多路复用的技术。
1)select是基于POSIX定义的标准接口,具有跨平台,兼容性好,而且可以监听多种事件且支持超时等待,但其所支持的功能不太适合高并发的场景。其主要有以下三个缺点:
1 其所监听的文件描述符有限,默认为1024个,且支持越多性能越低。其fd_set集合是一个位图(bitmap)
2 每次调用select函数都需要重新设置监听的集合,且需要花费在用户态和内核态来回拷贝的开销。
3 每次文件描述符有事件通知时,都需要遍历整个fd_set集合。
2)而poll本质与select没有什么不同,其将传入的监视集合从位图改成结构体数组,在每个结构体中记录所监视的描述符以及相关事件,从而避免了每次调用select都需要重新设置监视集合的问题,且突破对文件描述符的限制,但select的缺点2 和 3还是保留了下来。
3)epoll则直接在内核中创建监视文件描述符集合的空间和通过使用回调通知来解决了前两种所存在的内存拷贝开销大和每次都需遍历(轮询)整个监视集合的问题。
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
epoll的水平触发和边缘触发有什么区别?
水平触发和边缘触发是两种不同的事件触发方式。select和poll 只支持水平触发(LT 也叫条件触发),而epoll的默认方法也是水平触发。
水平触发(LT):当文件描述符有事件被触发时,内核会不断地通知应用程序进行数据的读取或写入,直到该事件被处理完毕。否则内核会一直通知应用程序处理该事件。*
边缘触发(ET):当文件描述符有事件被触发时,内核对该事件只会通知应用程序一次,即使没有处理该事件,内核也不会再通知,除非有新的事件到来。
区别: 边缘触发可以提高 I/O 处理效率,但也需要更加谨慎地处理事件,确保每个事件都被正确处理。而水平触发则相对简单一些,但会存在可能的性能问题。
同步和异步的概念和区别?
同步和异步是面对耗时操作(如函数调用,IO操作)的两种不同应对方式。
同步:可以形象理解为敌不动我不动,敌动我才动。就是需要等前面的语句执行完,才能执行下一个语句,因此面对耗时操作时大都采用阻塞来实现同步(比如read、listen等函数)。
异步:跟同步相反,面对耗时的操作时,可直接将其交给操作系统去处理,程序则接着继续执行下一条语句,而等操作系统完成操作时则通过中断等机制来通知应用程序。
区别: 同步适用于并发量小,耗时短的场景,而异步则使用于并发量大和耗时长的场景