进程和线程

进程具有两个相互独立的特点:

1.资源所有权:进程包括存放进程映像的虚拟地址空间,具有对资源的控制权。

2.调度/执行:进程具有运行状态和优先级,是可被 OS 调度和分派的实体。

通常将分派的单位称为线程(thread)或者轻量级进程(lightweight process),将拥有资源所有权的单位称为进程(process)或者任务(task)。

多线程是指 OS 在单个进程内支持多个并发执行路径的能力。

在多线程环境中,进程定义为资源分配单元和保护单元,和进程相关的有:

  • 容纳进程映像的虚拟地址空间。
  • 对处理器、其他进程(进程间通信)、文件和I/O资源的受保护访问。

一个进程可能有一或多个线程,和线程相关的有:

  • 执行状态。
  • 未运行时已保存的线程上下文。
  • 执行栈。
  • 用于局部变量的静态存储空间。
  • 与进程内其他线程共享的内存和资源访问。

线程的优点:

1.在已有进程中创建新线程花费的时间远少于创建一个新进程。

2.终止线程花费的时间少于终止进程。

3.同一进程内线程之间的切换花费的时间少于进程间的切换。

4.提高了执行程序间的通信效率,线程间通信不需要调用内核。

在多处理器环境中,同一进程中的多个线程可以同时在不同处理器上运行。

支持线程的 OS 中,调度和分派是在线程基础上完成的,大多数与执行相关的信息可以保存在线程级数据结构中。当进程的某些状态改变时,进程中的所有线程的状态都会改变。比如进程终止时,所有线程也会终止。

线程状态:运行态、就绪态和阻塞态。

线程状态改变的操作:

1.派生:一般情况下,当派生一个新进程时,同时也会为该进程派生一个线程。

2.阻塞:等待一个事件时。

3.解除阻塞:等待的事件发生。

4.结束:线程执行完成。

线程同步:同一个进程中的所有线程共享地址空间和其他资源。一个线程对资源的修改会影响到其他线程的环境,为了防止它们产生干扰和破坏数据结构,需要同步各线程的活动。

线程分类

用户级线程:管理线程的所有工作由应用程序完成,内核不知道线程的存在。

任何应用程序都可以使用线程库设计成多线程程序。线程库是一个和线程操作相关的例程库。

当进程处于运行态时,进程中的某一个线程正在运行。此时,若线程发出了阻塞的系统调用,则进程状态将转为阻塞态,而运行中的线程状态不变,仍然是运行态;若发生时钟中断,进程状态转为就绪态,运行态的线程状态不变;若运行中的线程需要同一进程中的另一个线程执行,则该线程转为阻塞态,另一个线程转为运行态。

用户级线程优点:

1.线程切换不需要转换到内核模式,节省了模式转换的开销。

2.调度算法可以根据应用程序的不同而在应用程序中设计,不干扰 OS 底层的调度策略。

3.可以在任何 OS 中运行。

缺点:

1.系统调用会阻塞进程,即阻塞进程中所有线程。

2.多线程程序不能应用多处理技术,每次只有一个进程被分配给处理器,每个进程每次只有一个线程在运行。

解决线程阻塞问题的方法

使用称为“套管”(jacketing)的技术,目标是将产生阻塞的系统调用转化为非阻塞的系统调用。

内核级线程:内核为进程和进程中每个线程维护上下文信息。调度由内核基于线程完成。

优点:

1.可以同时把一个进程中的多个线程调度到多个处理器上执行。

2.进程中一个线程被阻塞时,可以调度同一进程中另外一个线程。

缺点:

在同一个进程内不同线程间传递处理器控制权时,需要切换到内核模式。

混合方式:线程创建完全在用户空间中完成,线程调度和同步在应用程序中进行。一个应用程序中的多个线程会被映射到一些(数量少于应用程序中的线程)内核级线程上。

进程和线程之间多对多的关系

当一个程序需用使用I/O子程序时,将主程序和子程序当作由单线程实现的单个活动,就是两者作为同一个线程实现,但是为主程序和子程序分别创建各自的地址空间,线程在执行过程中在这两个地址空间中移动。此时是一个线程对多个进程,也可以在同一地址空间中执行多个线程。

