08 2012 档案

Hadoop 2.0 Yarn代码:RM与NM代码_心跳驱动服务分析_1 初始阶段(Job提交前)
摘要:1.概览当RM(ResourcesManager)和NM(NodeManager)陆续将所有模块服务启动,最后启动是NodeStatusUpdater,NodeStatusUpdater将用Hadoop RPC远程调用ResourcesTrackerService中的函数,进行资源是初始化等操作,为将要运行的Job做好准备。以下主要分析在Job提交之前 RM与NM在心跳的驱动下操作。主要涉及的java文件hadoop-yarn-server-resourcemanager下的包org.apache.hadoop.yarn.server.resourcemanagerResourceTracke 阅读全文

posted @ 2012-08-21 16:24 as_ 阅读(2982) 评论(2) 推荐(0) 编辑

Hadoop 2.0 Yarn代码:ResourcesManager端代码_RM端各模块服务的启动
摘要:1.概览以下介绍的NodeManager是如何启动和注册各个服务的主要涉及的Java文件hadoop-yarn-server-resourcemanager下的包org.apache.hadoop.yarn.server.resourcemanager:ResourcesManager.java2.代码分析Hadoop启动时。ResourcesManager的main开始执行1).main函数进行初始化操作,eg:配置信息的读取等等,然后创建ResourcesManager地向执行ResourcesManager的init()函数.执行ResourcesManager的start()函数.2) 阅读全文

posted @ 2012-08-19 14:21 as_ 阅读(1295) 评论(0) 推荐(0) 编辑

编程之美:寻找发帖"水王"
摘要:1.问题描述快速找出发帖超过一半的的ID问题变型:现在有一个数组,已知一个数出现的次数超过了一半,请用最小的复杂度的算法找出这个数。问题扩展:有三个发帖很多的ID,他们的发帖数目超过了帖子总数目的1/4,请从发帖ID列表中找出它们2.分析与解法每次从列表中删除两个不同的ID,那么剩下的ID列表中,“水王”的ID出现次数仍然超过剩余数目的一半,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。我们可以设置一个candidate和一个计数器nTimes,candidate为ID列表第一个ID,nTimes初始值为0,遍历整个ID列表,当遍历的ID与candidate相 阅读全文

posted @ 2012-08-19 13:10 as_ 阅读(806) 评论(0) 推荐(0) 编辑

Hadoop 2.0 Yarn代码:NodeManager端代码分析_NM端各服务模块的启动
摘要:1.概览以下介绍的NodeManager是如何启动和注册各个服务的主要涉及的Java文件hadoop-yarn-server-nodemanager下的包org.apache.hadoop.yarn.server.nodemanager NodeManager.java2.代码分析以下均在NodeManager.java中,NodeManager:当Hadoop启动时,NodeManager中的main函数被调用1).main函数输出信息到log日志中,创建NodeMananger对象,调用initAndStartNodeManager(false)2).initAndStartNodeMan 阅读全文

posted @ 2012-08-18 19:18 as_ 阅读(2463) 评论(0) 推荐(0) 编辑

编程之美:求二叉树中节点的最大距离
摘要:1.问题描述写一个程序求一棵二叉树相距最远的两个节点之间的距离如下图:2.分析与解法对于任意一个节点,以该节点为根,假设这个根有k个孩子节点,那么距离最远的两个节点U与V之间的路径与这个根节点的关系有两种。1).若路径经过Root,则U和V属于不同子树的,且它们都是该子树中到根节点最远的节点,否则跟它们的距离最远相矛盾2).如果路径不经过Root,那么它们一定属于根的k个子树之一,并且它们也是该子树中相距最远的两个顶点因此,问题就可以转化为在字数上的解,从而能够利用动态规划来解决。设第K棵子树中相距最远的两个节点:Uk和Vk,其距离定义为d(Uk,Vk),那么节点Uk或Vk即为子树K到根节点R 阅读全文

posted @ 2012-08-18 14:50 as_ 阅读(5122) 评论(0) 推荐(1) 编辑

编程之美:从无头单链表中删除节点
摘要:1.问题描述假设有一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个,也不是最后一个),请将该节点从单链表中删除。如下图所示:2.分析与解法假设给定的指针为pCurrent, Node* pNext = pCurren->next其中pCurren->next!=NULL,如下图,因为没有头结点,删除pCurren指向的节点B就很困难,而删除节点C就非常容易,于是就现将节点C当中的数据等信息拷贝到节点B上,覆盖节点B原来的数据,然后删除节点C。删除之前删除之后3.代码实现struct Node{ int data; Node* next;}; voi... 阅读全文

posted @ 2012-08-18 13:26 as_ 阅读(665) 评论(0) 推荐(0) 编辑

