美团面试题

1、Linux进程间的通信方式?两个进程是如何来共享内存的?两个进程如何通过信号量通信?
(1)Linux下进程间通信的方式有: 管道(有名/无名) 、消息、信号、信号量、共享内存、邮箱、socket。
(2)Linux下共享内存是进程间通信的方式之一,共享内存允许两个或多个进程访问同一块内存,比如像 malloc函数 向不同的进程返回执行同一块物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其他拥有这块物理内存指针的进程也会察觉到这个更改。在进程间的通信方式中,共享内存是通信效率最高的,访问共享内存区域和访问进程独有的内存区域一样快,并不需要通过系统调用或者其他通过内核的过程来完成,同时也避免了各种不必要的复制。对共享内存的操作涉及到多个进程间的同步问题,数据应该先写,在读,通常采用用信号量来协调这个过程。

进程与线程的区别?回答方式:
线程是进程中的一个逻辑执行单元,也是进程中可调度的实体;一个进程中可以包含多个线程,但是一个线程只能隶属于一个进程
与进程的区别:
1、CPU调度方面:CPU调度是以线程为基本单位进行的;
2、拥有资源方面:进程是拥有资源的基本单位,线程不拥有系统的资源,但是可以使用隶属于进程的资源;
3、并发方面: 线程 和 进程都支持并发;
4、系统开销方面: 创建进程的时候需要为进程分配资源,销毁进程时需要回收资源,所以使用进程的开销要大于使用线程的开销。

进程控制块?
操作系统通过进程控制块来对进程控制和管理的。PCB通常在系统内存中占用一块连续的分区,它存放着操作系统用于描述进程情况以及控制进程运行情况所需的全部信息,
为什么要CPU调度?
CPU调度的目标是在任何时候都有某些进程在运行,是CPU使用率最大化。 同一时刻 只有一个进程占有CPU资源,但一个进程在等待IO时等等一些阻塞进程的动作时,CPU就回空闲出来,这时候,我们应该让这个阻塞的进程让出CPU资源,让其他已经处于就绪状态的进程执行。这样就可以使CPU使用率最大化。
什么是死锁?
在多道程序环境下,多个进程可能竞争一定数量的资源,某个进程申请资源,如果这时这个资源不可用,那么这个进程就进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待进程可能再也无法改变其状态,一直等待下去,这种情况称之为 死锁。

cache的作用?
cache是处于 CPU寄存器 和 内存之间的一层缓存,用来加快CPU的取指速率, 使用时: CPU需要数据时,首先会查找cache中有没有需要的数据,如果有,则取走,如果没有,则查询内存,并将数据更新到缓存中,以供下次取指。

2、DNS (Domain name system)域名系统,简单描述其工作原理。
DNS客户机需要在程序中使用名称时,它会查询DNS服务器来解析该名称。客户机发送的每条查询信息包括三条信息:包括:指定的DNS域名,指定的查询类型,DNS域名指定的类别。它是基于UDP的服务,端口是53,该应用一般不直接为用户使用,而是为其他应用服务 如 HTTP、SMTP等在其中需要完成主机名到IP地址转换。

在浏览器地址栏内敲 www.baidu.com 到这个页面显示在浏览器上,这个过程中都发生了什么?
(1) 当我们在浏览器上敲入一个url是, 浏览器会解析出该url的域名,接下来的动作,是将域名转化为 ID 地址,依次查询 浏览器DNS缓存、系统缓存、路由器缓存、如果没有找到 则一直查询到 根域名服务器缓存,找到域名所对应的的 IP地址。
(2)向IP所对应的的服务器发送请求数据,
(3)服务器响应请求,发回网页内容;
(4)客户端浏览器获取网页内容,解析,并显示在浏览器上。
这就是我们所看到的的 百度页面显现的过程。

