聊天室项目问题

1.  makefile的作用:

    makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。
    
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

    

    在C程序的编译过程中,依次要进行预处理、编译、汇编、链接四个阶段。

   (1)预处理阶段:对c源码中的预处理代码进行处理。

   (2)编译阶段:将c源码处理为汇编代码

   (3)汇编阶段:将汇编代码处理为二进制代码(二进制文件即目标文件)

   (4)链接阶段:将二进制代码打包成一个操作系统可以识别的可执行文件格式,即把程序中所有的目标文件和所需的库文件都链接在一起,最终生成一个可以直接运行的文件

 

   2.数据库与文件进行数据存取的区别:

    其区别在于:

    (1)文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据。

    (2)文件系统中的程序和数据有一定的联系,数据库系统中的程序和数据分离。

    (3)文件系统用操作系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据。

    (4)文件系统实现以文件为单位的数据共享,数据库系统实现以记录和字段为单位的数据共享。

    其联系在于:

    (1)均为数据组织的管理技术。

    (2)均由数据管理软件管理数据,程序与数据之间用存取方法进行转换。

    (3)数据库系统是在文件系统的基础上发展而来的。

 

     3.系统调用与库函数的区别:

    (1)库函数提供了抽象,抽象是个好东西,可以让我们把更多的注意力集中在要解决问题的核心。

    (2)库函数给我们提供的接口更人性化,所以调用起来更方便。

    (3)调用库函数更安全,内存管理不用自己太操心。

    (4)调用库函数效率更高,程序跑的更快。虽然库函数最终是调用系统函数,但是库函数会比我们用更好的方式方法调用系统函数。

 

     4.Sqlite3和MySQL有什么区别:

 

     SQLite3是单机型数据 不能用于网络,一般用于制作桌面单机小程序 如小词典等等,mysql多用于网页制作

 

    http://www.oschina.net/translate/sqlite-vs-mysql-vs-postgresql-a-comparison-of-relational-database-management-systems?print

   

 

     5.多进程编程的优缺点:

     优点:每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系; 通过增加CPU,就可以容易扩充性能;可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大 。

 

     缺点:逻辑控制复杂,需要和主程序交互; 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算多进程调度开销比较大; 最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……

 

 

 

     6.多线程编程的优缺点:

     优点:

     (1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;

     (2)当前没有进行处理的任务时可以将处理器时间让给其它任务;

     (3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;

     (4)可以随时停止任务;

     (5)可以分别设置各个任务的优先级以优化性能。

       缺点:

        (1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。

        (2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。

        (3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。

        (4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。

 

      7.内核是如何管理进程的:

      进程管理负责控制进程对 CPU 的访问,如任务的创建、调度和终止等。任务调度是进程管理最核心的工作,由 Linux 内核调度器来完成。linux 内核调度器根据进程的优先级选择最值得运行的进程。

     一个进程的可能状态有如下几种:

    (1)  运行态——已经获得了资源,并且进程正在被 CPU 执行。进程既可运行在内核态,也可运行在用户态。

    (2)  就绪态——当系统资源已经可用,但由于前一个进程还没有执行完释放  CPU,准备进入运行状态。

    (3)  可中断睡眠状态——当进程处于可中断等待状态时,系统不会调度该程序执行。当系统产生一个中断或者释放了进程正在等待的资源,或者进程收到一个信号,都可以被唤醒进入就绪状态或者运行态。

    (4)  不可中断睡眠状态——处于中断等待状态,但是该进程只能被使用  wake_up()函数明确唤醒的时候才可进入就绪状态。

    (5)  暂停状态——当进程收到 SIGSTOP、SIGSTP、SIGTTIN 或者 SIGTTOU 就会进入暂停状态,收到 SIGCONT 信号即可进入运行态。

    (6)  僵死态——进程已经停止运行,但是其父进程还没有询问其状态。

 

 

      8.保持线程同步的方法:

 

    (1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。

    (2)互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。

    (3)信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。

    (4)事 件: 通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

 

 

      9.保持进程同步的方法:

   (a)信号量:一个信号量只能置一次初值,以后只能对之进行p操作或v操作。由此也可以看到,信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。信号量机制功能强大,但使用时对信号量的操作分散, 而且难以控制,读写和维护都很困难。加重了程序员的编码负担;核心操作P-V分散在各用户程序的代码中,不易控制和管理;一旦错误,后果严重,且不易发现和纠正。

 

    (b)自旋锁: 旋锁是为了保护共享资源提出的一种锁机制。调用者申请的资源如果被占用,即自旋锁被已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持着已经释放了锁。自旋锁是一种比较低级的保护数据结构和代码片段的原始方式,可能会引起以下两个问题; 1、死锁 2、过多地占用CPU资源传统自旋锁由于无序竞争会导致“公平性”问题

 

    (c)管程: 信号量机制功能强大,但使用时对信号量的操作分散,而且难以控制,读写和维护都很困难。因此后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操作集中在一个模块中,操作系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。

 

    (d)会合: 进程直接进行相互作用

 

    (e)分布式系统: 由于在分布式操作系统中没有公共内存,因此参数全为值参,而且不可为指针。

 

    (f)原语 是不可中断的过程。

 

      10.TCP与UDP的区别:

    TCPUDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。TCPUDP基本区别:
    1、基于连接与无连接。
    2、TCP要求系统资源较多,UDP较少。
    3、UDP程序结构较简单。
    4、流模式(TCP)与数据报模式(UDP)。
    5、TCP保证数据正确性,UDP可能丢包。
    6、TCP保证数据顺序,UDP不保证。
    7、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。
    8、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
    9、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
    10、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
    11、TCP首部开销20字节;UDP的首部开销小,只有8个字节。
    12、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道。
    TCP(TransmissionControl Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,完成第四层传输层所指定的功能。
    UDP 是UserDatagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768是UDP的正式规范。UDP在IP报文的协议号是17。

 

      11.七层网络模型和四层网络模型及每层的网络协议:

       http://blog.csdn.net/nopoppy/article/details/53494907

 

 

       12.TCP协议中三次握手,四次分手的具体含义:(SYN:同步标志  ACK:确认标志   FIN:结束标志 

       第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers

  第二次握手服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。   

  第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。

  四次分手:假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请你继续等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL(2MSL:最大报文段生存时间,虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。)后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

   

 

 

      13.端口号与ip,网关的作用:

    ip(网络之间互连的协议):

      网络之间互连的协议(IP)是Internet Protocol的外语缩写, 中文缩写为“网协”.

     网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。在因特网中,它是能使连接到网上的所有计算机网络实现相互通信的一套规则,规定了计算机在因特网上进行通信时应当遵守的规则。任何厂家生产的计算机系统,只要遵守IP协议就可以与因特网互连互通。IP地址具有唯一性,根据用户性质的不同,可以分为5类。另外,IP还有进入防护,知识产权,指针寄存器等含义。

 

     端口:

    "端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。端口号的范围从0到65535

 

     网关(Gateway)又称网间连接器、协议转换器。网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关既可以用于广域网互连,也可以用于局域网互连。网关是一种充当转换重任的计算机系统或设备。使用在不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。

 

 

 

 

 

 

 

 

 

 



 

 

 

14.Sqlite3数据库命令操作:

 

http://blog.csdn.net/ithomer/article/details/7027424

 

 

 



 



 

    15.嵌入式数据库的种类和各自的特点:

 

 

    1.Berkeley
    DB(BDB)是一个高效的嵌入式数据库编程库,C语言、C++、Java、Perl、Python、Tcl以及其他很多语言都有其对应的API。
Berkeley DB可以保存任意类型的键/值对(Key/ValuePair),而且可以为一个键保存多个数据。Berkeley
DB支持让数千的并发线程同时操作数据库,支持最大256TB的数据,广泛用于各种操作系统,其中包括大多数类Unix操作系统、Windows操作系统
以及实时操作系统。

    2.Couchbase Lite


    是一个为满足在线和离线的移动应用所开发的超轻量的,可靠的,并且安全的JSON数据库。即使在最不确定的网络条件下,亦可以给您的移动应用提供富有成效的和可靠地信誉。除此之外,‘同步门户’功能亦可以提供协作,社交互动或者是用户的更新。
      3.LevelDB



    LevelDB是Google开源出的一个Key/Value存储引擎,它采用C++编写的,支持高并发访问和写入,特别适合对于高写入业务环境。

    4. SQLite

    SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。
其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进制文件存在即可开始创建、连接和使用数据库。


    5.UnQLite

    UnQLite是,由Symisc
Systems公司出品的一个嵌入式C语言软件库,它实现了一个自包含、无服务器、零配置、事务化的NoSQL数据库引擎。UnQLite是一个文档存储
数据库,类似于MongoDB、Redis、CouchDB等。同时,也是一个标准的Key/Value存储,与BerkeleyDB和LevelDB等
类似。

 



 

 



 

    16.tcp是如何保证可靠数据传输的:

 (1)应用数据被分割成TCP认为的最合适发送的数据块; 

 

 

    (2)当TCP发出一个报文段后,就启动一个定时器,用来等待目的端确认收到这个报文段;若没能及时收到这个确认,TCP发送端将重新发送这个报文段(超时重传); 

    (3)TCP收到一个发自TCP连接的另一端的数据后就将发送一个确认,不过这个确认不是立即就发送,而是要推迟几分之一秒后才发送; 

    (4)TCP将保持它的首部和数据的检验和;(这是一个端到端的检验和,为了检验数据在传输过程中发生的错误;若检测到段的检验和有差错,TCP将丢弃和不确认收到此报文段并希望发端可以进行超时重传) 

    (5)由于TCP报文段是作为IP数据报来传输的,又因为IP数据报的到达可能会失序,所以TCP报文段的到达也可能会失序;因此,有必要的话TCP会对收到的数据进行重新排序后交给应用层; 

    (6)因为TCP报文段是作为IP数据报来传输的,并且IP数据报可能会发生重复,所以TCP的接收端必须丢弃掉重复的数据; 

    (7)TCP提供流量控制;(因为TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这一限制可以防止较快主机致使较慢主机的缓冲区溢出)

     http://blog.csdn.net/u014558484/article/details/51986864

 

 



 



 

    17.如果只有UDP如何保证数据靠靠传输:

 



 

    简单来讲,要使用UDP来构建可靠的面向连接的数据传输,就要实现类似于TCP协议的超时重传,有序接受,应答

 

确认,滑动窗口流量控制等机制,等于说要在传输层的上一层(或者直接在应用层)实现TCP协议的可靠数据传输机

 

制,比如使用UDP数据包+序列号,UDP数据包+时间戳等方法,在服务器端进行应答确认机制,这样就会保证不可靠的

 

UDP协议进行可靠的数据传输,不过这好像也是一个难题!

 



 

 

 

18.网络编程,系统编程,文件编程:

 

(1)网络编程:网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。

  

 

(2)系统编程:Windows系统编程和Linux(或者Unix)系统编程。

 

(3)文件编程:http://www.cnblogs.com/yuohoo/archive/2012/08/07/2625987.html

 

你可能感兴趣的:(笔试题整理)