编程之美:无差错二分查找
摘要:1.虽然二分查找是十分简单的程序,但是因为循环等操作也是最容易出错的,其中在写循环(或者递归)程序的时候,应该特别注意三个方面的问题:初始条件、转化、终止条件。2.二分查找源码int biseach(char** arr, int b, int e, char* v){ int minIndex = b, maxIndex = e, midIndex; while(minIndex < maxIndex - 1) //若改为minIndex < maxIndex时,容易出现死循环 { ... 阅读全文

posted @ 2012-08-18 10:05 as_ 阅读(906) 评论(0) 推荐(0) 编辑

编程之美:编程判断两个链表是否相交
摘要:1.问题描述给出两个单向链表的头指针,比如h1、h2,判断两个链表是否相交。编程之美为了简化问题,假设两个链表均不带环。如下图:2.分析与解法解法一:直观法,先判断第一个链表的每个节点是否在第二个链表中,这种方法时间复杂度为O(Length(h1)*Length(h2))解法二:hash表计数法,首先将第一个链表的所有节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址,查询hash表,如果它在hash表中存在,那么说明两个链表有交点。这个方法时间复杂度O(Length(h1)+Length(h2)),空间复杂度O(Length(h1))。解法三:转换为是否有环问题,可 阅读全文

posted @ 2012-08-17 14:54 as_ 阅读(2820) 评论(0) 推荐(0) 编辑

编程之美:求数组的子数组之和的最大值
摘要:1.问题描述一个有N个整数元素的一维数组( A[0], A[1], ... , A[n-2], A[n-1]),子数组之和的最大值是什么?(要求子数组的元素是连续的)例子:有数组( -2, 5, 3, -6, 4, -8, 6),则其子数组之和的最大值为8,其对应的数组为(5,3)2.分析与解法解法一:采用直接法,记Sum[i...j],为数组A中从第i到第j之间所有数之和,算出所有Sum,取其最大,代码如下,时间复杂度O(N2):int maxSum1(int *A, int n){ int max = -1; int i, j, sum; for(i = 0; i... 阅读全文

posted @ 2012-08-17 13:28 as_ 阅读(4756) 评论(3) 推荐(0) 编辑

编程之美:阶乘数计算
摘要:1.问题描述1).给定一个整数N,那么N的阶乘N!末尾有多少个0?例如:N=0,N!=3628800,N!的末尾有两个0.2).求N!的二进制表示中最低1的位置2.分析与解法首先考虑,如果N! = K*10M,且K不能被10整除,那么N!末尾有M个0.再考虑对N!质因分解,N! = (2X)*(3Y)*(5Z)...,由于10=2*5,所以M只跟X和Z有关,每一对2和5都可以得到一个10,于是M=min(X,Z)。不难看出X大于等于Z,因为在N!分解的数种明显2出现的频率要高于5,所以把公式简化为M=Z。根据上面的分析,有对于问题1解法一:要计算Z,最直接的方法,就是计算i(i =1, 2, 阅读全文

posted @ 2012-08-17 09:58 as_ 阅读(656) 评论(0) 推荐(0) 编辑

Hadoop 2.0 代码:Client端代码简要分析
摘要:1.概览 以下主要叙述Hadoop如何将用户写好的MR程序,以Job的形式提交 主要涉及的四个java类文件:hadoop-mapreduce-client-core下的包org.apache.hadoop.mapreduce: Job.java、JobSubmitter.javahadoop-mapreduce-client-jobclient下的包org.apache.hadoop.mapred: YARNRunner.java、ResourceMgrDelegate.java2.代码分析与执行逻辑过程1).客户运行写好类下下面的程序,这里省去map和reduce的函数的实现:Job jo 阅读全文

posted @ 2012-08-16 18:15 as_ 阅读(4575) 评论(0) 推荐(0) 编辑

编程之美:求二进制中1的个数
摘要:1.问题描述实现一个函数,输入一个无符号整数,输出该数二进制中的1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出22.分析与解法解法1:利用十进制和二进制相互转化的规则,依次除余操作的结果是否为1 代码如下:int Count1(unsigned int v){ int num = 0; while(v) { if(v % 2 == 1) { num++; } v = v/2; } return num;}解法2:向右移位操... 阅读全文

posted @ 2012-08-16 14:45 as_ 阅读(4775) 评论(1) 推荐(1) 编辑

编程珠玑:旋转交换技巧
摘要:1.问题描述将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步就能够完成该工作,你能否仅使用数十个额外字节的存储空间,正比于n的时间内完成向量旋转?2.解决思路旋转向量x其实就是交换向量ab的两段,得到向量ba。这里a代表x中的前i个元素。假设a比b短,将b分为bl和br,使得br具有与a相同的长度。交换a和br,也就是将ablbr 。序列a此时已处于其最终的位置,因此现在就集中到交换b的两部分。由于新问题与原来的问题具有相同的形式,我们可以递归地解决之。编程珠玑提供了更简单使用的方法,我们将问题看做 阅读全文

posted @ 2012-08-15 18:11 as_ 阅读(871) 评论(0) 推荐(0) 编辑

编程珠玑:取样问题
摘要:1.问题描述程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。从概率的角度说,我们希望得到没有重复的有序选择,其中每个选择出现的概率相等。2.解决思路与代码实现编程珠玑上给出了四个函数1).genknuth():算法依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果是有序的代码C++实现:void genknuth(int m, int n) { for(int i = 0;i < 0;i++) { if((bigrand() % (n... 阅读全文

posted @ 2012-08-15 16:00 as_ 阅读(672) 评论(0) 推荐(0) 编辑

编程珠玑:用后缀数组寻找最长重复字符串
摘要:1.基本概念子串:字符串 S 的子串 r[i..j] , i ≤ j ,表示 r 串中从 i 到 j 这一段,就是顺次排列 r[i],r[i+1],...,r[j] 形成的字符串。后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 r 的从 第 i 个字 符 开 始 的 后 缀 表 示 为 Suffix(i) ,也 就 是Suffix(i)=r[i..len(r)] 。后缀数组:后缀数组 SA 是一个一维数组,它保存 1..n 的某个排列 SA[1] ,SA[2] , …… , SA[n] ,并且保证 Suffix(SA[i]) < Suffix(SA[i+1]) 阅读全文

posted @ 2012-08-15 14:19 as_ 阅读(3118) 评论(1) 推荐(0) 编辑

编程珠玑:单词频率最高选取
摘要:问题描述:对一个输入文本中的每个单词的出现次数统计,并选取出现频率最大的10个单词首先用C++实现,着重注意STL的map,vector排序用法,这里与编程珠玑的代码不同。不知道何故,编程珠玑上的代码, 输入之后得到的结果是按照单词排序的,而不是按照次数排序,这里做了修改C++实现代码:#include <iostream> #include <stdlib.h> #include <string> #include <map> #include <vector> #include <algorithm> using na 阅读全文

posted @ 2012-08-14 19:49 as_ 阅读(565) 评论(0) 推荐(1) 编辑

编程珠玑:变位词程序的实现
摘要:这个程序的实现有助于压缩key的大小,使查找效率更高1.问题描述 给定一本英语单词词典,请找出所有的变位词集。所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同。2.解决思路编程珠玑的变位词程序要按照三个步骤来执行,其中前一个步骤程序的输出作为下一个步骤程序的输入:第一:程序标识单词,第二:程序排序标识后的文件,第三:程序将这些单词压缩为每个变位词类一行的形式下面是编程珠玑的举例,仅有6个单词的字典的处理过程由以上可看出需要三个程序的处理1).sign程序:假设输入单词的长度不超过100,对每个输入的单词依照字母进行排序,将结果输入这个单词所对应的”签名“2).sort程序: 阅读全文

posted @ 2012-08-14 15:42 as_ 阅读(3806) 评论(1) 推荐(1) 编辑

编程珠玑:位图法排序
摘要:问题描述输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=107。如果在输入文件中有任何正数重复出现就是致命错误。没有其他数据与该正数相关联。输出:按升序排列的输入正数的列表。约束:最多有1MB的内存空间可用,有充足的磁盘存储空间可用。运行时间最多几分钟,运行时间为10秒就不需要进一步优化。程序设计与实现概要:应用位图或位向量表示集合。可用一个10位长的字符串来表示一个所有元素都小于10的简单的非负整数集合,例如,可以用如下字符串表示集合{1,2,4,5,8}:0 1 1 1 0 1 0 0 1 0 0代表集合中数值的位都置为1,其他左所有的位置为0.编程珠玑当中建议是一年个一个具有 阅读全文

posted @ 2012-08-14 14:06 as_ 阅读(8837) 评论(1) 推荐(1) 编辑

Hadoop:The Definitive Guid 总结 Chapter 10 管理Hadoop
摘要:1.HDFS1).永久性数据结构A.NameNode的目录结构NameNode被格式化之后,将产生所示的目录结构:${dfs.name.dir}/current/VERSION /edits /fsimage /fstimedfs.name.dir属性中列出的目录的内容都是相同,同为如上所示的目录结构VERSION文件是一个Java属性文件,一般内容如下:#Tue May 29 11:05:47 CST 2012namespaceID=1545978810cTime=0storageType=NAME_NODElayoutVersion=-18layoutVersion是一个负数,描... 阅读全文

posted @ 2012-08-13 18:53 as_ 阅读(1197) 评论(0) 推荐(0) 编辑

Hadoop:The Definitive Guid 总结 Chapter 9 构建MapReduce集群
摘要:1.集群规范1)配置规范一般Hadoop DataNode和TaskTracker节点典型机器具有吐下规范:处理器:2个四核 2~2.5 GHz CPU内存:16~24 ECC RAM存储器:4*1TB SATA 磁盘网络:千兆以太网2).网络拓扑Hadoop集群架构包含两级网络拓扑,如下图所示,机架拓扑由两个网络位置描述,例如:/交换机1/机架1 和 /交换机1/机架2。这个架构的一突出特点是:同一机架内部节点间的总宽带要远高于不同机架间的节点的宽带2.集群的构建原装、SSH配置、Hadoop配置这里只给出Yarn的典型伪分布配置 分布式配置与此差别不大详见http://hadoop.apa 阅读全文

