多通道模式 线程进程( 三 )


多对多模型的优点是:
一个用户线程的阻塞不会导致所有线程的阻塞,因为此时还有其他内核线程被调度执行;
多对多模型对用户线程的数量没有限制;
在多处理器操作系统中,多对多模型线程也能获得一定的性能提升,但提升率没有一对一模型高 。
多对多模型
多对多模型主要用于流行的操作系统 。
查看进程和线程应用程序可以是多线程或多进程的 。怎么查?在Windows下,我们只能通过打开任务管理器来查看一个应用的进程和线程的数量 。按“Ctrl+Alt+Del”或右键单击快捷工具栏打开任务管理器 。
查看进程和线程的数量:
查看线程和进程的数量
在“Processes”选项卡下,我们可以看到应用程序中包含的线程数量 。如果一个应用程序有多个进程 , 我们可以看到每个进程 。比如谷歌的Chrome浏览器就有多个进程 。同时,如果打开一个应用程序的多个实例,就会有多个进程 。如上图所示 , 如果我打开两个cmd窗口,就会有两个cmd进程 。如果看不到线程数,可以再次点击“查看\选择栏目”菜单添加栏目收听 。
【多通道模式 线程进程】检查CPU和内存使用情况:
在performance选项卡中,我们可以查看CPU和内存使用情况,还可以根据CPU使用情况记录的监视器数量查看逻辑处理核心的数量 。比如我的双核四线程电脑,有四台显示器 。
检查CPU和内存使用情况 。
线程的生命周期
当线程数小于处理器数时,线程并发为真,不同的线程运行在不同的处理器上 。但是,当线程数量大于处理器数量时,线程的并发性就会受到阻碍 。这时候就不是真正的并发了,因为至少一个处理器会运行多个线程 。
并发是单个处理器运行多个线程时的模拟状态 。操作系统使用时间片轮换来依次执行每个线程 。现在几乎所有的现代操作系统都采用了时间片轮换的抢占式调度方式,比如我们熟悉的Unix、Linux、Windows、macOS等流行的操作系统 。
我们知道线程是程序执行的最小单位,也是任务执行的最小单位 。在早期只有进程的操作系统中,进程有五种状态:创建、就绪、运行、阻塞(等待)和退出 。早期进程相当于只有单线程的当前进程,所以当前多线程有五种状态,当前多线程的生命周期和早期进程类似 。
早期流程的生命周期
运行过程中有三种状态:就绪、运行、阻塞、创建和退出状态描述了创建和退出一个进程的过程 。
创建:流程正在创建中,还不能运行 。操作系统在创建进程时要做的工作包括分配和建立进程控制块表项、建立资源表和分配资源、加载程序和建立地址空;
Ready:时间片已经用完,这个线程被强制挂起,等待下一个属于它的时间片;
Run:该线程正在执行并占用时间片;
阻塞:也叫等待状态,等待一个事件(比如IO或者另一个线程)执行完;
退出:进程已经结束,所以也叫结束状态,释放操作系统分配的资源 。
线程的生命周期
Create:创建一个新线程,等待线程被调用执行;
Ready:时间片已经用完,这个线程被强制挂起,等待下一个属于它的时间片;
Run:该线程正在执行并占用时间片;
阻塞:也叫等待状态,等待一个事件(比如IO或者另一个线程)执行完;
退出:当一个线程完成一个任务或者其他终止条件发生时,线程终止,进入退出状态,释放线程分配的资源 。
协同程序协同进程,英文Coroutines,是一种基于线程的存在,但比线程更轻量级 。这种由程序员自己写程序管理的轻量级线程叫做“user 空 inter-thread”,对内核是不可见的 。
因为它们是自主开发的异步任务,所以很多人更愿意称之为纤程,或者GreenThread 。正如一个进程可以有多个线程一样,一个线程也可以有多个协程 。
该过程的目的在传统的J2EE系统中,每个请求占用一个线程来完成完整的业务逻辑(包括事务) 。所以系统的吞吐能力取决于每个线程的运行时间 。如果遇到一个耗时的I/O行为,整个系统的吞吐量会立刻下降,因为这个时候线程总是被阻塞的 。如果有很多线程 , 就会有很多线程闲置(等待线程执行完) , 导致资源应用不完整 。
最常见的例子是JDBC(同步阻塞),这就是为什么很多人说数据库是瓶颈 。这里的耗时实际上是让CPU一直等待I/O返回 。说白了就是线程处于空 turn状态,根本不用CPU做运算 。此外,过多的线程也会带来更多的ContextSwitch开销 。
对于以上问题,现阶段业界比较流行的解决方案之一是单线程加异步回调 。其代表是node.js和Vert.x,Java的新秀 。

推荐阅读