线程

进程和线程

↘锁芯ラ 提交于 2020-03-10 14:00:39
进程和线程的简介 -----内容为网络课堂所记的笔记,易懂,容易理解。----- 要想了解多线程,先要了解线程,要想了解线程,必须先了解进程,因为线程是依赖于进程而存在的。 什么是进程? 通过任务管理器我们看到了进程的存在 而通过观察,我们发现只有运行程序才会出现进程 进程,就是正在运行的程序 进程是系统进行资源分配和调用的独立单位,每一个进程都有它自己的内存空间和系统资源。 多进程有什么意义呢? 单进程的计算机只能做一件事,而我们现在的计算机都可以做多件事情。 *举例*:一边玩游戏(游戏进程),一边听音乐(音乐进程)。 也就是说现在的计算机都是支持多进程的,可以在一个时间段内执行多个任务。 并且呢,可以踢高CPU的使用率。 *问题:* 一边玩游戏,一边听音乐时同时进行的吗? 不是,因为单CPU在某一个时间点上只能做一件事。 而我们在玩游戏,或者听音乐的时候,是CPU在做这程序间的高效切换让我们觉得是同时进行的。 什么是线程? 在同一个进程内又可以执行多个任务,而这每一个任务我就可以看出来是一个线程。 线程:是程序的执行单元、执行路径,是程序使用CPU的最基本单位。 单线程:如果程序只有一条执行路径。 多线程:如果程序有多条执行路径。 多线程有什么意义呢? 多线程的存在,不是提高程序的执行速度,其实是为了提高应用程序的使用率。 程序的执行其实都是在抢CPU的资源,CPU的执行权。

【计算机二级Java语言】卷002

时间秒杀一切 提交于 2020-03-10 12:46:37
选择题 公共知识 【1】 一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈, 然后再依次出栈, 则元素出栈的顺序是()。 〖A〗 12345ABCDE 〖B〗 EDCBA54321 〖C〗 ABCDE12345 〖D〗 54321EDCBA 栈按先进后出的原则组织数据, 所以入栈最早的最后出栈, 所以选择B。 【2】 下列叙述中正确的是()。 〖A〗 循环队列有队头和队尾两个指针, 因此, 循环队列是非线性结构 〖B〗 在循环队列中, 只需要队头指针就能反映队列中元素的动态变化情况 〖C〗 在循环队列中, 只需要队尾指针就能反映队列中元素的动态变化情况 〖D〗 循环队列中元素的个数是由队头指针和队尾指针共同决定 循环队列有队头和队尾两个指针, 但是循环队列仍是线性结构的, 所以A错误; 在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况, 所以B与C错误。 【3】 在长度为n的有序线性表中进行二分查找, 最坏情况下需要比较的次数是()。 〖A〗 〖B〗 〖C〗 〖D〗 当有序线性表为顺序存储时才能用二分法查找。可以证明的是对于长度为n的有序线性表, 在最坏情况下, 二分法查找只需要比较 次, 而顺序查找需要比较n次。 【4】 下列叙述中正确的是()。 〖A〗 顺序存储结构的存储一定是连续的, 链式存储结构的存储空间不一定是连续的

线程基础

落花浮王杯 提交于 2020-03-10 12:17:54
线程基础 一、线程和进程的区别 进程: 进程之间数据隔离,每一个进程分配一块内存 进程可以使用多核处理,操作系统调度 进程是资源计算机资源份分配的最小单位 进程有数据不安全的问题,需要用到锁和信号量 进程之间本身无法通信,但是可以使用第三方模块和工具来实现通信IPC 队列:基于socket、pickle和lock来实现,队列的数据因为锁机制是安全的 管道:基于socket和pickle来实现,数据是不安全的 第三方工具:已开发完成,可以直接使用,稳定安全,工作中基本上都是使用第三方工具 进程之间可以通过Manager模块实现数据的共享,也被称为内存共享 进程开启的、关闭和切换对资源的消耗很大 一般情况下进程开启最多不要超过CPU核数的两倍,最佳的数量是CPU核数+1,CPU核数:os.cpu_count()获取 线程: 线程在进程之内 能被操作系统调度给CPU执行的最小单位 线程之间数据本身是可以共享的,但是也因此数据变得不安全 同一个进程中的多个线程是可以被CPU同时执行的,可以利用多核 线程开启、关闭和切换对资源的消耗很小,速度很快 二、CPython的垃圾回收机制 在CPython程序中gc来负责处理垃圾的回收工作,当一个线程执行的时候,gc会对该线程进行监控,但是当一个进程中多个线程同时工作的时候,gc机制无法很好的对每一个线程进行监控,为了能够监控每一个线程

pythonの多线程

↘锁芯ラ 提交于 2020-03-10 11:55:30
python的GIL 在非python环境中,单核情况下,同时只能有一个任务执行。多核时可以支持多个线程同时执行。 在python中,无论有多少核,同时只能执行一个线程,这是由于GIL所导致的。 GIL(Global Interpreter Lock全局解释器锁),是为了数据安全所做的决定,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”。 在一个python进程中,GIL只有一个 拿不到GIL的线程,就不允许进入CPU执行 GIL的释放逻辑 python2.x中,在线程遇见IO操作或者ticks计数达到100时进行释放(ticks是python自身的一个计数器,专门用于做GIL,每次释放后归零,这个计数可以通过sys.setcheckinterval来调整) python3.x中,改为使用计时器(当执行时间达到阈值后,当前线程释放GIL) 释放GIL锁后,线程会进行锁竞争,随后切换线程,会消耗资源 由于python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),所以在多核CPU上,python的多线程效率并不高 python多线程工作过程 1.拿到公共数据 2.申请GIL 3.python解释器调用os原生线程 4.os操作cpu执行运算 5.当该线程达到gil的释放要求时,无论运算是否已经执行完,gil都被要求释放 6.其他线程重复上面的过程

