07 2013 档案

摘要:应届生在面试的时候,大公司偶尔也会遇到一些系统设计题,而这些题目往往只是考一下你的知识面,或者对系统架构方面的了解,不会涉及编码。很多人感觉难以应对这样的题目,也不知道从何说起,在本文中,总结了回答这类题目需要哪些基础知识,以及怎样使用这些知识回答这些问题。在正式介绍基础知识之前,先罗列几个常见的系统设计相关的笔试面试题:(1)(百度)要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。(题目还给出了一系列的数据,比如:站点数总共为5000万,IP地址有1000万,等等)解决方案:DNS服务器实现域名到IP地址的转换。每个域名的平均长 阅读全文
posted @ 2013-07-17 10:06 一枚程序员 阅读(11731) 评论(0) 推荐(4) 编辑
摘要:根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程。内核线程建立和销毁都是由操作系统负责、通过系统调用完成的,操作系统在调度时,参考各进程内的线程运行情况做出调度决定,如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。用户线程多见于一些历史悠久的操作系统,例如Unix操作系统,不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程 阅读全文
posted @ 2013-07-16 17:10 一枚程序员 阅读(5173) 评论(0) 推荐(0) 编辑
摘要:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等,然后,该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其它相关资源,该进程就被运行起来。线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。在没有实现线程的操作系统中,进程既是资源分配的基本单位,又是调度的基本单 阅读全文
posted @ 2013-07-16 17:07 一枚程序员 阅读(623) 评论(0) 推荐(0) 编辑
摘要:使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下图所示:TCP客户/服务器的套接字函数1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。#include int socket(int family,int type,int protocol); //返回:非负描述字---成功 -1---失败第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SO... 阅读全文
posted @ 2013-07-16 10:05 一枚程序员 阅读(4008) 评论(0) 推荐(1) 编辑
摘要:UDP套接口是无连接的、不可靠的数据报协议;既然他不可靠为什么还要用呢?其一:当应用程序使用广播或多播时只能使用UDP协议;其二:由于他是无连接的,所以速度快。因为UDP套接口是无连接的,如果一方的数据报丢失,那另一方将无限等待,解决办法是设置一个超时。建立UDP套接口时socket函数的第二个参数应该是SOCK_DGRAM,说明是建立一个UDP套接口;由于UDP是无连接的,所以服务器端并不需要listen或accept函数。使用UDP套接字编程可以实现基于TCP/IP协议的面向无连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下图所示:UDP客户/服务器的套接字函数1、socket 阅读全文
posted @ 2013-07-16 09:33 一枚程序员 阅读(13357) 评论(0) 推荐(1) 编辑
摘要:多线程中,常见的一种问题除了竞态条件外就是死锁。那什么是死锁呢?死锁就是:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。那么为什么会产生死锁呢?1.因为系统资源不足。2.进程运行推进的顺序不合适。3.资源分配不当。这个定义可能有点拗口,一个最简单的例子就是有资源A和资源B,都是不可剥夺资源,现在进程C已经申请了资源A,进程D也申请了资源B,进程C接下来的操作需要用到资源B,而进程D恰好也在申请资源A,那么就引发了死锁。这个肯定每个人都看过了。然后套用回去定义:如果一个进程集合里面(进程C和进程D)的每个进程(进程C和进程D)都在 阅读全文
posted @ 2013-07-15 20:57 一枚程序员 阅读(976) 评论(0) 推荐(0) 编辑
摘要:为了能够有效的控制多个进程之间的沟通过程,保证沟通过程的有序和和谐,OS必须提供一定的同步机制保证进程之间不会自说自话而是有效的协同工作。比如在共享内存的通信方式中,两个或者多个进程都要对共享的内存进行数据写入,那么怎么才能保证一个进程在写入的过程中不被其它的进程打断,保证数据的完整性呢?又怎么保证读取进程在读取数据的过程中数据不会变动,保证读取出的数据是完整有效的呢?常用的同步方式有: 互斥锁、条件变量、读写锁、记录锁(文件锁)和信号灯。。1、互斥锁顾名思义,锁是用来锁住某种东西的,锁住之后只有有钥匙的人才能对锁住的东西拥有控制权(把锁砸了,把东西偷走的小偷不在我们的讨论范围了)。所谓互斥, 阅读全文
posted @ 2013-07-15 20:48 一枚程序员 阅读(4747) 评论(0) 推荐(1) 编辑
摘要:一般我们写的程序都是以单个进程的方式来运行的,比较少涉及到多进程。特别是在windows下,因为Windows是按照线程来分配CPU时间片的,线程是最小的调度单位,所以在Windows下更多的用到多线程,在同一个进程里创建多个线程来执行不同的任务,达到充分利用CPU的目的。线程之间可以共享进程的资源,比如内存、变量,但是多线程有一个不好的地方,由于这些线程是在同一个进程空间里执行,所以只要一个线程崩溃,整个进程也就崩溃了,程序就退出了。多进程由于是在不同的进程空间里,一个进程崩溃,不会影响到其它的进程,但是进程之间要交换信息的话,就比较麻烦了,不像多线程可以简单的通过一个全局变量来通讯。为了解 阅读全文
posted @ 2013-07-15 20:38 一枚程序员 阅读(3419) 评论(0) 推荐(0) 编辑
摘要:当线程分属于不同进程,也就是分驻在不同的地址空间时,它们之间的通讯需要跨越地址空间的边界,便得采取一些与同一进程中不同线程间通讯不同的方法。在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有:1、使用内存映射文件2、通过共享内存DLL共享内存3、使用SendMessage向另一进程发送WM_COPYDATA消息比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法。WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMess 阅读全文
posted @ 2013-07-15 20:34 一枚程序员 阅读(419) 评论(0) 推荐(0) 编辑
摘要:一、单选题1、在常用的网络协议中,___是面向连接的、有重传功能的协议。A、IP B、TCP C、UDP D、DXP分析:TCP协议为传输控制协议面向连接,IP为网际协议,UDP为用户数据报协议。。2、500张多米诺骨牌整齐地排成一列,依顺序编号为1、2、3……499、500。第一次拿走所有奇数位置上的骨牌,第二次再从剩余骨牌中拿走所有奇数位置上的骨牌,依此类推。请问最后剩下的一张骨牌的编号是多少?A、128 B、250 C、256 D、500分析:第一次后剩下250个偶数 2 4 6...500,将它们除以2得到1~250的一列,以此类推8次,最后剩余1,即1×2^8=256(最. 阅读全文
posted @ 2013-07-15 11:45 一枚程序员 阅读(6745) 评论(8) 推荐(3) 编辑
摘要:题目原文:Describe how you could use a single array to implement three stacks.译文:你如何只用一个数组实现三个栈?解答我们可以很容易地用一个数组来实现一个栈,压栈就往数组里插入值,栈顶指针加1; 出栈就直接将栈顶指针减1;取栈顶值就把栈顶指针指向的单元的值返回; 判断是否为空就直接看栈顶指针是否为-1。如果要在一个数组里实现3个栈,可以将该数组分为3个部分。如果我们并不知道哪个栈将装 入更多的数据,就直接将这个数组平均分为3个部分,每个部分维护一个栈顶指针, 根据具体是对哪个栈进行操作,用栈顶指针去加上相应的偏移量即可。代码如 阅读全文
posted @ 2013-07-15 10:06 一枚程序员 阅读(426) 评论(0) 推荐(0) 编辑
摘要:题目原文:Given a circular linked list, implement an algorithm which returns node at the beginning of the loop.DEFINITIONCircular linked list: A (corrupt) linked list in which a node’s next pointer points to an earlier node, so as to make a loop in the linked list.EXAMPLEInput: A –> B –> C –> D 阅读全文
posted @ 2013-07-11 11:23 一枚程序员 阅读(398) 评论(0) 推荐(0) 编辑
摘要:题目原文:You have two numbers represented by a linked list, where each node contains a single digit. The digits are stored in reverse order, such that the 1’s digit is at the head of the list. Write a function that adds the two numbers and returns the sum as a linked list.EXAMPLEInput: (3 –> 1 –> 阅读全文
posted @ 2013-07-11 11:18 一枚程序员 阅读(228) 评论(0) 推荐(0) 编辑
摘要:题目原文:Implement an algorithm to delete a node in the middle of a single linked list, given only access to that node.EXAMPLEInput: the node ‘c’ from the linked list a->b->c->d->e Result: nothing is returned, but the new linked list looks like a->b->d->e译文:实现一个算法来删除单链表中间的一个结点,只给出指向 阅读全文
posted @ 2013-07-09 21:25 一枚程序员 阅读(322) 评论(0) 推荐(0) 编辑
摘要:题目原文:Implement an algorithm to find the nth to last element of a singly linked list.译文:实现一个算法从一个单链表中返回倒数第n个元素。解答思路一:这道题的考点在于我们怎么在一个单链表中找到倒数第n个元素? 由于是单链表,所以我们没办法从最后一个元素数起,然后数n个得到答案。 但这种最直观的思路显然是没错的,那我们有没有办法通过别的方式,从最后的元素数起数 n个来得到我们想要的答案呢。这个次序颠倒的思路可以让我们联想到一种数据结构:栈。我们如果遍历一遍单链表,将其中的元素压栈,然后再将元素一一出栈。那么, 第n 阅读全文
posted @ 2013-07-09 19:00 一枚程序员 阅读(280) 评论(0) 推荐(0) 编辑
摘要:题目原文:Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this problem if a temporary buffer is not allowed?译文:从一个未排序的链表中移除重复的项进一步地,如果不允许使用临时的缓存,你如何解决这个问题?解答如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况。 对于这种情况,最好的解决方法当然是使用哈希表,但令人非常不爽的是C++标准里是没有 哈希表的(java里有)。网上有人用ext下的hash_ 阅读全文
posted @ 2013-07-09 15:38 一枚程序员 阅读(409) 评论(0) 推荐(0) 编辑
摘要:题目原文:Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring ( i.e., “waterbottle” is a rotation of “erbottlewat”).译文:假设你有一个isSubstring函数,可以检测一个字符串是否是另一个字符串 阅读全文
posted @ 2013-07-09 14:59 一枚程序员 阅读(410) 评论(0) 推荐(0) 编辑
摘要:题目原文:Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.译文:写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.解答简单题。遍历一次矩阵,当遇到元素等于0时,记录下这个元素对应的行和列。 可以开一个行数组row和列数组col,当元素a[i][j]等于0时, 就把row[i]和col[j]置为true。第二次遍历矩阵时,当某个元素对应的行row[i] 或列col[j]被设置为true,说明该元素在需要 阅读全文
posted @ 2013-07-09 14:55 一枚程序员 阅读(195) 评论(0) 推荐(0) 编辑
摘要:题目原文:Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?译文:一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)解答我们假设要将图像逆时针旋转90度,顺时针是一个道理。如果原图如下所示:1 2 3 4 5 6 7 8 9 10 11 12 1 阅读全文
posted @ 2013-07-09 14:53 一枚程序员 阅读(248) 评论(0) 推荐(0) 编辑
摘要:题目原文:Write a method to replace all spaces in a string with ‘%20’.译文:写一个函数,把字符串中所有的空格替换为%20 。解答简单题。先遍历一次字符串,得到空格个数,进而得到将空格转换成%20后的串长度 (每个空格替换为%20需要增加2个字符,x个空格增加2x个字符)。 然后从后向前依次对空格进行替换,非空格原样拷贝。如果原串有足够大的空间, 则替换过程直接在原串上进行, 因为从后向前替换的过程中,新串用到的空间一定是旧串不需要的空间,看图示:旧字符串:i am hawstein旧串索引: p新字符串:i%20am%20haws.. 阅读全文
posted @ 2013-07-09 14:48 一枚程序员 阅读(277) 评论(0) 推荐(0) 编辑
摘要:题目原文:Write a method to decide if two strings are anagrams or not.译文:写一个函数判断两个字符串是否是变位词。解答变位词(anagrams)指的是组成两个单词的字符相同,但位置不同的单词。比如说, abbcd和abcdb就是一对变位词。该题目有两种做法:O(nlogn)的解法由于组成变位词的字符是一模一样的,所以按照字典序排序后,两个字符串也就相等了。 因此我们可以用O(nlogn)的时间去排序,然后用O(n)的时间比较它们是否相等即可。代码如下:bool isAnagram1(string s, string t){ if... 阅读全文
posted @ 2013-07-09 14:43 一枚程序员 阅读(258) 评论(0) 推荐(0) 编辑
摘要:题目原文:Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is not.FOLLOW UPWrite the test cases for this method.译文:设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一 阅读全文
posted @ 2013-07-09 14:33 一枚程序员 阅读(353) 评论(0) 推荐(0) 编辑
摘要:题目原文:Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)译文:写代码翻转一个C风格的字符串。(C风格的意思是"abcd"需要用5个字符来表示,包含末尾的 结束字符)解答这道题如果就是要考察你有没有注意到C风格字符串最后的那个结束符,那我觉得还是像书 上写的那样,在代码中有所体现。代码如下:void reverse(char *s){ char *end = 阅读全文
posted @ 2013-07-09 11:34 一枚程序员 阅读(305) 评论(0) 推荐(0) 编辑
摘要:题目原文:Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?译文:实现一个算法来判断一个字符串中的字符是否唯一(即没有重复).不能使用额外的数据结构。 (即只使用基本的数据结构)解答首先,你可以问面试官,构成字符串的字符集有多大?是ASCII字符,还是只是26个字母? 还是有更大的字符集,对于不同的情况,我们可能会有不同的解决方案。如果我们假设字符集是ASCII字符,那么我们可以开一个大小为25 阅读全文
posted @ 2013-07-09 11:10 一枚程序员 阅读(406) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示