广州Python面试总结2 - 基础知识笔试题(来源广州Python近期面试笔试题)

一、笔试题问题

  1. 叙述操作系统中进程、线程、协程的区别,以及适用场景。
  2. 选择自己了解的几种Python后台框架(Flask、Django、Tornado),说明其优缺点。
  3. 消息队列的使用场景有哪些。
  4. 选择一个自己熟悉的数据库,MySQL或MongoDB回答下面的问题:
    a. 从user表中查找所有name等于"小明"的行,返回name和age,并只返回前十条记录;
    b. 向user表中插入一条记录,name等于"小明",age等于23,指定id为1;
    c. 在user表中删除所有name等于"小明"的记录;
    d. 数据库主从集群(或副本集)间是如何通讯和同步数据的。
  5. 进程间的通信有哪些方式?(不限于单击上的通信)
  6. 常用的操作系统调度算法以及简单的描述。
  7. 描述快速排序算法的流程。

二、问题答案

1. 叙述操作系统中进程、线程、协程的区别,以及适用场景

进程多与线程比较
线程与进程的区别:

  1. 线程是指进程内的一个执行单元,也是进程内的可调度实体。
  2. 地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
  3. 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
  4. 线程是处理器调度的基本单位,但进程不是
  5. 二者均可并发执行
  6. 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

协程多与线程进行比较

  1. 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。
  2. 线程进程都是同步机制,而协程则是异步
  3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

应用场景

  1. 多进程适合在CPU 密集型操作(cpu 操作指令比较多,计算密集型,如科学计算,位数多的浮点运算)。
  2. 多线程适合在IO 密集型操作(读写数据操作较多的,比如Web网站、爬虫)。
  3. Python中的多线程是假的多线程,协程+线程=真的多线程。

2. 选择自己了解的几种Python后台框架(Flask、Django、Tornado),说明其优缺点

因为Django和Flask的我都使用过,在面试前也了解过(具体可参考我前面的一篇博客:传送门),所有选择Django和Flask框架。
Django和Flask框架的区别

  1. Django重量级框架,自带ORM和模板引擎,还提供丰富的工具和组件;而Flask轻量级微框架,只提供了Web框架的核心功能,自由、灵活、高度定制。相比起来Django就不那么灵活,如果你想修改框架自带的功能,会比较麻烦。
  2. Django适合企业级网站开发,成熟、稳定、完善,还支持快速开发;而Flask开发大型网站也没有压力,但代码架构需要自己设计,前期项目搭建比较麻烦、耗时,相比Django还没有那么稳定。
  3. Django自带ORM也使Django与关系型数据库耦合度过高,如果想使用MongoDB等NoSQL数据,需要选取合适的第三方库;而Flask与关系型数据库的配合使用不弱于Django,而其与NoSQL数据库的配合远远优于Django。
  4. Django和Flask都比较容易上手,Django是模板式的开发,对初学者来说,相当简单(前提是不看底层代码),而Flask想要开发大型网站就得看程序猿的功力了。所以初学者还是推荐先Django再Flask,然后可以试着用Flask去改Django的代码。

3. 消息队列的使用场景有哪些

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。
详情应用解析可查看我的博客:《RabbitMQ使用场景介绍


4. 选择一个自己熟悉的数据库,MySQL或MongoDB回答下面的问题

  1. 从user表中查找所有name等于"小明"的行,返回name和age,并只返回前十条记录
    select name, age from user where name=“小明” limit 0,10;

  2. 向user表中插入一条记录,name等于"小明",age等于23,指定id为1
    insert into user(name,age) values(“小明”,23) where id=1;

  3. 在user表中删除所有name等于"小明"的记录
    delete from user where name=“小明”;(物理删除)

  4. 数据库主从集群(或副本集)间是如何通讯和同步数据的

  • 数据库主从通讯
    在多台数据服务器中,分为主服务器和从服务器。一台主服务器对应多台从服务器。主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据。主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
  • 同步数据
    MySQL服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
    在这里插入图片描述

5. 进程间的通信有哪些方式?(不限于单击上的通信)

进程间通信方式有管道、信号量、信号、消息队列、共享内存、套接字六种。

  1. 管道分为有名管道和无名管道,其中无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,一般用于两个不同进程之间的通信。有名管道也是一种半双工的通信方式,但它允许无亲缘关系进程间的通信。
  2. 信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。
  3. 信号是一种比较复杂的通信方式,用于通知接收进程某个时间已经发生。
  4. 消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点。
  5. 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。他往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
  6. 套接字可用于不同及其间的进程通信。

6. 常用的操作系统调度算法以及简单的描述

在操作系统中存在多种调度算法,其中有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适用。下面介绍几种常用的调度算法。

  • 先来先服务(FCFS)调度算法
    FCFS调度算法是一种最简单的调度算法,该调度算法既可以用于作业调度也可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将它们调入内存,分配必要的资源,创建进程并放入就绪队列。
  • 短作业优先(SJF)调度算法
    短作业(进程)优先调度算法是指对短作业(进程)优先调度的算法。短作业优先(SJF)调度算法是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。而短进程优先(SPF)调度算法,则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即执行,直到完成或发生某事件而阻塞时,才释放处理机。
  • 优先级调度算法
    优先级调度算法又称优先权调度算法,该算法既可以用于作业调度,也可以用于进程调度,该算法中的优先级用于描述作业运行的紧迫程度。
  • 高响应比优先调度算法
    高响应比优先调度算法主要用于作业调度,该算法是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备作业队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
  • 多级反馈队列调度算法(集合了前几种算法的优点)
    多级反馈队列调度算法是时间片轮转调度算法和优先级调度算法的综合和发展,通过动态调整进程优先级和时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为提高系统吞吐量和缩短平均周转时间而照顾短进程;为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;同时,也不必事先估计进程的执行时间。

7. 描述快速排序算法的流程

快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边。

然后以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组,重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有序的)。

以下的代码中会常常使用交换数组中两个元素值的Swap方法,其代码如下:

public static void Swap(int[] A, int i, int j){
int tmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;

在这里插入图片描述

发布了53 篇原创文章 · 获赞 69 · 访问量 2074
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览