3、TCP/UDP的区别?
(1)TCP是面向连接的、可靠数据传输协议,UDP是不面向连接的,非可靠数据传输协议;(2) 从传输速度上考虑: TCP 由于要建立连接、保证数据传输的可靠性等造成数据传输速度比较慢,UDP不需要这些,数据传输速度相对比较快;(3)从安全方面考虑,TCP的安全性能更高,UDP的安全性能比较低 (4)从传输数据的格式来比较,TCP传输的单位称为报文段,UDP传输的数据单位被称为 数据报
4、ICMP协议
ICMP (Internet Control Message Protocol) ,因特网控制消息协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传输控制消息。控制消息包括:网络不同、主机是否可达、路由器是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但对用户数据的传递起着很重要的作用。ICMP报文格式两种: 差错报告报文和询问报文。

5、数据库
数据库 一个 逻辑执行单元 如何才能被称的上是一个事务? 必须满足的性质?
数据库的事务是指 一个逻辑单元,这个逻辑单元可包含一系列的执行操作, 一个逻辑单元要想成为一个事务,必须满足所谓的 ACID (原子性、隔离性、一致性、持久性);
原子性:指的是 一个事务执行,要么全部执行成功,要么执行失败回滚到执行之前的状态;
一致性:事务执行过后,数据库中数据的状态都必须是一致的,必须遵从数据库的完整性约束;
隔离性:对于多个事务并发的时候,
持久性: 事务的完成后对系统的影响是持久的,任何一个事务的操作不会对其他事务造成干扰;比如一个事务在读数据库,一个事务在写数据库,读数据库的这个事务读到的数据,要么是这个写数据库事务 写前的状态,要么为写后的状态,不存在 读到的数据是 另一个事务写的过程中的一个状态。
数据库索引?

6、内存管理
内存的段页式管理的优缺点?
分段:
在段式存储管理中,将程序的地址空间(进程地址空间)划分为若干个段(segment),这样每个进程都有一个二维的地址空间,相互独立,互不干扰。程序通过分段来划分为多个模块,如代码段、数据段、共享段等,这样做的优点是:可以分别编译源程序的一个文件,并且可以针对不同类型的段采取不同的保护,也可以按段为单位进行共享。段式存储管理的优点是:没有内碎片,外碎片可以通过内存紧缩来消除,便于实现内存共享。

分页:将程序的逻辑地址空间划分为固定大小的页 (page),而物理内存划分为同样大小的页框(pageframe)。程序加载时,可以将任意一页放入内存中的任意一个页框,这些页框不必连续,从而实现了离散分配。这种管理的优势是:没有外碎片,且一个程序不必连续存放,这样就便于更改程序占用的空间大小。
页式 和 段式系统有许多相似之处,比如,两者都采用离散的分配方式,都通过地址映射机构来实现地址变换。但概念上两者是有很多区别的,主要表现在:
[1]、页是信息的物理单位, 段是信息的逻辑单位,每个逻辑单元分为一个段。
[2]、页大小固定由系统决定,把逻辑地址划分为页号和页内地址两部分,段的长度不固定,且决定于用户编写的程序
[3]、页式系统地址空间是一维的,即为单一的线性地址空间,程序员只需利用一个标识符,即可表示一个地址。分段的作业地址空间是二维的,程序员在标识一个地址时,既需给出段名,又需给出段内地址。
http://dongxicheng.org/os/linux-memory-management-basic/

内存:
(1)虚拟内存: 计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存(一块连续完整的地址空间),而实际上,他/她通常被分割成多个物理内存碎片,还有部分占时存储在外部磁盘存储器上,在需要时进行交换数据。与没有虚拟内存技术的系统相比,使用这种技术的系统使得大型程序编写变得更容易,对真正的物理内存使用的更有效率。
(2)物理内存:实际的内存,物理地址被分成离散的单元,称为页,页面大小是跟操作系统的位数有关系,一般为4K

7、程序内存分区
5个分区:
堆区:用户在这进行动态内存分配区,
栈区:系统自动分配,自动回收,速度快,效率高,但是栈区比较小,小心 栈溢出
全局区: 存储全局变量和静态变量,
文字常量区:常量字符串就存储在这,程序结束后,由系统同一释放。
程序代码区:存放程序的二进制代码。

Jerky Lu wechat
欢迎加入微信公众号