linux
文章平均质量分 80
z_ryan
这个作者很懒,什么都没留下…
展开
-
malloc的底层实现(ptmalloc)
前言 本文主要介绍了ptmalloc对于内存分配的管理。结合网上的一些文章和个人的理解,对ptmalloc的实现原理做一些总结。内存布局 介绍ptmalloc之前,我们先了解一下内存布局,以x86的32位系统为例: 从上图可以看到,栈至顶向下扩展,堆至底向上扩展, mmap 映射区域至顶向下扩展。 mmap 映射区域和堆相对扩展,直至耗尽虚拟地址空间中的剩余区域,...原创 2018-04-15 16:54:44 · 29463 阅读 · 5 评论 -
部分重要的SOCKET选项
首先介绍两个专门用来读取和设置socket文件描述符属性的系统调用getsockopt() && setsockopt()函数原形://读取socket文件描述符的属性int getsockopt(int sockfd , int level , int option_name , void* option_value , socklen_t* rest...原创 2018-05-28 17:58:05 · 1029 阅读 · 0 评论 -
frok 与 vfork
一、首先看一个程序:#include <stdio.h>#include <sys/wait.h>#include <unistd.h>Int main(){Int i = 0;For(i = 0 ; i < 2 ; i++){Fork();Printf(“-”);}Wait(NULL);Wait(NULL);Retur...原创 2018-06-25 19:04:40 · 1180 阅读 · 0 评论 -
linux五种IO模型
为了更好的理解五种IO模型,我们先来说一下几个概念:同步,异步,阻塞和非阻塞。同步和异步 这两个概念与消息的通知机制有关。同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。比如,调用readfrom系统调用时,必须等待IO操作完成才返回。 异步 异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个...原创 2018-07-01 12:43:36 · 14095 阅读 · 2 评论 -
I/O多路复用(select)
在之前写过一篇五种I/O模型,感兴趣的可以去看一下,今天主要讲其中的一种,那就是I/O多路复用。因为I/O多路复用可以使一个进程同时处理多个连接。这对提高程序的性能至关重要。对于IO复用的概念与理解在上文说的挺清楚了。本文主要说实现IO复用的系统调用。 在linux下,实现IO复用的系统调用主要有三个:select、poll 和 epoll,下面我们将对其进行逐一讲解。selec...原创 2018-07-02 21:18:47 · 5165 阅读 · 5 评论 -
I/O复用(poll)
上文说到的实现IO复用的函数中的select,本文接着介绍第二种poll。poll Poll相对于select来说突破了监听的文件描述符上限1024,最大文件描述符是系统所能允许的最大值,可以通过查看proc/sys/fs/file-max文件查看,这个值也可以改(通过limits.conf)。另一方面是实现了监听和就绪事件的分离。其他和select类似,也是在指定时间内轮询一定数量...原创 2018-07-02 21:27:05 · 2321 阅读 · 1 评论 -
IO复用(epoll)
在前面的文章中讲了实现IO复用的两种方式:select和poll。今天主要讲一个更为高效的函数epoll。epoll epoll能显著提高在大量链接中,只有少量活跃连接时的cpu利用率。因为,首先epoll可以复用监听的文件描述符集合,而不用每次在等待事件之前重新准备被监听的文件描述符集合。其次是因为epoll获取就绪事件时,不用遍历整个监听事件的集合,而是只需要遍历那些被内核I...原创 2018-07-03 23:47:03 · 1030 阅读 · 0 评论 -
IO复用的总结及一些问题
在前面的文章中,分别介绍了常用的三种实现IO多路复用的函数:select、poll、epoll今天对主要是对这三个函数的总结,以及对一些io复用的问题的总结。总结 系统调用 select poll epoll 事件集合 用户通过3个参数(readset、writeset,exceptset)分别传入感兴趣的可读、可写及异常等事件,内核通过对这些参数...原创 2018-07-04 12:33:18 · 1985 阅读 · 0 评论 -
浅析dup()和dup2()函数
前言 在linux下,一切皆文件。当文件被打开时,会返回文件描述符用于操作该文件,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2);)0表示标准输入,1表示标准输出,2表示标准错误。一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。 今天,我们主要说两个用于复制文件描述符的函数dup()和dup2()。dup()、dup2()函数...原创 2018-06-29 09:05:24 · 13091 阅读 · 1 评论 -
两种高效的并发模式
前言 我们都知道,并发编程的目的是让程序“同时”执行多个任务,提高效率。当一个程序是计算密集型的时,并发编程并没有优势,反而由于任务的切换时效率降低。但是,当一个程序是IO密集型时,采用并发编程会极大地提高cpu的利用率。因为IO操作的速度远远小于cpu的计算速度,所以让程序阻塞与IO操作上会浪费大量的CPU时间。而并发编程可以让阻塞于IO操作的线程主动放弃CPU,将执行权转移到其他线程。 ...原创 2018-07-06 18:38:58 · 2541 阅读 · 0 评论 -
线程控制原语小结
在本篇博客中主要总结一下linux下,线程的一些控制原语。 在Linux环境下,所有线程特点,失败均直接返回错误号。所以我们可以利用strerror()将错误信号所代表的具体错误打印出来。参数为发生错误所返回的错误信号。例如: ret = pthread_create(&tid ,NULL ,thrd_func ,NULL);if(ret != 0){ fpri...原创 2018-03-20 21:39:53 · 1268 阅读 · 0 评论 -
线程与进程的简单比较
本篇文章主要对线程与进程之间的区别作一简单总结,从内核实现的区别,双方的地址空间、共享的数据、操作原语的比较和多线程与多进程的区别这几方面,做一简单说明。1、Linux内核线程实现原理 Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。 1. 轻量级进程(light-weight process),也...原创 2018-03-20 20:32:03 · 1460 阅读 · 0 评论 -
C++中的“浅拷贝”与“深拷贝”
浅拷贝问题的提出 首先,我们先看一段代码:#include<string.h>using namespace std;class test{private: char* p; int len;public: test(const char* p) { len = strlen(p); this-&g...原创 2018-03-19 19:29:31 · 1252 阅读 · 0 评论 -
linux下测试写满cpu
在编写测试程序时,采用多线程,为了使线程不因为时间片耗尽而被切换,将线程的调度策略设置为SCHED_FIFO,优先级设置为最大,每个线程处理的逻辑为一个死循环,使线程一直处于RUNNING态,一直占用cpu。测试代码如下(testcpu.c):原创 2017-11-29 17:36:46 · 3033 阅读 · 0 评论 -
进程那些事
1、进程与程序的区别 程序,是指编译好的二进制文件,是静态的。在磁盘上,不占用系统资源例如:cpu,内存等。 进程,是一个抽象的概念,与操作系统原理紧密相关。进程是活跃的程序,占用系统资源。在内存中执行。包括了动态创建、调度和消亡的整个过程。一旦程序运行起来就会产生一个进程。在linux中,通过进程控制块来描述进程。例如:当我们编写一个c程序并将其编译之后,此时可执行的二进制文件并不能原创 2018-01-21 22:58:00 · 1213 阅读 · 0 评论 -
信号
1、概念 提及信号我们首先想到的是什么?有人想到赛场上裁判的信号枪,有人想到路口的红绿灯……;信号在我们生活中随处可见。在计算机中,信号是信息的载体,Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。在这篇文章中我们就主要聊聊信号。基本属性 信号的基本属性可以总结为两方面,即:软中断和时延性。 例如:A给B发送信号,B收到信号之前执行自己的代原创 2018-01-22 18:23:41 · 2401 阅读 · 1 评论 -
大小端及网络字节序
什么是大端模式、小端模式 “大端”和”小端”表示多字节值的哪一端存储在该值的起始地址处;小端存储在起始地址处,即是小端字节序;大端存储在起始地址处,即是大端字节序;具体的说: ①大端字节序(Big Endian):最高有效位存于最低内存地址处,最低有效位存于最高内存处; ②小端字节序(Little Endian):最高有效位存于最高内存地址,最低有效位存于最低内存处。原创 2018-01-22 23:58:21 · 30540 阅读 · 7 评论 -
c程序编译全过程解析
前言 当我们编写好c程序之后,经过编译便可运行得出结果。但是,我们所编写的程序别人可以看懂,但是机器却看不懂。为了在系统上运行这个程序,该源程序需要被其他程序转化为一系列低级机器语言指令,然后将这些指令按照可执行目标程序的格式打包并以二进制磁盘文件形式存储起来。这个过程就是编译过程。从源程序到可执行文件 源程序经过编译成为可执行文件。具体经历了以下几个过程:预处理–>编译–>汇编–原创 2018-01-23 17:40:41 · 1677 阅读 · 0 评论 -
c语言中的各种“零”
在c语言中,存在各种各样的“零”。例如:0,‘0’,NULL等。下面我们就具体介绍一下这些”零“:零的含义 零值 意义 备注 0 整型数据的0 0.0 实型数据的0 NULL 指针型数据的0 内存的0地址,用于初始化暂时不用的指针。或是标识已经被释放堆内存的指针。 ‘\0’ 转义字符型(ASCII值为0)原创 2018-01-24 21:41:07 · 9455 阅读 · 0 评论 -
mem系列函数源码实现
1、memcmp ①、原形:int memcmp(const void *buffer1, const void ,*buffer2, int count); ②、功能:比较内存区中指定count个字符的大小; ③、代码#include#includeint my_memcmp(const void *buf1,const void *buf2,int n);int原创 2018-02-03 22:26:38 · 1533 阅读 · 0 评论 -
str系列源码小结
1、strcmp ①、原形:int strcmp(const char * str1, const char * str2) ②、功能:比较两个字符串的大小 ③、代码#include#includeint my_strcmp(const char* str1,const char* str2);int main(){ int ret = 0; ch原创 2018-02-03 23:11:45 · 1342 阅读 · 0 评论 -
字符串分割函数--strtok与strsep
在c/c++中,字符串分割函数主要有两种:一是strtok函数,另一个就是strsep函数。下面我们对这两个函数作一个详细解释说明。1、strtok原形: char* strtok(char *str, const char *delim);功能: 分解字符串为一组字符串;str为要分割的字符串,delim为分隔符;返回值: 从str开头开始的一原创 2018-02-04 14:02:06 · 3639 阅读 · 2 评论 -
剖析linux下的零拷贝技术(zero-copy)
背景 大多数的网络服务器是基于server-client模式的。在这当中,下载是一个很常见的功能。此时服务器端需要将主机磁盘上的文件发送到客户端上去。传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。那么传统的I/O操作过程是咋样的呢?(下面是具体说明,以read和writ...原创 2018-03-18 20:47:52 · 9523 阅读 · 1 评论 -
C函数的调用过程原理和栈分析
在编程中,相信每个人对函数都不陌生,那么你真正理解函数的调用过程吗?当一个c函数被调用时,一个栈帧(stack frame)是如何被建立,又如何被消除的。本文主要就是来解决这些问题的,不同的操作系统和编译器可能有所不同,本文主要介绍在linux下的gcc编译器。栈帧 我们先来看一下,一个典型的栈帧的样子: 首先介绍一下这里面非两个重要的指针:ebp和esp; ...原创 2018-07-13 12:01:57 · 4524 阅读 · 0 评论