posted @ 2012-08-13 10:58 as_ 阅读(1178) 评论(0) 推荐(0) 编辑

Hadoop:The Definitive Guid 总结 Chapter 8 MapReduce的特性
摘要:1.计数器计数器是一种收集Job统计的有效手段,用于质量控制或应用级统计。计数器的应用使得获取统计数据比使用日志文件获取数据更加容易。1).内置计数器Hadoop的内置计数器用来描述Job的各项指标,例如已处理的字节数和记录数,输入数据量和输出数据量。内置计数器被分为几类(group):实际上每类都包含Task计数器和Job计数器A.Task计数器Task计数器用来收集整个执行过程中Task所生成的信息,这些结果的通过Job里面所有Task聚集(aggregate)统计出来,例如:MAP_INPUT_RECORDS是用来统计所有map读入的记录数目,Take计数器功能同样也被Task Atte 阅读全文

posted @ 2012-08-12 20:30 as_ 阅读(2609) 评论(0) 推荐(1) 编辑

Hadoop:The Definitive Guid 总结 Chapter 7 MapReduce的类型与格式
摘要:MapReduce数据处理模型非常简单:map和reduce函数的输入和输出是键/值对(key/value pair)1.MapReduce的类型Hadoop的MapReduce一般遵循如下常规格式:map(K1, V1) –> list (K2, V2)combine(K2, list(V2)) –> list(K2, V2)partition(K2, V2) –> integerreduce(K2, list(V2)) –> list(K3, V3)map:对数据进行抽去过滤数据,组织key/value对等操作.combine:为了减少reduce的输入和Hadoo 阅读全文

