it笔试题部分答案.docx
《it笔试题部分答案.docx》由会员分享,可在线阅读,更多相关《it笔试题部分答案.docx(76页珍藏版)》请在冰豆网上搜索。
it笔试题部分答案
uhn感谢IT面试群S-北京-陈磊的整理分享。
基础篇:
操作系统、计算机网络、设计模式一:
操作系统
1.进程有哪几种状态,状态转换图,及导致转换的事件。
答:
基本状态:
ready(就绪),running(运行),wait(等待).
(1)就绪→执行 处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
(2)执行→就绪 处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
(3)执行→阻塞 正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
(4)阻塞→就绪 处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
2.进程与线程的区别。
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:
线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:
不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:
进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属
于进程的资源.
(4)系统开销:
在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开
销明显大于创建或撤消线程时的开销。
3.进程通信的几种方式。
#管道(pipe):
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
进程的亲缘关系通常是指父子进程关系。
#有名管道(namedpipe):
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
#信号量(semophore):
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。
它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。
因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
#消息队列(messagequeue):
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。
消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
#信号(sinal):
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
#共享内存(sharedmemory):
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。
它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
#套接字(socket):
套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
4.线程同步几种方式。
(一定要会写生产者、消费者问题,完全消化理解)
1、临界区(CCriticalSection)
当多个线程访问一个独占性共享资源时,可以使用临界区对象。
拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到拥有临界区的线程放弃临界区为止。
具体应用方式:
1、定义临界区对象CcriticalSectiong_CriticalSection;
2、在访问共享资源(代码或变量)之前,先获得临界区对象,g_CriticalSection.Lock();
3、访问共享资源后,则放弃临界区对象,g_CriticalSection.Unlock();
2、事件(CEvent)
事件机制,则允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。
比如在某些网络应用程序中,一个线程如A负责侦听通信端口,另外一个线程B负责更新用户数据,利用事件机制,则线程A可以通知线程B何时更新用户数据。
每个Cevent对象可以有两种状态:
有信号状态和无信号状态。
Cevent类对象有两种类型:
人工事件和自动事件。
自动事件对象,在被至少一个线程释放后自动返回到无信号状态;
人工事件对象,获得信号后,释放可利用线程,但直到调用成员函数ReSet()才将其设置为无信号状态。
在创建Cevent对象时,默认创建的是自动事件。
3、互斥量(CMutex)
互斥对象和临界区对象非常相似,只是其允许在进程间使用,而临界区只限制与同一进程的各个线程之间使用,
但是更节省资源,更有效率。
4、信号量(CSemphore)
当需要一个计数器来限制可以使用某共享资源的线程数目时,可以使用“信号量”对象。
CSemaphore类对象保存了对当前访问某一个指定资源的线程的计数值,该计数值是当前还可以使用该资源的线程数目。
如果这个计数达到了零,则所有对这个CSemaphore类对象所控制的资源的访问尝试都被放入到一个队列中等待,直到超时或计数值不为零为止。
CSemaphore类的构造函数原型及参数说明如下:
5.线程的实现方式.(也就是用户线程与内核线程的区别)
∙KST
对于一切的进程,无论是系统进程还是用户进程,进程的创建和撤销,以及I/O操作都是利用系统调用进入到内核,由内核处理完成,所以说在KST下,所有进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
内核空间实现还为每个内核支持线程设置了一个线程控制快,内核是根据该控制快而感知某个线程是否存在,并加以控制。
优点:
1在多处理器上,内核可以调用同一进程中的多个线程同时工作;
2如果一个进程中的一个线程阻塞了,其他线程仍然可以得到运行;
缺点:
对于用户线程的切换代价太大,在同一个线程中,从一个线程切换到另一个线程时,需要从用户态,进入到内核态并且由内核切换。
因为线程调度和管理在内核实现。
∙ULT
用户进程ULT仅存在于用户空间中。
对于这种线程的创建、撤销、线程之间的同步和通信等功能,都无需系统调用来实现。
对于同一进程的线程之间切换仍然是不需要内核支持的。
所以呢,内核也会是完全不会知道用户级线程的存在。
但是有一点必须注意:
设置了用户级线程的系统,其调度荏苒是以进程为单位进行的哦。
优点:
3线程切换不需要转换到内核空间,节省了宝贵的内核空间;
4调度算法可以是进程专用,由用户程序进行指定;
5用户级线程实现和操作系统无关;
缺点:
6系统调用阻塞,同一进程中一个线程阻塞和整个进程都阻塞了。
7一个进程只能在一个cpu上获得执行。
6.用户态和核心态的区别。
特权级的不同,即权力的不同。
运行在用户态下的程序不能直接访问操作系统内核数据结构和程序,比如上面例子中的testfork()就不能直接调用sys_fork(),因为前者是工作在用户态,属于用户态程序,而sys_fork()是工作在内核态,属于内核态程序。
7.用户栈和内核栈的区别。
1.
栈是系统运行在内核态的时候使用的栈,用户栈是系统运行在用户态时候使用的栈。
当进程由于中断进入内核态时,系统会把一些用户态的数据信息保存到内核栈中,当返回到用户态时,取出内核栈中得信息恢复出来,返回到程序原来执行的地方。
用户栈就是进程在用户空间时创建的栈,比如一般的函数调用,将会用到用户栈。
2.
内核栈是属于操作系统空间的一块固定区域,可以用于保存中断现场、保存操作系统子程序间相互调用的参数、返回值等。
用户栈是属于用户进程空间的一块区域,用户保存用户进程子程序间的相互调用的参数、返回值等。
3.
每个Windows都有4g的进程空间,系统栈使用进程空间的地段部分,用户栈是高端部分如果用户要直接访问系统栈部分,需要有特殊的方式。
(内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。
每个进程会有两个栈,一个用户栈,
存在于用户空间,一个内核栈,存在于内核空间。
记住,进程对应的用户栈和内核栈都是进程私有的。
当进程在用户空间
运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面
的内容是内核栈空间地址,使用内核栈。
)
8.内存池、进程池、线程池。
(c++程序员必须掌握)
内存池
平常我们使用new、malloc在堆区申请一块内存,但由于每次申请的内存大小不一样就会产生很多内存碎片,造成不好管理与浪费的情况
内存池则是在真正使用内存之前,先申请分配一定数量的、大小相等(一般情况下)的内存块留作备用。
当有新的内存需求时,就从内存池中分出一部分内存块,若内存块不够再继续申请新的内存。
这样做的一个显著优点是尽量避免了内存碎片,使得内存分配效率得到提升。
进程池&&线程池
这两个问题有一定的相似度,在面向对象程序编程中,对象的创建与析构都是一个较为复杂的过程,较费时间,所以为了提高程序的运行效率尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。
所以我们可以创建一个进程池(线程池),预先放一些进程(线程)进去,要用的时候就直接调用,用完之后再把进程归还给进程池,省下创建删除进程的时间,不过当然就需要额外的开销了
利用线程池与进程池可以是管理进程与线程的工作交给系统管理,不需要程序员对立面的线程、进程进行管理
9.死锁的概念,导致死锁的原因.
(1)因为系统资源不足。
(2)进程运行推进的顺序不合适。
(3)资源分配不当等。
10.导致死锁的四个必要条件。
(1)互斥条件:
一个资源每次只能被一个进程使用。
(2)请求与保持条件:
一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:
进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:
若干进程之间形成一种头尾相接的循环等待资源关系。
11.处理死锁的四个方式。
1、撤消陷于死锁的全部进程;
2、逐个撤消陷于死锁的进程,直到死锁不存在;
3、从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
4、从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态
12.预防死锁的方法、避免死锁的方法。
1.忽略该问题。
例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。
为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。
跟掩耳盗铃有点像。
2.检测死锁并且恢复。
3.仔细地对资源进行动态分配,以避免死锁。
4.通过破除死锁四个必要条件之一,来防止死锁产生。
13.进程调度算法。
(周转时间=程序结束时间--开始服务时间、带权周转时间=周转时间/要求服务时间)
14.Windows内存管理的方式(块式、页式、段式、段页式).
块式管理:
把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把程序片断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。
这样会造成很大的浪费,平均浪费了50%的内存空间,但时易于管理。
页式管理:
把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。
段式管理:
把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。
一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧)。
段页式管理:
结合了段式管理和页式管理的优点。
把主存分为若干页,每一页又分为若干段。
好处就很明显,不用我多说了吧。
15.内存连续分配方式采用的几种算法及各自优劣。
1、单一连续分配2、固定分区分配3、动态分区分配
常见内存分配算法及优缺点如下:
(1)首次适应算法。
使用该算法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小要求的空闲分区为止。
然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。
该算法倾向于使用内存中低地址部分的空闲分区,在高地址部分的空闲分区很少被利用,从而保留了高地址部分的大空闲区。
显然为以后到达的大作业分配大的内存空间创造了条件。
缺点在于低址部分不断被划分,留下许多难以利用、很小的空闲区,而每次查找又都从低址部分开始,这无疑会增加查找的开销。
(2)循环首次适应算法。
该算法是由首次适应算法演变而成的。
在为进程分配内存空间时,不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足要求的空闲分区,并从中划出一块来分给作业。
该算法能使空闲中的内存分区分布得更加均匀,但将会缺乏大的空闲分区。
(3)最佳适应算法。
该算法总是把既能满足要求,又是最小的空闲分区分配给作业。
为了加速查找,该算法要求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。
这样每次找到的第一个满足要求的空闲区,必然是最优的。
孤立地看,该算法似乎是最优的,但事实上并不一定。
因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。
同时每次分配后必须重新排序,这也带来了一定的开销。
(4)最差适应算法。
最差适应算法中,该算法按大小递减的顺序形成空闲区链,分配时直接从空闲区链的第一个空闲分区中分配(不能满足需要则不分配)。
很显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。
这种分配方法初看起来不太合理,但它也有很强的直观吸引力:
在大空闲区中放入程序后,剩下的空闲区常常也很大,于是还能装下一个较大的新程序。
最坏适应算法与最佳适应算法的排序正好相反,它的队列指针总是指向最大的空闲区,在进行分配时,总是从最大的空闲区开始查寻。
该算法克服了最佳适应算法留下的许多小的碎片的不足,但保留大的空闲区的可能性减小了,而且空闲区回收也和最佳适应算法一样复杂。
16.动态链接及静态链接.
动态库:
1.共享:
多个应用程序可以使用同一个动态库,启动多个应用程序的时候,只需要将动态库加载到内存一次即可;
2.开发模块好:
要求设计者对功能划分的比较好。
静态库:
代码的装载速度快,执行速度也比较快,因为编译时它只会把你需要的那部分链接进去,应用程序相对比较大。
但是如果多个应用程序使用的话,会被装载多次,浪费内存。
17.基本分页、请求分页储存管理方式。
(1)基本思想
(2)存储管理使用的数据结构(空闲空间管理的/作业占用空间管理的)
(3)逻辑地址的格式,地址变换的时间(动态/静态)、方法
(4)存储分配和存储回收过程
(5)是否能实现虚拟存储;如果能,如何实现
(6)其他特点:
是否存在碎片问题(原因);是否能实现存储保护(如何实现)等
18.基本分段、请求分段储存管理方式。
19.分段分页方式的比较各自优缺点。
分页和分段系统有许多相似之处。
比如,两者都采用离散分配方式,且都要通过地址映射机构来实现地址变换。
但在概念上两者完全不同,主要表现在下述三个方面。
(1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。
或者说,分页仅仅是由于系统管理的需要而不是用户的需要。
段则是信息的逻辑单位,它含有一组其意义相对完整的信息。
分段的目的是为了能更好地满足用户的需要。
(2)页的大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面;而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时,根据信息的性质来划分。
(3)分页的作业地址空间是一维的,即单一的线性地址空间,程序员只需利用一个记忆符,即可表示一个地址;而分段的作业地址空间则是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
20.几种页面置换算法,会算所需换页数。
(LRU用程序如何实现?
)
1)最佳置换算法(OPT)(理想置换算法
2)先进先出置换算法(FIFO)
3)最近最久未使用(LRU)算法
4)Clock置换算法(LRU算法的近似实现)
5)最少使用(LFU)置换算法
6)工作集算法
7)工作集时钟算法
8)老化算法(非常类似LRU的有效算法)
9)NRU(最近未使用)算法
10)第二次机会算法
21.虚拟内存的定义及实现方式。
虚拟内存是计算机系统内存管理的一种技术。
它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
与没有使用虚拟内存技术的系统相比,使用这种技术的系统使得大型程序的编写变得更容易,对真正的物理内存(例如RAM)的使用也更有效率。
在Windows9x时代,例如Windows98,用于实现虚拟内存的文件存放在系统分区的根目录下。
通常是系统分区根目录下的win386.swp(具有隐藏、系统属性)。
有关虚拟内存设置则存放在系统目录中的system.ini中,其中形似“PagingDrive=C:
\Win386.swp”的一行就是虚拟内存文件路径、文件名的设置。
在WindowsNT系列中,例如WindowsXP,用于实现虚拟内存的文件则以系统分区根目录下的页面文件pagefile.sys(具有隐藏、系统属性)形式来保存。
这些文件的大小——即pagefile.sys文件大小的默认值是物理内存的1.5倍。
同时,页面文件可以设置一个比平常值大的最大值,当物理内存与页面文件皆不够用时,系统会自动生成temppf.sys(意为temporarypagefile,临时页面文件)进行补足,temppf.sys的大小在页面文件的大小和最大值之间。
在Linux操作系统支持两种形式的交换空间:
交换分区和交换文件。
交换分区:
在磁盘中专门分出一个磁盘分区用于交换交换文件:
创建一个文件用于交换交换空间大小没有规定特定的值,如果物理内存较小(小于512M字节)时,一般设置为物理内存的1.5倍到2倍。
22.操作系统的四个特性。
并发性,共享性,虚拟性,异步性
23.DMA。
DMA的英文拼写是“DirectMemoryAccess”,汉语的意思就是直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。
在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。
DMA模式又可以分为Single-WordDMA(单字节DMA)和Multi-WordDMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。
24.Spooling。
SPOOLing(SimultaneousPeripheralOperationOn-Line)技术,即外部设备联机并行操作,是为实现低速输入输出设备与高速的主机之间的高效率数据交换而设计的。
通常称为“假脱机技术”,又称为排队转储技术。
25.外存分配的几种方式,及各种优劣。
连续分配、链接分配和索引分配(优缺点见PPT)
二:
计算机网络
1.电路交换与分组交换的区别?
优劣对比。
分组交换和电路交换是两个节点或者主机之间传输数据的两种网络方式。
对于分组交换网络来说,数据是通过分成单个的组进行传输的,通过电路把数据传送到另一台主机。
在分组交换网络中,当数据包到达线路时,路由不是专门确定的。
使用路由算法,每一个数据包实际上可以采用不同的路由通过网络到达目标主机。
这与电路交换不同,电路交换设置一个静态路由,并且在开始连接主机之前就预先设置好了。
表11Mbit/s链路与100个用户连接结果表:
电路交换分组交换
带宽1Mbit/s10Kbit/s
平均时延50s100s
最大时延100s100s
2.OSI有哪几层,会画出来,知道主要几层的各自作用。
1.物理层:
主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。
它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0,也就是我们常说的数模转换与模数转换)。
这一层的数据叫做比特。
2.数据链路层:
定义了如何让格式化数据以进行传输,以及如何让控制对物理介质的访问。
这一层通常还提供错误检测和纠正,以确保数据的可靠传输。
3.网络层:
在位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。
Internet的发展使得从世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
4.传输层:
定义了一些传输数据的协议和端口号(WWW端口80等),如:
TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。
主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。
常常把这一层数据叫做段。
5.会话层:
通过传输层(端口号:
传输端口与接收端口)建立数据传输的通路。
主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)。
6.表示层:
可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。
例如,PC程序与另一台计算机进行通信,其中一台计算机使用扩展二一十进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。
如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
应用层:
是最靠近用户的OSI层。
这一层为用户的应用程序(例如电子邮件、文件传输和终端仿真)提供网络服务。
3.TCP/IP有哪几层,会画出来,知道所有层数的作用,会列举各层主要的协议名称。
一共有四层:
从上到下---应用层(Application) 、传输层(Transport)、网络层(NetworkLayer)、网络接口层
从协议分层模型方面来讲,TCP/IP由四个层次组成:
网络接口层、网间网层、传输层、应用层。
其中:
网络接口层这是TCP/IP软件的最低层,负责接收IP数据报并通过网络发送之,或者从网络上接收物理帧,抽出IP数据报,交给IP层。
网间网层负责相邻计算机之间的通信。
其功能包括三方面。
一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。
二、处理输入数据报:
首先检查其合法性,然后进行寻径--假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。
三、处理路径、流控、拥塞等问题。
传输层提供应用程序间的通信。
其功能包括:
一、格式化信息流;二、提供可靠传输。
为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。
应用层向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。
远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。
TELNET会话提供了基于字符的虚拟终端。
文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。
4.硬件(MAC)地址的概念及作用。
MAC(Medium/MediaAccessControl)地址,或称为MAC地址、物理地址,用来表示互联网上每一个站点的标识符,采用十六进制数表示,共六个字节(48位)。