
linux内核分析
文章平均质量分 86
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
缺页中断处理过程
缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。当进程执行过程中发生缺页中断时,需要进行页面换入,步骤如下: 首先硬件会陷入内核,在堆栈中保存程序计数器。大多数机器将当前指令的各种状态信息保存在CPU中特殊的寄存器中。启动一个汇编代码例程保存通用寄存器及其它易失性信息,以免被操作系统破坏。这个例程将操作系统作为一个函数来调用。(在页面换入换原创 2015-07-09 17:56:36 · 19364 阅读 · 0 评论 -
linux内核分析--内核中的数据结构之队列(二)
内核中的队列是以字节形式保存数据的,所以获取数据的时候,需要知道数据的大小。如果从队列中取得数据时指定的大小不对的话,取得数据会不完整或过大。内核中关于队列定义的头文件位于: include/linux/kfifo.h头文件中定义的函数的实现位于:kernel/kfifo.c内核队列编程需要注意的是:队列的size在初始化时,始终设定为2的n次方使用队列之前将队列结构体中的原创 2014-02-25 11:20:15 · 3928 阅读 · 0 评论 -
深度分析同步、异步、阻塞、非阻塞
同步和异步与阻塞与非阻塞是在通信和I/O中常用的字眼,之前在许多地方同步与阻塞,异步与非阻塞常常被混为一谈,带来了许多混乱,其实同步、异步和阻塞、非阻塞是两个不同的概念。最近随着异步IO(AIO)越来越多的应用,对这两个概念进行区分和解释的文章也越来越多,但是问起身边的同学,能说清楚的倒也不多,所以我就顺便跟风写一篇科普文吧(越来越水了=_=)。同步(synchronous)和异步(async原创 2013-11-05 22:35:43 · 1339 阅读 · 0 评论 -
Linux 线程实现机制分析
一.基础知识:线程和进程按照教科书上的定义,进程是资源管理的最小单位,线程是程序执行的最小单位。在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持SMP以及减小(进程/线程)上下文切换开销。无论按照怎样的分法,一个进程至少需要一个线程作为它的指令执行体,进程管理着资源(比如cpu、内存、文件等等),而将线程分配到某个cpu上执行。一个进程当然可以拥有多个线程,此时,如果进程运行转载 2013-11-06 22:33:15 · 1065 阅读 · 0 评论 -
linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)
linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR) linux内核的三种调度方法:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHED_RR实时调度策略,时间片轮转 linux内核的三种调度方法:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先转载 2013-11-06 22:34:25 · 1230 阅读 · 0 评论 -
进程的同步与异步
关于同步和异步的解释,在以前的文章中也提到过,但是没有这么全。进程同步用来实现程序并发执行时候的可再现性。一.进程同步及异步的概念1.进程同步:就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事.就像早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成时,就开始吃饭.按照这个定义,其实绝大多数函数都是同步调用(例如si原创 2013-11-05 22:04:53 · 2574 阅读 · 0 评论 -
linux中的生产者和消费者问题--信号量 互斥 同步
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。生产者-消费者模型 生产原创 2013-11-05 16:23:18 · 6075 阅读 · 0 评论 -
关于linux中多进程(线程)同步和互斥
Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发访问会导致竞态,linux提供了多种解决竞态问题的方式,这些方式适合不同的应用场景。Linux内核是多进程、多线程的操作系统,它提供了相当完整的内核同步方法。内核同步方法列表如下:中断屏蔽原子操作自旋锁读写自旋锁顺序锁信号量读写信号量BKL(大内核锁)Seq锁一、并发与竞态:转载 2013-11-05 09:57:11 · 3986 阅读 · 0 评论 -
linux内核开发之并发控制(五)
"小涛,还有多少啊,你看我本来就开玩笑似的说说火车票,飞机票的事,看MM的事,你在眉飞色舞,鸡飞狗跳的没完了呢…”"啊?怎么这样呢,本来一个寝室,做人的差别就那么大嗫,平时不好好学习,有问题了问我,给你免费教学,还满腹牢骚,也太不够朋友了吧…."我锤着桌子说."朋友,我还不够朋友啊,你没听说吗:朋友为我,两肋插刀,我为朋友,插它两刀..“小王打断我,”听你念经似的,都三个小时了,你转载 2013-10-18 22:30:44 · 903 阅读 · 0 评论 -
linux内核开发之并发控制(四)
出招表七:信号量(信号量其实和自旋锁是一样的,就是有一点不同:当获取不到信号量时,进程不会原地打转而是进入休眠等待状态)Linux系统中与信号量相关的操作主要有一下4种:1)定义信号量 struct semaphore sem;2)初始化信号量 void sema_init (struct semphore *sem, int val); //设置sem为val转载 2013-10-18 22:30:12 · 917 阅读 · 0 评论 -
linux内核开发之并发控制(一)
“小涛,你说十一黄金周,火车站,飞机场那些售票系统咋没一个宕掉的呢。你不宕掉也没关系,来两个卖错票的,说不定哥就去上海看世博,去北京看青梅竹马的表妹了…”小王抱怨道。“晕死..哥鄙视你,你说都老大不小的人了,怎么脑子里天天都是MM之类的事了,能不能有点男子气概啊..”。“靠,能跟你比啊,你是饱汉不知饿汉饥,要是像你一样十一和…” "嗯,啊,哼哼.."没等他说完,我赶忙塞了转载 2013-10-18 22:23:48 · 1019 阅读 · 0 评论 -
LINUX使用的缓存,缓冲区高速缓存
Linux使用的缓存不管在硬件设计还是软件设计中,高速缓存是获得高性能的常用手段。Linux使用了多种和内存管理相关的高速缓存。1.缓冲区高速缓存: 缓冲区高速缓存中包含了由块设备使用的数据缓冲区。这些缓冲区中包含了从设备中读取的数据块或写入设备的数据块。缓冲区高速缓存由设备标识号和块标号索引,因此可以快速找出数据块。如果数据能够在缓冲区高速缓存中找到,则系统就没有必要在物理原创 2013-10-18 21:37:12 · 5065 阅读 · 1 评论 -
linux系统编程--信号
一,什么是中断?1.中断的基本概念中断是指计算机在执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的事件处理程序,待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。引起中断发生的事件被称为中断源。中断源向CPU发出的请求中断处理信号称为中断请求,而CPU收到中断请求后转到相应的事件处理程序称为中断响应。在有些情况下原创 2013-10-24 21:10:42 · 1328 阅读 · 0 评论 -
linux内核--使用内核队列实现ringbuffer(续)
一、ring buffer 在以前的一篇文章--网络编程中接受缓冲的ringbuf的简单实现介绍了一个自己写的ringbuffer,其实原理和linux内核中的队列很相似,思想是一样的,只不过处理的没有内核那么恰当巧妙,这里也可以使用linux内核中的队列实现之。/**@brief 仿照linux kfifo写的ring buffer *@atuher Anker date:原创 2014-02-25 11:39:20 · 6785 阅读 · 1 评论 -
linux内核分析--内核中使用的数据结构之哈希表hlist(三)
前言:1.基本概念:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。2. 常用的构造散列函数的方法散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数,数据元素将被更快地定位。散列表的常原创 2014-02-25 14:46:41 · 2312 阅读 · 3 评论 -
linux内核分析--内核中的数据结构之红黑树(四)
红黑树由于节点颜色的特性,保证其是一种自平衡的二叉搜索树。红黑树的一系列规则虽然实现起来比较复杂,但是遵循起来却比较简单,而且红黑树的插入,删除性能也还不错。所以红黑树在内核中的应用非常广泛,掌握好红黑树,即有利于阅读内核源码,也可以在自己的代码中借鉴这种数据结构。红黑树必须满足的规则:所有节点都有颜色,要么红色,要么黑色根节点是黑色,所有叶子节点也是黑色叶子节点中不包含数据非原创 2014-02-25 16:13:42 · 2960 阅读 · 1 评论 -
linux内核--段页式管理内存的方法
一、概念物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不原创 2015-01-28 19:50:28 · 3573 阅读 · 0 评论 -
linux内核分析--内核中的数据结构之双链表(一)
下面直接进入正题:在了解了基本内容看具体实现,只知道数据成员list的地址,怎样去访问自身以及其他成员呢?在include/linux/list.h头文件中可以看到这段代码!#define list_entry(ptr,type,member) / container_of(ptr,type,member)其中container_of这个宏在/include/linu原创 2014-02-24 21:12:10 · 5208 阅读 · 0 评论 -
linux内核分析--内核中的数据结构之双链表(续)
在解释完内核中的链表基本知识以后,下面解释链表的重要接口操作:1. 声明和初始化实际上Linux只定义了链表节点,并没有专门定义链表头,那么一个链表结构是如何建立起来的呢?让我们来看看LIST_HEAD()这个宏:#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) struct原创 2014-02-24 21:52:16 · 2032 阅读 · 0 评论 -
标准库函数和系统调用的区别
写在前面:所谓标准库函数,这里暂时讨论C语言的标准库函数。库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。一、标准库函数和系统调用的区别函数库调用系统调用在所有的ANSI C编译器版本中,C库函数是相同的各个操作系统的系统调原创 2014-04-08 14:17:17 · 6145 阅读 · 0 评论 -
linux下系统自启动级别的分析
一、redhat 下添加自启动程序、服务1、 有三种方法添加自启动服务 ln -s 在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0~6七个运行级别之一); chkonfig 命令行运行级别设置; ntsysv 伪图形运行级别设置;第一种方法多用于自己常见的脚本,第二种方法多用于系统已经存在的服务。这里只介绍第一种方法。原创 2013-07-24 23:17:09 · 2243 阅读 · 0 评论 -
linux内核中异步通知机制--信号处理机制
什么是异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序就不需要查询设备状态, 特像硬件上常提的“中断的概念”。 比较准确的说法其实应该叫做“信号驱动的异步I/O”,信号是在软件层次上对中断机制的一种模拟。阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意味着使用poll()来查询是否可访问,而异步通知则意味着设备通知应用程序自身可访问。(希望用这么一句话能表达我的意思原创 2014-04-08 11:09:44 · 6960 阅读 · 0 评论 -
关于进程、线程、轻量级进程的笔记
在现代操作系统中,进程支持多线程。进程是资源管理的最小单元;而线程是程序执行的最小单元。一个进程的组成实体可以分为两大部分:线程集合资源集。进程中的线程是动态的对象;代表了进程指令的执行。资源,包括地址空间、打开的文件、用户信息等等,由进程内的线程共享。线程有自己的私有数据:程序计数器,栈空间以及寄存器。Why Thread?(传统单线程进程的缺点)1. 现实中有很多需要并发处理的任务转载 2013-11-06 22:36:14 · 1076 阅读 · 0 评论 -
linux环境进程间通信:信号(上)
一、信号及信号来源信号本质 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后,功能更加强大,除了基原创 2013-11-06 22:48:14 · 1144 阅读 · 0 评论 -
linux环境进程间通信:信号(下)
一、信号生命周期从信号发送到信号处理函数的执行完毕对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生;信号在进程中注册完毕;信号在进程中的注销完毕;信号处理函数执行完毕。相邻两个事件的时间间隔构成信号生命周期的一个阶段。下面阐述四个事件的实际意义:信号"诞生"。信号的诞生指的是触发信原创 2013-11-06 22:46:48 · 1159 阅读 · 0 评论 -
ubuntu 下为何没有/etc/inittab文件 linux下程序的启动流程
Linux 内核启动 init ,init进程ID是1,是所有进程的父进程,所有进程由它控制。Ubuntu 的启动由upstart控制,自9.10后不再使用/etc/event.d目录的配置文件,改为/etc/init。查看当前的运行级别,Ubuntu 桌面默认是2。?1runlevel原创 2013-08-12 16:05:45 · 5722 阅读 · 0 评论 -
谈谈守护进程与僵尸进程
04年时维护的第一个商业服务就用了两次fork产生守护进程的做法,前两天在网上看到许多帖子以及一些unix书籍,认为一次fork后产生守护进程足够了,各有道理吧,不过多了一次fork到底是出于什么目的呢?进程也就是task,看看内核里维护进程的数据结构task_struct,这里有两个成员:[cpp] view plaincopystruct task_st转载 2014-04-16 22:16:51 · 952 阅读 · 0 评论 -
linux内核分析--内核中的数据结构之红黑树(续)
#include#include #include "kn_common.h"MODULE_LICENSE("Dual BSD/GPL");struct student{ int id; char* name; struct rb_node node;};static int insert_student(struct student*, struct r原创 2014-02-25 16:31:57 · 1869 阅读 · 0 评论 -
linux内核开发之并发控制(三)
算了,既然给你那么多秘籍了,也不在乎这剩下的两三招:出招表五:顺序锁(seqlock)使用顺序锁,读执行单元绝不会被写执行单元阻塞,同时写执行单元也不需要等待所有读执行单元完成读操作后才进行写操作。但是写执行单元之间仍然是互斥的。如果读执行单元在读操作期间,写执行单元已经发生了操作,那么,读执行单元必须重新读取数据,以便确保得到的数据是完整的。致命弱点:顺序锁有一个限制,就转载 2013-10-18 22:27:53 · 1112 阅读 · 0 评论 -
linux内核开发之并发控制(二)
上集说到哪儿了呢?瞧这记性,什么?说到"天要下雨,娘要嫁人"那段。。这是谁在答话,废话,我当然知道讲到这里了,我是说驱动讲到哪里了。算了,不管了..话说Linux开源社区的开发者们做了什么工作呢,很简单:利用spin_lock()/spin_unlock()作为自旋锁的基础,将它们和关中断local_irq_disable()/开中断local_irq_enable(),关底半部loc转载 2013-10-18 22:25:22 · 889 阅读 · 0 评论 -
linux内核--系统调用(四)
一. 概述 系统调用是应用程序与内核交互的一种方式。系统调用作为一种接口,通过系统调用,应用程序能够进入操作系统内核,从而使用内核提供的各种资源,比如操作硬件,开关中断,改变特权模式等等。首先,系统调用是一个软中断,既然是中断那么一般就具有中断号和中断处理程序两个属性,Linux使用0x80号中断作为系统调用的入口,而中断处理程序的地址放在中断向量表里。 二. 过程原创 2013-10-01 22:31:25 · 1985 阅读 · 0 评论 -
linux内核--进程管理(二)
一、进程 进程就是出于执行期的程序,但进程并不仅仅局限于一段可执行的程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核的内部数据,处理器状态,一个或多个具有内存映射的内存地址空间以及一个或多个执行线程,存放全局变量的数据段。 执行线程,进程线程,是在进程中活动的对象。每个线程都拥有一个独立的程序计数器、进程栈和一组进程寄存器。内核调用的对象是线程不是进程。程序本原创 2013-09-28 16:11:23 · 1623 阅读 · 0 评论 -
linux内核--进程与线程
在《linux内核设计与实现》中第三章讲解了进程管理,在关于进程和线程的概念之间的区别还是由点模糊。书中说道: 进程就是处于执行期的程序。但进程并不仅仅局限于一段可执行程序代码。通常进程还要包含其他资源,像打开的文件,挂起的信号,内核内部数据,持利器状态,一个或多个具有内存映射的内存地址空间以及一个或多个执行线程,当然还包括用来存放全局变量的数据段等。 然而每一个线程都拥有一个原创 2013-09-29 10:39:56 · 4687 阅读 · 0 评论 -
linux内核--进程地址空间(三)
引言:上篇博文中,我们简单的介绍了Linux虚拟存储器的概念及组成情况,下面来分析分析进程的创建和终结及跟进程地址空间的联系。这里首先介绍一个比较重要的概念:存储器映射在Linux系统中,通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容,这个过程称为存储器映射。存储器映射为共享数据、创建新的进程以及加载程序提供了一种高效的机制。虚拟存储器区域可以映射原创 2013-09-30 16:40:12 · 2177 阅读 · 0 评论 -
linux内核--自旋锁的理解
自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对于UP系统,自旋锁仅做抢占和中断操作,没有实现真正的“自旋”。如果配置了CONFIG_DEBUG_SPINLOCK,那么自旋锁按照SMP系统来编译。 但是为什么在UP系统中不需要真正的“带有自旋的”自旋锁呢?其实在理解了自旋锁的概念和由来,这个问题就迎刃而解了。所以我重新查找了关于自旋锁的资料,认真原创 2013-09-30 17:35:30 · 2930 阅读 · 0 评论 -
linux内核--进程管理(一)
进程和线程的概念我就不讲了。总之,你记着:内核调度的对象是线程,而不是进程。linux系统中的线程很特别,它对线程和进程并不做特别区分。进程的另外一个名字叫任务(task).我和作者一样,习惯了把用户空间运行的程序叫做进程,把内核中运行的程序叫做任务。 内核把进程存放在叫做任务队列(task list)的双向循环链表中,链表中的每一项都是类型为task_struct,名称叫做进程描述原创 2013-09-27 22:26:13 · 2029 阅读 · 0 评论 -
linux内核--添加系统调用
1、目的:在现有的系统中添加一个不用传递参数的系统调用。这个系统调用的功能是实现遍历系统中的所有进程。实验主要内容:添加系统调用的名字利用标准 C 库进行包装添加系统调用号在系统调用表中添加相应表项sys_mysyscall 的实现编写用户态测试程序2、步骤:a)安装依赖库:[plain] view plaincopysudo apt-g原创 2013-09-29 16:57:08 · 3067 阅读 · 0 评论 -
linux内核--进程调度(一)
引言:无论是在批处理系统还是分时系统中,用户进程数一般都多于处理机数、这将导致它们互相争夺处理机。另外,系统进程也同样需要使用处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一个进程,以使之执行。 进程调度的具体功能可总结为如下几点: 作为进程调度的准备,进程管理模块必须将系统中各进程的执行情况和状态特征记录在各进程的PCB表中。并且,根据各原创 2013-09-29 15:20:01 · 9925 阅读 · 0 评论 -
异步(Asynchronous)机制(三)--和同步机制的本质区别
矛盾很久,不确定是否该用“本质”这个词,觉着自己好像还没资格这么说。其实,这篇探讨的是换个角度看待同步和异步的差异。 为了分析同步和异步的区别,还是以前两篇中出现过的Client发送request和接收response的程序为例。如果是同步机制的程序,大致应该是这样的(只是一些伪代码):[java] view plaincopySocket sock = con转载 2013-10-05 21:32:00 · 1759 阅读 · 0 评论 -
异步(Asynchronous)机制(二)--异步消息机制以及Hadoop RPC
上篇说了半天,却回避了一个重要的问题:为什么要用异步呢,它有什么样的好处?坦率的说,我对这点的认识不是太深刻(套句俗语,只可意会,不可言传)。还是举个例子吧:比如Client向Server发送一个request,Server收到后需要100ms的处理时间,为了方便起见,我们忽略掉网络的延迟,并且,我们认为Server端的处理能力是无穷大的。在这个use case下,如果采用同步机制,即Clie转载 2013-10-05 21:30:29 · 1576 阅读 · 0 评论