目录

1、线程和进程

2、进程间的通信方式

3、线程同步和互斥

4、上下文切换

5、什么是用户模式和内核模式?


1、线程和进程

(1)什么是进程?

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。

当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事 本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位。

(2)什么是线程?

线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 。 线程,有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位。

(3)线程和进程的区别

进程基本上相互独立的,而线程存在于进程内,是进程的一个子集。

进程拥有共享的资源,如内存空间等,供其内部的线程共享。

进程间通信较为复杂

  • 同一台计算机的进程通信称为 IPC(Inter-process communication)
  • 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议, 例如 HTTP

线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

线程更轻量,线程上下文切换成本一般上要比进程上下文切换低。

2、进程间的通信方式

1. 管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

2. 信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。

3. 消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息; 对消息队列有读权限得进程则可以从消息队列中读取信息。

4. 共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。

5. 信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。

6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

3、线程同步和互斥

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。

线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

四种线程同步互斥的控制方法

  • 临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。(在一段时间内只允许一个线程访问的资源就称为临界资源)。
  • 互斥量:为协调共同对一个共享资源的单独访问而设计的。
  • 信号量:为控制一个具有有限数量用户资源而设计。
  • 事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

4、上下文切换

上下文切换是指CPU(中央处理单元)从一个进程或线程到另一个进程或线程的切换。

进程是程序的一个执行实例。在Linux中,线程是轻量级进程,可以并行运行,并与父进程(即创建线程的进程)共享一个地址空间和其他资源。

上下文是CPU寄存器和程序计数器在任何时间点的内容。

寄存器是CPU内部的一小部分非常快的内存(相对于CPU外部较慢的RAM主内存),它通过提供对常用值的快速访问来加快计算机程序的执行。

程序计数器是一种专门的寄存器,它指示CPU在其指令序列中的位置,并保存着正在执行的指令的地址或下一条要执行的指令的地址,这取决于具体的系统。

上下文切换可以更详细地描述为内核(即操作系统的核心)对CPU上的进程(包括线程)执行以下活动:

1. 暂停一个进程的处理,并将该进程的CPU状态(即上下文)存储在内存中的某个地方

2. 从内存中获取下一个进程的上下文,并在CPU的寄存器中恢复它

3. 返回到程序计数器指示的位置(即返回到进程被中断的代码行)以恢复进程。

上下文切换只能在内核模式下发生。内核模式是CPU的特权模式,其中只有内核运行,并提供对 所有内存位置和所有其他系统资源的访问。其他程序(包括应用程序)最初在用户模式下运行,但它们可以通过系统调用运行部分内核代码。

上下文切换是多任务操作系统的一个基本特性。在多任务操作系统中,多个进程似乎同时在一个 CPU上执行,彼此之间互不干扰。这种并发的错觉是通过快速连续发生的上下文切换(每秒数十次 或数百次)来实现的。这些上下文切换发生的原因是进程自愿放弃它们在CPU中的时间,或者是调 度器在进程耗尽其CPU时间片时进行切换的结果。

上下文切换通常是计算密集型的。就CPU时间而言,上下文切换对系统来说是一个巨大的成本, 实际上,它可能是操作系统上成本最高的操作。因此,操作系统设计中的一个主要焦点是尽可能 地避免不必要的上下文切换。与其他操作系统(包括一些其他类unix系统)相比,Linux的众多优势 之一是它的上下文切换和模式切换成本极低。

5、什么是用户模式和内核模式?

内核模式(Kernel Mode)和用户模式(User Mode)

在现代操作系统中,CPU实际上都在两种截然不同的模式中花费时间:

Kernel Mode

在内核模式下,执行代码可以完全且不受限制地访问底层硬件。它可以执行任何CPU指令和引用任何内存地址。内核模式通常为操作系统的最低级别、最受信任的功能保留。内核模式下的崩溃是灾难性的,他们会让整个电脑瘫痪。

User Mode

在用户模式下,执行代码不能直接访问硬件或引用内存。在用户模式下运行的代码必须委托给系统API来访问硬件或内存。由于这种隔离提供的保护,用户模式下的崩溃总是可恢复的。在计算机上运行的大多数代码都在用户模式下执行。

Windows 系统用户模式和内核模式组件之间的通信:

CPU保护模式

x86 CPU提供了四个保护环(protection rings):0、1、2 和 3。通常只使用 0 环(内核)和 3 环(用户)。

应用程序一般会在以下几种情况下切换到内核模式:

1.系统调用。比如创建线程,加锁解锁等

2.异常事件。当发生某些预先不可知的异常时,就会切换到内核态,以执行相关的异常事件。

3.设备中断。在使用外围设备时,如外围设备完成了用户请求,就会向CPU发送一个中断信号,此时,CPU就会暂停执行原本的下一条指令,转去处理中断事件。此时,如果原来在用户态,则自然就会切换到内核态。

