解释下对gil解释锁理解
GIL 又叫全局解释器锁,首先说一点,Python语言与GIL全局解释器锁没有关系,仅仅是因为历史原因,在cpython解释器中还存在GIL难以移除。GIL是功能与性能权衡后的产物,它有着存在的合理性,也有着难以移除的历史客观因素。
为什么存在GIL?
在早期的开发过程中,因为物理因素限制,从最开始的单核CPU发展为多核CPU, 想要充分发挥多核CPU的性能需要利用到多线程编程,Python中同样引入了多线程编程,而多线程编程引入带来的问题是:线程之间数据的一致性和状态同步的问题。 而想解决这些问题最好的方法就是加一把锁,所以就有了GIL全局解释器锁这样一把大锁。
随着越来越多的代码库开发者接受GIL,而后逐渐大量依赖于这一特性进行开发,到最后发现GIL对多核CPU多线程编程的效率是低效影响的时候,想要移除这一特性,却发现已经很难了。
详细连接
https://blog.csdn.net/ahilll/article/details/83892996
**1、完全免费 **
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变。这让Linux吸收了无数程序员的精华,不断壮大。
**2、完全兼容POSIX 1.0标准 **
这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。
**3、多用户、多任务 **
Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。
**4、良好的界面 **
Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X- Windows系统,用户可以使用鼠标对其进行操作。在X-Windows环境中就和在Windows中相似,可以说是一个Linux版的 Windows。
**5、丰富的网络功能 **
互联网是在Unix的基础上繁荣起来的,Linux的网络功能当然不会逊色。它的网络功能和其内核紧密相连,在这方面Linux要优于其他操作系统。在Linux中,用户可以轻松实现网页浏览、文件传输、远程登陆等网络工作。并且可以作为服务器提供WWW、FTP、E-Mail等服务。
**6、可靠的安全、稳定性能 **
Linux采取了许多安全技术措施,其中有对读、写进行权限控制、审计跟踪、核心授权等技术,这些都为安全提供了保障。Linux由于需要应用到网络服务器,这对稳定性也有比较高的要求,实际上Linux在这方面也十分出色。
**7、支持多种平台 **
Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高
1、cd命令
2、ls命令
3、grep命令
4、find命令
5、cp命令
6、mv命令
7、rm命令
…
详细链接
https://blog.csdn.net/ljianhui/article/details/11100625
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位
在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
以下对‘is’ 与‘==’的区别进行说明。
看下面例子:
>>> foo = [1]
>>> bar = [1]
>>> foo is bar # foo、bar不是同一个对象
False
>>> foo == bar # foo、bar的值相等
True
>>> id(foo) # 注意参数必须为引用,如果是对象则不符合此规则
32658856 # 不同电脑上可能结果不同
>>> id(bar)
32658696
foo、bar是两个引用,指向不同的地址空间,所以两者不相等,而foo、bar的内容相等。来看foo、bar的内存地址,两者是不一样的。
详细链接
https://blog.csdn.net/yanyunqq/article/details/12108979
直接上链接
https://blog.csdn.net/Despair1992/article/details/84969895
1、Django是一款重量级的Python开发web框架,功能齐全,不同的人用Django来开发,开发出来的东西基本架构都是一样的,但是Flask是一个轻量级的web框架,相对来说更加灵活,每个人开发出来的东西架构可能完全不一样,
所以对于团队级别的大型项目来说,比较适合选择Django,因为整个团队比较容易达成一致的架构,不会陷入无休止的会议讨论,里面很多东西不需要自己设计,拿来即用,快速开发。
而对于个人开发的小项目来说,也可以用Django,也可以用Flask,用Flask的话,可以设计自己的项目架构,不必拘泥于Django的固定模式。但是对于经验少的开发者来说,这里就比较困难了
2、Flask对于加深Python学习有很大帮助,因为Flask不像Django很多东西都是现成的,需要自己去写
3、Django对新手来说比Flask容易上手,正是因为灵活性的原因
4、感觉选择哪个框架最后还是小马过河,一千个读者就有一千个哈姆雷特
增
1.使用insert插入单行数据。
2.使用insert,select语句将现有表中的 数据添加到已有的新表中。
删
1.使用delete删除数据某些数据
2.使用truncate table 删除整个表的数据
改
使用update更新修改数据
查
查询的话比较多
详细链接
https://blog.csdn.net/a88055517/article/details/6736284
作为一个多用户、多任务的操作系统,Linux下的文件一旦被删除,是难以恢复的。尽管删除命令只是在文件节点中作删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据。所以,基本上就无法恢复该文件了。
如果磁盘上的数据没有被覆盖,如:个人学习用机,则可通过debugfs命令找到原文件所在磁盘块,采用dd命令读取相应的磁盘数据达到恢复文件的目的:
先确认所删除文件所在物理磁盘:df -v 输出结果中”Mounted on“列出的文件系统中找到自己的文件系统,查看”Filesystem “列对应的磁盘卷,假设为/dev/sda1
运行debugfs
open /dev/sda1
ls -d 被删除文件名全路径
#显示有<>尖括号的就是我们要找的文件Inode号, 执行
logdump –I
#在输出中找到 Blocks: (0+1): YYYY
quit
运行dd命令:
dd if=/dev/sda1 of=/tmp/del.txt.rev bs=4096 count=1 skip=YYYY
如果以上过程中,找不到被删除的文件块,则无法完成恢复。
详细链接
https://blog.csdn.net/zhusongziye/article/details/83153963
以上时我本人在这次面试爱数所遇到的题目,在网上还有其他人在面试过程中的一些问题: