• 第四模块考核复习


    进程:
    正在进行的一个过程或者说一个任务,负责执行任务的是cpu,进程用来把资源集中到一起,进程是资源单位,或者说是资源集合
    线程:
    线程是cpu的执行单位,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
    多线程和多进程的区别:
    0、创建进程的开销远大于创建线程的开销。
    1、开启速度 在主进程下开启线程比 开启子进程快 (线程:线程先执行,在执行进程程序)
    2、pid 对比:在主进程下开启多个线程(进程和线程pid相同);在主进程下开启子进程(pid不相同)
    3、同一进程内的线程共享该进程的数据(进程之间的地址是隔离的;同一进程内的线程共享该进程的地址空间)
    协程:
    协程:是单线程下的并发,又称微线程,纤程。
    协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。
    优点如下:
    1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级
    2. 单线程内就可以实现并发的效果,最大限度地利用cpu
    缺点如下:
    1. 协程的本质是单线程下,无法利用多核,可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程
    2. 协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程
    协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用于协程;
    进程池与线程池作用:
    # 为什么建池 :我们必须对服务器开启的进程数或者线程数加以控制,让机器在一个自己可以承受的范围内运行
    # 这就是进程池或线程池的作用
    协程与线程的区别:
    协程:单线程下的并发。协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。 
      1.python的线程是属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他的线程运行) 
    2.单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!非io操作的切换与效率无关)
    GIL锁是什么鬼?
    GIL即全局解释器锁,全局解释器锁的存在,在同一时间内,python解释器只能运行一个线程的代码,这大大影响了python多线程的性能。而这个
    解释器锁由于历史原因,现在几乎无法消除。
    有了GIL的存在,同一时刻同一进程中只有一个线程被执行
    进程间通信方式有哪些?
    进程间通信(IPC),消息队列(队列 = 管道 + 锁),管道(使用消息传递的)
    信号量,套接字(socket),Event,定时器
    什么是并发和并行?
    答:并发是指一个处理器同时处理多个任务。
    并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
    伪并行,单个cpu+多道技术,所用的方法是多路复用:时间上+空间上
    时间上:当一个程序遇到io,可以去执行另外一个程序
    空间上:程序之间的内存必须分割,这种分割需要硬件层面实现,由操作系统控制。
    并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
    守护进程和守护线程的区别
    守护进程,等主进程执行结束,守护进程被回收(守护进程不会执行)
    守护线程,在其他非守护线程结束后才算允许完毕,守护线程在此时被回收(因为线程开销小,开启速度快,守护线程也会被执行)
    线程锁和进程锁
    答: 线程锁: 大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。
    当有多个线程访问同一对象的加锁方法 / 代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。
    但是,其余线程是可以访问该对象中的非加锁代码块的。
      进程锁: 也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,
    但是可以使用本地系统的信号量控制(操作系统基本知识)。
    同步与异步
    同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用时,一直等待函数完成,而进程继续处于激活状态。
    异步:是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行,函数返回的时候通过状态、通知、事件等方通知进程任务完成。
    阻塞与非阻塞:针对的是进程或线程,阻塞是当前请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程
     调用blocking IO会一直block住对应的进程直到操作完成,而non-blocking IO在kernel还在准备数据的情况下会立刻返回。
    同步和异步的区别是遇到IO请求是否等待。阻塞和非阻塞的区别是数据没准备好的情况下是否立即返回。同步可能是阻塞的,也可能是非阻塞的,而非阻塞的有可能是同步的,也有可能是异步的。
    blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了
    
    9. MySQL索引种类
    1. 主键和外键的区别?
     char和varchar的区别?
    
    
    
    
    
    
    MySQL
    库、表、字段、数据
    Mysql常用的数据类型:数字、字符串、时间类型、枚举类型和集合类型
    事务的四大特征:
    事务具体四大特性,也就是经常说的ACID :
    1.原子性(所有操作要么全部成功,要么全部失败回滚)
    2.一致性(事务执行之前和执行之后都必须处于一致性状态。)
    3.隔离性(数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离)
    4.持久性(一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使遭遇故障依然能够通过日志恢复最后一次更新) 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
    Mysql中varchar与char的区别
    char是一种固定长度的类型,varchar则是一种可变长度的类型
    char(50): 定长,字符的长度为50,浪费空间,存取速度快,数据不足时,会往右填充空格来满足长度。
    varchar(50): 变长,字符的长度为50,节省空间,存取速度慢,存储数据的真实内容,不会填充空格,且会在真实数据前加1-2bytes,表示真实数据的bytes字节数。
    简述触发器、函数、视图、存储过程?
    触发器和存储过程都是一组mysql语句集
    使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询。
    触发器无法由用户直接调用,而知对表的【增/删/改】操作被动引发的。
    
    存储过程存放于MySQL中,通过主动调用它的名字可以执行其内部的一堆sql
    10. 主键和外键的区别? 
    1.主键是能确定一条记录的唯一标识
    2.外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性
    4 drop, delete truncate的区别(美 /trʌŋ'ket/)
    三者都是删除的意思,但是三者个有些区别
    • delete和truncate只删除表的数据不删除表的结构
    • 速度 drop > truncate > delete
    • 想删除部分数据时, delete 删除时要带上where语句
    • 保留表而想删除所有的数据时用truncate
    视图(view)的作用,可以更改吗?
    视图是虚拟的表;只包含动态检索数据的查询,不包含数据;简化操作,隐藏细节,保护数据;对视图的更新会作用于基表,一般不更新;
    concat, group_concat函数的作用是什么?
    concat() 用于连接字符串,
    将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
    索引的本质是什么?索引有什么优点,缺点是什么?
    索引是帮助MySQL高效获取数据的数据结构。因此,索引的本质是一种数据结构。
    在数据之外,数据库系统还可以维护满足特定查找算法的数据结构,这些数据结构以某种方式指向真实数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
    
    优点:
    1、提高数据检索效率,降低数据库的IO成本;
    2、通过索引对数据进行排序,降低了数据排序的成本,降低了CPU的利用率;
    
    缺点:
    1、索引实际上也是一张表,索引会占用一定的存储空间;
    2、更新数据表的数据时,需要同时维护索引表,因此,会降低insert、update、delete的速度;
    
    from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
    # 为什么建池 :我们必须对服务器开启的进程数或者线程数加以控制,让机器在一个自己可以承受的范围内运行
    # 这就是进程池或线程池的作用
    import os,time,random
    from threading import currentThread
    def task(name):
        print(f"{name} 线程:{currentThread().getName()}  pid:{os.getpid()} run")
        time.sleep(random.randint(1,3))
    if __name__ == '__main__':
        pool = ThreadPoolExecutor(4) # 4个线程池的容量设定,
        for i in range(10):
            pool.submit(task,'alex %s'%i)
        pool.shutdown(wait=True)#等待池内所有任务执行完毕回收完资源后才继续
    print('')
  • 相关阅读:
    查找算法
    Android IPC
    运输层和TCP/IP协议
    二叉树的学习笔记
    java 和 JVM
    转载: GIt远程操作详解
    java-jpa-criteriaBuilder使用
    java项目构建工具Maven
    虚拟机下安装Maven
    validate表单验证-单独验证
  • 原文地址:https://www.cnblogs.com/foremostxl/p/9814864.html
Copyright © 2020-2023  润新知