高级语言:高度封装了的编程语言,与低级语言相对。相对于汇编语言而言的,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,它是以人类的日常语言为基础的一种编程语言,使用一般人易于接受的文字来表示(例如汉字、不规则英文或其他外语),从而使程序便于人编写,阅读交流,维护
机器语言:一种指令集的体系。这种指令集,称机器码(machine code),是电脑的CPU可直接解读的数据,计算机能直接解读、运行。一条指令就是机器语言的一个语句,它是一组有意义的二进制代码,指令的基本格式,如:操作码字段和地址码字段,其中操作码指明了指令的操作性质及功能(如加、减、乘、除、数据传送等),地址码则给出了操作数或操作数的地址(存储器地址或寄存器地址即寄存器名)。
编译器:能够一种语言编译成另一种语言,编译过程是源代码→预处理器 → 编译器 → 目标代码。编译器完成的功能是把源代码(SourceCode)编译成通用中间语言的字节码(ByteCode)。最后运行的时候通过通用语言运行库的转换,编程最终可以被CPU直接计算的机器码NativeCode。
解释器:能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
解释器运行程序的方法:
· 直接运行高级编程语言 (如 Shell 自带的解释器)
· 转换高级编程语言码到一些有效率的字节码 (Bytecode),并运行这些字节码。Perl,Python,MATLAB,与Ruby是属于此种方法
· 以解释器包含的编译器对高级语言编译,并指示处理器运行编译后的程序 (例如:JIT)
编译型语言:首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。如C/C++、Pascal/Object Pascal(Delphi)。编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。
解释性语言:编写的程序不进行预先编译,以文本方式存储程序代码。在运行程序的时候,解释性语言必须先解释再运行。如Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB。解释性语言在运行程序的时候才翻译,比如解释性basic语言,专门有一个解释器能够直接执行basic程序,每个语句都是执行的时候才翻译。这样解释性语言每执行一次就要翻译一次,效率比较低
python是解释型语言, 不像c++这样是编译型语言:程序输入到编译器,编译器再根据语言的语法进行解析。编译型语言之所以可以进行深层次的底层优化是因为可以直接看到代码的整体部分,这使得它可以对不同的语言指令之间的交互进行推理,从而给出更有效的优化手段。
Python是解释型语言,程序被输入到解释器运行,解释器只会按照python的规则以及在执行过程中怎样去动态的应用这些规则,由于解释器没法很好的对程序进行推导. 而Python大部分的优化也是解释器自身的优化, 换句话说,解释器优化后,Python不用修改源代码就能享受优化的好处. 因此关键问题来了,如果假定其他条件不变, python程序的执行速度跟解释器速度相关 . 不管你怎样优化自己的程序,你的程序的执行速度还是依赖于解释器执行你的程序的效率。这就很明显的解释了为什么我们需要对优化Python解释器做这么多的工作了。
1)对象:
进程是资源分配的最小单位(系统进行资源分配和调度的基本单位,是操作系统结构的基础,申请和拥有系统资源),
线程是CPU调度的最小单位(被系统独立调度和分派的基本单位, 线程有就绪、阻塞和运行三种基本状态。)
2)组成:
进程具有自己的地址空间的实体,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)
线程是进程中的一个实体,由线程ID,当前指令指针(PC),寄存器集合和堆栈组成,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
3)数据空间:
多进程中子进程和父进程有不同的代码和数据空间,
多线程则共享数据空间
前言:Python中多线程并不是真正意义上的多线程。那为什么在Python中多线程的威力没有像其他语言那样大呢?
· GIL全称是全局解释器锁,保证了同一时刻只有一个线程在执行。
· 作用:在单核的情况下实现多任务!这在当时非常厉害的技术。
· 产生问题的原因:一个CPU分配给一个进程,进程的线程使用GIL进行资源抢夺。在多核情况下,会使其他核空闲,CPU的利用率不高。
线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。
GIL是什么呢?仍然用篮球比赛的例子来帮助理解:把篮球场看作是CPU,一场篮球比赛看作是一个线程,如果只有一个篮球场,多场比赛要排队进行,就是一个简单的单核多线程的程序;如果有多块篮球场,多场比赛同时进行,就是一个简单的多核多线程的程序。然而python有着特别的规定:每场比赛必须要在裁判的监督之下才允许进行,而裁判只有一个。这样不管你有几块篮球场,同一时间只允许有一个场地进行比赛,其它场地都将被闲置,其它比赛都只能等待。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程 在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位,运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,当前协程切换到其他协程由当前协程来控制。
I/O密集型 (CPU-bound)
I/O bound 指的是系统的CP效能 相对 硬盘/内存效能 要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O (硬盘/内存) 的读/写,此时 CPU Loading 不高。
计算密集型 (CPU-bound)
在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。CPU bound 指的是系统的 硬盘/内存效能 相对 CPU效能 要好很多,此时,系统运作,大部分的状况是 CPU Loading 100%,CPU 要读/写 I/O (硬盘/内存),I/O在很短的时间就可以完成,而 CPU 还有许多运算要处理,CPU Loading 很高。
是否采用多任务的第二个考虑是任务的类型。我们可以把任务分为计算密集型和IO密集型。
计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。
计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要。Python这样的脚本语言运行效率很低,完全不适合计算密集型任务。对于计算密集型任务,最好用C语言编写。
IO密集型任务,涉及到网络、磁盘IO的任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。常见的大部分任务都是IO密集型任务,比如Web应用。
IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差。
原文:https://www.cnblogs.com/satansz/p/13053187.html