线程

操作系统面试总结

大憨熊 提交于 2020-03-21 01:23:40
操作系统的作用: OS作为用户与计算机硬件系统之间的接口 OS作为计算机系统资源的管理者 OS实现了对计算机资源的抽象 操作系统的基本特性: 并发、共享、虚拟、异步 操作系统的主要功能: 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 三种基本状态的转换 就绪 执行 阻塞 什么是死锁: 如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,该组进程是死锁的(Deadlock) 产生死锁原因: 竞争不可抢占性资源引起死锁 竞争可消耗资源引起死锁 进程推进顺序不当引起死锁 银行家算法: 当进程请求一组资源时,首先确定是否有足够的资源分配给该进程,若有,再进一步计算这些资源分配给进程后,是否为使系统处于不安全的状态。如果不会,才会把资源分配给它,否则让进程等待。 连续分配方式: 单一连续分配 固定分区分配 动态分区分配 动态可重定位分区分配 离散分配方式: 分页存储管理方式 分段存储管理方式 段页式存储管理方式 操作系统中进程调度策略: FCFS(先来先服务),优先级,时间片轮转,多级反馈 文件 :是指由创建者所定义的,具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。 文件的组织方式来分可分为 :顺序文件 索引文件 索引顺序文件 进程和线程以及它们的区别: 进程是具有一定功能的程序关于某个数据集合上的一次运行活动

计算机操作系统基础知识-2

旧街凉风 提交于 2020-03-21 01:22:16
Shell Shell是操作系统与用户交互的界面。表现为通过控制台执行用户命令。本身不执行命令,仅仅是组织和管理命令。 脚本:类似程序的方式执行一系列的逻辑顺序的命令序列完成复杂的功能和人机交互。保存在文件中,是shell命令的集合。 系统调用 定义:操作系统内核为应用程序提供的服务/函数 特点: 一般涉及核心操作和硬件资源 运行于核态 函数具有唯一ID 产生中断,且为自愿中断 进程管理 定义:是程序在某个数据集合上的一次运行活动。程序的一次运行即为一个进程。 特性: 动态性 并发性 异步性 独立性 分类: 按使用资源权限 系统进程:系统内核相关进程 用户进程:运行于用户态的进程 按对CPU依赖性 偏CPU进程:计算型 偏I/O进程: 进程状态 就绪态:获得了除CPU之外所有资源,通常有多个进程处于就绪态,有一个就绪队列。 运行态:获得CPU,正在运行 等待态: 进程控制块 进程由程序、数据、进程控制块组成。 进程控制块是描述和管理进程的一种数据结构,包括以下内容: 进程描述信息 控制和调度信息 资源信息 现场信息 进程互斥和同步 同步:进程通过协作共同完成同一任务而造成的直接制约关系,如生产者-消费者模式 互斥:进程间竞争系统资源而造成的间接制约关系,同一时间内只有一个进程可以访问系统资源。 临界资源和临界区 临界资源:同一时间只能有一个进程访问的资源 临界区

进程与线程的概念

不想你离开。 提交于 2020-03-20 23:49:21
3 月,跳不动了?>>> 1.并行和并发 并行性是指两个或多个时间在同一时刻发生,而并发性是指两个或多个事件在同一时间间隔内发生 。在多道程序环境下,并发性是指在一段时间内宏观有多个程序在同时运行,但在单处理机系统中每一时刻却仅能有一道程序执行,故微观上这些程序只能是分时地交替执行。倘若在计算机系统中有多个处理机,则这些可以并发执行的程序便可分配到多个处理机上,实现并行执行,即利用每个处理机来处理一个可并发执行的程序,这样,多个程序便可同时执行。 2.进程 通常的程序是静态实体(PassiveEntity),在多道程序系统中,它们是不能独立运行的,更不能和其它程序并发执行。 在操作系统中引入进程的目的,就是为了使多个程序能并发执行。例如,在一个未引入进程的系统中,在属于同一个应用程序的计算程序和I/O程序之间,两者只能是顺序执行,即只有在计算程序执行告一段落后,才允许I/O程序执行;反之,在程序执行I/O操作时,计算程序也不能执行,这意味着处理机处于空闲状态。但在引入进程后,若分别为计算程序和I/O程序各建立一个进程,则这两个进程便可并发执行。 由于在系统中具备使计算程序和I/O程序同事运行的硬件条件,因而可将系统中的CPU和设备同时开动起来,实现并行工作 ,从而有效提高资源的利用率和系统吞吐量,并改善系统的性能。 事实上可以在内存中存放多个用户程序,分别为他们建立进程后

进程,线程,超线程,并发,并行 等概念

我的梦境 提交于 2020-03-20 23:43:57
3 月,跳不动了?>>> 进程是操作系统对一个正在运行的程序的抽象,即操作系统为该进程虚拟了独自的处理器资源,内存空间(又称虚拟地址空间)与磁盘空间 线程是进程中多个可以派遣的工作单位(或称执行单元,以CPU的角度来看)的集合,同一进程的多个线程共享该线程的资源(包括运行时在虚拟地址空间加载的代码,全局数据等) 并发(concurrency)从最终用户的角度来看,就是同时运行多个本地应用程序(或者网络应用程序例如 web服务器 同时处理来自多个远程用户的页面请求 / 活动连接 的过程) 并发 从计算机底层实现原理来看,是CPU等硬件 在操作系统所抽象出来的多个进程(或线程)之间快速来回切换执行的过程;具体讲,某一极短时间间隔内,CPU只能执行一个进程(或线程) 超线程(hyper threading,HT)也称“同时多线程”(simultaneous multi-threading) 采用超线程技术的多核CPU的任意一个物理核心在某一极短时间间隔内可以“同时”执行两个或多个线程 例如传统的单线程CPU,在某一极短时间间隔内只能执行一个线程,单线程CPU在不同线程间切换需要20,000个时钟周期 超线程多核CPU的任意一个物理核心在不同线程间切换只需要一个时钟周期; 典型的例子是 Intel Core i7 四核心处理器,一个物理核心可以同时执行两个线程, 总共可以“并行

.NET提供了哪几个定时器类型

一笑奈何 提交于 2020-03-20 20:30:34
分析问题   在.NET内建类型中,一共为程序员提供了3种定时器:   1、System.Windows.Forms.Timer类型。   2、System.Threading.Timer类型。   3、System.Timers.Timer类型。   概况来说,这三种类型都实现了定时的功能。程序员通常需要做的是为定时器设置一个间断时间,设置定时到达时的处理方法,然后就可以等待定时器不断地计时和触发处理事件,现在笔者来分别介绍一下这三种类型的特点。   1、System.Windows.Forms.Timer类型   从这个定时器的命名空间可以看出,.NET设计这个类型的目的是为了方便程序员在Windows界面上使用定时器。当一个System.Windows.Forms.Timer类型被构造时,当前定时器会和当前线程进行关联。而当定时器的计时到达后,一个定时器消息将被插入到当前线程的消息队列中。当前线程将逐一处理消息队列中的所有消息,并一一派发给各自的处理方法。这样的机制和利用工作者线程进行定时有很大的区别,事实上,System.Windows.Forms.Timer类型并没有涉及多线程的操作,定时器的设置、定时方法的执行都在同一个线程上。 注意   这就意味着System.Windows.Forms.Timer并不能准确地定时,事实上,当消息阻塞时,定时器的误差将相当大

设计模式

