线程

Node-1.高性能服务器

寵の児 提交于 2020-03-10 03:30:46
文章目录 Node——高性能服务器 异步I/O与非阻塞I/O Nodejs的异步I/O 事件循环机制 Node与其他服务器比较 Node——高性能服务器 浏览器中JavaScript在单线程上执行,而且与UI渲染共享同一个线程,所以JavaScript在执行的时候UI渲染和响应是处于停滞状态的。如果网页获取资源时同步获取,那么会阻塞页面的其他操作,不能响应用户的交互行为,影响用户体验。 那Nodejs怎么解决性能上的问题?基于事件的非阻塞异步I/O ! 通过事件驱动节省为每个请求创建额外线程和切换线程的开销,使得服务器可以在大量连接的情况下也有条不紊地处理请求,非阻塞的设置让它可以更好地提升响应吞吐,使Nodejs构建了一套完善的 高性能 异步I/O框架。 异步I/O与非阻塞I/O 说到Node的经常会听到异步、非阻塞、回调、事件这些词语。实际上,异步和非阻塞都达到了并行I/O的目的,但是从计算机内核I/O而言,异步/同步和阻塞/非阻塞实际上是两回事。 操作系统内核对于I/O只有两种方式:阻塞与非阻塞。 阻塞I/O: 系统内核调用后一定要等系统内核层面完成所有操作后,调用才结束。 阻塞I/O造成CPU等待I/O,浪费等待时间,CPU的处理能力不能得到充分利用。如读取磁盘上的文件,系统内核在完成磁盘寻道、读取数据、复制数据到内存后,这个调用才结束。 非阻塞I/O:

操作系统面试常常问到的问题

拥有回忆 提交于 2020-03-09 23:50:56
什么是操作系统?它的功能和特征? 操作系统就是管理和控制计算机硬件和软件资源的程序,它的管理功能有: 进程管理 内存管理 文件管理 I/O管理 操作系统是用户与硬件之间的接口,也是硬件和软件之间的接口。 操作系统的四大特征: 并发:两个或多个进程在同一时间间隔内发生,注意和并行的区别。 共享:系统中的资源可供多个并发执行的进程使用。 虚拟:把一个物理实体,变为若干个逻辑上的对应物,如虚拟处理器、虚拟内存、虚拟外部设备。 异步:由于多个程序并发执行和资源有限,进程执行是走走停停的。 什么是管态和目态?为什么要区分管态和目态? 管态:特权态/系统态/核心态,处于管态的程序可以访问计算机任何资源,访问权限不受限制。通常操作系统在管态运行。 目态:常态/用户态,处于目态的程序只能执行非特权指令,不能直接使用系统资源,不能改变CPU工作状态,且只能访问本程序的存储空间。 区分管态和目态的目的:出于安全考虑,保护操作系统程序。内核程序是用户程序的管理者,需要执行一些特权指令,如I/O指令,中断指令等,特权指令不允许用户直接使用。 如何从目态切换到管态 系统调用:使用中断机制,用户态的进程通过系统调用申请使用操作系统提供的服务程序,主动要求切换到内核态。 异常:CPU运行用户态进程时,发生异常,例如缺页,则会切换到处理当前异常的内核程序中。 I/O中断:I/O设备完成用户请求的操作后

Interview_操作系统_day21

為{幸葍}努か 提交于 2020-03-09 21:45:12
并发和并行 并发: 同一时刻只能运行一条指令。在宏观上看起来是多个程序同时运行,但微观上是多个程序的指令交替着运行的。并发不能提高计算机的性能,只能提高效率。 并行: 同一时刻可以运行多条指令。无论从宏观还是微观,都是一起执行的。比如多核 \(cpu\) ,多个程序分别运行在不同的核上,互不影响。并行确实提高了计算机的效率。 用户态和内核态区别 操作系统两种 \(CPU\) 状态: 核心态:运行操作系统程序 用户态:运行用户程序 操作系统的指令划分: 特权指令:只能由操作系统使用,用户不能使用的指令。 非特权指令:用户程序可以使用的指令。 特权级: \(R0、R1、R2、R3\) \(R0\) 相当于内核态, \(R3\) 相当于用户态 不同的特权级别可以运行不同的指令 区别: 内核态和用户态是操作系统的两种运行级别。用户态拥有最低的特权级,核心态拥有较高的特权级。 处于用户态时,进程能够访问到的内存空间和对象受到限制,其所占有的处理机是可以被抢占的。 处于内核态时,进程能够访问所有的内存空间和对象,且所占有的处理机是不可以被抢占的。 操作系统为什么要分内核态和用户态 为了安全。在 \(cpu\) 中,如果有些指令用错会使系统崩溃,所以用户程序是不可信的,无论程序员是否有意,都可能把系统弄崩溃。 分了内核态和用户态之后,操作系统对内核级别指令进行封装,然后为用户提供系统服务

