进程、线程相关知识点整理

什么是进程

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。

进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

进程的三种基本状态

a. 运行状态:获得CPU的进程处于此状态,对应的程序在CPU上运行着

b. 阻塞状态:为了等待某个外部事件的发生(如等待I/O操作的完成,等待另一个进程发来消息),暂时无法运行。也称为等待状态

c. 就绪状态:具备了一切运行需要的条件,由于其他进程占用CPU而暂时无法运行

进程状态转换

a. 运行状态 ===> 阻塞状态:例如正在运行的进程提出I/O请求,由运行状态转化为阻塞状态

b. 阻塞状态 ===> 就绪状态:例如I/O操作完成之后,由阻塞状态转化为就绪状态

c. 就绪状态 ===> 运行状态:例如就绪状态的进程被进程调度程序选中,分配到CPU中运行,由就绪状态转化为运行状态

d. 运行状态 ===> 就绪状态:处于运行状态的进程的时间片用完,不得不让出CPU,由运行状态转化为就绪状态

   

进程间通信主要包括

 

管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

 

有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

 

信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

 

消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

 

信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

 

共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

 

套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

 

注: 

全双工指在发送数据的同时也能够接收数据,两者同步进行。目前的网卡一般都支持全双工。

所谓半双工就是指一个时间段内只有一个动作发生,早期的对讲机、以及早期集线器等设备都是基于半双工的产品。

 

什么是线程

线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等。
当多个线程同时读写同一份共享资源的时候,可能会引起冲突。这时候,我们需要引入线程“同步”机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团。
线程同步的真实意思和字面意思恰好相反。线程同步的真实意思,其实是“排队”:几个线程之间要排队,一个一个对共享资源进行操作,而不是同时进行操作。

进程,线程对比

把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.



线程同步的方法


(1)wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
(3)notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
(4)notityAll ():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

 

用户级线程和内核级线程

 

1 .内核级线程:切换由内核控制,当线程进行切换的时候,由用户态转化为内核态。切换完毕要从内核态返回用户态;可以很好的利用多核cpu。

2. 用户级线程内核的切换由用户态程序自己控制内核切换,不需要内核干涉,少了进出内核态的消耗,但不能很好的利用多核Cpu。

 

以下是用户级线程和内核级线程的区别:

(1)内核支持线程是OS内核可感知的,而用户级线程是OS内核不可感知的。

(2)用户级线程的创建、撤消和调度不需要OS内核的支持,是在语言(如Java)这一级处理的;而内核支持线程的创建、撤消和调度都需OS内核提供支持,而且与进程的创建、撤消和调度大体是相同的。

(3)用户级线程执行系统调用指令时将导致其所属进程被中断,而内核支持线程执行系统调用指令时,只导致该线程被中断。

(4)在只有用户级线程的系统内,CPU调度还是以进程为单位,处于运行状态的进程中的多个线程,由用户程序控制线程的轮换运行;在有内核支持线程的系统内,CPU调度则以线程为单位,由OS的线程调度程序负责线程的调度。

(5)用户级线程的程序实体是运行在用户态下的程序,而内核支持线程的程序实体则是可以运行在任何状态下的程序。

内核线程的优点:

(1)当有多个处理机时,一个进程的多个线程可以同时执行。

缺点:

(1)由内核进行调度。

用户线程的优点:

(1) 线程的调度不需要内核直接参与,控制简单。

(2) 可以在不支持线程的操作系统中实现。

(3) 创建和销毁线程、线程切换代价等线程管理的代价比内核线程少得多。

(4) 允许每个进程定制自己的调度算法,线程管理比较灵活。这就是必须自己写管理程序,与内核线程的区别

(5) 线程能够利用的表空间和堆栈空间比内核级线程多。

(6) 同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起。另外,页面失效也会产生同样的问题。

缺点:

(1)资源调度按照进程进行,多个处理机下,同一个进程中的线程只能在同一个处理机下分时复用

 

 

