面试问题复习(一)
1. 缓冲区溢出
缓冲区溢出原指当某个数据超过了处理程序限制的范围时,程序出现的异常操作。造成此现象的原因有:
- 存在缺陷的程序设计。
- 尤其是C语言,不像其他一些高级语言会自动进行数组或者指针的边界检查,增加溢出风险。
- C语言中的C标准库还具有一些非常危险的操作函数,使用不当也为溢出创造条件。比如(1.字符串处理函数没有指定长度,单单凭借结尾字符是不是’\0’来判断结束。2.被处理的字符超过缓冲区可接受的大小。例如,从屏幕输入字符串:gets(buff),但是buff的内存少于屏幕一行字符个数,就会导致溢出,应该使用fgets)。
2.linux上gcc版本提供了三种对抗缓冲器溢出
- 栈随机化;
- 栈破坏检测;
- 限制可执行代码区域;
3. 如何实现线程安全
产生线程不安全的原因
在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。
在Java多线程编程当中,提供了多种实现Java线程安全的方式:
- 最简单的方式,使用Synchronization关键字:Java Synchronization介绍
- 使用java.util.concurrent.atomic 包中的原子类,例如 AtomicInteger
- 使用java.util.concurrent.locks 包中的锁
- 使用线程安全的集合ConcurrentHashMap
- 使用volatile关键字,保证变量可见性(直接从内存读,而不是从线程cache读)
4. 进程/线程间通信
##### 进程间通信
-
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
-
有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
-
信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
-
消息队列( messagequeue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
-
信号 (sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
-
共享内存(shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
-
套接字(socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
线程建的通信方式
-
锁机制:包括互斥锁、条件变量、读写锁
- 互斥锁提供了以排他方式防止数据结构被并发修改的方法。
- 读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
- 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
-
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
-
信号机制(Signal):类似进程间的信号处理
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。
5. 使用TCP/UDP的应用协议有哪些
TCP对应的协议:
(1) FTP:定义了文件传输协议,使用21端口。
(2) Telnet:一种用于远程登陆的端口,使用23端口,用户可以以自己的身份远程连接到计算机上,可提供基于DOS模式下的通信服务。
(3) SMTP:邮件传送协议,用于发送邮件。服务器开放的是25号端口。
(4) POP3:它是和SMTP对应,POP3用于接收邮件。POP3协议所用的是110端口。
(5)HTTP:是从Web服务器传输超文本到本地浏览器的传送协议。
UDP对应的协议:
(1) DNS:用于域名解析服务,将域名地址转换为IP地址。DNS用的是53号端口。
(2) SNMP:简单网络管理协议,使用161号端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
(3) TFTP(Trival File Tran敏感词er Proto