2-2.进程通信-多线程
进程同步: 并发进程在执行次序上的协调,以达到有效的资源共享和相互合作,使程序执行有可再现性。
进程互斥: 两个并行的进程A、B,如果当A进行某个操作时,B不能做这一操作,进程间的这种限制条件称为进程互斥,这是引起资源不可共享的原因。互斥是一种特殊的同步。
一、进程通信
1.进程通信的概念(是什么?):
进程通信,是指进程之间的信息交换,是操作系统内核层中比较重要的部分。 低级通信:少量数据。信号量。 高级通信:信息量大。
2.进程通信的意义(为什么?):
并发进程之间的相互通信是实现多进程间协作和同步的常用工具。具有很强的实用性,进通信是操作系统内核层极为重要的部分。
二、进程通信方式(怎么做?)
1.共享存储区通信
(1)是什么?
若干进程共享主存中的某一个区域,且使该区域出现在多个进程的虚地址空间中。进程之间通过共享变量或数据结构进行通 信,这种通信要处理好互斥进入的问题。
共享存储区通信1.png
(2)共享数据结构:
生产者-消费者问题,少量数据。
(3)共享存储区:
Unix系统中通信速度最高的一种通信机制。通过系统调用shmget建立共享存储区。
2.消息传递系统
在消息传递系统中,进程间的数据交换以消息为单位,在计算机网络中,消息又称为报文。程序员直接利用系统提供的一组通信命令(原语)来实现通信。 消息传递系统因其实现方式不同,又可分为直接通信方式和间接通信方式两种。
(1)直接通信方式
通信原语:
Send(Receiver ,message) ;
Receive(Sender ,message) ;
1)直接通信实例—消息缓冲队列机制: 广泛用于本地进程通信。
原理:
由系统管理一组缓冲区,其中每个缓冲区可以存放一个消息。当进程要发送消息时要先向系统申请一个缓冲区,然后把消息写进去,接着把该缓冲区链接到 接收进程 的消息队列中。接收进程可以在适当的时候从消息队列中摘下消息缓冲区,读取消息,并释放该缓冲区。
消息缓冲队列机制.png
消息缓冲队列通信的数据结构:
① 消息缓冲区 type message buffer=record sender ;发送进程的标识符 size ;消息长度 text ;消息正文 next ;指向下一个消息缓冲区的指针 end ② PCB 有关通信的扩充数据项 type PCB = record ... mutex ;消息缓冲队列互斥信号量 ; Sm ;消息缓冲队列资源信号量 ; mq ;消息缓冲队列首指针 ; ... end ③ 发送原语 Proceduce send (receiver,a) begin getbuf(a.size,i) ; i.sender = a.sender ; i.size = a.size ; i.text = a.text ; i.next = 0 ; getid (PCB set , receiver ,j) ; P(j.mutex) ; insert(j.mq,i) ; V(j.mutex) ; V(j.Sm) ; end ④ 接收原语 proceduce receive(b) begin j := internal name ; P (j.Sm) ; P (j.mutex) ; Remove(j.mq,i ) ; V(j.mutex) ; b.sender :=i.sender ; b.size :=i.size ; b.text :=i.text ; Releasebuf(i) ; end
(2)间接通信方式
私用信箱、公用信箱(系统创建)、共享信箱(某个进程创建的,且需要指定哪些可以用)
3.管道通信
管道是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。向管道(共享文件)提供输入的发送进程(写进程), 以字符流形式将大量的数据送入管道;而接受管道输出的接收进程(读进程),则从管道中接收(读)数据。由于发送进程和接收进程是利用管道进行通信的,故又称为管道通信。 有名管道:Unix早期版本Windows2000 无名管道:Unix后期版本Windows2000
管道通信.png
4.Socket通信
两台或同一台计算机的两个进程交换数据。微软等公司制定Windows Socket网络编程接口规范。 服务器方: (1) 首先服务器方要先启动,并根据请求提供相应服务; (2) 打开一通信通道并告知本地主机,它愿意在某一IP地址上接收客户请求;(3) 处于监听状态,等待客户请求到达该端口; (4) 接收到服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一新进(线)程来处理这个客户请求。新进(线)程处理此客户请求,并不需要对其它请求作出应答。服务完成后,关闭此新进程与客户的通信链路,并终止 (5) 返回第二步,等待另一客户请求; (6) 关闭服务器。 客户方: (1) 打开一通信通道,并连接到服务器所在主机的特定端口; (2) 向服务器发服务请求报文,等待并接收应答;继续提出请求...... (3) 请求结束后关闭通信通道并终止。
三、线程与线程管理(重点)
1.线程的概念
线程是进程的一个实体,是被系统独立调度和分派的基本单位,每个线程都有一个惟一的标识符。线程自己基本不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享所属进程拥有的全部资源。 一个进程可以有一个或多个线程,至少有一个线程。 一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 Createthread()
2.线程与进程的关系
称线程为轻量级进程(lightweight process,LWP),而传统意义上的进程则被称为重量级进程(heavyweight process,HWP)。
(1) 调度
在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位,从而使传统进程的两个属性分开,线程便能轻装运行,这样可以显著地提高系统的并发性。
(2)并发性
在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行,因而使操作系统具有更好的并发性,从而能更有效地使用系统资源和提高系统的吞吐量。
(3) 拥有资源
无论是传统的操作系统,还是引入线程的操作系统,进程都是拥有资源的独立单位,它可以拥有自己的资源。 但线程自己不拥有系统资源,它可以访问其隶属进程的资源。
(3)系统开销
由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统所付出的开销将显著地大于在创建或撤销线程时的开销。
3.多线程
传统的操作系统中,资源分配和CPU调度的单位是进程,即一个程序的一次执行。进程在任何时候只有一个执行现场,即称为单线程结构。 与传统操作系统中的单线程结构相对应,提出了多线程结构的概念。
(1)多线程的好处在于:
①提高应用程序响应, ②使多处理器效率更高; ③改善程序结构; ④占用较少的系统资源; ⑤把线程和远程过程调用RPC结合起来; ⑥提高了系统性能等。
4.线程的基本状态:
与进程一样,各线程之间也存在着共享资源和相互使用合作的制约关系,使得线程在其执行过程中出现间断性。相应地,线程在运行时也具有以下三种基本状态: 1)执行状态:线程正获得处理机运行。 2)就绪状态:线程除处理机以外的其他资源已经全部获得。 3)阻塞状态:线程在其执行过程中因某事件受阻而暂停执行。
5.线程的同步:
常用线程的同步机制有: 1)互斥锁。 2)条件变量。 3)信号量机制
四、多核技术
1.并行计算机
① 单指令流单数据流(Single Instruction stream Single Data stream,SISD) ② 单指令流多数据流(Single Instruction stream Multiple Data stream, SIMD) ③ 多指令流多数据流(Multiple Instruction stream Multiple Data stream, MIMD) ④ 多指令流单数据流(Multiple Instruction stream Single Data stream,MISD)不存在
2.多核处理器
1) 基于总线共享的Cache结构。 2) 基于片上的互连结构。
3.操作系统对多核系统的支持
分配与调度 。 中断。 存储管理。
- 【专业技术】谷歌浏览器实现Javascript扩展
- 数据结构和算法——二叉排序树
- 通过shell脚本生成查询表数据的sql (r2笔记63天)
- Linux C 编程——多线程
- 数据结构和算法——Huffman树和Huffman编码
- 简单易学的机器学习算法——K-Means++算法
- 梯度下降原理及Python实现
- 海量数据迁移之通过rowid切分大表(r2笔记62天)
- 简单易学的机器学习算法——K-近邻算法
- 使用Python绘制点击图、热图
- 使用shell生成状态报表(r2笔记61天)
- 利用d3.js对QQ群资料进行大数据可视化分析
- 海量数据迁移之分区并行切分(r2笔记60天)
- 数据结构和算法——kd树
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring事务是如何应用到你的业务场景中的?
- MySQL8.0大表秒加字段,是真的吗?
- 大数据简介,技术体系分类整理
- 图像处理笔记(5)---- OpenCV 用滑动条做调色板
- 牛X | 一款比传统数据库快100-1000倍的数据库,认识一下
- SpringBoot统一参数校验
- SpringBoot多邮件源发送邮件
- 一个基础的SpringBoot项目该包含哪些
- leetcode树之平衡二叉树
- 3分钟短文:说说Laravel页面会话之间的数据保存Session用法
- Skywalking Php注册不上问题排查
- 第4章代码-图形几何变换
- 第5章代码-三维观察
- 我的2020 九月iOS面试秘籍,为你的跳槽保驾护航
- SAP Spartacus layout设计原理