OS之多线程

os中引入进程的目的是,为了描述和实现多个程序的并发执行,以改善资源利用率及提高系统的吞吐量。

  为什么要引入线程?这是为了减少程序并发执行时系统所付出的额外开销(堆栈切换的开销等),使os具有更好的并发性。

 进程的两个基本属性:

    1、进程是一个拥有资源的独立单位;

    2、进程同时又是一个可以独立调度的基本单位;

系统为进程进行的操作:

  创建进程、 撤销进程、进程切换

进程作为资源的拥有者和系统的调度对象,需要花费系统较大的额外开销,故,系统中同时存咋的进程数目不宜过多,进程切换的频率也不宜过高,而这也就限制了并发度的进一步提高;

目标:既能提高进程并发度,又能降低系统的额外开销;

实现:将进程的资源申请和调度属性分开,即进程作为资源的申请和拥有者,但不作为调度的基本单位。这样,就产生了线程的概念;

  线程是进程中的一个实体,是独立调度和分派的基本单位;

线程自身基本上不拥有资源,只拥有少许运行中必不可少的私有资源。线程可与同属一个进程的其他线程共享进程的全部资源;

  进程中的所有线程共享该进程的状态;

线程具有三种基本状态:就绪、执行和阻塞;一般没有挂起状态;

一个进程可以创建和撤销一个或多个线程,同一进程的多个线程可以并发执行;

  对线程的操作包括:

    1、派生(spawn),当系统创建一个进程时,同时也为该进程派生一个线程(主线程),同一进程中的线程可以再派生其他线程;

    2、阻塞(Block), 当线程需要等待其他事件,它将被阻塞,释放处理机执行其他线程;

    3、解除阻塞(Unblock),当线程的阻塞事件发生,其状态转换为就绪,并插入到就绪队列,等待调度执行;

    4、结束(Finish),当线程执行完毕,释放其私有资源,(共享资源没有权限释放)

 注意:线程阻塞不一定会引起整个进程的阻塞,否则,引入线程带来的并发性就不会提高;(有时候线程阻塞会引起进程的阻塞,比如: )

  传统os,一个进程可以创建一个线程;MS DOS就是一个单用户,单进程,单线程的os,unix是一个多用户,多进程,单线程的os;

  现代os,windows和linux 都是多进程、多线程技术;java虚拟机是一个单进程、多线程的运行环境;

 

  引入线程的os中,线程是独立调度的基本单位(进程也要被调度);进程是资源拥有的基本单位,从而可以显著提高os的并发程度;

  同一进程中的线程间切换不会引起进程切换;但当一个进程中的线程切换到另一进程中的线程时,将会引起进程切换;

  进程之间可以并发执行;

  同属于一个进程的多个线程之间,也可并发执行;

  因而使os具有更好的并发性,从而更有效地使用系统资源和提高os吞吐量;

思考:不同进程之间的线程能否并发执行;

进程与线程  ----拥有资源

  进程是拥有资源的独立单位,它有权申请系统的各类资源;

线程除了拥有很少的私有资源以外,不能申请系统资源,可以共享其所属今晨的资源,即,进程的代码段、数据段以及系统资源,如已打开的文件,I/O设备等,都可被其内的所有线程共享;

    

  

 

 

 

时间: 2024-12-17 23:02:18

OS之多线程的相关文章

《Objective-C高级编程:iOS与OS X多线程和内存管理》读后感

拿到这本书的第一感觉是非常薄,但是内容就如同序里面所说,这不是一本面向初学者的书,比较有深度,对C/C++完全不熟悉的话很多东西会看不明白. 虽然此书在技术点上只谈到了ARC.Blocks和GCD,但是如果把这三部分的内容深入理解了,其实也等于将开发中大部分的问题都解决了,ARC面对的是内存管理的问题,相信每一个iOS开发者都曾面临过,对大多数人来说,只要记好内存管理的相关规则,就能避免内存管理的问题,如果不满足于只知其表象,想深入理解ARC的工作机制的话,这部分还是很值得一读的.Blocks在

聊聊 iOS 开发

做开发到一定程度后就会面临"转职",是转向更深的技术还是工程管理值得考虑啊.. 行业现状 虽然近几年有大量的开发者涌入移动端,社会上的各种培训机构也越来越多,但是优秀的 iOS 开发者在行业内仍然很少,这一方面是由于创业者很多,另一方面是因为技术更新换代很快,而且开发也需要长时间的经验积累,以近几年的 WWDC 大会为例,11年发布的 iOS5 与 iOS4 相比简直就是跨越性的更新,虽然用户可能感觉不到,但是从 SDK 的变化来说,开发者的压力是很大的:12年发布的 iOS6 带来了

