1、相关数据结构
include/linux/notifierh
struct notifier_block {
int (notifier_call)(struct notifier_block , unsigned long, void );
struct notifier_block next;
int priority;
};
通知链中的元素,记录了当发出通知时,应该执行的 *** 作(即回调函数)
链头中保存着指向元素链表的指针。通知链元素结构则保存着回调函数的类型以及优先级
2、时钟初始化
21 内核初始化部分( start_kernel 函数)和时钟相关的过程主要有以下几个:
tick_init()
init_timers()
hrtimers_init()
time_init()
其中函数 hrtimers_init() 和高精度时钟相关,下面将详细介绍这几个函数。
221 tick_init 函数
kernel/time/tick-commonc
void __init tick_init(void)
{
clockevents_register_notifier(&tick_notifier);
}
static struct notifier_block tick_notifier = {
notifier_call = tick_notify,
};
函数 tick_init() 很简单,调用 clockevents_register_notifier 函数向 clockevents_chain 通知链注册元素: tick_notifier。这个元素的回调函数指明了当时钟事件设备信息发生变化(例如新加入一个时钟事件设备等等)时,应该执行的 *** 作,该回调函数为 tick_notify
kernel/time/tick-commonc
static int tick_notify(struct notifier_block nb, unsigned long reason,
void dev)
{
switch (reason) {
case CLOCK_EVT_NOTIFY_ADD:
return tick_check_new_device(dev);
case CLOCK_EVT_NOTIFY_BROADCAST_ON:
case CLOCK_EVT_NOTIFY_BROADCAST_OFF:
case CLOCK_EVT_NOTIFY_BROADCAST_FORCE:
tick_broadcast_on_off(reason, dev);
break;
case CLOCK_EVT_NOTIFY_BROADCAST_ENTER:
case CLOCK_EVT_NOTIFY_BROADCAST_EXIT:
tick_broadcast_oneshot_control(reason);
break;
case CLOCK_EVT_NOTIFY_CPU_DYING:
tick_handover_do_timer(dev);
break;
case CLOCK_EVT_NOTIFY_CPU_DEAD:
tick_shutdown_broadcast_oneshot(dev);
tick_shutdown_broadcast(dev);
tick_shutdown(dev);
break;
case CLOCK_EVT_NOTIFY_SUSPEND:
tick_suspend();
tick_suspend_broadcast();
break;
case CLOCK_EVT_NOTIFY_RESUME:
tick_resume();
break;
default:
break;
}
return NOTIFY_OK;
}
222 init_timers 函数
函数 init_timers() 的实现如清单2-1(省略了部分和
主要功能无关的内容,以后代码同样方式处理)
前言:本文主要讲解Linux IO调度层的三种模式:cfp、deadline和noop,并给出各自的优化和适用场景建议。IO调度发生在Linux内核的IO调度层。这个层次是针对Linux的整体IO层次体系来说的。从read()或者write()系统调用的角度来说,Linux整体IO体系可以分为七层,它们分别是:
VFS层: 虚拟文件系统层。由于内核要跟多种文件系统打交道,而每一种文件系统所实现的数据结构和相关方法都可能不尽相同,所以,内核抽象了这一层,专门用来适配各种文件系统,并对外提供统一 *** 作接口。
文件系统层: 不同的文件系统实现自己的 *** 作过程,提供自己特有的特征,具体不多说了,大家愿意的话自己去看代码即可。
页缓存层: 负责真对page的缓存。
通用块层: 由于绝大多数情况的io *** 作是跟块设备打交道,所以Linux在此提供了一个类似vfs层的块设备 *** 作抽象层。下层对接各种不同属性的块设备,对上提供统一的Block IO请求标准。
IO调度层 :因为绝大多数的块设备都是类似磁盘这样的设备,所以有必要根据这类设备的特点以及应用的不同特点来设置一些不同的调度算法和队列。以便在不同的应用环境下有针对性的提高磁盘的读写效率,这里就是大名鼎鼎的Linux电梯所起作用的地方。针对机械硬盘的各种调度方法就是在这实现的。
块设备驱动层: 驱动层对外提供相对比较高级的设备 *** 作接口,往往是C语言的,而下层对接设备本身的 *** 作方法和规范。
块设备层: 这层就是具体的物理设备了,定义了各种真对设备 *** 作方法和规范。
有一个已经整理好的[Linux IO结构图],非常经典,一图胜千言:
(1)最新的稳定版并解压
从人人吧:
wget wget335/zookeeper-335targz
tar -zxvf zookeeper-343targz
可执行文件都在bin/目录下,配置都在conf/目录下
(2)生成配置
conf/目录下有个zoo_samplecfg,是样板配置文件
复制一份成zoocfg
里面有两个比较重要的配置:
dataDir=/var/lib/zookeeper # 数据存放位置,可根据需要修改
clientPort=2181 # 服务监听端口,可根据需要修改
(3)启动服务
bin/zkServersh start
如果未启动成功,一个检查JAVA_HOME是否正确设置,二个看端口是否冲突
(4)启动客户端测试
启动命令:
bin/zkClish -server 127001:2181
显示根目录下、文件:
ls /
创建文件,并设置初始内容:
create /shenjian hello
获取文件内容:
get /shenjian
修改文件内容:
set /shenjian world
删除文件:
delete /shenjian
退出客户端:
quit
查看zookeeper的状态
有没有快捷键倒不知道,但 vi或cat ~/bash_history 之类的显示的 是没有数字的历史记录 怀疑是不是以前有用过这个命令。然后Ctrl+R 检索了一下 这个命令就出来了。 个人想法!不知道是不是
以上就是关于如何armlinux输出时钟信息全部的内容,包括:如何armlinux输出时钟信息、如何让linux noop输出信息、linux 中zookeeper.out服务信息输出文件怎么找到等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)