精华内容
下载资源
问答
  • 学Linux云计算技术有意义吗?云计算发展前景如何?  学Linux云计算技术有意义吗?  云计算因其强大功能而备受关注和人们关注。云计算可以随时随地从可配置计算资源共享池中轻松获取所需资源,资源可以快速...

    近年来,云计算技术发展迅速。毫无疑问,Linux云计算技术的发展前景受到很多公司和个人的青睐。因此,越来越多的人打算学习云计算技术,进入it行业。那学Linux云计算技术有意义吗?云计算发展前景如何?
      学Linux云计算技术有意义吗?
      云计算因其强大的功能而备受关注和人们的关注。云计算可以随时随地从可配置计算资源的共享池中轻松获取所需资源,资源可以快速提供和释放,从而将管理资源和与服务提供商交互的工作量降低到尽可能低的限度。云计算可以大大降低小公司的运营成本。云计算的数据中心可以为小公司动态提供计算服务,利用计算资源,避免资源浪费。
      云计算发展前景如何?
      云计算技术在日益互联的世界中提供了灵活性、敏捷性和可扩展性,但这项技术正在以惊人的速度发展。随着云计算的快速发展,越来越多的企业希望获得更高的运营效率,远离传统网络。可见,云计算的就业前景非常广阔。
      以上便是关于“学Linux云计算技术有意义吗?云计算发展前景如何?”的相关介绍。Linux云计算学习路漫漫,找到自己的方向,脚踏实地的掌握技术,才能更好的实现自己的价值。

    展开全文
  • 前言 ...Linux源码可谓是C语言典范宝库,可以看到各种数据结构与算法在分布式其他领域索引,对于AI算法在设备侧落地,功耗与节能是绕不开,以智能台灯为例,单纯土豪堆NPU芯片是无法让好产品

    前言

    首先说2020年已经算是跨入AI时代,目前回报率最高的工作或者机会都是和AI相关的,AI看似高大上,门槛好像很高,其实并不尽然。
    所谓什么时候起步都不算晚,但是踩准时机非常重要,目前AI技术在落地产品时候都离不开嵌入式设备的广大市场,在嵌入式软件领域与AI技术结合必然从硬件到软件重新塑造嵌入式软件领域的架构!

    意义

    Linux源码可谓是C语言的典范宝库,可以看到各种数据结构与算法在分布式其他领域的索引,对于AI算法在设备侧落地,功耗与节能是绕不开的,以智能台灯为例,单纯土豪的堆NPU芯片是无法让好产品走入千家万户的,说到最后好的产品还必须要有一个美丽的价格才行。

    所以在AI产品落地到边缘计算场景或者终端场景,其实需要一些定制化专业化的软件平台来承载这个任务。这本身也会是一个比较有前途的事情。

    问题是如何开发这套系统软件,或者说它的架构是怎么样的?以什么样的形式来呈现出来?
    这个问题很值得思考,接下来有时间我专门来写写这块的问题。

    展开全文
  • 一直想问下,学习linux内核源代码都有些什么意义呢,是可以找个更好工作吗 如果是从事驱动开发,好像基本上厂商已经做差不多了,到你这里顶多改动几行,做其他呢,又不知道意义何在,求各位说说看
  • --关于Linux一级目录下文件所存在含义 bin:存放二进制文件程序工具,是系统必备,是识别我们所敲击命令存放地。 boot:存放系统启动必须文件 dev:存放是系统外围设备 etc:存放系统配置文件,系统...

    --关于Linux一级目录下的文件所存在的含义

    bin:存放二进制文件程序工具,是系统必备,是识别我们所敲击的命令存放地。

    boot:存放系统启动的必须文件

    dev:存放的是系统的外围设备

    etc:存放系统配置文件,系统所有的配置文件都在这里

    home:放置普通用户,你添加的每个用户都在这里

    initrd:临时目录,初始化引导的时候用的

    lib:动态链接库存放的位置

    lost+found:自检的时候回发现的碎片文件,丢失的文件可能可以在这里找回

    mnt:挂载外部设备,光驱啥的

    opt:安装第三方软件的

    proc:虚拟的文件系统,反应的是进程信息,不占用硬盘空间

    root:管理的目录

    sbin:超级用户的管理工具,系统必备

    tmp:临时文件,全局可写的

    user:所有用户公共的资料

    var:动态变化的数据,数据库,日志等。它跟home是变化的,经常需要维护

    以上这些内容参照文档所写。

    可能存在某些目录我们没有的,某些目录我没写的,但基本重要的内容都在这了。





    展开全文
  • 1.分析linux内核重要性  操作系统作为最核心软件,关系到国家战略安全,在现代信息化战争中,操作系统安全对于制信息权起着非常重要作用。而制信息权是制空权,制海权基础。没有制信息权作为保障...

    转自:http://blog.sina.com.cn/s/blog_6dd71c3c0101mgpf.html

     1.分析linux内核的重要性

         操作系统作为最核心的软件,关系到国家的战略安全,在现代的信息化战争中,操作系统的安全对于制信息权起着非常重要的作用。而制信息权是制空权,制海权的基础。没有制信息权作为保障,制空制海权也就无从谈起。

         在信息安全中,操作系统起着及其重要的作用。许多安全产品如防火墙,入侵检测系统,入侵防护系统,防毒杀毒软件都构建在操作系统之上。如果操作系统被攻击者控制,那么许多防护机制就失去了作用。

         由于Windows系统内核代码的不开放性,以及windows系统安全性和稳定性存在较大的弱点,分析linux内核代码,并在此基础上开发和构建安全操作系统就显得重要了。安全操作系统,可信计算这些都是最近比较热门的研究领域。

         分析linux内核对个人而言,可起到如下作用:深入理解操作系统原理,可以开发基于内核的安全产品,学习优秀的软件开发思想,体验真正黑客的乐趣(真正的黑客以深入研究计算机技术,发现和探索新的安全问题,攻击技术和防御技术为乐)。

        

         2.参考书籍,相关资料及软件

         分析和研究linux操作系统内核前需要一些准备。一份linux内核源代码,这是最基本的条件,具备了这一条件就可以开始了。内核源代码可以从安装盘或已经安装了linux的系统中获得,也可以从网络上免费下载。

         如果这样开始,往往是比较困难的,最好有一个源代码阅读软件,SourceInsight和一两本参考书籍。

         参考书籍就市面上大概有10余中,作者国内国外都有。但总体而言,国内作者写的linux内核分析方面的书籍较为简单和概括,缺乏自己的创见和实际分析经验。当然也有基本较好的:

         浙大出版社出版的由毛得操编写的>,该书分上下两册,共1500多页。

         浙大出版社出版的由李善良编写的>,这是一本很不错的入门教材,其最大特点在于强调边学边实践,分析linux内核只看不动手是学不到什么真正的东西的。我个人非常喜欢这本书。

         西安电子科技大学出版社出版的由郭玉东编写的>,这本书对硬件和linux下的汇编有个简单的介绍,在算法和处理流程方面的讲解非常不错,只是针对的版本是2.2。

         机械工业出版社出版的由蒋静编写的>,这是一本推荐给大学教学使用的书籍。里面兼顾硬软件,原理阐释清晰。

         国外的书籍最为经典当数>,陈莉君翻译,Daniel P Bovet和Marco Cesati编写。特点在于全面,深入,版本不断更新,现在最新的是针对2.4内核版本,应该很快出版针对2.6版本。大量的学术论文都引用该书,许多开发者都从中吸取经验。

         国外的书籍还由一本很不错,>,陈莉君翻译,Robert Love编著。该书适合入门,对linux的设计和实现做了大概的分析和介绍,也有一定的深度。

         设备驱动程序>>,魏永明翻译,Alessandro Rubinni等编写,许多涉及linux内核开发的人员都在编写驱动程序,这是一本linux编写驱动程序的经典书籍。

         除了以上书籍之外,还有两本实验教材也值得一提。分析linux内核不上机实践是难以取得成效的。

         >,机械工业出版社,罗宇编著。还有一本老外写的具体书名忘了,各书店应该都有。

         当然还有一种极佳的参考资料:Internet。这里要特别推荐的是

        http://vegr.kernel.org

        ,这是linux内核核心开发人员交流和探讨的一个社区,是顶级高手汇聚的地方(包括linus,linux操作系统最早开发者和发布者)。

        

         3.linux内核分析所涉及的内容以及分析方法

         总体而言,linux内核包括以下几个部分:进程,进程调度,中断和异常,定时和时间管理,内存管理,内核同步机制,虚拟文件系统,EXt2或Ext3文件系统,I/O设备管理,高速缓存,信号实现,进程通信实现,系统调用实现,内核模块,设备驱动程序,启动和引导,内存寻址(与硬件相关).

         分析方法主要有两种:一种是从系统启动加载开始,分析linux如何运作;一种按照各个功能模块如进程管理,内存管理,内核同步,内核模块,系统调用分别分析。我个人是采用第二种,原因是边学边实际应用到项目中,边学边实践,有动力又有成就感

     2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。

    一、 链表数据结构简介
    链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表的开销主要是访问的顺序性和组织链的空间损失。

    通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系。按照指针域的组织以及各个节点之间的联系形式,链表又可以分为单链表、双链表、循环链表等多种类型,下面分别给出这几类常见链表类型的示意图:

    1. 单链表

    图1 单链表
    图1 单链表 

    单链表是最简单的一类链表,它的特点是仅有一个指针域指向后继节点(next),因此,对单链表的遍历只能从头至尾(通常是NULL空指针)顺序进行。

    2. 双链表

    图2 双链表
     学习 <wbr>Linux内核的意义及内核 <wbr>head_list分析

    通过设计前驱和后继两个指针域,双链表可以从两个方向遍历,这是它区别于单链表的地方。如果打乱前驱、后继的依赖关系,就可以构成"二叉树";如果再让首节点的前驱指向链表尾节点、尾节点的后继指向首节点(如图2中虚线部分),就构成了循环链表;如果设计更多的指针域,就可以构成各种复杂的树状数据结构。

    3. 循环链表
    循环链表的特点是尾节点的后继指向首节点。前面已经给出了双循环链表的示意图,它的特点是从任意一个节点出发,沿两个方向的任何一个,都能找到链表中的任意一个数据。如果去掉前驱指针,就是单循环链表。

    在Linux内核中使用了大量的链表结构来组织数据,包括设备列表以及各种功能模块中的数据组织。这些链表大多采用在[include/linux/list.h]实现的一个相当精彩的链表数据结构。本文的后继部分就将通过示例详细介绍这一数据结构的组织和使用。

    二、 Linux 2.6内核链表数据结构的实现
    尽管这里使用2.6内核作为讲解的基础,但实际上2.4内核中的链表结构和2.6并没有什么区别。不同之处在于2.6扩充了两种链表数据结构:链表的读拷贝更新(rcu)和HASH链表(hlist)。这两种扩展都是基于最基本的list结构,因此,本文主要介绍基本链表结构,然后再简要介绍一下rcu和hlist。

    链表数据结构的定义很简单(节选自[include/linux/list.h],以下所有代码,除非加以说明,其余均取自该文件):


    struct list_head {
                            struct list_head *next, *prev;
                            };
                            
    

    list_head结构包含两个指向list_head结构的指针prev和next,由此可见,内核的链表具备双链表功能,实际上,通常它都组织成双循环链表。

    和第一节介绍的双链表结构模型不同,这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包含数据,而是在数据结构中包含链表节点。

    在数据结构课本中,链表的经典定义方式通常是这样的(以单链表为例):


    struct list_node {
                            struct list_node *next;
                            ElemType        data;
                            };
                            
    

    因为ElemType的缘故,对每一种数据项类型都需要定义各自的链表结构。有经验的C++程序员应该知道,标准模板库中的采用的是C++ Template,利用模板抽象出和数据项类型无关的链表操作接口。

    在Linux内核链表中,需要用链表组织起来的数据通常会包含一个struct list_head成员,例如在[include/linux/netfilter.h]中定义了一个nf_sockopt_ops结构来描述Netfilter为某一协议族准备的getsockopt/setsockopt接口,其中就有一个(struct list_head list)成员,各个协议族的nf_sockopt_ops结构都通过这个list成员组织在一个链表中,表头是定义在[net/core/netfilter.c]中的nf_sockopts(struct list_head)。从下图中我们可以看到,这种通用的链表结构避免了为每个数据项类型定义自己的链表的麻烦。Linux的简捷实用、不求完美和标准的风格,在这里体现得相当充分。

    图3 nf_sockopts链表示意图

     学习 <wbr>Linux内核的意义及内核 <wbr>head_list分析

     

     

    三、 链表操作接口

    1. 声明和初始化
    实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_HEAD()这个宏:


    #define LIST_HEAD_INIT(name) { &(name), &(name) }
                            #define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)
                            
    

    当我们用LIST_HEAD(nf_sockopts)声明一个名为nf_sockopts的链表头时,它的next、prev指针都初始化为指向自己,这样,我们就有了一个空链表,因为Linux用头指针的next是否指向自己来判断链表是否为空:


    static inline int list_empty(const struct list_head *head)
                            {
                            return head->next == head;
                            }
                            
    

    除了用LIST_HEAD()宏在声明的时候初始化一个链表以外,Linux还提供了一个INIT_LIST_HEAD宏用于运行时初始化链表:


    #define INIT_LIST_HEAD(ptr) do { \
                            (ptr)->next = (ptr); (ptr)->prev = (ptr); \
                            } while (0)
                            
    

    我们用INIT_LIST_HEAD(&nf_sockopts)来使用它。

    2. 插入/删除/合并
    a) 插入

    对链表的插入操作有两种:在表头插入和在表尾插入。Linux为此提供了两个接口:


    static inline void list_add(struct list_head *new, struct list_head *head);
                            static inline void list_add_tail(struct list_head *new, struct list_head *head);
                            
    

    因为Linux链表是循环表,且表头的next、prev分别指向链表中的第一个和最末一个节点,所以,list_add和list_add_tail的区别并不大,实际上,Linux分别用


    __list_add(new, head, head->next);
                            
    


    __list_add(new, head->prev, head);
                            
    

    来实现两个接口,可见,在表头插入是插入在head之后,而在表尾插入是插入在head->prev之后。

    假设有一个新nf_sockopt_ops结构变量new_sockopt需要添加到nf_sockopts链表头,我们应当这样操作:


    list_add(&new_sockopt.list, &nf_sockopts);
                            
    

    从这里我们看出,nf_sockopts链表中记录的并不是new_sockopt的地址,而是其中的list元素的地址。如何通过链表访问到new_sockopt呢?下面会有详细介绍。

    b) 删除


    static inline void list_del(struct list_head *entry);
                            
    

    当我们需要删除nf_sockopts链表中添加的new_sockopt项时,我们这么操作:


    list_del(&new_sockopt.list);
                            
    

    被剔除下来的new_sockopt.list,prev、next指针分别被设为LIST_POSITION2和LIST_POSITION1两个特殊值,这样设置是为了保证不在链表中的节点项不可访问--对LIST_POSITION1和LIST_POSITION2的访问都将引起页故障。与之相对应,list_del_init()函数将节点从链表中解下来之后,调用LIST_INIT_HEAD()将节点置为空链状态。

    c) 搬移

    Linux提供了将原本属于一个链表的节点移动到另一个链表的操作,并根据插入到新链表的位置分为两类:


    static inline void list_move(struct list_head *list, struct list_head *head);
                            static inline void list_move_tail(struct list_head *list, struct list_head *head);
                            
    

    例如list_move(&new_sockopt.list,&nf_sockopts)会把new_sockopt从它所在的链表上删除,并将其再链入nf_sockopts的表头。

    d) 合并

    除了针对节点的插入、删除操作,Linux链表还提供了整个链表的插入功能:


    static inline void list_splice(struct list_head *list, struct list_head *head);
                            
    

    假设当前有两个链表,表头分别是list1和list2(都是struct list_head变量),当调用list_splice(&list1,&list2)时,只要list1非空,list1链表的内容将被挂接在list2链表上,位于list2和list2.next(原list2表的第一个节点)之间。新list2链表将以原list1表的第一个节点为首节点,而尾节点不变。如图(虚箭头为next指针):

    图4 链表合并list_splice(&list1,&list2)
     学习 <wbr>Linux内核的意义及内核 <wbr>head_list分析

    当list1被挂接到list2之后,作为原表头指针的list1的next、prev仍然指向原来的节点,为了避免引起混乱,Linux提供了一个list_splice_init()函数:


         static inline void list_splice_init(struct list_head *list, struct list_head *head);
                            
    

    该函数在将list合并到head链表的基础上,调用INIT_LIST_HEAD(list)将list设置为空链。

    3. 遍历
    遍历是链表最经常的操作之一,为了方便核心应用遍历链表,Linux链表将遍历操作抽象成几个宏。在介绍遍历宏之前,我们先看看如何从链表中访问到我们真正需要的数据项。

    a) 由链表节点到数据项变量

    我们知道,Linux链表中仅保存了数据项结构中list_head成员变量的地址,那么我们如何通过这个list_head成员访问到作为它的所有者的节点数据呢?Linux为此提供了一个list_entry(ptr,type,member)宏,其中ptr是指向该数据中list_head成员的指针,也就是存储在链表中的地址值,type是数据项的类型,member则是数据项类型定义中list_head成员的变量名,例如,我们要访问nf_sockopts链表中首个nf_sockopt_ops变量,则如此调用:


    list_entry(nf_sockopts->next, struct nf_sockopt_ops, list);
                            
    

    这里"list"正是nf_sockopt_ops结构中定义的用于链表操作的节点成员变量名。

    list_entry的使用相当简单,相比之下,它的实现则有一些难懂:


    #define list_entry(ptr, type, member) container_of(ptr, type, member)
                            container_of宏定义在[include/linux/kernel.h]中:
                            #define container_of(ptr, type, member) ({                      \
                            const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
                            (type *)( (char *)__mptr - offsetof(type,member) );})
                            offsetof宏定义在[include/linux/stddef.h]中:
                            #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
                            
    

    size_t最终定义为unsigned int(i386)。

    这里使用的是一个利用编译器技术的小技巧,即先求得结构成员在与结构中的偏移量,然后根据成员变量的地址反过来得出属主结构变量的地址。

    container_of()和offsetof()并不仅用于链表操作,这里最有趣的地方是((type *)0)->member,它将0地址强制"转换"为type结构的指针,再访问到type结构中的member成员。在container_of宏中,它用来给typeof()提供参数(typeof()是gcc的扩展,和sizeof()类似),以获得member成员的数据类型;在offsetof()中,这个member成员的地址实际上就是type数据结构中member成员相对于结构变量的偏移量。

    如果这么说还不好理解的话,不妨看看下面这张图:

    图5 offsetof()宏的原理
    图5 offsetof()宏的原理 

    对于给定一个结构,offsetof(type,member)是一个常量,list_entry()正是利用这个不变的偏移量来求得链表数据项的变量地址。

    b) 遍历宏

    在[net/core/netfilter.c]的nf_register_sockopt()函数中有这么一段话:


                 ……
                            struct list_head *i;
                            ……
                            list_for_each(i, &nf_sockopts) {
                            struct nf_sockopt_ops *ops = (struct nf_sockopt_ops *)i;
                            ……
                            }
                            ……
                            
    

    函数首先定义一个(struct list_head *)指针变量i,然后调用list_for_each(i,&nf_sockopts)进行遍历。在[include/linux/list.h]中,list_for_each()宏是这么定义的:


                 #define list_for_each(pos, head) \
                            for (pos = (head)->next, prefetch(pos->next); pos != (head); \
                            pos = pos->next, prefetch(pos->next))
                            
    

    它实际上是一个for循环,利用传入的pos作为循环变量,从表头head开始,逐项向后(next方向)移动pos,直至又回到head(prefetch()可以不考虑,用于预取以提高遍历速度)。

    那么在nf_register_sockopt()中实际上就是遍历nf_sockopts链表。为什么能直接将获得的list_head成员变量地址当成struct nf_sockopt_ops数据项变量的地址呢?我们注意到在struct nf_sockopt_ops结构中,list是其中的第一项成员,因此,它的地址也就是结构变量的地址。更规范的获得数据变量地址的用法应该是:


    struct nf_sockopt_ops *ops = list_entry(i, struct nf_sockopt_ops, list);
                            
    

    大多数情况下,遍历链表的时候都需要获得链表节点数据项,也就是说list_for_each()和list_entry()总是同时使用。对此Linux给出了一个list_for_each_entry()宏:


    #define list_for_each_entry(pos, head, member)               ……
                            
    

    与list_for_each()不同,这里的pos是数据项结构指针类型,而不是(struct list_head *)。nf_register_sockopt()函数可以利用这个宏而设计得更简单:


    ……
                            struct nf_sockopt_ops *ops;
                            list_for_each_entry(ops,&nf_sockopts,list){
                            ……
                            }
                            ……
                            
    

    某些应用需要反向遍历链表,Linux提供了list_for_each_prev()和list_for_each_entry_reverse()来完成这一操作,使用方法和上面介绍的list_for_each()、list_for_each_entry()完全相同。

    如果遍历不是从链表头开始,而是从已知的某个节点pos开始,则可以使用list_for_each_entry_continue(pos,head,member)。有时还会出现这种需求,即经过一系列计算后,如果pos有值,则从pos开始遍历,如果没有,则从链表头开始,为此,Linux专门提供了一个list_prepare_entry(pos,head,member)宏,将它的返回值作为list_for_each_entry_continue()的pos参数,就可以满足这一要求。

    4. 安全性考虑
    在并发执行的环境下,链表操作通常都应该考虑同步安全性问题,为了方便,Linux将这一操作留给应用自己处理。Linux链表自己考虑的安全性主要有两个方面:

    a) list_empty()判断

    基本的list_empty()仅以头指针的next是否指向自己来判断链表是否为空,Linux链表另行提供了一个list_empty_careful()宏,它同时判断头指针的next和prev,仅当两者都指向自己时才返回真。这主要是为了应付另一个cpu正在处理同一个链表而造成next、prev不一致的情况。但代码注释也承认,这一安全保障能力有限:除非其他cpu的链表操作只有list_del_init(),否则仍然不能保证安全,也就是说,还是需要加锁保护。

    b) 遍历时节点删除

    前面介绍了用于链表遍历的几个宏,它们都是通过移动pos指针来达到遍历的目的。但如果遍历的操作中包含删除pos指针所指向的节点,pos指针的移动就会被中断,因为list_del(pos)将把pos的next、prev置成LIST_POSITION2和LIST_POSITION1的特殊值。

    当然,调用者完全可以自己缓存next指针使遍历操作能够连贯起来,但为了编程的一致性,Linux链表仍然提供了两个对应于基本遍历操作的"_safe"接口:list_for_each_safe(pos, n, head)、list_for_each_entry_safe(pos, n, head, member),它们要求调用者另外提供一个与pos同类型的指针n,在for循环中暂存pos下一个节点的地址,避免因pos节点被释放而造成的断链。

    四、 扩展

    1. hlist

    图6 list和hlist
    图6 list和hlist 

    精益求精的Linux链表设计者(因为list.h没有署名,所以很可能就是Linus Torvalds)认为双头(next、prev)的双链表对于HASH表来说"过于浪费",因而另行设计了一套用于HASH表应用的hlist数据结构--单指针表头双循环链表,从上图可以看出,hlist的表头仅有一个指向首节点的指针,而没有指向尾节点的指针,这样在可能是海量的HASH表中存储的表头就能减少一半的空间消耗。

    因为表头和节点的数据结构不同,插入操作如果发生在表头和首节点之间,以往的方法就行不通了:表头的first指针必须修改指向新插入的节点,却不能使用类似list_add()这样统一的描述。为此,hlist节点的prev不再是指向前一个节点的指针,而是指向前一个节点(可能是表头)中的next(对于表头则是first)指针(struct list_head **pprev),从而在表头插入的操作可以通过一致的"*(node->pprev)"访问和修改前驱节点的next(或first)指针。

    2. read-copy update
    在Linux链表功能接口中还有一系列以"_rcu"结尾的宏,与以上介绍的很多函数一一对应。RCU(Read-Copy Update)是2.5/2.6内核中引入的新技术,它通过延迟写操作来提高同步性能。

    我们知道,系统中数据读取操作远多于写操作,而rwlock机制在smp环境下随着处理机增多性能会迅速下降(见参考资料4)。针对这一应用背景,IBM Linux技术中心的Paul E. McKenney提出了"读拷贝更新"的技术,并将其应用于Linux内核中。RCU技术的核心是写操作分为写-更新两步,允许读操作在任何时候无阻访问,当系统有写操作时,更新动作一直延迟到对该数据的所有读操作完成为止。Linux链表中的RCU功能只是Linux RCU的很小一部分,对于RCU的实现分析已超出了本文所及,有兴趣的读者可以自行参阅本文的参考资料;而对RCU链表的使用和基本链表的使用方法基本相同。

    五、 示例
    附件中的程序除了能正向、反向输出文件以外,并无实际作用,仅用于演示Linux链表的使用。

    为了简便,例子采用的是用户态程序模板,如果需要运行,可采用如下命令编译:


    gcc -D__KERNEL__ -I/usr/src/linux-2.6.7/include pfile.c -o pfile
                            
    

    因为内核链表限制在内核态使用,但实际上对于数据结构本身而言并非只能在核态运行,因此,在笔者的编译中使用"-D__KERNEL__"开关"欺骗"编译器。

    展开全文
  • 本文给大家介绍Linux中文件目录权限的意义Linux的权限对于文件与目录的意义,涉及到linux 文件、目录、权限相关知识,对本文感兴趣的朋友一起学习吧
  • 最近学习linux的体会

    千次阅读 2014-01-27 11:58:20
    一、 对我而言,Linux最妙的地方在于:它既是一个拥有庞大生态圈支持的操作系统,同时又能很轻松地被...这也正是Beaglebone、树莓派、cubieboard等等开源硬件存在的意义。 二、 表面说是学习Linux,实际上是在
  • 前面章节提到,相比Windows系统,Linux系统有更好稳定性,...当然,这和Linux出色性能是分不开,否则,节约成本就没有任何意义。 2.良好可移植性及灵活性 Linux系统有良好可移植性,它几乎支持所有CPU平
  • Linux基础学习总结: man 命令 查询数据后面的数字代表什么意思:比如 man date ...刚开始学习Linux知识,感觉Linux的命令操作很有意思,以后会学习更多的Linux并总结, 希望大家一起学习,共同进步
  • 学习 Linux 同样要有一定的顺序和方法,当然这也是你学习本教程的意义。如果你是初学者,那么建议按照本教程的顺序阅读,不要跳跃,欲速则不达,揠苗也不见得能助长。 另外,强烈建议做好读书笔记,边看边记,边练习...
  • linux学习

    2021-02-25 19:41:51
    linux中文件夹的意义: root:根目录 home:普通用户的家目录 var:用来存放静态文件(一般存在/www/html文件夹下) linux的特点: (1)linux是一个开源免费的操作系统内核 (2)安全:针对不同的用户可以设定不同的权限属性,...
  • 如果大伙看到这个标题就觉得这篇文章会给出多么有深刻意义的见解,那我个人觉得您可以移步啦!首先我先澄清下:我写这篇文章目的,纯粹出于对Linux文件系统结构一知半解,所以在深入了解学习后出现一篇文章。 ...
  • 1.1用户及用户组存在的意义 用户是操作者在系统中的身份标识 组是逻辑概念,是用户的集合, 用户的存在为了限制权限 组的存在为了归类用户便于管理权限 1.2用户在系统中的存储方式 用户在系统中就是文件中...
  • 權限對檔案重要性 檔案是實際含有資料地方,包括一般文字檔、資料庫內容檔、二進位可執行檔(binary program)等等。 因此,權限對於檔案來說,他意義是這樣: r (read):可讀取此一檔案實際內容,如...
  •  Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作...
  • 】这节我们介绍Linux系统命令行中一些特定符号具有什么含义,以及命令行语法规则。●Linux命令行中特定符号含义比如我登录到系统中之后,会显示[xiaozhi@localhost~]$这一行符号,xiaozhi就是我登录到系统...
  • 学习 Linux 同样要有一定的顺序和方法,当然这也是你学习本教程的意义。如果你是初学者,那么建议按照本教程的顺序阅读,不要跳跃,欲速则不达,揠苗也不见得能助长。 另外,强烈建议做好读书笔记,边看边记,边练习...
  • 学习linux的意义: 平时浏览的网页,是由用户输入网址,由相应的服务器发送过来的; 平时玩的网游,账户中的装备等信息,也是由服务器来存储玩家的数据的。 我认为,从硬件上来说, 互联网=用户设备(手机,个人电脑...
  • 首先,写这篇文章初衷是写给那些想学习linux,并真正想用它做些有意义事情人。希望能帮助初学者找到正确学习linux思维或者方向。1、做好思想准备如果你想系统学习...
  • Linux学习

    2018-07-10 14:40:22
    有壳就有核,这里核就是指 UNIX/Linux 内核,Shell 是指“提供给使用者使用界面”软件(命令解析器),类似于 DOS 下 command(命令行)和后来 cmd.exe 。普通意义 Shell 就是可以接受用户输入命令...
  • 本节旨在介绍对于初学者如何学习 Linux 的建议,在这里不具体分析Linux的学习节点只分析对于零基础的伙伴的学习方法。那么如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Linux 的方法。 如何去...
  • 学习linux操作系统新手常犯几个错误 不要以根用户登录这是使用Unix惯例除非必须那么不要轻易在根用户下运行任何东西 文件命名混乱避免使用美元符$括弧和百分号%等特殊字符这些字符对于shell有着特殊意义可能会...
  • Linux学习方法

    2015-01-01 13:11:45
    学习任何一门技术,最好的初衷是什么——兴趣,其次是用处,那么学习Linux致歉,请再次问问自己,你确定Linux对你的意义吗,你确定Linux都能干点什么嘛,一个Linux学习视频分享给大家 http://bbs.ingben.com/forum
  • 一、 如何建立多用户 提醒大家一句,别一直使用root用户,因为root用户在系统中有着至高无上...再者,“Linux是一个真正意义上的多任务、多用户系统”,不体会一下Linux的特色岂不可惜。为了方便自己和别人使用,就在
  • Linux简单学习

    2019-01-03 19:12:50
    下面是我自己的复习总结,可以直接看上面链接。 总结: 1.第一节: 简介:严格的来讲,Linux 不算是一个操作系统,只是一个 Linux ...Linux的全称是GNU/Linux,这才算是一个真正意义上的Linux系统。用户通过She...
  • Linux 学习计划

    2018-11-16 19:42:49
    目前工作太无趣且充满了烦琐,看不到意义所在,偶然接触到linux,觉得字符界面很好玩,想深入学习并成为一名linux运维工作者。当前目标是学会和理解基础及当下最流行的linux运维知识,转行成为一个linux运维...
  • 意义:防止出现操作失误所造成Linux系统无法正常运行。 快照使用: (注意:拍摄快照时所创建虚拟机最好处于关闭状态!!!) 二、Vmware克隆 克隆:在复制一份。 A系统==>克隆技术==>B系统 克隆方式分...
  • 学习Linux为了什么?

    2017-11-15 21:08:00
    你为了什么才学习Linux?...如果你是认为玩linux很潮而去使用它,将全部精力用在如何安装各种Linux发行版本上,那么,这样“玩”根本没有多少意义。 雪源梅香也清楚,在当前这个社会形态下,做什么事,大多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,148
精华内容 459
关键字:

学linux的意义

linux 订阅