操作系统和网络面试总结

来源:互联网 发布:亚马逊和淘宝哪个大 编辑:程序博客网 时间:2024/04/20 04:00

    • TCPIP 分层
    • OSI分层
    • TCP 和 UDP
    • 1 TCP 的三次握手
    • 2 TCP 的四次挥手
      • 问题1为什么连接的时候是三次握手关闭的时候却是四次握手
      • 问题2为什么TIME_WAIT状态需要经过2MSL最大报文段生存时间才能返回到CLOSE状态
    • 同步和异步 阻塞和非阻塞
    • 阻塞了应该怎么办java
    • 同步和互斥
    • 线程与进程
    • 僵尸进程和孤儿进程
    • 僵尸进程解决办法
    • 进程间的通信方式
    • 线程进程同步和通信的总结
    • 并发和并行
    • 分段和分页
    • 操作系统的内容分为几块吗什么叫做虚拟内存他和主存的关系如何内存管理属于操作系统的内容吗
    • 从TCPIP协议看访问yahoo网站的过程
    • 访问网站的过程
    • http协议
    • 降低缺页中断
    • ip地址


原文地址:http://blog.csdn.net/quzhongxin/article/details/48833301

以下关于TCP/IP的总结均来自:TCP三次握手/四次挥手详解

1. TCP/IP 分层

应用层:ftp, e-mail,http,dns
传输层:tcp, udp
网络层:IP, ARP
链路层:驱动程序和网卡,交换机

OSI分层:

  • 第7层 应用层(Application Layer)
    提供为应用软件而设的界面,以设置与另一应用软件之间的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等。

  • 第6层 表示层(Presentation Layer)
    把数据转换为能与接收者的系统格式兼容并适合传输的格式。

  • 第5层 会话层(Session Layer)
    负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

  • 第4层 传输层(Transport Layer)
    把传输表头(TH)加至数据以形成数据报。传输表头包含了所使用的协议等发送信息。例如:传输控制协议义(TCP) 等。

  • 第3层 网络层(Network Layer)
    决定数据的路径选择和转寄,它网络表头(NH)加至数据报,以形成分组。网络表头包含了网络数据。例如:互联网协议(IP) 等。

  • 第2层 数据链路层(Data Link Layer)
    负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成了帧。数据链表头(DLH)是包含了物理地址和错误侦测及改错的方法。数据链表尾(DLT)是一串指示数据包末端的字符串。例如以太网、无线局域网(Wi-Fi)和通用分组无线服务(GPRS)等。

  • 第1层 物理层(Physical Layer)
    在局部局域网络上传送帧,它负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等

2. TCP 和 UDP

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
UDP:面向非连接、传输不可靠(不保证数据到达的顺序)、用于传输少量数据(数据包模式)、速度快。
详细解释:
TCP为两台主机提供高可靠性的数据通信。他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。TCP的特点:面向连接的传输层协议,点对点的连接,可靠,全双工通信,面向字节流。
UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。

3.1 TCP 的三次握手

此处输入图片的描述
注意一个TCP发送包的首部为:16bit 源端口号,16bit 目的端口号, 32 位序列号(该包的编号),32位确认序列号(用以接收方回信时的序号),其他的标志位:确认位ACK,推送位PSH,同部位SYN,终止位FIN
第一次握手:建立连接时,客户端发送syn包和一个随机序列号seq=x到服务器,并进入SYN_SEND状态,等待服务器进行确认。(syn,同步序列编号)。
第二次握手,服务器收到syn包,必须确认客户的SYN,然后服务器发送一个ACK=1, SYN=1, seq=y的随机数和ack=x+1的确认数的包发送回去。
第三次握手是客户端收到服务器端的SYN+ACK包,然后向服务器端发送确认包ack=y+1, seq=x+1, ACK=1,客户端和服务器端进入ESTABLISHED状态,完成三次握手

3.2. TCP 的四次挥手

