再谈UNIX流机制和tty驱动
linux的tty驱动基本分为三层,一层在虚拟文件系统vfs,另一层是线路规程(或者称行规程),最下面一层是设备驱动,了解了大体架构之后再看linux的具体实现,vfs层的基本就是一个file_operations,而线路规程则是一个tty_ldisc,而驱动则没有统一的表示了,驱动层和线路规程有一个接口,那就是线路规程的receive_buf函数,或者在硬件中断中,或者在软中断中,或者在工作队列中等,驱动程序调用receive_buf函数将字符放入一个队列,然后唤醒等待的睡眠进程,在receive_buf执行线路规程规定的键码的解释,最终睡眠在tty的vfs层read方法中继而睡眠在线路规程的read中的进程被唤醒,取出字符;写终端的过程也是这样,vfs的write直接调用线路规程的write,然后数据就到了驱动,每个tty都直接绑定一个tty_driver,后者有一个tty_operations,线路规程的write就是调用了该tty_driver的write...这个过程不就是最原始的unix对tty的处理机制吗?和流机制相去甚远,在流机制中,vfs层往下调用,应该对下层是什么一无所知,是线路规程还是一般的驱动程序,还是一系列的规程等等,这些都应该对vfs层完全透明,可是linux的tty驱动实现中,一切都好似硬编码的,虽然一个线路规程可以透明地堆叠在另一个线路规程上,但是vfs层下却只能是一个线路规程,和最原始的unix实现一样,unix的队列是用clist(别指望在网上得到大量信息,如果你搜索clist,结果十有八九是mfc的)实现的,该clist机制是基于单独字符的缓冲,因此取字符或者放字符只能一个一个进行,linux的队列也是这样,只是不用clist这个结构体了,unix操作clist开销要比linux的更大一些,因为操作clist结构体要比linux如今使用的单一队列更复杂。
看看unix后来的实现,特别是bsd的实现,流机制引导下的分层模型大行其道,具体参见我前面的文章《从文件系统看系统架构》。unix原始的clist实现的tty驱动和linux的一些tty设备驱动一样,都是对输入和输出的不对称处理,输入可以直接输出到驱动,而输入却涉及到了设备的中断,所以为了不使中断更延迟,原始unix和linux的某些设备驱动实现都安排了两个输入队列,中断程序首先将数据放入第一个队列,然后中断返回,而后的进程上下文或者软中断中在将这些裸数据经过线路规程后加入第二个输入队列(linux的receive_buf)。
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271803

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Rancher部署Traefik实现微服务的快速发现
Traefik 是什么? Traefik 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。它支持多种后台 (Rancher、Docker、Swarm、Kubernetes、Marathon、Mesos、Consul、Etcd、Zookeeper、BoltDB、Rest API、file…) 来自动、动态的刷新配置文件,以实现快速地服务发现。 特性 它非常快 无需安装其他依赖,通过Go语言编写的单一可执行文件 支持 Rest API 多种后台支持:Rancher、Docker、Swarm、Kubernetes、Marathon、Mesos、Consul、Etcd,并且还会更多 后台监控,可以监听后台变化进而自动化应用新的配置文件设置 配置文件热更新。无需重启进程 正常结束http连接 后端断路器 轮询,rebalancer 负载均衡 Rest Metrics 支持最小化 官方 docker 镜像 后台支持SSL 前台支持SSL(包括SNI) 清爽的AngularJS前端页面 支持Websocket 支持HTTP/2 网络错误重试 支持Let's Encrypt ...
- 下一篇
mysql5.6主从复制与基于amoeba实现读写分离
Mysql5.6主从复制 1、特性分析说明: mysql 5.6支持多线程复制的机制并且mysql 5.6还引用了GTID的概念,使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。 TID:事务的ID号:也就是说在mysql复制中每一个事务都有自己的ID号(随机数) GTID:全局事务ID,在整个事务架构中每一个事务ID号是唯一的,不止是在一个节点上而是整个主从复制架构中每任何两个事务的ID号都不会相同的,这就是全局事务ID。 全局事务ID是怎么生成的?简单来讲是由mysql服务器自动管理的,在mysql5.6以后每一个mysql服务器都有一个全局唯一的ID号叫做uuid,而GTID就是由当前节点的UUID(一个128位的随机数)和为当前节点生成的随机数(TID)组成的,因此只要UUID不同再在此基础上保证事务ID不同就保证全局不一样了。 全局事务ID有何用处?简单来讲GTID能够保证让一个从服务器到其他的从服务器哪里实现数据复制而且能够实现数据整合的。GTID在分布式架构中可以保证数据的一致性。从而也实现了mysql的高可用性。 GTID相关操作:默认情况下将一个事务记录...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS关闭SELinux安全模块