本贴是博主借鉴多个网站进行的整理,由于过多不在此一一谢过。

 

 最后再给大家推荐两个网站

 漫画教你理解进程线程

 我是一个线程

 

转载于:https://www.cnblogs.com/CZDblog/p/5581073.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设置dns_2019让你的网速飞起来,你需要……设置正确DNS服务篇

有时候上网明明网络连接正常,但网页访问却很慢?平时会不会经常听到一些老司机说,网络很慢啊可以修改一下DNS啊!什么是DNS?又为什么会对网速产生影响呢?跟着小编的教程一起来学习一下吧~PART 1 什么是DNS&am…

c/c++多线程编程中最好不要加volatile

来自https://www.zhihu.com/question/31459750 答主解释说:不能指望volatile能解决多线程竞争问题,除非所用的环境系统不可靠才会为了保险加上volatile, 或者从极限效率考虑来实现很底层的接口,这要求编写者对逻辑走向很清楚&…

5 随窗口改变大小_C4D默认界面两个关于坐标轴的窗口有什么区别

前言在一开始学习C4D的时候,就有这个疑问,为什么明明物体的属性都有了一个坐标属性的窗口了,还要有一个和坐标相关的窗口在默认的界面呢,后边在使用的过程中才慢慢理解了额外的坐标管理器窗口的作用,这一篇文章我们来看…

iOS  Emoji表情编码/解码

之前做弹幕的时候 遇到的表情编码解码问题 表情编码一般是使用unicode编码 ,编码之后的格式 \ud83d\ude18\ud83d\ude18world\u4e16\u754chaha\ud83d\ude17 //编码NSString *uniStr [NSString stringWithUTF8String:[_barrageText.text UTF8String]];NSData *uniDat…

时间单位的档案

时间单位的档案 2011-09-14 10:33:20分类: C/C 编辑: 李瑛 撰文/David Labrader [崔琳琳/译 曾少立/校]时间的单位可以从极小到极大,下面的描述是想传达一种超大时间跨度的感受。一渺秒(十亿分之一秒的十亿分之一)科学…

MySQL数据查询新人须知

MySQL 是一个开放源码的小型关系型数据库管理系统。 针对不同的用户,MySQL 一共分为两个不同的版本: MySQL Community Server(社区版服务器)。 MySQL Enterprise Server(企业版服务器)。 目前 Internet …

combobox异步加载 easyui_如何解决多条数据加载easyui-combobox样式反应慢的问题

问题描述总共一百条数据,数据中加入combobox样式,打开页面出现卡顿情况问题出现的环境背景及自己尝试过哪些方法一条数据,有三处地方用到combobox样式,如果有100条数据是,打开页面编辑这100条数据就会出现页面卡顿情况…

板邓:wordpress中add_action()和do_action()关系

学习wordpress插件开发的都知道很熟悉这两个函数&#xff0c;也是必须要掌握的&#xff01; 我们来看一下一段代码&#xff1a; <? add_action("wp_footer","hc_copyright_install");function hc_copyright_install() {echo"板邓wordpress开发&q…

(硬 核)Navicat for MySQL 介 绍( 入 门 须 知 )

Navicat for MySQL 是一款流行的 MySQL 图形化管理工具以下是 Navicat for MySQL 工作界面使用 Navicat for MySQL 连接 MySQL 服务器鼠标左键单击“连接”按钮&#xff0c;出现“新建连接”窗口。分别输入连接名、MySQL 服务器主机地址、服务 端口号、用户名和密码&#xff0c…

ubuntupython损坏_修复损坏的Python3.2安装(Ubuntu)

我愚蠢地从/usr/lib/python3.2中删除subprocess.py模块所以我试图通过执行以下命令来解决这个问题&#xff1a;sudo apt-get install python3但我刚刚犯了个错误&#xff1a;Traceback (most recent call last): File "/usr/bin/py3compile", line 33, infrom subpro…