此处输入图片的描述
第一次:首先客户端主动发送Fin=1,seq=u,它等于前面已传送过去的最后一个字节的序号加1.这是A进入FIN-WAIT-1状态,等待B的确认。
第二次:B收到连接后立即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1.然后B即进入CLOSE-WAIT状态。因而A到B的这个链接现在已经断开了,这时的TCP连接处于半关闭状态,即A已经没有数据需要发送了。但B若发送数据,A还是要接受的。A收到来自B的确认之后就进入了FIN-WAIT-2状态等待B发出连接释放报文段。
第三次:若B已经没有要向A发送数据,其应用进程就通知TCP释放连接。这是B发出的连接释放报文段必须使用FIN=1.现在假定B的序号为w,B还必须重复上次已发送过的确认号ack=u+1.这时B就进入了LAST-ACK状态,等待A确认。
第四次:A在收到B的连接释放之后必须对此发出确认。在确认号中把ACK置1,确认号ack=w+1,而自己的序号是seq=u+1。接着A进入TIME-WAIT状态。为了保证B可以收到确认释放报文段。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,”你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

4. 同步和异步 阻塞和非阻塞

同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。
例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
例如 ajax请求(异步): 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。 
非阻塞
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

5. 阻塞了应该怎么办?(java)

  1. sleep()方法:
    sleep()允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep()被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。
      
  2. suspend()和 resume()方法:
    两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。典型地,suspend()和 resume()被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume()使其恢复。
  3. yield()方法:
    yield()使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield()的效果等价于调度程序认为该Java线程同步已执行了足够的时间从而转到另一个线程。
  4. wait()和 notify()方法:
    两个方法配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify()被调用或者超出指定时间时Java线程同步重新进入可执行状态,后者则必须对应的 notify()被调用。
      初看起来它们与 suspend()和 resume()方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这一对方法则相反。

6. 同步和互斥

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。

7. 线程与进程

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

一个程序至少有一个进程,一个进程至少有一个线程。一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行。

进程在执行过程中拥有独立的内存单元,而多个线程共享内存,可以极大地提高程序的运行效率。

僵尸进程和孤儿进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。

僵尸进程解决办法

(1)通过信号机制
  子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。
(2)fork 两次,将子进程变为孤儿进程

8. 进程间的通信方式

进程间通讯的方式:

  • 管道中还有命名管道和非命名管道之分,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先 进先出的通讯方式。FIFO是一种先进先出的队列。它类似于一个管道,只允许数据的单向流动。每个FIFO都有一个名字,允许不相关的进程访问同一个 FIFO,因此也成为命名管。
  • 消息队列:是用于 两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列 中取数据。需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中 写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!
  • 信号量, 不能传递复杂消息,只能用来同步
  • 共享内存,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写;

几种方式的比较:

  • 管道:速度慢,容量有限
  • 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题。
  • 信号量:不能传递复杂消息,只能用来同步
  • 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了一块内存的。

9. (线程/进程)同步和通信的总结

线程同步的方式:临界区、互斥量、信号量、事件
进程同步的方式:临界区、互斥量、信号量、事件、管程
进程间通信方式主要包括信号量、FIFO、管道、消息队列、共享内存。
进程互斥、同步与通信的关系:进程竞争资源时要实施互斥,互斥是一种特殊的同步,实质上需要解决好进程同步问题,进程同步是一种进程通信,由此看来,进程互斥、同步都可以看做进程的通信;
信号量是进程同步与互斥的常用方法,也可以作为低级的进程通信方法,用于传递控制信号;
管道与管程是不同的,管程是进程同步的方式,而管道则是进程通信的方式;

线程同步指多个线程同时访问某资源时,采用一系列的机制以保证同时最多只能一个线程访问该资源。线程同步是多线程中必须考虑和解决的问题,因为很可能发生多个线程同时访问(主要是写操作)同一资源,如果不进行线程同步,很可能会引起数据混乱,造成线程死锁等问题;

  • 临界区:通过对多线程的串行化来访问公共资源或者一段代码,速度快,适合控制数据访问
  • 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以可以保证公共资源不会同时被多个线程访问
  • 信号量:它允许多个线程同一时刻访问同一资源,但是需要限制同一时刻访问此资源的最大线程数目。信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中PV操作相似。
  • 事件(信号):通过通知操作的方式来保持多线程的同步,还可以方便的实现多线程的优先级比较的操作