posted @ 2012-08-12 09:45 as_ 阅读(3880) 评论(1) 推荐(4) 编辑

Hadoop:The Definitive Guid 总结 Chapter 6 MapReduce的工作原理
摘要:1.剖析MapReduce作业运行机制1).经典MapReduce--MapReduce1.0整个过程有有4个独立的实体客户端:提交MapReduceJobTracker:协调作业的运行TaskTracker:运行作业划分后的任务HDFS:用来在其他实体之间共享作业文件以下为运行整体图A.作业的提交JobClient的runJob是用于新建JobClient实例并调用其submitJob()方法的便捷方式,提交Job后,runJob()每秒轮询检测作业的进度,随时监控Job的运行状态。其中JobClient的submitJob()方法所实现的作业提交过程:向JobTracker请求一个新的作业 阅读全文

posted @ 2012-08-11 13:08 as_ 阅读(4330) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 2 传输层:TCP、UDP和SCTP
摘要:注,总结中暂时忽略SCTP1.总图虽然称为“TCP/IP”协议族,但是本协议族还有许多其他成员,见下图2.用户数据包协议(UDP)UDP 套接字写入一个消息,该消息接着被封装(encapsulating)进一个UDP数据报,该UDP数据报又进而被封装成一个IP数据报,然后发送到目的地。UDP不保证UDP数据报到达其最终目的地,不保证各个数据报的先后顺序跨网络保持不变,也不保证每个数据报只到达一次。用UDP进行网络编程所碰到的问题是缺乏可靠性,我们也称UDP提供无连接的(connectionless)服务,因为UDP客户与服务器不必存在长期的关系。3.传输控制协议(TCP)首先,TCP提供客户与 阅读全文

posted @ 2012-08-11 10:43 as_ 阅读(1559) 评论(0) 推荐(1) 编辑

Hadoop:The Definitive Guid 总结 Chapter 5 MapReduce应用开发
摘要:用MapReduce来编写程序,有几个主要的特定流程,首先写map函数和reduce函数,最好使用单元测试来确保函数的运行符合预期,然后,写一个驱动程序来运行作业,要看这个驱动程序是否可以运行,之后利用本地IDE调试,修改程序实际上权威指南的一些配置已经过时 所以这里很多地方不做介绍1.配置APIHadoop拥有很多xml配置文件,格式遵从一般xml的要求 见实例<!--Example:5-1. A simple configuration file, configuration-1.xml--><?xml version="1.0"?><co 阅读全文

posted @ 2012-08-10 13:35 as_ 阅读(1091) 评论(0) 推荐(0) 编辑

Hadoop:The Definitive Guid 总结 Chapter 4 Hadoop I/O
摘要:1.数据的完整性1).HDFS的数据完整性HDFS以透明方式校验所有写入它的数据,并在默认设置下,会在读取数据时验证校验和。针对数据的每个io.bytes.per.checksum字节都会创建一个单独的校验和。默认值为512字节;DataNode负责在存储数据(包括数据的校验和)之前验证它们收到的数据,其中管道线的最后一个DataNode负责验证校验和,如果此datanode检测到错误,客户端会收到一个checksum Exception。客户端从datanode上读取数据时,也会验证校验和,将其与datanode上存储的校验和进行比较。每个datanode都维护着一个连续的校验和和验证日志, 阅读全文

posted @ 2012-08-10 10:51 as_ 阅读(1153) 评论(0) 推荐(0) 编辑

Hadoop:The Definitive Guid 总结 Chapter 3 Hadoop分布式文件系统
摘要:1.HDFS的设计HDFS设计的适合对象:超大文件(TB级别的文件)、流式数据访问(一次写入,多次读取)、商用硬件(廉价硬件)HDFS设计不适合的对象:低时间延迟的数据访问、大量的小文件、多用户写入,任意修改文件2.HDFS的概念1).数据块(Block)HDFS中Block的大小默认是64M,小于块大小的的文件并不占据整个块的全部空间(而是将文件大小作为块的大小.比如要存放的文件是1k,但是系统的Block默认是64MB,存放之后块的大小是1k,不是64MB.文件若是大于64MB,则分多快进行存储.)使用Blocks的好处:可以存储大文件,一个文件的大小可以大于网络中任意一个单块硬盘的容量把 阅读全文

posted @ 2012-08-09 16:24 as_ 阅读(1302) 评论(1) 推荐(0) 编辑

newInstance() 和 new 的区别
摘要:(来源网络)用newInstance与用new是有区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。 Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。 例如: Class c = Class.forName(“A”);factory = (AInterface)c.newInstance(); 其中AInterface是A的接口,如果下面这样写,你可能会理解: String className = "A";Class c 阅读全文

posted @ 2012-08-08 23:30 as_ 阅读(500) 评论(0) 推荐(0) 编辑

Hadoop:The Definitive Guid 总结 Chapter 1~2 初识Hadoop、MapReduce
摘要:1.数据存储与分析问题:当磁盘的存储量随着时间的推移越来越大的时候,对磁盘上的数据的读取速度却没有多大的增长从多个磁盘上进行并行读写操作是可行的,但是存在以下几个方面的问题:1).第一个问题是硬件错误。使用的硬件越多出错的几率就越大。一种常用的解决方式是数据冗余,保留多分拷贝,即使一份数据处理出错,还有另外的数据。HDFS使用的也是类似的方式,但稍有不同。2).第二个问题是数据处理的相关性问题。例如很多分析工作在一快磁盘上处理出来的结果需要与其他磁盘上处理处理出来的结果合并才能完成任务。各种分布式系统也都给出了合并的策略,但是做好这方面确实是一个挑战。MapReduce提供了一种编程模型,他将 阅读全文

posted @ 2012-08-08 18:04 as_ 阅读(1345) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
摘要:此为UNP最后一段总结 Chapter30主要为代码实践 请参考UNP一、线程这里UNP的线程与APUE中讲得线程基本一致,但是APUE讲得更加细致,所以这里只列出主要内容(线程数据会稍微详细) 详细见APUE线程相关章节 或者本博文中的APUE专题1.基本线程函数:创建与终止2.线程特定数据使用线程特定数据是使现成函数线程安全的常用技巧这里重点提一下的是1).每个系统支持有限数量的线程特定数据项。系统(很可能是线程库)为每个进程维护一个数据结构,我们称之为Key结构,如下图2).Key结构中的标志指示这个数组元素是否正在使用,所有的标志初始化为"不在使用"。当一个线程调用 阅读全文

posted @ 2012-08-07 21:53 as_ 阅读(1047) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 22~25 高级UDP套接字编程、高级SCTP 套接字编程、带外数据、信号驱动I/O
摘要:一、高级UDP套接字编程1.接收标志、目的IP地址和接口索引作为recvmsg的一个例子,我们将要写一个名为recvfrom_flags的函数,它与recvfrom类似,但他还返回:返回的msg_flags值收到的数据报的目的地址(通过设置IP_RECVDSTADDR套接口选项)接收数据报接口的索引(通过设置IP_RECIF套机口选项)相关详细代码 见UNP P4632.何时用UDP代替TCP使用广播或者多播时候,因为UDP支持广播或多播类似实时音频应用的程序应使用UDP对于简单的请求-应答应用程序应使用UDP对于海量数据传输(例如文件传输)不应该使用UDP3.给UDP应用增加可靠性如果我们想 阅读全文

