- 博客(65)
- 资源 (10)
- 收藏
- 关注
原创 数据缓冲区高速缓冲
数据缓冲区高速缓冲缓冲头部一个缓冲区有两部分组成:一个含有磁盘上数据的存储数组和一个标识该缓冲区的缓冲头部。一个缓冲区的数据与文件系统上一个逻辑磁盘块中的数据相对应,并且通过考察缓冲头部中的标识字段来识别缓冲区内容。缓冲区是磁盘块在主存中的拷贝,磁盘块的内容映射到缓冲区中。但是同一时刻,一个磁盘块不能映射到多个缓冲区中。设备号字段和块号字
2015-09-26 15:19:36 2999 1
原创 内部网关协议RIP
内部网关协议RIPRIP协议的特点:1)仅和相邻路由器交换信息2)路由器交换的信息是当前本路由器所知道的全部信息,即是自己的路由表3)按固定的时间间隔交换路由信息路由表中最重要的信息:1)到某个网络的最短距离2)应经过的下一跳地址距离向量算法:目的是找出到每个网络的最短距离。对每个相邻路由器发过来的RIP报文,都进行如下操作:1)先修改报文中
2015-09-24 16:48:41 2026
原创 IP协议
IP 协议IP数据报首部的固定部分的各字段1)版本:占4位,指IP协议的版本2)首部长度:占4位,可表示最大数15,首部最大长度15*4字节=60字节,最小值5,因此首部最小值是5*4字节=20字节3)区分服务:占8位,前三位是优先权(现在已经被忽略),最后一位是未用位必须置0,中间4位分别是最小时延、最大吞吐量、最高可靠性、最小费用(4位只能选择一
2015-09-23 22:30:59 849
原创 集线器、交换机、路由器、网关
集线器(HUB) 集线器就是将网线集中到一起的机器,也就是多台主机和设备的连接器。集线器的主要功能是对接收到的信号进行同步整形放大。集线器在OSI/RM中的物理层。集线器的基本功能是信息分发,它把一个端口接收的所有信号向所有端口分发出去。 集线器的工作原理很简单,比如有一个具备8个端口的集线器,共连接了8台电脑。集线器处于网络的“中心”,通过集线器对信号进行转发,8台电脑之
2015-09-23 21:17:21 1077
原创 CSMA/CD 协议
CSMA/CD 协议(载波监听多点接入/碰撞检测)网络适配器的作用网络适配器里面装有处理器和存储器;适配器和局域网之间的通信是通过电缆或双绞线以串行的传输方式进行的,但是适配器和计算机之间的通信则是通过计算主板上的IO总线以并行传输的;适配器的一个重要功能就是进行数据串行传输和数据并行传输的转换。操作系统中安装有网络适配器的设备驱动程序来管理网络适配器。适配器接收和
2015-09-23 18:28:36 2623
原创 哈希表
哈希表哈希表是一种高效的数据结构。它的最大优点就是把数据存储和查找和所消耗的时间大大减少,几乎可以看成是O(1),而代价是消耗较多的内存。哈希表的基本原理哈希表的基本原理是使用一个下标范围比较大的数组A来存储元素,设计一个函数h,对于要存储的线性表的每个元素node,取一个关键字key,算出一个函数值h(key),把h(key)作为数组下标,用A[h(key)]来存
2015-09-22 13:38:25 441
原创 二叉排序树的相关操作
二叉排序树定义:1)若它的左子树非空,则左子树的所有节点都小于它的根节点;2)若它的右子树非空,则右子树的所有节点都小于它的根节点;3)它的左右字数也分别为二叉排序树。二叉排序树的创建和插入节点代码实现int BST_Insert(TreeNode **root, int data){ if(NULL == *root){ (*root) = (Tree
2015-09-21 23:46:38 519
原创 内核导言之进程概述
进程概述一个进程是一个程序的执行,它是有一序列有格式字节组成的,这些有格式字节被解释成机器指令(正文)、数据和栈区。可以有几个进程是一个程序的实例,一个进程遵循着一个严格的指令序列执行,这个指令序列是自包含的,不会跳转到其他进程的指令序列上。 UNIX系统上的进程都是被系统调用fork创建的实体。除了0进程以外,每个进程都是被另外一个进程执行系统调用fork时
2015-09-18 17:52:34 512
原创 内核导言之文件子系统概貌
文件子系统概貌索引节点(index node):描述了文件数据在磁盘上的布局,并且包含诸如文件所有者、文件存储许可权和存取时间等其他信息。每个文件都有一个索引节点,都是它可以有多个名字。索引节点被存储在文件系统上,当需要操作文件的时候,内核把他们读入内存的索引节点表中。文件表:是一个全局核心结构,每个表项保存着文件中的字节偏移量(下一次开始读或写的位置)和打
2015-09-18 11:28:23 509
原创 内核导言之操作系统体系结构
UNIX 操作系统的体系结构文件子系统使用一个缓冲机制存取文件数据,缓冲机制调节在内核与二级存储设备之间的数据流。缓冲机制同块IO设备驱动程序交互,以便启动往内核去的数据传送及从内核来的数据传送。设备驱动程序是用来控制外围设备操作的内核模块。文件子系统还可以在没有缓存机制的干预下直接与“原始”IO设备驱动程序交互。原始设备,有时被称为字符设备,包括所有不是块
2015-09-18 11:07:06 652
转载 STL之set 的用法
set 容器的用法1.关于setC++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组,list封装了链表,map和set封装了二叉树等,在封装这些数据结构的时候,STL按照程序员的使用习惯,以成员函数方式提供的常用操作,如
2015-09-11 16:57:55 964
原创 STL之list 用法
List 容器的使用list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。使用list容器之前必须加上头文件:#include;list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using n
2015-09-11 15:33:45 528
原创 STL之vector用法
vector 用法vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的.它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的
2015-09-11 14:31:00 536
原创 二叉树的镜像(非递归)
二叉树的镜像代码实现int tree_mirror(TreeNode *bt){ if(NULL == bt){ cout<<"tree is empty\n"; } TreeNode *temp; stack st; while(1){ temp = bt->lchild; bt->lchild = bt->rchild; bt->rchild = tem
2015-09-11 11:02:46 460
原创 二叉树的节点个数和深度(非递归)
二叉树的节点个数代码实现int count_tree(TreeNode *bt){ int count = 0; if(NULL == bt){ //cout<<"tree is empty\n"; return 0; } queue que; que.push(bt); while(!que.empty()){ bt = que.front(); que.p
2015-09-11 10:50:19 1390 1
原创 二叉树的四种遍历方式(非递归和递归)
二叉树的四种遍历方式二叉树的创建--先序非递归创建#include#include#include#includeconst int OK = 1;const int ERROR = 0;using namespace std;typedef struct TreeNode{ int data; struct TreeNode *lchild,*rchild;}Tr
2015-09-11 10:45:08 493
原创 创建守护进程的步骤
守护进程编程步骤1. 创建子进程,父进程退出 所有工作在子进程中进行 形式上脱离了控制终端2. 在子进程中创建新会话 setsid()函数 使子进程完全独立出来,脱离控制3. 改变当前目录为根目录 chdir()函数 防止占用可卸载的文件系统 也可以换成其它路径4. 重设文件权限掩码 umask()函数 防止继承的文件创建屏蔽字拒
2015-09-08 11:26:31 581
原创 经典同步问题--读者和写者问题
读者--写者问题读者--写者问题是互斥问题的一个概括。一组并发的线程要访问一个共享的对象,例如一个主存中的数据结构,或者是磁盘上的数据库。有些线程只读对象,其他线程只修改对象。只读对象的线程叫做读者,修改对象的线程的对象叫做写者。写者必须拥有对对象的独占的访问,而读者可以和其他读者共享对象。按照读者和写者的优先级分为两类问题:一、读者优先读者优先,要求不要读者等待,
2015-09-03 20:23:31 2735 1
原创 经典同步问题--生产者和消费者
生产者--消费者问题 生产者和消费者线程共享一个有n个槽的有限缓冲区。生产者生产的新项目不断插入有限缓冲区,消费者不停地从缓冲区取出项目。这里涉及操作共享变量的同步问题 还有有限缓冲区的问题,操作共享缓冲区时,需要设置互斥变量让线程同步;缓冲区满的时候生产者停止生产,等待缓冲区有空间;缓冲区空的时候,消费者不能忘缓冲区取,等待缓冲区有产品。图文示例
2015-09-03 17:33:16 823
原创 排序算法(三)
堆排序堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行操作的时候将堆视为一颗完全二叉树,树种每个节点与数组中的存放该节点值的那个元素对应。所以堆又称为二叉堆,堆与完全二叉树的对应关系如下图所示:把堆看成一个棵树,有如下的特性:(1)含有n个元素的堆的高度是lgn。(2)当用数组表示存储了n个元素的堆时,叶子节点的下标是n/2+1,n/2+
2015-08-31 20:33:01 399
原创 排序算法(二)
归并排序基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例:算法实现void merge(int *arr,int *store,int start,int mid,int end){ int i,j,k; for(i
2015-08-30 16:10:20 405
原创 排序算法(一)
冒泡排序基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。冒泡排序的示例:算法实现void print(int *arr, int size){ int i; for( i = 0; i < size
2015-08-30 15:28:08 476
转载 epoll 模型
Epoll模型相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编
2015-08-29 19:27:26 404
转载 poll函数
函数原型#includeint poll(struct pollfd fdarray[],nfds_t nfds, int timeout); 返回值:准备就绪的描述符数目;若是超时,返回0;若是出错,返回-1第一个参数 pollfd 结构体定义如下:struct pollfd{ int fd; /* poll 的文件描述符. */
2015-08-28 21:46:15 612
原创 Select 函数
函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才唤醒它。函数说明#include#includeint select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset,const struct timeval *timeout); 若
2015-08-28 21:16:13 491
转载 static 关键字详解
static 关键字详解首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.1. 用static声明的函数和变量小结 static 声明的变量在C语言中有两方面的特征:1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。2)、变量用static告
2015-08-17 16:34:07 562
转载 sizeof 操作符详解
1、定义sizeof是C语言的一种单目操作符,它并不是函数。sizeof操作符以字节形式给出了其操作数所占存储空间的大小。操作数可以是一个表达式或括在括号内的类型名。操作数所占存储空间的大小由操作数的类型决定。作用就是返回一个对象或者类型所占的内存字节数。2、语法sizeof有如下三种语法形式:(1) sizeof( object ); // sizeof( 对象 );
2015-08-16 19:58:37 794
原创 const的用法
const 的用法修饰变量类型const int bufSize = 512; //任何对bufSize进行赋值的操作都是错误的。 const int j = get_num(); //因为const对象一旦创建就不能改变,所以const对象const int j = 21; //必须初始化,可以运行是初始化和编译时初始化注意:默认情况下,const对象
2015-08-16 16:00:56 408
转载 c++的引
引用简介 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名; 【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 说明: (1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型
2015-08-16 15:10:09 451
原创 线程私有数据
线程私有数据创建私有数据之前得先创建一个键,需要创建与该数据相关联的键#includeint pthread_key_create(pthread_key_t *keyp, void (*destructor)(void *));成功--0,出错--返回错误编号参数;keyp -- 存储创建的键,可以被任何线程使用,但每个线程把这个键和不同的线程私有数据地址进行关联
2015-08-10 19:27:13 393
转载 线程私有数据实现的原理
在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程ID不能保证是一个小而连续的整数,并且用数组实现的时候由于其他线程也可以访问其数组中的数据,这样会引起数据混乱。这时候我们可以借助线程的私有数据来解决这个问题。 线程私有数据实现的主要思想是:在分配线程私有数据之前,创建与该数据相关联的健,
2015-08-10 17:23:53 1700
原创 线程同步
线程同步互斥量:从本质上是一把锁,在访问共享资源前对互斥量加锁,在访问完后解锁,对互斥量加锁后任何其他试图再次对其加锁都会被阻塞,知道当前线程对互斥量解锁。互斥量初始化1)静态初始化将互斥量设置为PTHREAD_MUTEX_INITIALIZER或者调用怕pthread_mutex_init函数2)动态初始化#includeint pth
2015-08-10 16:15:52 413
原创 线程原语
线程原语比较两个线程是否相等#includeint pthread_equal(pthread_t tid1,pthread_t tid2);相等--非0,否则-- 0获得自身的线程ID#includepthread_t pthread_self(void);创建线程#includeint pthread_create(pthread_
2015-08-10 11:31:21 539
原创 共享存储函数
共享存储共享存储允许两个或多个进程共享一个给定的存储区。数据不需要在客户进程和服务器进程之间复制,因此这是最快的一种进程间通信的方式。使用的窍门是多个进程访问存储区时,需要采取一定的同步控制。获取一个共享存储标志:shmget函数#includeint shmget(key_t key, size_t szie, inf flag);成功--共享存储ID,出
2015-08-09 15:57:56 452
转载 va_start和va_end使用详解
va_start和va_end使用详解 本文主要介绍va_start和va_end的使用及原理。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理:1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);void foo(parm_list,...);这种方式和我们以前认识的不大一样,但我们要记住
2015-08-07 09:08:33 436
转载 define 的高级用法
define 的高级用法1、前言 今天看代码时候,遇到一些宏,之前没有见过,感觉挺新鲜。如是上网google一下,顺便总结一下,方便以后学习和运用。C语言程序中广泛的使用宏定义,采用关键字define进行定义,宏只是一种简单的字符串替换,根据是否带参数分为无参和带参。宏的简单应用很容易掌握,今天主要总结一下宏的特殊符号及惯用法。 (1)宏中包含特殊符号:#、##. (
2015-08-07 00:18:08 1117
原创 VIM 使用技巧
VIM 使用技巧1)删除空行 ==>:g/^$/d2)替换: 用字符串 str2 替换正文中所有出现的字符串 str1 ==>:1,$ s/str1/str2/g 或 :g/str1/s//str2/g g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换; g 放在命令开头,表示对正文中所有包
2015-08-06 23:54:12 404
原创 消息队列操作函数
消息队列操作函数1、概述 消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识。具有足够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息。在某个进程往一个队列写入消息之前,并不需要另外某个进程在该队列上等待消息的到达。System V 消息队列是随内核持续的,只有在内核重起或者显示删除一个消息队列时,该
2015-08-05 22:22:02 933
原创 进程间通信之管道和FIFO
进程间通信管道特点:1)半双工,数据只能在一个方向上流动。 2)只能在具有血缘关系的进程间使用。#includeint pipe(int fd[2]);成功-- 0,出错-- -1fd 参数:返回的是文件描述符,fd[0] 读端,fd[1]写端。1.如果所有指向管道写端的文件描述符都关闭了(管道写端的引用计数等于0),而仍然有进程
2015-08-04 23:43:42 855
原创 Linux 进程管理命令
Linux 进程管理命令:& ==>将命令放在后台执行 #cp src_file dest_file & 命令:jobs ==> 查看目前的后台工作状态参数:-l 列出后台工作的进程 -s 仅列出正在后台当中暂停的工作 -r 仅列出正在后台run的工作命令:fg ==> 将后台工作拿到前台来处理 #fg %jobnum
2015-08-04 22:00:38 415
打通Linux脉络系列:进程、线程和调度.pdf
2020-01-05
跟我一起写Makefile
2015-07-10
socket编程原理
2015-07-10
Linux与Unix Shell编程指南pdf
2015-03-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人