继上篇文章继续分享:金蝶测开面经分享(上)
进程和线程
1. 区别:
# 进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
#进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
#线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。
#但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间
2. 进程与线程的资源
#线程共享:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
#线程独有:栈(保存其运行状态和局部自动变量)、程序计数器。
3. 进程与线程的同步
#进程:无名管道、有名管道、信号、共享内存、消息队列、信号量
#线程:互斥量、读写锁、自旋锁、线程信号、条件变量
4. 僵尸进程
# 定义:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或者waitpid获取子进程的状态信息,那么子进程的进程描述符等一系列信息还会保存在系统中。这种进程称之为僵死进程。
# 危害:在Unix系统管理中,当用ps命令观察进程的执行状态时,经常看到某些进程的状态栏为defunct,这就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数目太多,还会导致系统瘫痪。
#处理方法:
a. 改写父进程,在子进程死后要为它收尸。具体做法是接管SIGCHLD信号。子进程死后,会发送SIGCHLD信号给父进程,父进程收到此信号后,执行waitpid()函数为子进程收尸。这是基于这样的原理:就算父进程没有调用wait,内核也会向它发送SIGCHLD消息,尽管默认处理是忽略,如果想响应这个消息,可以设置一个处理函数。
b.把父进程杀掉。父进程死后,僵尸进程成为”孤儿进程”,过继给1号进程init,init始终会负责清理僵尸进程.它产生的所有僵尸进程也跟着消失。
4. 孤儿进程
#父进程运行结束,但子进程还在运行(未运行结束)的子进程就称为孤儿进程。孤儿进程最终会被init进程(进程号为1)所收养,因此init进程此时变成孤儿进程的父进程,并由init进程对它们完成状态收集工作。(linux下,init是内核启动的第一个用户级进程,init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。)
5. Linux命令
#"|":管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
#grep:-v 不显示匹配上的内容;-n 显示匹配上的内容
a. grep -v down,显示不包含down的内容。
b. grep -n down,显示包含down的内容。
c. du:(disk use)显示每个文件和目录的磁盘使用空间。
d. df:(disk free)显示磁盘分区上可以使用的磁盘空间。
6. 单例模式
# 什么情况下会用到:假如有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig对象的实例,这就导致系统中存在多个AppConfig的实例对象,在配置文件内容很多的情况下会严重浪费内存资源。类似AppConfig这样的类,我们希望在程序运行期间只存在一个实例对象。
#优点:速度快、在使用时不需要创建、直接使用即可。
#缺点:可能存在内存浪费
7. GET 和 POST 的区别
# GET在浏览器回退时是无害的,而POST会再次提交请求。
# GET产生的URL地址可以被Bookmark,而POST不可以。
# GET请求会被浏览器主动cache,而POST不会,除非手动设置。
# GET请求只能进行url编码,而POST支持多种编码方式。
# GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
# GET请求在URL中传送的参数是有长度限制的,而POST么有。
# 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
# GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
# GET参数通过URL传递,POST放在Request body中。
8. APP是用多进程安全还是用多线程安全
# 写网页(html,js,css)的,写的很随意,导致chrome渲染的时候出现bug,整个chrome崩掉,我google再nb的程序员也写不出来0 bug的浏览器,单个页面不行就算了,我越界到别人地址上了,大家一块崩溃吧,
# 插件也是参差不齐,插对了没问题,插错了不但是把自己弄坏,整个进程崩了,其他线程也别活了。
#别有用心者,我是黑客要努力的超越漏洞,我从页面a刺穿到别人的页面上(安全性问题).
#原因:多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
序列和反序列化
1. 定义:
# Java序列化就是指把Java对象转换为字节序列的过程。Java反序列化就是指把字节序列恢复为Java对象的过程。
# 作用
a. 序列化:在传递和保存对象时,保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
b. 反序列化:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
# 总结
a. 核心作用就是对象状态的保存和重建。
CP和UDP的区别、特点
# TCP的主要特点是:
a. 面向连接。
b. 每一条TCP连接只能是点对点的(一对一)。
c. 提供可靠交付的服务(无差错,不丢失,不重复,且按序到达)(校验和、重传控制、序号标识、滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。)。
d.提供全双工通信。
e.面向字节流。
#UDP的主要特点是:
a.无连接。
b.尽最大努力交付(不保证可靠交付)。
c.面向报文。
d.无拥塞控制。
e.支持一对一、一对多、多对一和多对多的交互通信。
f.首部开销小(只有四个字段:源端口、目的端口、长度、检验和)。
采用TCP,一旦发生丢包,TCP会将后续的包缓存起来,等前面的包重传并接收到后再继续发送,延时会越来越大。
UDP对实时性要求较为严格的情况下,采用自定义重传机制,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成影响。