posted @ 2012-08-07 17:40 as_ 阅读(1308) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 18~21 路由套接字、密钥管理套接字、广播、多播
摘要:一、路由套接字1.概述在路由器接口中支持三种类型的操作1). 进程能通过写路由套接口向内核发消息。2). 进程能在路由套接口上从内核读消息,这是核心通知进程已收到一个ICMP重定向消息并进行了处理的方式。3). 进程可以用sysctl函数得到路由表或列出所有已配置的接口。2.数据链路套接口地址结构在路由套接口上返回的一些消息中包含数据链路套接口地址结构,他在<net/if_dl.h>定义struct sockaddr_dl { uint8_t sdl_len; sa_family_t sdl_family; /* AF_LINK */ uint16_t sdl_i... 阅读全文

posted @ 2012-08-07 15:52 as_ 阅读(2643) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 15~17 Unix域协议、非阻塞式I/O、ioctl操作
摘要:一、Unix域协议Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API(套接口或XTI)的一种方法。当客户和服务器在同一台主机上时,Unix域协议是IPC通信方式的一种替代品。Unix域提供了两种类型的套接口:字节流套接口(与TCP类似)和数据报套接口(与UDP类似)。1.Unix域套接口地址结构struct sockaddr_un { sa_family_t sun_family; /* AF_LOCAL */ char sun_path[104]; /* null-terminat... 阅读全文

posted @ 2012-08-07 12:59 as_ 阅读(1270) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
摘要:一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射的IPv6地址实现的。要求,ipv6服务器必须具有双重协议栈,即服务器必须同时拥有ipv4地址和ipv6地址,称其为ipv6服务器是因为开放的网络套接口为ipv6类型。当ipv4客户欲连接ipv6服务器时,通过gethostbyname获得服务器主机的A记录(即ipv4地址),并通过网络发送ipv4数据包。ipv6服务器接受这个ipv4数据包,并通过内核将客户ipv4地址映射为ipv6地址返回。2.I 阅读全文

posted @ 2012-08-06 22:20 as_ 阅读(888) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 11 名字与地址转换
摘要:本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口号间进行转换。1.域名系统域名系统(Domain Name System,DNS)主要用于主机名与IP地址间的映射。主机名可以是简单名字,如solaris或bsdi,也可以是全限定域名FQDN(Fully Qualified Domain Name),如solaris.kohala.com1).资源记录DNS中的条目称为资源记录RR(resource record),一般感兴趣的有如下几个:A A 阅读全文

posted @ 2012-08-06 21:05 as_ 阅读(1963) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 9~10 基本SCTP套接字编程及C/S程序例子
摘要:这里简要列出内容 不做详细总结1.接口模型1).一到一形式2).一到多形式2.涉及函数sctp_bindx函数sctp_connectx函数sctp_getpaddrs函数sctp_freepaddrs函数sctp_getladdrs函数sctp_freeladdrs函数sctp_sendmsg函数sctp_recvmsg函数sctp_opt_info函数sctp_peeloff函数shutdown函数3.头端阻塞4.控制总结程序代码示例详见UNP 阅读全文

posted @ 2012-08-06 17:14 as_ 阅读(785) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 8 基本UDP套接字编程
摘要:1.概述使用UDP编写的一些常用应用程序有:DNS(域名系统)、NFS(网络文件系统)和SNMP(简单网络管理协议)下图给出典型的UDP客户/服务器程序的函数调用:2.recvfrom和sendto函数两个函数类似于标准的read和write函数,不过需要三个额外的参数#include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); ssize_t sendto(int sockf 阅读全文

posted @ 2012-08-06 17:03 as_ 阅读(1020) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 7 套接字选项
摘要:1.getsockopt和setsockopt函数这两个函数仅用于套接字:#include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval socklen_t optlen);//均返回:若成功为0,出错为-1其中sockfd必须指向一个打开套接字描述符,level(级别)指定系统中解释选项的代 阅读全文

posted @ 2012-08-06 15:22 as_ 阅读(1023) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 6 I/O复用:select和poll函数
摘要:有些进程需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O条件就绪(也就是说输入已准备好被读取,或者描述符已能承受更多的输出),他就通知进程,这个能力成为I/O复用1.I/O模型5种基本I/O模型阻塞式I/O非阻塞式I/OI/O复用(select和poll)信号驱动式I/O(SIGIO)异步I/O一个输入操作通常包括两个不同的阶段等待数据准备从内核向进程复制数据对于一个套接口上的输入操作,第一步一般是等待数据到达网络,当分组到达时,它被拷贝到内核中的某个缓冲区,第二步是将数据从内核缓冲区拷贝到应用缓冲区。1).阻塞式I/O最流行的I/O模型是阻塞式I/O(blocking 阅读全文

posted @ 2012-08-06 00:14 as_ 阅读(1247) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 5 TCP客户/服务器程序实例
摘要:1.概述这章的TCP客户/服务器模型2.TCP回射服务器程序1).main函数#include "unp.h"int main(int argc, char **argv){ int listenfd, connfd; pid_t childpid; socklen_t clilen; struct sockaddr_in cliaddr, servaddr; listenfd = Socket (AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); serva... 阅读全文

posted @ 2012-08-05 17:58 as_ 阅读(746) 评论(0) 推荐(1) 编辑

UNP总结 Chapter 4 基本TCP套接字编程
摘要:1.socket函数为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型#include <sys/socket.h> int socket (int family, int type, int protocol);//返回:若成功则为非负描述符,若出错则为-1其中family指明协议族,type参数指明套接字类型,protocol参数应该设为某个(见下图)协议类型常值,或者设为0,以选择所给定family和type组合的系统默认值socket函数的family常值family说 明AF_INETAF_INETAF_LOCALAF_ROUTE 阅读全文

posted @ 2012-08-05 16:41 as_ 阅读(1246) 评论(0) 推荐(1) 编辑

UNP总结 Chapter 3 套接字编程简介
摘要:1.套接字地址结构1).IPv4套接字地址结构IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet.h>头文件中,如下所示struct in_addr{ in_addr_t s_addr; //32位的IPv4网络字节序} struct sockaddr_in{ uint8_t sin_len; //带符号8位整数地址结构长度 sa_family_t sin_family; //协议族,IPv4为AF_INET ... 阅读全文

posted @ 2012-08-05 13:40 as_ 阅读(3526) 评论(0) 推荐(0) 编辑

UNP总结 Chapter 1 简介
摘要:写在开头 UNP总结只列出相对重要的内容 简化细节 如想详细了解 见UNP socket API 第三版1.客户与服务器处于同一个以太网,有如下所示的通信层次2.一个简单TCP时间获取客户程序#include "unp.h"int main(int argc, char **argv){ int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if (argc != 2) err_quit("usage: a.out <IPaddress>"); ... 阅读全文

posted @ 2012-08-05 01:59 as_ 阅读(905) 评论(0) 推荐(0) 编辑

Chapter 17 高级进程间通信
摘要:这章属于高级内容 内容比较简略1.基于STREAMS的管道流管道是一个双向(全双工)管道。单个流管道就能向父、子进程提供双向的数据流1).命名的STREAMS管道我们可以用fattach函数来在文件系统给一个STREAMS管道一个名字#include <stropts.h>int fattach(int filedes, const char *path);//成功返回0,错误返回-1。path参数必须引用一个已有的文件,调用进程必须拥有这个文件,或有对它有写的权限,或使用超级用户特权运行。一个进程可以调用fdetach来撤消STREAMS文件和文件系统里的名字之间的关联关系。#i 阅读全文

posted @ 2012-08-04 21:56 as_ 阅读(704) 评论(0) 推荐(0) 编辑

Chapter 15 进程间通信
摘要:1.管道管道是UNIX系统IPC的最古老形式,在shell下的表现形式为管道线。每当在管道线中输入一个由shell执行的命令序列时,shell为每一条命令单独创建一进程,然后将前一条命令进程的标准输出用管道与后一条命令的标准输入相连接。管道有两个主要局限:1).管道是半双工的,即数据只能在一个方向上流动。2).管道只能在具有公共祖先的进程之间使用。管道是由调用pipe函数而创建的.#include <unistd.h>int pipe(int filedes[2]);//成功返回0,错误返回-1。经由参数filedes返回两个文件描述符:filedes[0]为读而打开,filede 阅读全文

posted @ 2012-08-04 21:06 as_ 阅读(2783) 评论(0) 推荐(0) 编辑

Chapter 14 高级I/O
摘要:1.非阻塞I/O非阻塞I/O使我们可以调用不会永远阻塞的I/O操作,例如open,read和write。如果这种操作不能完成,则立即出错返回,表示该操作如继续执行将继续阻塞下去。对于一个给定的描述符有两种方法对其指定非阻塞I / O:(1) 如果是调用open以获得该描述符,则可指定O_NONBLOCK标志(2) 对于已经打开的一个描述符,则可调用fcntl打开O)NONBLOCK文件状态标志2.记录锁记录锁(record locking)的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区1).fcntl记录锁下面给出fcntl函数原型#include <fc 阅读全文

posted @ 2012-08-04 18:07 as_ 阅读(711) 评论(0) 推荐(0) 编辑

Chapter 13 守护进程
摘要:1.守护进程的特征 守护进程也称精灵进程是生存期长的一种进程,它们常常在系统引导装入时启动,在系统管比时终止。守护进程没有控制终端,所以它们是在后台运行的。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。比如,作业规划进程crond,打印进程lpd等。 所有守护进程都以超级用户(用户ID为0)的优先权运行。没有一个守护进程具有控制终端,控制名称设置为(?)、终端前台进程组ID设置为-1。除update以外的所有守护进程都是组的首进程,对话期的首进程,而且是这些进程组和对 阅读全文

posted @ 2012-08-04 15:43 as_ 阅读(450) 评论(0) 推荐(0) 编辑

Chapter 12 线程控制
摘要:1.线程限制用sysconf函数可以获得和thread相关的一些系统信息,主要是线程相关的一些最大值:线程限量和sysconf的名字参数限量名描述名字参数PTHREAD_ DESTRUCTOR_ITERATIONS当一个线程退出时一个实现将尝试销毁线程相关数据的最大次数。_SC_THREAD_ DESTRUCTOR_ITERATIONSPTHREAD_ KEYS_MAX一个进程可以创建的关键字的最大数量。_SC_THREAD_ KEYS_MAXPTHREAD_ STACK_MIN可以作为一个线程栈的最少字节数。_SC_THREAD_ STACK_MINPTHREAD_ THREADS_MAX一 阅读全文

posted @ 2012-08-04 15:14 as_ 阅读(904) 评论(0) 推荐(0) 编辑

Chapter 11 线程
摘要:1.线程概念一个线程由表示一个进程里的一个执行上下文所需的信息组成。这包括一个在进程里标识线程的线程ID、一组寄存器值、栈、调用优先级和策略、信号掩码、errno变量(1.7节)、和线程指定数据(12.6节)。在一个进程内的所有东西在进程里的线程间都可以共享,包括可执行程序的代码、程序的全局和堆内存、栈、和文件描述符。2.线程标识就像每个进程有一个进程ID一样,每个线程也有一个线程ID。进程ID在整个系统的唯一的,但线程ID不同,线程ID只在它所属的进程环境中有效1).下面一个函数被用来比较两个线程ID#include <pthreads.h>int pthread_equal(p 阅读全文

posted @ 2012-08-04 10:59 as_ 阅读(610) 评论(0) 推荐(1) 编辑

Chapter 10 信号
摘要:1.信号概念信号是一种软件中断,通知程序某种事件的发生。常见的信号有SIGABRT(当进程调用abort函数的时候自动发送), SIGALRM(当timer被触发的时候自动发送),等等。下面的情况可以产生信号:按下CTRL+C产生SIGINT硬件中断,如除0,非法内存访问(SIGSEV)等等Kill函数可以对进程发送信号Kill命令。实际上是对Kill函数的一个包装软件中断。如当Alarm Clock超时(SIGURG),当Reader中止之后又向管道写数据(SIGPIPE),等等当信号发生的时候,可以有三种选择(称之为Disposition of the signal或者Action ass 阅读全文

posted @ 2012-08-04 00:25 as_ 阅读(1590) 评论(0) 推荐(0) 编辑

Chapter 9 进程关系
摘要:1.终端登录登录过程:内核--->init[进程ID=1]--->(fork)init--->(exec)getty--->(exec)--->login登录结束过程:进程1=init->登录shell<->终端设备驱动程序<->使用终端的用户2.网络登录如下图3.进程组1).每个进程属于一个进程组,这个进程组从同样的终端获得信号 函数getpgrp返回调用进程的进程组ID,结果也用pid_t表示:#include <unistd.h>pid_t getpgrp(void);//返回调用进程的进程组ID。2)SUS定义ge 阅读全文

posted @ 2012-08-03 20:25 as_ 阅读(610) 评论(2) 推荐(0) 编辑

Chapter 8 进程控制
摘要:1.进程标识符要点:1).每个进程都有一个非负整型表示的唯一的进程ID。因为进程ID是一个总是唯一的,常将其用作其他标示符的一部分以保证其唯一性。例如:应用程序有时包含进程ID作为文件名的一部分,来产生唯一的文件名。2).虽然唯一,但是进程ID可以重用3).进程ID 0通常是调用进程,常常称为对换程序(swapper)。在硬盘上没有对应于这个进程的程序,它是内核的一部分而被熟知为一个系统进程。进程ID 1通常是init进程,在启动过程结束后被内核调用。下列函数返回这些标识符:#include <unistd.h>pid_t getpid(void); ... 阅读全文

posted @ 2012-08-03 17:33 as_ 阅读(528) 评论(0) 推荐(0) 编辑

Chapter 7 进程环境
摘要:1.main函数C函数总是从执行一个名为main的函数开始。main函数的原型为int main(int argc, char *argv[]); 其中 argc是命令行参数的数量而,argv是参数指针的数组。2.进程终止有8种方法终止一个进程。普通终止有5种:1).从main函数中返回;2).调用exit;3).调用_exit或_Exit;4).最后线程从启动例程(eg:start函数)返回;5).从最后线程里调用pthread_exit异常终止有3种:6).调用abort7).收到一个信号8).最后线程回应一个取消请求Exit 函数三个普通终止程序的函数:_exit和_Exit从内核立即返 阅读全文

posted @ 2012-08-03 14:26 as_ 阅读(357) 评论(0) 推荐(0) 编辑

Chapter 6 系统数据文件和信息
摘要:1.口令文件出于安全考虑,用户登录密码在/etc/shadow文件中加密。由spwd结构描述,加密是one-way加密算法,意思是你不能通过加密后的密码得出原密码,而只能通过原密码去验证是否正确,提供了相似的访问函数。但是shadow中的用户加密密码是不可读出的。1).POSIX.1只定义了两个获取口令文件相的函数。在给出用户登录名或者数值用户ID,这两个函数允许我们通过查找相关项#include <pwd.h>struct passwd *getpwuid(uid_t uid);struct passwd *getpwnam(const char *name);//两者成功都返回 阅读全文

posted @ 2012-08-03 13:04 as_ 阅读(627) 评论(0) 推荐(0) 编辑

Chapter 5 标准I/O库
摘要:1.流和FILE对象对于国际字符集,一个字符可以由一个以上的字节来表示。标准I/O文件流可以用来操作单字节和多字节(宽,wide)字符集。一个流的方向(orientation)决定了字符是以单字节还是多字节的方式读取,当一个流被创建时,它没有方向。如一个多字节I/O函数(见<wchar.h>)用在了没有方向的流上,那么流的方向会设为面向宽字符的。如果一个字节I/O函数用在一个没有方向的流上,那么流的方向会设为面向字节的。只有两个函数可以在设置后改变这个方向。freopen函数(简单说明)将会清除一个流的方向,而 fwide函数用来设置一个流的方向。#include <stdi 阅读全文

posted @ 2012-08-03 11:46 as_ 阅读(756) 评论(0) 推荐(0) 编辑

Chapter 4 文件和目录
摘要:1.stat、fstat和lstat函数获取一些文件相关的信息。函数原型:#include <sys/stat.h> int stat(const char *restrict pathname, struct stat *restrict buf); //提供文件名字,获取文件对应属性。int fstat(int filedes, struct stat *buf); //通过文件描述符获取文件对应的属性。int lstat(const char *restrict pathname, struct stat *restrict b... 阅读全文

posted @ 2012-08-02 21:00 as_ 阅读(839) 评论(0) 推荐(0) 编辑

Chapter 3 文件I/O
摘要:1.文件描述符文件描述符是一个非负整数,当打开一个现有文件或创建一个新文件时候,内核向进程返回一个文件描述符。Unix系统shell使用文件描述符0与进程的标准输入相关联,文件描述符1与进程的标准输出相关联,文件描述符2与进程的标准出错相关联,在POSIX标准中,幻数0、1、2应当替换为符号常量STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,另外文件描述符变化范围:0~OPEN_MAX,现在很多系统将OPEN_MAX置为632.open函数调要open函数可以打开或创建一个文件。函数原型#include <fcnt1.h>int open(cons 阅读全文

posted @ 2012-08-01 18:49 as_ 阅读(696) 评论(0) 推荐(0) 编辑

Chapter 1 Unix基础知识
摘要:以下仅列出相对比较重要的内容1.文件和目录1).文件系统 Unix文件系统是目录和文件组成的一种层次结构。目录是一个包含许多目录项的文件,而逻辑上,可以认为每个目录项都包含着文件名。文件属性是指文件类型(是普通文件还是目录)、文件的大小、文件的所有者、文件权限以及文件的修改时间等等。如获取相应信息可以用stat和fstat函数2).文件名3).路径名由斜线和文件名组成的序列构成路径名,以斜线开头的路径名称为绝对路径名,否则为相对路径名。注:文件根系统的名字(/)是个特殊的绝对路径,不含文件名4).工作目录 每一个进程都有一个工作目录(又称当前工作目录),所有绝对路径名都从工作目录开始2.输入和 阅读全文

posted @ 2012-08-01 14:19 as_ 阅读(614) 评论(0) 推荐(0) 编辑

Linux进程模型总结
摘要:来源于网络 原创不详Linux进程通过一个task_struct结构体描述,在linux/sched.h中定义,通过理解该结构,可更清楚的理解linux进程模型。 包含进程所有信息的task_struct数据结构是比较庞大的,但是该数据结构本身并不复杂,我们将它的所有域按其功能可做如下划分:进程状态(State)进程调度信息(Scheduling Information)各种标识符(Identifiers)进程通信有关信息(IPC:Inter_Process Communication)时间和定时器信息(Times and Timers)进程链接信息(Links)文件系统信息(File S.. 阅读全文

posted @ 2012-08-01 13:02 as_ 阅读(4403) 评论(0) 推荐(0) 编辑

导航