10 并发和并行

并发:一个处理器能同时处理多任务;并发性是指能处理多个同时性活动的能力,并发时间不一定同时刻发生;
并行:多个处理器或多核处理器同时处理多个不同的任务;指同时发生的两个并发事件。
并发不一定并行,并行一定并发。

分段和分页

  • 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外碎片,提高内存的利用率;或者说,分页仅仅是由于系统管理的需要,而不是用户的需要。
  • 段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好的满足用户的需要。
  • 页的大小固定且由系统确定,把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而一个系统只能有一种大小的页面。段的长度却不固定,决定于用户所编写的程序,通常由编辑程序在对源程序进行编辑时,根据信息的性质来划分。
  • 分页的作业地址空间是一维的,即单一的线性空间,程序员只须利用一个记忆符,即可表示一地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。

操作系统的内容分为几块吗?什么叫做虚拟内存?他和主存的关系如何?内存管理属于操作系统的内容吗?

  • 操作系统的主要组成部分:进程和线程的管理,存储管理,设备管理,文件管理。
  • 虚拟内存是一些系统页文件,存放在磁盘上,每个系统页文件大小为4K,物理 内存也被分页,每个页大小也为4K,这样虚拟页文件和物理内存页就可以对应,实际上虚拟内存就是用于物理内存的临时存放的磁盘空间
  • 页文件就是内存页,物 理内存中每页叫物理页,磁盘上的页文件叫虚拟页,物理页+虚拟页就是系统所有使用的页文件的总和。

从TCP/IP协议看访问yahoo网站的过程

  1. 应用程序阶段:妳打开浏览器,在浏览器上面输入网址列,按下 [Enter]。此时网址列与相关数据会被浏览器包成一个数据, 并向下传给 TCP/IP 的应用层;
  2. 应用层:由应用层提供的 HTTP 通讯协议,将来自浏览器的数据报起来,并给予一个应用层表头,再向传送层丢去;
  3. 传送层:由于 HTTP 为可靠联机,因此将该数据丢入 TCP 封包内,并给予一个 TCP 封包的表头,向网络层丢去;
  4. 网络层:将 TCP 包裹包进 IP 封包内,再给予一个 IP 表头 (主要就是来源与目标的 IP 啰),向链结层丢去;
  5. 链结层:如果使用以太网络时,此时 IP 会依据 CSMA/CD 的标准,包裹到 MAC 讯框中,并给予 MAC 表头,再转成位串后, 利用传输媒体传送到远程主机上。
  6. 等到 Yahoo 收到你的包裹后,在依据相反方向拆解开来,然后交给对应的层级进行分析,最后就让 Yahoo 的 WWW 服务器软件得到你所想要的数据,该服务器软件再根据你的要求,取得正确的资料后,又依循上述的流程,一层一层的包装起来, 最后传送到你的手上

访问网站的过程

1.DNS域名解析:浏览器缓存、系统缓存、路由器、ISP的DNS服务器、根域名服务器。把域名转化成IP地址。
2.与IP地址对应的服务器建立TCP连接,经历三次握手:SYN,ACK、SYN,ACK
3.以get,post方式发送HTTP请求,get方式发送主机,用户代理,connection属性,cookie等
4.获得服务器的响应,显示页面

http协议

请求方法
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。参见安全方法
POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为渠道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法(安全的),其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如:
PATCH(由 RFC 5789 指定的方法):用于将局部修改应用到资源。

降低缺页中断

1、改变内存页框数。增加作业分得的内存块数。
2、增大页面大小。页面划分越大,中断率越低。
3、替换算法的优劣影响缺页中断次数
4、程序局部性。程序局部性好可减少缺页中断(为什么?)

ip地址

此处输入图片的描述
属于A类的私有地址:
10.0.0.0 – 10.255.255.255
属于B类的私有地址:
172.16.0.0 – 172.31.255.255(记住是16-31)
属于C类的私有地址:
192.168.0.0 – 192.168.255.255

0 0
原创粉丝点击