(硬 核)使用MySQL管理和查询数据 ( 入 门 须 知 ②)

具体的某一个数据库由几个部分组成的&#xff1f; 表视图函数查询备份 数据表是数据存储的基本单位 对于关系型数据库而言&#xff0c;一张表就是一个关系 MySQL 常见数据类型: 类型分类 类型 取值范围或描述 示例 整数类型 tinyint 0 &#xff5e;255 员工年龄&#x…

解决 Plugin with id 'com.github.dcendents.android-maven' not found.

在Android studio中引用第三方库的时候&#xff0c;报这个错。 Error:(2, 0) Plugin with id com.github.dcendents.android-maven not found. 搜了一下。 "这是原因为该项目的原作者会把项目发布到maven中央仓库中&#xff0c;所以在gradle中添加了相关的maven发布任务。…

小明一家过桥_【练习】用python解决小明一家过桥问题

import randomlist1[] #存放所有遍历的结果#等待过桥的人员bridge1{小明:1,弟弟:3,爸爸:6,妈妈:8,爷爷:12}#过桥后的人员bridge2{}#判断未过桥的人是否空了(全部过完后&#xff0c;程序停止&#xff0c;看总共用了多长时间)len1len(bridge1)print(len1)#while True:print(初始情…

MySQL基础,DDL和DML(新人入门向)

SQL 作为关系型数据库管理系统的标准语言&#xff08;ANSI X3.135-1986&#xff09;&#xff0c;在 1987 年得到国际标准组织的支持成为国际标准。不过不同数据库系统之间的 SQL 不能完全通用。 SOL——Structured Query Language 结构化查询语言 DDL——Data Definition Lan…

天然气门站监控摄像头如何布置_监控摄像头布置原则

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":8,"count":8}]},"card":[{"des":"时间序列数据库 (Time Series Database , 简…

Mysql 函数入门

1.数学函数 数学函数是用来处理数值数据方面的运算&#xff0c;MySQL 中主要的数学函数有绝对值函数、三角函数、对数函数和随机函数等。数学函数 功能介绍 TRUNCATE(x,y) 返回截去小数点后 y 位的数值 x RAND() 返回一个随机浮点值 v&#xff0c;0<v<1 RAND(x)…

WGZX:javaScript 学习心得--1

标签&#xff1a; javascriptiframedreamweaver浏览器htmltable2008-09-11 10:50 1071人阅读 评论(0) 收藏 举报分类&#xff1a;UI&#xff08;21&#xff09; 1&#xff0c;document.getElementById方法只能获取到一个对象&#xff0c;即使有多个同名的对象&#xff0c;也只取…

MySQL 聚合函数 和 分组查询(初级)

聚合函数用于对一组值进行计算并返回一个汇总值&#xff0c;使用聚合函数可以统计记录行数、计算某个字段值的总和以及这些值的最大值、最小值和平均值等。函数名称 功能 sum 返回选取的某列值的总和 max 返回选取的某列的最大值 min 返回选取的某列的最小值 avg …

mysql时长用什么类型_MySQL 日期时间类型怎么选?千万不要乱用!

构建数据库写程序避免不了使用日期和时间&#xff0c;对于数据库来说&#xff0c;有多种日期时间字段可供选择&#xff0c;如 timestamp 和 datetime 以及使用 int 来存储 unix timestamp。不仅新手&#xff0c;包括一些有经验的程序员还是比较迷茫&#xff0c;究竟我该用哪种类…

PHP----练习-----新闻管理----增删改查

练习-----新闻管理 题目要求如下&#xff1a; 做法&#xff1a; 【1】建数据库 【2】封装类文件--------DBDA.class.php 1 <?php2 class DBDA3 {4 public $fuwuqi"localhost"; //服务器地址5 public $yonghuming"root";//用户名6 public …