linux进程间的那些事儿

北城以北 提交于 2020-03-09 16:25:23
写这篇文章之前,我对linux的进程间通讯还是有些畏惧的,不过看了一些其它文章之后,觉得linux进程间远比我学到的要难得多,首先来说,linux下线程的概念被淡化了,线程又名轻量级进程。线程机制是现代编程技术中常用的一种抽象,提供了在同一程序中共享内存地址控件的一组线程。这些线程可以共享打开的文件和其它资源。线程机制支持并发程序涉及技术,可以保证真正并行处理。linux实现线程的机制非常独特,从内核的角度来说,没有线程这个概念,把所有线程当成进程来实现,内核并没有准备特别的数据结构来表示线程。相反,线程仅仅被视为一个与其它进程共享某些资源的进程,每个线程都拥有唯一率属于自己的task_struct,所以在内核中,看起来像一个普通的进程(只是该级才能哼和其它一些进程共享某些资源,如地址空间). 在windows或是sun solaris等操作系统中,提供了专门支持线程的机制,线程被抽象成一种耗费较少资源,执行迅速的单元。而对于linux来说,它只是一种进程间共享资源的手段。linux线程的创建和普通进程创建类似,只不过在调用clone的时候需要传递一些参数来指明需要共享的资源 clone(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND,0); 而一个普通的fork实现 clone(SIGCHLD,0) 而vfork的实现是 clone

线程的上下文切换

て烟熏妆下的殇ゞ 提交于 2020-03-09 15:34:30
CPU利用时间片轮询来为每个任务都服务一定的时间,然后把当前任务的状态保存下来,继续服务下一个任务。任务的状态保存及再加载就叫做线程的上下文切换。 在一个进程内部可以有多个线程在同时运行,并与创建它的进程共享同一地址空间和其它资源。 上下文:批线程切换时CPU寄存器和程序计数器所保存的当前线程的信息。 寄存器:指CPU内部容量较小但速度很快的内存区域(与之相对应的是CPU外相对较慢的RAM主内存)。寄存器通过对常用值(常为运算的中间值)的快速访问来加快计算机程序的速度。 程序计数器:是一个专用的寄存器,用于表明指令序列中CPU正在执行的位置,存储的值为正在执行的指令的位置或下一个将被执行的指令的位置,这依赖于特定的系统。 上下文切换 上下文切换指的是内核(OS的核心)在CPU上对进程或线程进行切换。上下文切换过程中的信息被保存在 进程控制块 (PCB ,Process Control Block)中。PCB又被称作切换帧(SwitchFrame)。上下文切换的信息会一直被保存在CPU的内存中。直到被再次使用。上下文切换流程如下: (1)挂起一个进程,将这个进程在CPU中的状态(上下文信息)存储于内存的PCB中。 (2)在PCB中检索下一个进程的上下文并将其在CPU的寄存器中恢复。 (3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码),并恢复该进程。

(五)Guarded Suspension模式

让人想犯罪 __ 提交于 2020-03-09 15:21:42
一、定义 guarded是"被保护着的"、"被防卫着的"意思,suspension则是"暂停"的意思。当现在并不适合马上执行某个操作时,就要求想要执行该操作的线程等待,这就是Guarded Suspension Pattern,会要求线程等候,以保障实例的安全性,其它类似的称呼还有guarded wait、spin lock等。 二、模式案例 下面的案例是一种简单的消息处理模式,客户栈线程发起请求,有请求队列缓存请求,然后发送给服务端线程进行处理。 //Request类表示请求 public class Request { private final String name; public Request(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Request{" + "name='" + name + '\'' + '}'; } } //请求队列类 public class RequestQueue { private final LinkedList<Request> queue = new LinkedList<Request>(); public synchronized

