线程

第十二章 并发编程

心已入冬 提交于 2020-03-08 09:38:10
第十二章 并发编程 1、并发:逻辑控制流在时间上重叠 2、并发程序:使用应用级并发的应用程序称为并发程序。 3、三种基本的构造并发程序的方法: 进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。 I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化为状态机。 线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。 12.1 基于进程的并发编程 构造并发服务器的自然方法就是,在父进程中接受客户端连接请求,然后创建一个 新的子进程 来为每个新客户端提供服务。 基于进程的并发echo服务器的重点内容 (1)需要一个SIGCHLD处理程序,来 回收 僵死子进程的资源。 (2)父子进程 必须关闭 各自的connfd拷贝。对父进程尤为重要,以 避免存储器泄露 。 (3)套接字的文件表表项中的引用计数,直到父子进程的connfd都关闭了,到客户端的连接才会终止。 注意:进程的模型: 共享文件表 ,但不是共享用户地址空间。 优点:一个进程不可能不小心覆盖两个进程的虚拟存储器。 缺点:独立的地址空间使得进程共享状态信息变得更加困难。进程控制和IPC的开销很高。 Unix IPC 是指所有允许进程和同一台主机上其他进程 进行通信 的技术,包括管道、先进先出(FIFO)、系统V共享存储器,以及系统V信号量。 12.2 基于I

操作系统的基本特征

ε祈祈猫儿з 提交于 2020-03-08 08:26:44
转自百度知道 https://zhidao.baidu.com/question/1493972177685493419.html 操作系统有四个基本特征 , 如下: 1.并发(concurrence) 并行性与并发性这两个概念是既相似又区别的两个概念。并行性是指两个或者多个事件在同一时刻发生,这是一个具有微观意义的概念,即在物理上这些事件是同时发生的;而并发性是指两个或者多个事件在同一时间的间隔内发生,它是一个较为宏观的概念。在多道程序环境下,并发性是指在一段时间内有多道程序在同时运行,但在单处理机的系统中,每一时刻仅能执行一道程序,故微观上这些程序是在交替执行的。 应当指出,通常的程序是静态实体,它们是不能并发执行的。为了使程序能并发执行,系统必须分别为每个程序建立进程。进程,又称任务,简单来说,是指在系统中能独立运行并作为资源分配的基本单位,它是一个活动的实体。多个进程之间可以并发执行和交换信息。一个进程在运行时需要运行时需要一定的资源,如 cpu,存储空间,及 i/o设备 等。在 操作系统 中引入进程的目的是使程序能并发执行。 2.共享 (sharing) 所谓共享是指,系统中的资源可供内存中多个并发执行的进程共同使用。由于资源的属性不同,故多个进程对资源的共享方式也不同,可以分为:互斥共享方式 和 同时访问方式 3.虚拟 (virtual)

线程相关(一)

余生颓废 提交于 2020-03-08 08:21:20
一.进程间通信 1.进程间通信之队列:先进先出 1 from multiprocessing import Queue 2 3 q = Queue(5) #参数表示的是队列的最大存储数 4 #往队列中添加数据 5 q.put(1) 6 q.put(2) 7 print(q.full()) #q.full()是判断队列是否满了 8 q.put(3) 9 q.put(4) 10 q.put(5) 11 print(q.full()) 12 13 #q.put(6) 这个时候 队列满了 会原地等待 直到队列中有数据出来 才会执行#(阻塞态) 14 15 print(q.get()) #从队列中取数据 先进先出 如果队列中没有数据 会等待程#序会进入阻塞,直到队列中有数据放入 16 print(q.get_nowait()) #取值 没有值不等待直接报错 17 #full get_nowait 都不适用于多进程的情况 2.进程间通信IPC机制 1 from multiprocessing import Process,Queue 2 3 def producer(q): 4 q.put('hello world!') 5 6 def consumer(q): 7 print(q.get()) 8 9 if __name__ == '__main__': 10 q = Queue() 11

java锁学习