烂漫一生 提交于 2020-03-20 14:53:38
3 月,跳不动了?>>> 在软件工程中, 创建型模式 是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度。创建型模式通过以某种方式控制对象的创建来解决问题。 常用创建型模式有:单例模式、工厂模式、抽象工厂模式、原型模式、建造者模式 一、单例模式 单例模式有以下8种写法: 饿汉式: 静态常量 静态代码块 懒汉式: 线程不安全 线程安全,同步方法 线程安全,同步代码块 双重检查 静态内部类 枚举 单例模式的使用场景: 需要频繁创建和销毁的对象;创建时耗时过多或消耗资源过多,但又经常用到的对象(比如session工厂、数据源等) 1. 饿汉式 - 静态常量写法 代码实现: /** * 设计模式之单例模式 * 饿汉式(静态常量) */ public class SingletonTest01 { public static void main(String[] args) { Singleton instance1 = Singleton.getInstance(); Singleton instance2 = Singleton.getInstance(); System.out.println("两次获取的实例一样吗:" + (instance1 == instance2)); //true } } class

什么是 Event Loop?

梦想与她 提交于 2020-03-20 13:58:13
3 月,跳不动了?>>> Event Loop 是一个很重要的概念,指的是计算机系统的一种运行机制。 JavaScript语言就采用这种机制,来解决单线程运行带来的一些问题。 本文参考C. Aaron Cois的 《Understanding The Node.js Event Loop》 ,解释什么是Event Loop,以及它与JavaScript语言的单线程模型有何关系。 想要理解Event Loop,就要从程序的运行模式讲起。运行以后的程序叫做 “进程” (process),一般情况下,一个进程一次只能执行一个任务。 如果有很多任务需要执行,不外乎三种解决方法。 (1)排队。因为一个进程一次只能执行一个任务,只好等前面的任务执行完了,再执行后面的任务。 (2)新建进程。使用fork命令,为每个任务新建一个进程。 (3)新建线程。因为进程太耗费资源,所以如今的程序往往允许一个进程包含多个线程,由线程去完成任务。(进程和线程的详细解释,请看 这里 。) 以JavaScript语言为例,它是一种单线程语言,所有任务都在一个线程上完成,即采用上面的第一种方法。一旦遇到大量任务或者遇到一个耗时的任务,网页就会出现”假死”,因为JavaScript停不下来,也就无法响应用户的行为。 你也许会问,JavaScript为什么是单线程,难道不能实现为多线程吗? 这跟历史有关系

ThreadLocalRandom

混江龙づ霸主 提交于 2020-03-20 13:20:58
3 月,跳不动了?>>> 一、Random 在创建Random类时会生成seed,seed用于生成随机数。在每次生成随机数后,都会使用CAS的方式更新seed,所以Random是线程安全的。但是在并发度较高的情况下,CAS的效率会变得很低。 protected int next(int bits) { long oldseed, nextseed; AtomicLong seed = this.seed; do { oldseed = seed.get(); nextseed = (oldseed * multiplier + addend) & mask; } while (!seed.compareAndSet(oldseed, nextseed)); return (int)(nextseed >>> (48 - bits)); } 二、ThreadLocalRandom current() static final ThreadLocalRandom instance = new ThreadLocalRandom(); public static ThreadLocalRandom current() { if (UNSAFE.getInt(Thread.currentThread(), PROBE) == 0) localInit(); return instance;

mysql学习(第一天)

你离开我真会死。 提交于 2020-03-20 10:55:14
个人申明:博客内容全部来自我在狸猫技术窝公众号学习平台的学习笔记 1.mysql驱动是什么? 大家都知道,我们如果要在Java系统中去访问一个MySQL数据库,必须得在系统的依赖中加入一个MySQL驱动,有了这个MySQL驱动才能跟MySQL数据库建立连接,然后执行各种各样的SQL语句。 我们先来看下面的一段maven配置,这段maven配置中就引入了一个MySQL驱动。这里的mysql-connector-java就是面向Java语言的MySQL驱动。 大家都知道,如果我们要访问数据库,必须得跟数据库建立一个网络连接,那么这个连接由谁来建立呢? 其实答案就是这个 MySQL驱动,他会在底层跟数据库建立网络连接,有网络连接,接着才能去发送请求给数据库服务器 !我们看下图。 然后当我们跟数据库之间有了网络连接之后,我们的Java代码才能基于这个连接去执行各种各样的增删改查SQL语句 来看下图 所以对于Java语言开发的系统,MySQL会提供Java版本的MySQL驱动,对于PHP、Perl、.NET、Python、Ruby等各种常见的编程语言,MySQL都会提供对应语言的MySQL驱动,让各种语言编写的系统通过MySQL驱动去访问数据库。 2、数据库连接池到底是用来干什么的? 接着我们来思考一个问题,一个Java系统难道只会跟数据库建立一个连接吗? 这个肯定是不行的

关于高并发的aotomic

我的梦境 提交于 2020-03-20 08:35:21
AtomicInteger线程安全的根源,熟悉并发的同学一定知道在java中处理并发主要有两种方式: 1,synchronized关键字,这个大家应当都各种面试和笔试中经常遇到。 2,volatile修饰符的使用,相信这个修饰符大家平时在项目中使用的也不是很多。 这里重点说一下volatile: Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存重新读取该成员的值,而且,当成员变量值发生变化时,强迫将变化的值重新写入共享内存,这样两个不同的线程在访问同一个共享变量的值时,始终看到的是同一个值。 java语言规范指出:为了获取最佳的运行速度,允许线程保留共享变量的副本,当这个线程进入或者离开同步代码块时,才与共享成员变量进行比对,如果有变化再更新共享成员变量。这样当多个线程同时访问一个共享变量时,可能会存在值不同步的现象。 而volatile这个值的作用就是告诉VM:对于这个成员变量不能保存它的副本,要直接与共享成员变量交互。 建议:当多个线程同时访问一个共享变量时,可以使用volatile,而当访问的变量已在synchronized代码块中时,不必使用。 缺点:使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用。 来源: https://www.cnblogs.com/mengziHEHE/p/3236313.html