每日3题是麦叔的面试系列专题之一,每天包括初级,中级,高级难度题目各一道。
每日3题,100天之后成为大牛!
如果有不明白的,给麦叔留言。
[Easy] 谈谈你对面向对象的理解?
思考30秒再往下翻...
面向对象是相当于面向过程而言的,面向过程语言是一种基于功能分析的,以算法为中心的程序设计方法,而面向对象是一种基于结构分析的,以数据为中心的程序设计思想。在面向对象语言中有一个很重要的东西,叫做类。面向对象有三大特性:封装、继承、多态。
[Normal] Python异步使用场景有哪些?
思考30秒再往下翻...
多线程和多进程的模型虽然解决了并发问题,但是系统不能无上限地增加线程。由于系统切换线程的开销也很大,所以,一旦线程数量过多,CPU的时间就花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降。
由于我们要解决的问题是CPU高速执行能力和IO设备的龟速严重不匹配,多线程和多进程只是解决这一问题的一种方法。
另一种解决IO问题的方法是异步。当代码需要执行一个耗时的IO操作时,它只发出IO指令,并不等待IO结果,然后就去执行其他代码了。一段时间后,当IO返回结果时,再通知CPU进行处理。
异步使用场景:
不涉及共享资源,或对共享资源只读,即非互斥操作
没有时序上的严格关系
不需要原子操作,或可以通过其他方式控制原子性
常用于IO操作等耗时操作,因为比较影响客户体验和使用性能
不影响主线程逻辑
[Hard] 什么是僵尸进程和孤儿进程?怎么避免僵尸进程?
思考30秒再往下翻...
孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init 进程(进程号为1)所收养,并由init 进程对他们完成状态收集工作。
僵尸进程:进程使用fork 创建子进程,如果子进程退出,而父进程并没有调用wait 或waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。
避免僵尸进程的方法:
1.fork 两次用孙子进程去完成子进程的任务
2.用wait()函数使父进程阻塞
3.使用信号量,在signal handler 中调用waitpid,这样父进程不用阻塞
mac系统可以通过命令查看僵尸进程
支持麦叔,请点在看,谢谢!