理解进程、线程以及上下文切换相关推荐

  1. JUC多线程:系统调用、进程、线程的上下文切换

    一.什么是上下文切换: 1.内核空间的用户空间: 讲上下文切换前我们先了解下什么是内核空间和用户空间,程序运行在内核空间的状态称为内核态,运行在用户空间的状态称为用户态,用户态和内核态是操作系统的两种 ...

  2. c++ createtoolhelp32snapshot取进程路径_理解进程和线程

    进程和线程是操作系统里很重要的概念,但是所有的东西都会落实到代码.看起来很复杂的进程线程,其实在操作系统的代码里.也只是一些数据结构和算法.只不过他比一般的数据结构和算法可能复杂点.但是学习方法还是一 ...

  3. 我所理解的线程和进程

    我所理解的线程和进程(一) 0x00 没什么卵用的前言 最近刚巧和朋友讨论起进程和线程的概念,于是突发奇想写了这篇博客,希望不依托于具体的编程语言和平台简述进程和线程的概念,所以本篇博客不讨论实现细节 ...

  4. Python_进程/线程/多线程理解

    目录 进程.线程.多线程: 1.进程与线程区别 (1)进程与线程区别 (2)多进程与多线程区别 (3)更多区别 2. 进程简单理解 3. 线程简单理解 进程.线程.多线程: 进程:资源分配的最小单位. ...

  5. CPU核心数线程数、程序进程线程、并发并行的简单理解

    CPU核心数线程数.程序进程线程.并发并行.简单理解和区分 这篇文章是对上述感念的简单理解,想深入研究可以看看<计算机组成原理> CPU的核心数 线程数 当我们买电脑的时候,会看到CPU的 ...

  6. 15分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行,太实用了!

    作者:Martin cnblogs.com/mhq-martin/p/9035640.html 基本概念 1 进程和线程 进程(Process): 是Windows系统中的一个基本概念,它包含着一个运 ...

  7. 进程用户态 上下文切换需要保存哪些_漫话性能:CPU上下文切换

    序言 表弟:CPU平均负载​zhuanlan.zhihu.com 我们理解了平均负载( Load Average),并用三个案例展示了不同场景下平均负载升高的分析方法.这其中,多个进程(或线程)竞争 ...

  8. 线程中可以创建进程吗_Linux 进程线程是如何创建的?

    上文讲了<Linux进程在内核眼中是什么样子的?>,可以理解内核关于进程线程的所有管理就通过一个结构体 -- task_struct.知道了内核眼中进程的描述,本文通过三个例子站在用户态看 ...

  9. 面试官:换人!他连进程线程协程这几个特点都说不出

    前言 很早之前就在构思这篇文章的主题,进程线程可以说是操作系统基础,看过很多关于这方面知识的文章都是纯理论讲述,编程新手有些难以直接服用. 于是写下这篇文章,用图解的形式带你学习和掌握进程.线程.协程 ...

  10. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

最新文章

  1. 用php文件创建表,使用PHP创建单个文件上传表单的最佳方式是什么?
  2. 最大字段和_使对易失性字段的操作原子化
  3. GPT v.s. 中国象棋:写过文章解过题,要不再来下盘棋?
  4. Qt Creator编辑状态图
  5. 开发java程序的步骤_开发 Java 程序的一般步骤是:源程序编辑、 和 。_学小易找答案...
  6. 柴静《认识的人 了解的事》
  7. C语言试题七十一之请编写函数求出这个数的阶乘
  8. mybatis报错:java.lang.IllegalArgumentException: Mapped Statements collection does not contain
  9. PHP 基础 自动类型转换之比较运算符
  10. txt文本如何改html类型,编辑html格式文本可改成txt格式(可以替换或更换某文本)新手...
  11. [Manifest]关于icon
  12. swf到html5转换器,iPixSoft SWF to HTML5 Converter(SWF到HTML5转换器) V3.6.0 官方版[安全工具]...
  13. 拓端tecdat|R语言离群值处理分析
  14. 项目源码--Android聚合视频类播放器
  15. Flask部署机器学习模型---基于线性回归模型的销售预测系统实现简易版代码
  16. 传奇服务器如何修改地图和刷怪,传奇如何将怪物刷在指定地图?
  17. ftp 连接失败。500 OOPS: cannot change directory:
  18. 【项目】森林预言家——森林火灾预防系统
  19. ElasticSearch 基础(七)之分析器
  20. 学习PHP——高级(总)

热门文章

  1. 小目标检测论文笔记:Learning Calibrated-Guidance for Object Detection in Aerial Images
  2. 【千与千寻】观影有感
  3. 某大厂开发者对于Android多线程的总结,大厂直通车!
  4. MySQL数据库——排序查询
  5. 用函数调用实现上下两行星星符号,中间文字
  6. 反欺诈体系与设备指纹
  7. Batch获取MSN好友信息、Gmail邮箱Yahoo邮箱Live邮箱联系人
  8. 使用SLM方法降低PAPR
  9. Win10 环境下安装Ubuntu 18.04过程记录
  10. 老年产品的工业设计有多重要?