OSIDP-线程-04的更多相关文章

  1. Android中的线程池

    在Android中,主线程不能执行耗时的操作,否则可能会导致ANR.那么,耗时操作应该在其它线程中执行.线程的创建和销毁都会有性能开销,创建过多的线程也会由于互相抢占系统资源而导致阻塞的现象.这个时候 ...

  2. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  3. Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  4. Android中多线程编程(三)Handler更新UI的方式

    Handler更新UI的方式和原因以及遇到的问题 1.方式: 仅仅能通过Handler来更新UI. 代码例如以下: package com.chengdong.su.handlerdemo; impo ...

  5. JVM学习笔记(详细)

    目录 01 JVM与Java体系结构 简介 JVM整体架构,HotSpot java代码执行流程 JVM架构模型 JVM生命周期 JVM发展历程 02 类加载子系统 JVM细节版架构 类加载器的作用 ...

  6. Python并发编程04 /多线程、生产消费者模型、线程进程对比、线程的方法、线程join、守护线程、线程互斥锁

    Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线程join.守护线程.线程互斥锁 目录 Python并发编程04 /多线程.生产消费者模型.线程进程对比.线程的方法.线 ...

  7. 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition

    img { border: solid 1px } 一.前言 多线程怎么防止竞争资源,即防止对同一资源进行并发操作,那就是使用加锁机制.这是Java并发编程中必须要理解的一个知识点.其实使用起来还是比 ...

  8. java多线程系类:JUC线程池:04之线程池原理(三)(转)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--"基础篇& ...

  9. Java多线程系列--“JUC线程池”04之 线程池原理(三)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...

  10. flask --- 04 . 偏函数, 线程安全,栈堆,

    一.偏函数(partial) ①第一种 结果为: ② 第二种 二.线程安全 将空间转换成时间 问题: 1秒钟打印所有结果 threading.current_thread().ident :线程ID ...

随机推荐

  1. WCF的实现(方式二)

    参考他人实现文件传输 [WCF]利用WCF实现上传下载文件服务 服务端: 1.首先新建一个名为FileService的WCF服务库项目,如下图: 2.将Service,IService重命名为File ...

  2. 从零搭建hadoop集群之节点间免密登录

    我这里有三台虚拟机 分别是 hadoop01 hadoop02 hadoop03 1.所有节点切入到hadoop用户 2.分别再三个节点上输入 ssh-keygen 命令(输入命令后敲回车键三下)  ...

  3. SpringBoot(十五)单个以及多个跨域的配置方法

    同源策略是浏览器的一个安全限制,要求域名.协议.端口相同,如果不同则没办法进行数据交互.而跨域配置,则是为了解除这方面的限制.前后端分离的情况下,因为需要分开部署,后台开发基本都需要进行跨域配置了.( ...

  4. windows环境下部署项目

    有些时候,我们的项目不得不用windows服务器部署,但是需要注意的是,windows服务是无法开启多进程处理请求的. 本文介绍如何在windows上部署flask项目,应用 apache + mod ...

  5. spring boot整合druid

    其实网上有很多例子可供参考,主要是在整合的过程中遇到了一些问题,方便记录下.另外例子可参考以下两个链接: https://www.jianshu.com/p/e3cd2e1c2b0c https:// ...

  6. window 画工业图软件

    1.autoCAD 2.visio 3.CorelDraw 4.DrawIO

  7. 软件离线许可(License)实现原理

    我们经常使用各种开发软件,比如IntelliJ IDEA.Navicat.Visual Studio等,这些软件都有一个特点,就是要收费.一般是我们需要去购买一个许可,然后输入这个许可到软件里就能够使 ...

  8. IntelliJ IDEA 工具识别不了 过大Java文件 引用识别的不了的文件报错

    之前出现过proto 生成的文件过大 idea 识别不了 引用消息报错. 解决方案 1.找到IntelliJ IDEA 桌面快捷键图标 右键属性 2.打开文件位置,找到所在目录 3.找到idea.pr ...

  9. git当前分支修改文件不提交切换另一个分支(git stash)

    出发前先讲故事:项目正在test分支更新版本我们疯狂的写bug,突然没更新前的版本出bug了(意料之中),此时呢我们要切换到master分支去改bug.此时此刻我test分支上修改的文件还不想提交,但 ...

  10. MindManager离线安装包官网下载

    软件官网:https://www.mindjet.com/ 注意:不建议在思杰马克丁及其相关合作网站下载该软件,更不建议在其旗下站点购买该软件授权. 目前来说,官网正常下载的话它会要求你填写一些信息, ...