打印

飞凌干货-printf数据打印的归宿

[复制链接]
1240|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
布罗利|  楼主 | 2022-5-23 14:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如果不懂什么叫行规程(也叫线路规程)的话,请阅读《UNIX环境高级编程》的终端和伪终端章节,简单来说,它就是一个中间层,用来适配VFS接口和底层的具体驱动,比如解释和处理控制字符等。从上面的图中,我们可以看出,主要的开销几乎都集中在底层,而底层却偏偏是我们不能控制或者很难控制的。之所以上面的测试例子中ssh登录的终端对test性能的测试效果良好,但是那是因为网络环境好,你在一个64kbps相隔5k公里的线路上试一下。

小小的printf下面竟然藏着如此多的内容,并且很可能就是它成了你的程序的性能瓶颈,因为最底层的影响因素往往是不可控的。那么是不是就是意味着我要建议大家从来不用printf打印呢?或者说干脆就不要用标准输出呢?并不是这样。但是为何不把打印这种事交给本机的另一个进程呢?事实上,几乎所有的需要记录日志的系统都是这么做的,而syslog则迎合了这个思想。这种思想的背后就是“用可控制的一次IPC替换不可控制冰山之下的茫茫深海

关于日志记录
日志记录一直都是“薛定谔猫”式的东西,因为日志记录作为一段代码,它已经是程序的一部分,不可能独立地观察程序的行为,如果说用镜像系统的话,那么这种行为就是被动的,你不得不镜像每一条指令,以发现一些关键的信息,要想主动记录关键事件,必须用日志系统。打印日志可以方便信息获取和审计,但是代价有时也是高昂的:
1.你要设计一套日志回滚系统,防止存储空间被撑爆;
2.你要让日志记录尽快完成,不能降低关键路径的性能;
3.你要反复调试代码,确保日志记录的缓冲区不会溢出;
4.为了让日志更短,语言能力不好的人组织的日志就像电报一样难以理解。
...
我认为,日志记录应该遵循以下的原则:

1.除非必须要把事件发生的时间记录下来,否则就用计数器代替日志记录,一系列的事件映射成一系列的计数器,由用户决定什么时候查看事件发生了。事实上,Linux的网络子系统就是用的这种方式,所有的/proc/net/netstat就是这个查看接口。

2.一定要有一个日志级别控制选项,用户可以决定是否记录日志,以及记录的日志详细到什么程度。

tty层接口

驱动代码摘自:

lichee/linux-3.10/drivers/tty/serial/sunxi-uart.c

接收数据

static unsigned int sw_uart_handle_rx(struct sw_uart_port *sw_uport, unsigned int lsr)

{

….

tty_flip_buffer_push(&sw_uport->port.state->port);



}

tty_termios_baud_rate(termios)

tty_termios_encode_baud_rate(termios, baud, baud);

发送数据
https://www.forlinx.com/product/129.html

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

183

帖子

0

粉丝