蚂蚁面经整理

1.HTTPS和HTTP的主要区别

        1、https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。

        2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。

        3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

        4、http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

2.网络七层/四层模型

OSI网络七层

        应用层(规定数据的传输协议

        表示层(解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信

        会话层(建立一个连接(自动的手机信息、自动的网络寻址)

        传输层(每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议

        网络层(此处需要确定计算机的位置,怎么确定?IPv4,IPv6路由器

        数据链路层(规定了0和1的分包形式,确定了网络数据包的形式网卡、网桥、交换机

        物理层(将数据转换为0/1)网线、集线器

TCP/IP四层模型:

4、应用层(Application):为用户提供所需要的各种服务
3、传输层(Transport):为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性
2、网际层(Internet):主要解决主机到主机的通信问题
1、网络接口层(Network Access):负责监视数据在主机和网络之间的交换

OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。

OSI七层和TCP/IP的区别:

    TCP/IP他是一个协议簇;而OSI(开放系统互联)则是一个模型,且TCP/IP的开发时间在OSI之前。
    TCP/IP是由一些交互性的模块做成的分层次的协议,其中每个模块提供特定的功能;OSI则指定了哪个功能是属于哪一层的。
    TCP/IP是四层结构,而OSI是七层结构。OSI的最高三层在TCP中用应用层表示。
各层的协议:

应用层:

超文本传输协议HTTP
文件传送协议FTP
远程登录协议TELNET
简单邮件传送协议SMTP
DNS域名解析协议

传输层:TCP(传输控制协议)/UDP(用户数据包协议)

3.MAC地址的作用

MAC地址是数据链路层的地址,如果mac地址不可直达 ,直接丢弃,在LAN里面,一个网卡的MAC地址是唯一的;
MAC地址在arp协议里常常用到,mac地址到ip地址的相互转化;

由于IP只是逻辑上标识,任何人都随意修改,因此不能用来标识用户;而 MAC地址则不然,它是固化在网卡里面的,基于MAC地址的这种特点,局域网采用了用MAC地址来标识具体用户的方法。于是解决了IP盗用问题。属于物理地址。

4.TCP/UDP在哪一层?两者区别?为什么要三次握手?为什么要四次挥手?

5.常见的IO模型(UNIX网络编程):

1)同步阻塞IO(Blocking IO):即传统的IO模型。

(2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。

(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。

(4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非阻塞IO。

(5)信号驱动

6. I/O多路复用方式

IO多路复用使程序能够同时监听多个文件描述符,能提高程序的性能,linux方式:select、poll、epoll(epoll可以说是select和poll的增强版)

select的几大缺点:
(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大
(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大
(3)select支持的文件描述符数量太小了,默认是1024

poll的实现和select非常相似,只是描述fd集合的方式不同,poll使用pollfd结构而不是select的fd_set结构。其他的都差不多。

epoll提供了三个函数,epoll_create,epoll_ctl和epoll_wait,epoll_create是创建一个epoll句柄;epoll_ctl是注册要监听的事件类型;epoll_wait则是等待事件的产生。

7.进程和线程的区别

进程:操作系统资源分配的最小单元。一个进程拥有的资源有⾃⼰的堆、栈、虚存空间(页表)、文件描述符等信息。 从编程的角度来理解进程,可以把它看作是⼀个类或一个 PCB(进程控制块的结构体)。进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看作程序运行的一次运行过程。

线程:操作系统能够进行运算调度的最小单元。它被包含在进程中,是进程中实际运行的单位。一个进程中可以并发多个线程,每个线程执行不同的任务 。

虽然多进程也能实现并发编程,但是线程比进程更轻量

区别:

1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。

2.从属关系不同:进程中包含了线程,线程属于进程。

3.开销不同:进程的创建、销毁和切换的开销都远大于线程。

4.拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。

5.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。

6.CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。

7.操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。

8.死锁

死锁:是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

死锁产生原因:a.竞争资源  b.进程间推进顺序非法

死锁产生的四个必要条件:

1.互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
2.请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
4.环路等待条件:在发生死锁时,必然存在一个进程--资源的环形链。
避免死锁:允许进程动态地申请资源、银行家算法(首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。)

9.虚拟内存

日常生活中,当我们使用电脑的时候,尤其是windows电脑,经常会打开许多软件,这些软件占用的内存已经远远大于计算机的物理内存。之所以会这样,就是因为虚拟内存的存在

虚拟内存会为每个进程提供一个一致的,私有的地址空间,它让每个进程都拥有一片连续完整的内存空间,这样能更加有效管理内存并减少出错

内存分配互不干涉,假设用户在编程是内存空间无限大

10.i++和++i的区别是什么?哪个效率高?为什么?

理论上,++i的执行效率比i++的执行效率要高。

因为++i 不用生成临时变量,而i++要生成临时变量。

这意味着在翻译成汇编代码时,i++可能需要更多的指令来解释。

当然这个会因编译器有所区别,有的编译器会对这个流程进行优化。

从执行逻辑分析

i++表示先赋值后加1;i++实现的是,运算结束之后进行自加运算,换句话说这一句跑到分号之后才会有自加效果。

++i表示先加1再赋值;++i正好相反,是在这一句的一开始就进行自加,然后将结果带入运算。

11.内存泄漏

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化,其值是随机的,指针变量的值是别的变量的地址,意味着指针指向了一个地址是不确定的变量,此时去解引用(返回内存地址中对应的变量的值)就是去访问了一个不确定的地址,所以结果是不可知的。

12.c++内存分配

一个C/C++编译的程序占用内存分为以下几个部分:

栈区(stack):由编译器自动分配与释放,存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
堆区(heap):一般由程序员自动分配,如果程序员没有释放,程序结束时可能有OS回收。其分配类似于链表。
全局区(静态区static):存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)。
常量区(文字常量区):存放常量字符串,程序结束后由系统释放。
代码区:存放函数体(类成员函数和全局区)的二进制代码。

三种内存分配方式:1.从静态存储区分配(内存在程序编译的时候已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static量。)2.在栈上创建(在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时,这些内存单元会自动被释放。栈内存分配运算内置于处理器的指令集,效率高,但是分配的内存容量有限。)3.从堆上分配(亦称为动态内存分配。程序在运行的时候使用malloc或者new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生命周期有程序员决定,使用非常灵活,但如果在堆上分配了空间,既有责任回收它,否则运行的程序会出现内存泄漏,频繁的分配和释放不同大小的堆空间将会产生内存碎片)

13.(MYSQL)事物的四大特性

事物:是指一个完整的业务逻辑,一个不可再分的工作单元。

四大特性:1.原子性(Atomicity,做/不做)、2.一致性(Consistency)3.隔离性(Isolation互不干扰)4.持久性(Durability,事物一旦提交->永久)

四大隔离界别:Read Uncommitted(读未提交)、Read Committed(读已提交)、Repeatable Read(可重复读)、Serializable(串行化)。四种隔离级别依次增强。

14.(LINUX)kill -9 和kill -15的区别

kill -9是强制杀死进程的命令,它会直接终止进程,不管进程是否愿意退出,也不会给进程任何机会来保存工作状态或清理资源。

kill -15是正常杀死进程的命令,它会发送一个终止信号给进程,让进程有机会自行清理资源、保存工作状态。进程可以捕捉这个信号并执行相应的操作,然后再退出。如果进程在一定时间内没有退出,系统会发送一个强制终止信号给进程,这个信号和kill -9的效果是一样的。

因此,通常情况下,应该优先使用kill -15来杀死进程,只有在进程无法正常退出或存在死锁等问题时,才使用kill -9。

15.僵尸进程怎么产生的?僵尸进程和孤儿进程的区别?哪一个有害?怎么杀死僵尸进程?

如果一个进程已经终止,但是它的父进程尚未调用 wait() 或 waitpid() 对它进行清理,这时的进程状态称为僵死状态,处于僵死状态的进程称为僵尸进程(zombie process)。任何进程在刚终止时都是僵尸进程,正常情况下,僵尸进程都立刻被父进程清理了

影响:如果进程不调用 wait / waitpid 的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程。

孤儿进程:孤儿进程指:当一个子进程的父进程结束时,子进程还在运行,此时,这个子进程就叫做孤儿进程。最后,孤儿进程会被init进程(进程id为1)进程收养,即将init作为孤儿进程的父进程,当子进程结束时,由init进程完成对它的状态收集工作。因此,孤儿进程是无害的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值