
Linux内核
文章平均质量分 64
继续微笑lsj
眼界决定未来
展开
-
epool边沿触发和水平触发
LT(level triggered)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可能性要小一点。传统的select/poll都是这种模型的代表.ET(edge-triggered)是高速工作方式,只支持转载 2016-02-28 08:37:00 · 753 阅读 · 0 评论 -
动态内存管理详解:malloc/free/new/delete/brk/mmap
c++ 内存获取和释放 new/delete,new[]/delete[]c 内存获取和释放 malloc/free, calloc/realloc上述8个函数/操作符是c/c++语言里常用来做动态内存的申请和释放的,要理解这些接口,大概需要下面几个维度的了解:1. 了解OS的进程空间模型,一个进程的地址空间,一般划分为内核区、用户区,用户区又划分为栈区、堆区、数据转载 2015-01-22 00:08:26 · 948 阅读 · 0 评论 -
ptmalloc,tcmalloc和jemalloc内存分配策略研究
站点比较恶心,贴一个连接: http://www.owent.net/2013/07/ptmalloctcmalloc和jemalloc内存分配策略研究.html转载 2015-01-22 00:41:11 · 1800 阅读 · 0 评论 -
mmap
mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。#includevoid* mmap(void* start,size_t length,int prot,int flags,int fd,off_t offset);int munmap(void* start,转载 2015-01-21 23:44:08 · 736 阅读 · 0 评论 -
内存分配的原理__进程分配内存有两种方式,分别由两个系统调用完成:brk和mmap(不考虑共享内存)
如何查看进程发生缺页中断的次数? 用ps -o majflt,minflt -C program命令查看。 majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。 这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?转载 2015-01-22 00:14:51 · 1014 阅读 · 0 评论 -
localtime与localtime_r
localtime与localtime_r在写代码的时候,经常会用到读取系统时间的函数。很多人都会调用localtime函数来将时间转换本地时间,但是大家往往会忽略了一点,localtime函数不是线程安全的。如果在多线程里调用localtime函数,很可能会出现问题。struct tm *localtime(const time_t *clock);这个函数在返回的时转载 2014-10-03 07:36:32 · 875 阅读 · 0 评论 -
Mutex与spin lock的性能对比
锁机制(lock) 是多线程编程中最常用的同步机制,用来对多线程间共享的临界区(Critical Section) 进行保护。Pthreads提供了多种锁机制,常见的有:1) Mutex(互斥量):pthread_mutex_***2) Spin lock(自旋锁):pthread_spin_***3) Condition Variable(条件变量):pthread_con_转载 2014-08-18 17:01:56 · 1993 阅读 · 0 评论 -
epoll的实现原理
1.通俗的类比假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面。如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.select版大妈做的是如下的事情:比如同学甲的朋友来了,select版大妈比较笨,她带着朋友挨转载 2014-06-10 17:17:40 · 1205 阅读 · 0 评论 -
linux中select()函数分析
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式转载 2014-06-07 14:15:01 · 812 阅读 · 0 评论 -
Linux的进程/线程间通信方式总结
Linux系统中的进程间通信方式主要以下几种:同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式:包括信号量(Semaphore), 消息队列(Message Queue), 和共享内存(Shared Memory)网络主机间的进程通信方式转载 2014-03-27 17:23:56 · 1162 阅读 · 0 评论 -
sbrk/brk的用法
sbrk/brk: brk和sbrk主要的工作是实现虚拟内存到内存的映射.在GNUC中,内存分配是这样的: 每个进程可访问的虚拟内存空间为3G,但在程序编译时,不可能也没必要为程序分配这么大的空间,只分配并不大的数据段空间,程序中动态分配的空间就是从这一块分配的。如果这块空间不够,malloc函数族(realloc,calloc等)就调用sbrk函数将数据段的下界移动,sbrk函数在原创 2013-11-06 10:18:27 · 1770 阅读 · 0 评论 -
linux内核-内存管理(上)
摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存地使用方法。力求从外自内、水到渠成地引导网友分析Linux地内存管理与使用。在本章最后我们给出一个内存映射地实例,帮助网友们理解内核内存管理与用户内存管理之间地关系,希望大家最终能驾驭Linux内存管理。 前言内存管理一向是所有操作系统书籍不惜笔墨重点讨论的内容,无转载 2013-06-09 19:30:14 · 1415 阅读 · 0 评论 -
Linux内核-内存管理之高端内存
看了linux内核内存管理,参考网上的意见整理了一下,认为两个比较好的博文:http://blog.youkuaiyun.com/chobit_s/article/details/6029527http://blog.youkuaiyun.com/do2jiang/article/details/54956751.页框管理 Linux采用4KB页框大小作为标准的内存分配单元。内原创 2013-06-06 13:19:11 · 2101 阅读 · 2 评论 -
EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接
EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接EWOULDBLOCK用于非阻塞模式,不需要重新读或者写EINTR指操作被中断唤醒,需要重新读/写在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non转载 2015-02-16 13:08:14 · 6893 阅读 · 2 评论 -
非阻塞connect编写方法介绍
TCP连接的建立涉及到一个三次握手的过程,且SOCKET中connect函数需要一直等到客户接收到对于自己的SYN的ACK为止才返回,这意味着每个connect函数总会阻塞其调用进程至少一个到服务器的RTT时间,而RTT波动范围很大,从局域网的几个毫秒到几百个毫秒甚至广域网上的几秒。这段时间内,我们可以执行其他处理工作,以便做到并行。在此,需要用到非阻塞connect。本文主要介绍了非阻塞conn转载 2015-03-19 00:00:16 · 983 阅读 · 0 评论 -
setsockopt、getsockopt详细介绍
一、 int PASCAL FAR setsockopt( SOCKET s, int level, int optname, const char FAR* optval, int optlen); 设置套接口的选项。 s:标识一个套接口的描述字。 level:选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。 optname:需设置的选项。 opt转载 2015-03-19 00:19:24 · 908 阅读 · 0 评论 -
memory order
Background 很久很久很久以前,CPU忠厚老实,一条一条指令的执行我们给它的程序,规规矩矩的进行计算和内存的存取。 很久很久以前, CPU学会了Out-Of-Order,CPU有了Cache,但一切都工作的很好,就像很久很久很久以前一样,而且工作效率得到了很大的提高。 很久以前,我们需要多个CPU一起工作,于是出现了传说中的SMP系统,每个CPU都有独立的Cache,都会乱序执转载 2016-02-26 23:42:23 · 608 阅读 · 0 评论 -
巧夺天工的kfifo
Linux kernel里面从来就不缺少简洁,优雅和高效的代码,只是我们缺少发现和品味的眼光。在Linux kernel里面,简洁并不表示代码使用神出鬼没的超然技巧,相反,它使用的不过是大家非常熟悉的基础数据结构,但是kernel开发者能从基础的数据结构中,提炼出优美的特性。kfifo就是这样的一类优美代码,它十分简洁,绝无多余的一行代码,却非常高效。关于kfifo信息如下:本文分转载 2016-02-26 23:26:43 · 529 阅读 · 0 评论 -
多路IO复用
通过单线程可以监听多个io事件;1)select需要一次内存拷贝到内核,epoll本身构建与内核;2)epoll支持的socket数量更多;3)epoll不是轮询原创 2016-03-08 23:12:00 · 662 阅读 · 0 评论 -
进程上下文
对于服务器的优化,很多人都有自己的经验和见解,但就我观察,有两点常常会被人忽视 – 上下文切换 和 Cache Line同步 问题,人们往往都会习惯性地把视线集中在尽力减少内存拷贝,减少IO次数这样的问题上,不可否认它们一样重要,但一个高性能服务器需要更细致地去考察这些问题,这个问题我将分成两篇文章来写:1)从一些我们常用的用户空间函数,到linux内核代码的跟踪,来看一个上下文切换是如何转载 2016-02-21 13:31:11 · 525 阅读 · 0 评论 -
脏页回写
由于页高速缓存的缓存作用,写操作实际上会被延迟。当页高速缓存中的数据比后台存储的数据更新时,那么该数据就被称为脏数据。在内存中积累起来的页最终必须被写回磁盘。在以下两种情况发生时,脏页被写回磁盘:1. 当空闲的内存低于一个特定的阈值时,内核必须将脏页写回磁盘,以便释放内存。2. 当脏页在内存中驻留时间超过一个特定的阈值时,内核必须将超时的脏页写回磁盘,以确保脏页不会无限期地驻留在内转载 2016-03-01 23:13:15 · 4658 阅读 · 1 评论 -
zero-copy
许多web应用都会向用户提供大量的静态内容,这意味着有很多data从硬盘读出之后,会原封不动的通过socket传输给用户。这种操作看起来可能不会怎么消耗CPU,但是实际上它是低效的:kernal把数据从disk读出来,然后把它传输给user级的application,然后application再次把同样的内容再传回给处于kernal级的socket。这种场景下,application实际上只是作为转载 2016-03-01 22:37:03 · 416 阅读 · 0 评论 -
sigaction 函数
使用 sigaction 函数: signal 函数的使用方法简单,但并不属于 POSIX 标准,在各类 UNIX 平台上的实现不尽相同,因此其用途受到了一定的限制。而 POSIX 标准定义的信号处理接口是 sigaction 函数,其接口头文件及原型如下: #include int sigaction(int signum, const struct sigaction *转载 2016-01-30 21:59:47 · 673 阅读 · 0 评论 -
原子性操作atomic_t
在任何处理器平台下,都会有一些原子性操作,供操作系统使用,我们这里只讲x86下面的。在单处理器情况下,每条指令的执行都是原子性的,但在多处理器情况下,只有那些单独的读操作或写操作才是原子性的。为了弥补这一缺点,x86提供了附加的lock前缀,使带lock前缀的读修改写指令也能原子性执行。带lock前缀的指令在操作时会锁住总线,使自身的执行即使在多处理器间也是原子性执行的。xchg指令不带lock前转载 2016-01-30 09:17:49 · 711 阅读 · 0 评论 -
IO多路复用的几种实现机制的分析
elect,poll,epoll都是IO多路复用的机制。所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从转载 2015-11-20 23:51:04 · 855 阅读 · 0 评论 -
socket阻塞与非阻塞
1. 设置阻塞和非阻塞1) 获取文件的flags,即open函数的第二个参数: flags = fcntl(fd,F_GETFL,0);2) 设置文件的flags: fcntl(fd,F_SETFL,flags);3) 增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞: flags = fcntl(fd转载 2015-11-20 23:45:33 · 953 阅读 · 0 评论 -
块设备
基本概念 块设备(blockdevice)--- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存放暂时的数据,待条件成熟后,从缓存一次性写入设备或者从设备一次性读到缓冲区。字符设备(Character device)---是一个顺序的数据流设备,对这种设备的读写是按字符进行的,而且这些字符是连续地形成一个数据流。他不具备缓冲区,所转载 2015-06-05 19:41:54 · 687 阅读 · 0 评论 -
Linux 软件看门狗 watchdog
Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需转载 2015-05-16 21:39:12 · 968 阅读 · 0 评论 -
Linux内核-信号之signal处理机制
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 一、信号的基本概念 本节先介绍信号的一些基本概念,然后给出一转载 2013-06-19 13:06:02 · 3291 阅读 · 0 评论 -
Linux内核-进程内核栈、用户栈
1.进程的堆栈 内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。2.进程用户栈和内核栈的切换转载 2013-07-07 10:35:04 · 2316 阅读 · 0 评论 -
Linux内核-循环链表
写的很全面的一篇文章,手贱了,转了。 http://blog.chinaunix.net/uid-14114479-id-2932024.html 本文详解了内核中面向对象的list结构的原理,以及如何以list为内嵌对象来构造自己的链表结构,如何从内嵌list对象获得自定义的对象指针;探讨了各种宏或者函数的详细使用方法及怎样以通用list结构来操作自转载 2013-06-07 12:52:26 · 1711 阅读 · 0 评论 -
Linux内核-内存管理之伙伴系统算法
1.伙伴系统算法的提出 内核应该为分配一组连续的页框而建立一种健壮、高效的分配策略。为此,必须解决著名的内存管理问题,也就是所谓的外锁片问题(external fragmentation)。频繁的请求和释放不同大小的一组连续页框,必然导致在已分配的块内分散了许多小块的空闲页框。由此带来的问题时,即使有足够的空闲页框可以满足请求,但要分配一个大块的连续页框无法满足。原创 2013-06-07 17:01:45 · 1776 阅读 · 0 评论 -
Linux内核-内存管理(下)
物理内存管理(页管理)Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数4k(在i386体系结构中)大小页,从而分配和回收内存的基本单位便是内存页了。利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存[1],系统可以东一页、西一页的凑出所需要的内存供进程使用。虽然如此,但是实际上系统使用内存还是倾向于分配连续的内存块,因为分配连续内存时,页表不需转载 2013-06-09 19:31:51 · 1377 阅读 · 0 评论 -
Linux内核-信号之signal处理函数
alarm(设置信号传送闹钟)相关函数 signal,sleep表头文件 #include定义函数 unsigned int alarm(unsigned int seconds);函数说明 alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。如果参数seconds 为0,则之前设置的闹钟会被取消,并将剩下的时间返回。返回值返回之前闹钟转载 2013-06-19 13:47:39 · 1420 阅读 · 0 评论 -
硬链接和软连接的区别
要说明这个问题,先说明下liunx下文件和目录的本质。事实上,在liunx上,目录也是文件的一种,它是储存了一张表的文件。例如有一个叫程序的文件夹,里面有两个文件1和2.在那张目录表内。它的内容是这样的名称 节点1 3382 228那么什么是节点呢?c语言我们都学过,我们简单地把节点号理解成一个数组的下标,把内存看成一个大数组,每个文件都可以看成一个数组中的一个元素,而知道了节转载 2013-06-29 22:45:09 · 1311 阅读 · 0 评论 -
Linux内核-进程退出
进程退出表示进程结束运行。Linux系统中进程的退出分为正常退出和异常退出。 (1)正常退出:在main函数中执行return返回;调用exit函数;调用_exit()函数。 (2)异常退出:调用abort;进程收到某个信号,该信号使程序终止。 不管哪中方式都会执行内核中同样一段代码。这段代码用来关闭进程所有打开的文件描述符,释放它所占有原创 2013-07-07 15:13:51 · 2124 阅读 · 0 评论 -
__asm__ __volatile__内嵌汇编用法简述
__asm__ __volatile__内嵌汇编用法简述 在阅读C/C++原码时经常会遇到内联汇编的情况,下面简要介绍下__asm__ __volatile__内嵌汇编用法。因为我们华清远见教学平台是ARM体系结构的,所以下面的示例都是用ARM汇编。带有C/C++表达式的内联汇编格式为:__asm__ __volatile__("Instruction List" : Output转载 2013-07-07 16:36:17 · 1196 阅读 · 0 评论 -
Linux内核-进程wait
子进程先与父进程退出时,如果父进程没有调用wait和waitpid函数,则子进程进入僵死状态。。 父进程一旦调用了 wait,就被挂起,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait 就会收集这个子进程的信息, 并把它彻底销毁后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。wa转载 2013-07-07 15:48:13 · 1106 阅读 · 0 评论 -
Linux内核-进程之fork、vfork和clone
各种大神的混合,做个笔记。 http://blog.sina.com.cn/s/blog_7598036901019fcg.html http://blog.youkuaiyun.com/kennyrose/article/details/7532912 http:/原创 2013-06-28 13:25:46 · 2330 阅读 · 0 评论 -
linux用户态和内核态理解
1、特权级 Intel x86架构的cpu一共有0~4四个特权级,0级最高,3级最低,硬件上在执行每条指令时都会对指令所具有的特权级做相应的检查。硬件已经提供了一套特权级使用的相关机制,软件自然要好好利用,这属于操作系统要做的事情,对于UNIX/LINUX来说,只使用了0级特权级别和3级特权级。也就是说在UNIX/LINUX系统中,一条工作在0级特权级的指令转载 2013-06-19 16:23:36 · 1377 阅读 · 0 评论