python多线程编程

拈花ヽ惹草 提交于 2020-03-10 11:39:57
python多线程编程 Python多线程编程中常用方法: 1、join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join([timeout]) timeout:可选参数,线程运行的最长时间 2、isAlive()方法:查看线程是否还在运行 3、getName()方法:获得线程名 4、setDaemon()方法:主线程退出时,需要子线程随主线程退出,则设置子线程的setDaemon() Python线程同步: (1)Thread的Lock和RLock实现简单的线程同步: import threading import time class mythread(threading.Thread): def __init__(self,threadname): threading.Thread.__init__(self,name=threadname) def run(self): global x lock.acquire() for i in range(3): x = x+1 time.sleep(1) print x lock.release() if __name__ == '__main__': lock = threading.RLock() t1 = [] for i

python多线程机制

时间秒杀一切 提交于 2020-03-10 11:28:11
Python中的线程从一开始就是操作系统的原生线程。而Python虚拟机也同样使用一个全局解释器锁(Global Interpreter Lock,GIL)来互斥线程多Python虚拟机的使用。 GIL与线程调度   为了理解Pyhon为什么需要GIL,考虑这样的情形:假设有两个线程A B,在两个线程中,都同时保存着对内存中同一对象obj的引用,也就是说,这事obj->ob_refcnt的值为2.如果A销毁对obj的引用,显然,A将通过Py_DECREF调整obj的引用计数值。外面知道,py_DECREF的整个动作可以分为两个部分:   --obj ->ob_refcnt;   if(obj->ob_refcnt == 0) destory object and free memory.   如果A执行完第一个动作后,obj->ob_refcnt的值变为1,不幸的是,在这里时候线程调度机制将A挂起,唤醒了B。更为不幸的是,B同样也开始销毁对obj的引用。B完成第一个动作后,obj ->ob_refcnt为0,B是一个幸运儿,它没有被线程调度打断,而是顺利完成了接下来的第二个动作,将对象销毁,内存释放。好了吗,现在A又被重新唤醒,可现在已是物是人非,obj ->ob_refcnt已经被B减少到0,而不是当时的1.按照约定,A开始在一次地对已经销毁的对象进行对象销毁的内存释放动作

面试实题:No.13

梦想的初衷 提交于 2020-03-10 10:51:59
1、简单介绍一下dubbo,dubbo的作用,以及dubbo的原理 。 Dubbo是阿里巴巴公司开源的一个高性能优秀的分布式服务框架。 分析源代码,基本原理如下: client一个线程调用远程接口,生成一个唯一的ID(比如一段随机字符串,UUID等),Dubbo是使用AtomicLong从0开始累计数字的将打包的方法调用信息(如调用的接口名称,方法名称,参数值列表等),和处理结果的回调对象callback,全部封装在一起,组成一个对象object向专门存放调用信息的全局ConcurrentHashMap里面put(ID, object)将ID和打包的方法调用信息封装成一对象connRequest,使用IoSession.write(connRequest)异步发送出去 当前线程再使用callback的get()方法试图获取远程返回的结果,在get()内部,则使用synchronized获取回调对象callback的锁, 再先检测是否已经获取到结果,如果没有,然后调用callback的wait()方法,释放callback上的锁,让当前线程处于等待状态。 服务端接收到请求并处理后,将结果(此结果中包含了前面的ID,即回传)发送给客户端,客户端socket连接上专门监听消息的线程收到消息,分析结果,取到ID,再从前面的ConcurrentHashMap里面get(ID)

关键字面试题参考

邮差的信 提交于 2020-03-10 08:00:52
● 请你讲讲Java里面的final关键字是怎么用的? 考察点:关键字 参考回答:当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。“使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。“对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。 ● 请你谈谈关于Synchronized和lock 考察点:java关键字 参考回答:synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。JDK1.5以后引入了自旋锁、锁粗化、轻量级锁,偏向锁来有优化关键字的性能。Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现

进程、线程、协程之概念理解+线程和进程各自有什么区别和优劣

给你一囗甜甜゛ 提交于 2020-03-10 06:09:31
一、概念 首先,根据图了解一下串行,并行和并发的基本概念:   1、进程    资源分配的基本单位 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 Linux系统函数fork()可在父进程中创建一个子进程,在父进程接到新请求时,复制出一个子进程来处理,即父进程监控请求,子进程处理,实现并发处理。注意:必须是Linux系统,windows不能用fork。 组成 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 特征 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的

day15_线程的生命周期(线程状态)丶线程的同步丶线程的通信

不问归期 提交于 2020-03-10 04:01:53
线程状态概述 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中 java.lang.Thread.State 这个枚举中给出了六种线程状态: 这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析 我们不需要去研究这几种状态的实现原理,我们只需知道在做线程操作中存在这样的状态。那我们怎么去理解这几个状态呢,新建与被终止还是很容易理解的,我们就研究一下线程从Runnable(可运行)状态与非运行状态之间的转换问题 Timed Waiting(计时等待) Timed Waiting在API中的描述为:一个正在限时等待另一个线程执行一个(唤醒)动作的线程处于这一状态。单独的去理解这句话,真是玄之又玄。我们需要记住下面几点: 进入 TIMED_WAITING 状态的一种常见情形是调用的 sleep 方法,单独的线程也可以调用,不一定非要有协作关系。 为了让其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。这样才能保证该线程执行过程中会睡眠 sleep与锁无关,线程睡眠到期自动苏醒,并返回到Runnable(可运行)状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始立刻执行。 Timed Waiting 线程状态图