為{幸葍}努か 提交于 2020-03-08 08:04:38
锁从设计理念上可分为2类,分别为悲观锁(互斥锁)和乐观锁(非互斥锁) 悲观锁适用于写多读少的场景,乐观锁适用于读多写少的场景 java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。 java中主要锁有2种实现方式,分别是jvm虚拟机实现的(Synchronized关键字)和JDK 代码实现的(Lock接口实现等java.util.concurrent.locks包下的锁) Synchronized实现的锁是一种互斥锁(一次最多只能有一个线程持有的锁,当一个线程持有该锁的时候其它线程无法进入上锁的区域),它是一种悲观锁 synchronized最早只有重量级锁,在jdk1.6中对Synchronized进行了优化。 在编译器层面,使用了锁消除(对一些没有必要的、不会引起安全问题的同步代码取消同步)和锁粗化(对那些多次执行同步的代码且它们可以可并到一次同步的代码) 同时引进了适应性自旋锁,偏向锁,轻量级锁,这3种锁属于乐观锁。 jdk1.6中是默认开启偏向锁和轻量级锁的 Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。 锁可以升级但不能降级,这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 偏向锁:(Mark

多线程(三)-- 线程安全问题

社会主义新天地 提交于 2020-03-08 07:53:13
安全解决 -- 互斥锁 @synchronized(self) { //开始加锁,操作 } 优: 解决多线程抢夺资源产生的数据安全问题 缺: 消耗CPU资源多 使用前提: 多条线程执行一块代码时加锁 线程同步:@synchronized() 多条线程在同一条线上执行(按顺序执行,与线程并发不同) nonatomic 与 atomic atomic保护线程安全,自动加锁 为setter加锁 对比 atomic:线程安全,消耗大量资源 nonatomic:非线程安全,适合内存小的移动设备 来源: https://www.cnblogs.com/fangchun/p/4684910.html

halcon算子翻译——par_join

我只是一个虾纸丫 提交于 2020-03-08 06:56:46
名称 par_join - 等待使用par_start启动的子线程。 用法 par_join( : : ThreadID : ) 描述 par_join算子用于在调用程序中等待所有在单独的子线程中启动的程序或算子,方法是将par_start(启动的线程)添加到相应的程序行中( by adding the par_start qualifier to the according program line)。 要等待的子线程由它们传递给算子参数ThreadID的线程ID标识。 注意:par_start不是一个算子,而是一个在程序行开头添加的标识符,表明与调用程序并行执行。 语法是par_start <ThreadID>:后跟实际的程序或算子调用。 参数 ThreadID (input_control)   thread_id(-array) → (integer) 所有要等待的子线程的ID。 示例 * start two procedures in separate sub threads par_start <ThreadID1> : producer_proc() par_start <ThreadID2> : consumer_proc() * wait until both procedures have finished par_join ([ThreadID1,

Mybatis中的SqlSession

核能气质少年 提交于 2020-03-08 06:16:57
mybatis简介: 它是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互,并且在JDBC操作的基础上做了封装和优化, 它借助灵活的SQL定制,参数以及结果集的映射方式,更好的适应了当前互联网技术的发展. Mybatis优点: 1.稳定,灵活(动态sql),功能强大(池,日志,缓存) 2.学习以及使用成本低 3.解耦,SQL的可维护性,可复用性比较高 Mybatis中的SqlSession Mybatis是通过SqlSession来实现与数据库会话的.(如下是对Mybatis中的一些理解) 1.Mybatis中使用的门面模式:对外提供API(app),对内封装接口(JDBC) LOG4J就是使用的门面模式 2.使用sqlsessiontemplate对象来访问数据库默认是没有事务的, 新的事务会有新的sqlsession,底层是通过ThreadLoad绑定SqlSession到当前线程,保证SqlSession对象在当前线程中只有一份. 3.Mybatis中的池使用了亨元模式:目的是减少对象创建的次数,减少内存的消耗. 4.MyBatis在应用时,首先会基于建造模式构建SqlSessionFactory工厂(例如底层通过SqlSessionFactoryBuilder的Bulid方法进行构建),此工厂对象线程安全,可以被多个线程共享

Python-多线程

只愿长相守 提交于 2020-03-08 04:35:50
导入包 import threading 定义多线程: 线程1=threading . Thread(target=函数名,name = ‘线程名字’,arsg=(参数1,参数2))- 启动线程: 线程1.start() def job1 ( ) : print ( 'T1 start\n' ) for i in range ( 10 ) : time . sleep ( 0.1 ) print ( 'T1 finish\n' ) def main ( ) : thread_job1 = threading . Thread ( target = job1 , name = 'T1' ) #创建一个多线程 thread_job1 . start ( ) #激活一个多线 print ( threading . active_count ( ) ) #线程的数量 print ( '*' * 59 ) print ( threading . enumerate ( ) ) print ( '*' * 59 ) print ( threading . current_thread ( ) ) #运行的是哪个线程 #结果 T1 start 3 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **

实现单例模式的几种方法

淺唱寂寞╮ 提交于 2020-03-08 04:33:21
单例模式(singleton): 某些类在进程的运行过程,只需要一个对象,不允许创建多个对象出来 如何写单例模式: 1.饿汉模式——一开始就创建好对象 class Singleton { private static Singleton instance = new Singleton ( ) ; private Singleton ( ) { } public static Singleton getInstance ( ) { return instance ; } } 2.懒汉模式——用到时再创建对象 1)线程不安全的懒汉模式 public class Singleton { private static Singleton instance ; private Singleton ( ) { } public static Singleton getInstance ( ) { if ( instance == null ) { instance = new Singleton ( ) ; } return instance ; } } 多线程时,线程不安全。——加锁,将方法加锁 2)双重锁的懒汉模式 class Singleton { private static volatile Singleton instance = null ; private Singleton

庖解Chrome源码(1)——线程模型

折月煮酒 提交于 2020-03-08 04:30:17
  很多人喜欢Chrome,喜欢它的简洁,喜欢它的“快”。 简洁大家一目了然,无需多言,这里重点要说的是它的“快”。什么是“快”呢?大概不少人第一反应就是cnBeta上的日经Javascript跑分贴,Chrome那叫一个快啊。(其实每次点开这类文章时,我都是想去同情一下我们可怜的IE同学的,不过最近IE9着实又让人充满了期待。)但Javascript跑分真的这么重要吗,我们真的能体会到很大的差距吗?反正我是感觉不太出来。那凭啥还说Chrome快呢?Chrome快就快在UI Responsive(UI响应性)上。说白了就是你双击一下桌面图标,它能很快启动起来(Firefox用户应该深有感触吧);点击某个超链接,它能瞬间给你弹出个新页面来(用IE的朋友也没少遇过假死的现象吧)。因此,Chrome并不只是个跑分的工具。那Chrome良好的UI Responsive是如何做到的呢?这就要得益于它的线程模型了。   为了避免重复制造轮子, 这里我并不打算阐述Chrome线程模型的总体框架,而是将更多的精力放在具体实现上 。对Chrome线程模型框架不熟悉的朋友可以阅读一下duguguiyu的 这篇文章 。有条件的朋友可以到 这里 去下载一份Chromium的源码,或者到 这里 在线查看。闲话少说, Let's Go! NO.1 Smart Pointers