Thinking in java学习笔记19:第二十一章(并发-中)

∥☆過路亽.° 提交于 2020-03-09 13:43:51
上一个笔记(并发-上)的内容: https://blog.csdn.net/asdfghj253/article/details/104050967 3.共享受限资源 3.1 不正确地访问资源 这节举了个例子来说明,我总结一下。那就是资源的原子性和可视性。 这里将资源设置了状态,并编写方法来提供资源是否可用的可观性,当状态为不可用,那么其他线程无法调用,等一线程结束状态改回可用,再给下一个线程使用。 3.2 解决共享资源竞争 上面那节主要是当一种思维来讲的,根据这个思维,这边讲了线程现在使用的一个资源机制,互斥和共享,通过加锁来解决并发模式的线程问题。这些都是采用序列化访问共享资源的方案:在给定时刻只允许一个任务访问共享资源。 而锁往往是锁一段代码,所以一段时间内只会有一个任务可以运行这段代码 3.2.1 synchronized 关键字 (同步) java提供 synchronized 关键字(同步)来防止资源冲突,这个关键字将会检查锁是否可用,然后获取锁。执行代码,最后释放锁。 例: synchronized void test(){ ......} 这个test函数,一个时间段内只有一个任务可以调用。调用完释放锁,给下一个任务使用。 注意:使用 synchronized 的话,将里面的域(成员)设置成private是非常重要的,否则 synchronized

爬虫学习笔记-多线程(1)

我怕爱的太早我们不能终老 提交于 2020-03-09 13:40:48
一个线程只属于一个进程 一个进程可以有多个线程 在进程内部,如果要干多个事情,就需要运行多个子任务,这些子任务叫线程,线程共享所属进程地内存空间 模块: 1,_thrad模块 低级模块 2,threading模块 高级模块,对低级模块进行封装 普通实例 import threading , time def run ( num ) : print ( '子线程(%s)开始' % ( threading . current_thread ( ) . name ) ) time . sleep ( 2 ) print ( '打印' , num ) time . sleep ( 2 ) print ( '子线程(%s)结束' % ( threading . current_thread ( ) . name ) ) if __name__ == '__main__' : print ( '主线程(%s)开始' % ( threading . current_thread ( ) . name ) ) t = threading . Thread ( target = run , name = 'runthread' , args = ( 1 , ) ) #target为这个主线程要执行地函数名字 #args为要传入的函数参数 #用t这个变量接收线程 t . start ( ) #运行线程

WPF 异步加载数据

被刻印的时光 ゝ 提交于 2020-03-09 13:20:41
发个从网上找到代码,供参考吧。 private void Window_Loaded(object sender, RoutedEventArgs e) {   var Loads= this.Dispatcher.BeginInvoke(new Action(() =>   {   // 这里执行其它耗时操作   }));   Loads.Completed += new EventHandler(Loads_Completed); } void Loads_Completed(object sender, EventArgs e) { //执行完成后的操作,如隐藏加载提示文字,显示加载完成后的数据等 } 出处: https://blog.csdn.net/ht_zhaoliubin/article/details/45482203 ================================================================================= 加载某个界面时,需要获取数据,而数据返回的时间比较长,这个时候可以异步加载界面。 1、在该窗体的加载事件(Load)中编写以下代码: new Thread(p=>{DataBinding();}).Start(); 2、界面加载时获取数据和绑定数据都写在DataBinding()方法中

ReentrantLock和synchronized总结

人走茶凉 提交于 2020-03-09 10:00:25
一、简介 ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。 (1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。 (2)synchronized可重入,因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock也可重入,但加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁。 (3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。 ReentrantLock好像比synchronized关键字没好太多,我们再去看看synchronized所没有的,一个最主要的就是ReentrantLock还可以实现公平锁机制。什么叫公平锁呢?也就是在锁上等待时间最长的线程将获得锁的使用权。通俗的理解就是谁排队时间最长谁先执行获取锁。 二: ReentrantLock相比synchronized的额外功能 公平锁是指当锁可用时,在锁上等待时间最长的线程将获得锁的使用权。而非公平锁则随机分配这种使用权。和synchronized一样,默认的ReentrantLock实现是非公平锁,因为相比公平锁,非公平锁性能更好。当然公平锁能防止饥饿