几个面试题
Linux
僵尸进程,孤儿进程
僵尸进程
指的是一个进程使用fork创建子进程,如果子进程退出,父进程又灭有调用wait/waitpid获取子进程状态,此时子进程的状态信息仍在系统中,这种进程为僵尸进程孤儿进程
指的是父进程已经退出,但其子进程还在运行,那么他的子进程都会变成孤儿进程,被pid为1的init进程收养管理危害:
孤儿进程:没有危害,因为有init进程管理
僵尸进程:按理说父进程产生了僵尸进程不管了,然后子进程自己做完自己的事情就结束也可以,但是问题就在于子进程什么时候结束是个未知数,大量这样的僵尸进程会占用进程号(进程号是有限的)。
解决僵尸进程:kill产生僵尸进程的父进程,这样僵尸进程就由init进程接管变成孤儿进程
线程与进程
进程
是操作系统分配系统资源的单位,线程
是操作系统运算调度的最小单位。
信号量
是由内核来维护的,他独立出进程。因此可以通过它来进行同步。互斥锁、条件变量、信号量三者的差别:
互斥锁由生成互斥锁的进程解除(因为此时其他线程根本得不到此锁),信号量没有这种限制:一个线程等待某个信号量,而另一个线程可以挂出该信号量
基本概念
互斥锁(Mutex,Mutual Exclusive Lock):
获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作
semaphore(信号量):
Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可用资源,加锁时获得该资源,将Mutex减到0,信号量和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1。
进程之间通信
常用的通信方式( linux 下)有
共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存可以直接读写内存是最快的 IPC 方式
匿名和具名管道
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
socket
面相网络的一种进程间通信方式,只要有网络存在,它可以跨越任何限制
消息队列
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
Deamon进程
在DOS环境中,此类应用程序被称为驻留程序(TSR)。在Windows系统中,由称为Windows服务的应用程序来履行守护进程的职责。
独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务
守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。
HTTP
分布式session:
方案原理:将一台机器上的Session数据广播复制到集群中其余机器上
使用场景:机器较少,网络流量较小
优点:实现简单、配置较少、当网络中有机器Down掉时不影响用户访问
缺点:广播式复制到其余机器有一定廷时,带来一定网络开销Cookies和Session
客户端接收到从服务器端发来的 Session ID 后, 会将其作为
Cookie 保存在本地。 下次向服务器发送请求时, 浏览器会自动发送
Cookie, 所以 Session ID 也随之发送到服务器。 服务器端可通过验证
接收到的 Session ID 识别用户和其认证状态。