iOS进阶—— Block

花几分钟时间看下面三个小题目,写下你的答案. 这个三个小题目,我在整理此片博文之前给了三位朋友去解答,最后的结果,除了一位朋友 3 题全部正确,其他两个朋友均只答中 1 题. 说明还是有很多 iOS 的朋友对于 Block 并没有透彻理解.本篇博文会对 Block 进行详细的解说. 1 Block 使用的简单规则 先了解简单规则,再去分析原理和实现: Block 中,Block 表达式截获所使用的自动变量的值,即保存该自动变量的瞬间值. 修饰为 __block 的变量,在捕获时,获取的不再是瞬间

菜鸟不要怕,看一眼,你就会用GCD,带你装逼带你飞

相信读者已经看过很多大神们对GCD深入浅出的分析,这也是老生常谈的一个多线程的实现方式了,所以我也就不再啰嗦其理论.但是到底有多少方法是我们日常编程中常用的?又有多少是你不知道的?今天,我就来例举一些GCD的方法,绝对让你看一眼就会正确得使用. 与其说CGD是线程管理,不如说是队列管理,那么我们先来介绍一下GCD中常用的队列: Serial Diapatch Queue 串行队列 当任务相互依赖,具有明显的先后顺序的时候,使用串行队列是一个不错的选择 创建一个串行队列: dispatch_que

老生常谈之Block

前面有一篇介绍Block的博客,主要介绍了Block的简单使用技巧.这篇博客主要更加深入地了解一下Block.包括:Block的实现.__Block的原理以及Block的存储域三方面. Block的实现 首先我们使用Xcode创建一个Project,点击File-->New-->Project,选择macOS中Application的Command Line Tool,然后设置Project Name即可.你好发现这个工程值包含了一个main.m文件,然后我们做如下更改(更改后的代码如下):

转-关于多线程

多线程 枫叶国游子 2001-07-04 16:32:33 我这里可以大概给你介绍一下,但对于每一种编程模型要看具体的示例是什么,而且我不可能给你罗列所有的代码,请谅解. 其实我们编程只要尽量站到比较高的层次,很多道理其实你会发现你已经懂了. 就多线程来说,我们开始设想只有两个线程(>2时是不是算数学归纳法?)那么如果两个独立的线程会发生什么呢? 1.当一个线程进入moniter(也就是说站用一个object),另一个线程只有等待或返回,而我们把返回就称为一种模式,这种模式的英文是Balking

PHP中的(伪)多线程与多进程

多线程|进程  已经因为没怎么需要,所以没有查这个的资料.最近有一个项目却是需要这样子的功能.     查看了PHP的手册和他人的例子,了解到基本的两种方法: (伪)多线程:借助外力    利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.    以下转载自:http://www.laikan8.com/21/118472.html     QUOTE:我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的. 也就是说可以同时让多人一起访问.

C#.net同步异步SOCKET通讯和多线程总结

多线程|异步 同步套接字通信 Socket支持下的网上点对点的通信 服务端实现监听连接,客户端实现发送连接请求,建立连接后进行发送和接收数据的功能 服务器端建立一个socket,设置好本机的ip和监听的端口与socket进行绑定,开始监听连接请求,当接收到连接请求后,发送确认,同客户端建立连接,开始与客户端进行通信. 客户端建立一个socket,设置好服务器端的IP和提供服务的端口,发出连接请求,接收到服务的确认后,尽力连接,开始与服务器进行通信. 服务器端和客户端的连接及它们之间的数据传送均采

简介Java多线程在交易中间件测试中的应用

引言 随着信息系统的结构的日益复杂和规模的不断扩大,交易中间件在复杂系统的应用也越来越广.交易中间件 作为一个中间层的系统,在接收客户端请求时,通常需要做一些负载控制和用户缓存的一些功能.对于软件测试人员来说, 测试交易中间件时,避免不了模拟客户端在高负载情况下的一些有规律或随机的行为.这些测试有时是功能性验证测试 (Functional Verification Test),有时也涉及到性能测试 (Performance Test). 本文将介绍如何使用 Java 语言 编写多线程的自动化测试