菜鸟之旅——学习线程(基础)

愉悦的绅士

菜鸟之旅——学习线程(基础)

  在现在的软件编程中,不可避免的会用到多线程或者其他方式来实现异步的目的,那么,线程是个什么东西,如何使用?这些都是需要去学习与摸索的东西。不过在学习线程之前,还是有一些知识需要掌握的,虽说都是书本上的东西,但是还是对线程的学习有一定的作用的。

进程

 目的

  现在的计算机存在很多的操作系统(OS),大部分操作系统都是实时操作系统,可以实时的响应用户的操作,它们往往都有共同的基本特征:并发、共享虚拟,进程的产生于并发、共享有很大的联系。

  操作系统可以“同时”运行着很多的程序,并且很多程序有可能会有通讯、共同使用某些I\O设备,比如打印机之类的,这些都是操作系统为我们提供的诸多便利,但是实际上CPU在同一时刻只能处理一道程序,但是操作系统却实现了程序并发的特征,这是因为在微观上是因为多个程序交替使用CPU和其他资源;但是在多道程序环境下,程序之间将会失去封闭性,并具有间断性及不可再现性,为了能够更好的实现并发特征,引入了进程这一概念。每个进程通过一种时间片轮转调度算法来进行调度,分配运行时间片,在时间片内可以使用CPU或是其他资源,由于时间片非常短暂,用户感觉不到进程之间的切换。

  注意:在多处理机上,每个处理机可以处理不同的程序,可以说是真正的并发。

 定义

  从不同的角度,进程可以有不同的定义,比较典型的定义有:

  1、进程是程序的一次执行过程。

  2、进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

  3、进程是具有独立功能的程序在一个数据集上运行的过程,是操作系统进行资源分配和调度的一个独立单位。

 组成

  PCB:进程控制块,为了使参与并发执行的程序(含数据)能够独立的运行,更好的并发且不会冲突,于必须给进程配置一个专门的数据结构,操作系统利用PCB来控制和管理进程,PCB是进程的唯一标识

  程序段:程序段就是能被进程调度程序调度到CPU执行的程序代码段,注意程序是固定的,可以被多个进程共享,就是说多个进程可以运行同一段程序。

  数据段:一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。

  由PCB、程序段和数据段三部分构成了进程映像,进程的创建就是创建进程映像中的PCB,进程的撤销就是撤销进程的PCB。在引入进程映像的概念后,可以把传统操作系统中的进程定义为:进程是进程映像的运行过程,是系统进行资源分配和调度的一个独立单位。进程是动态的,而进程映像是静态的。

 状态

  进程存在5种状态,分别是创建、就绪、运行、阻塞和终止,而进程大部分时间是在就绪、阻塞和终止三个状态下切换。
             

  进程的切换:进程切换就是处理机(CPU)从一个进程的运行转到另一个进程上,进程的运行环境发生了实质性的变化:

  1、保存CPU上下文,包括程序计数器和其他寄存器;

  2、更新PCB信息;

  3、把进程的PCB移入相应的队列,比如就绪或者等待队列;

  4、选择另一个进程运行,更新其PCB;

  5、更新内存管理的数据结构;

  6、恢复CPU上下文信息。

线程

  我们从上面简单的回顾了一下进程的基本知识,当然,进程还有很多知识点没有介绍到,因为本人能力有限,就不更多的介绍了。下面开始回顾线程的基本知识:

 目的

  进程的引入是为了解决操作系统实现多个程序并发执行,进程的出现使各个程序在并发执行具有良好的封闭性,在进程切换的时候总会消耗一些资源,有一定量的时空消耗,但是随着软件复杂度提升,进程所占用的资源也会变多,在进程切换时需要付出更多的时空开销!于是为了减小程序在并发执行时所付出的时空开销,提升操作系统的并发性能,便引入了线程的概念。

 定义

  对于线程的最直接理解就是:轻量级进程,它是一个基本的CPU执行单元,由线程ID、程序计数器、寄存器集合和堆栈组成;线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一些在运行中必不可少的资源,但是可以与同一进程下的线程共享进程的全部资源。

  引入线程之后,进程的内涵发生了变化,进程只作为除CPU以外系统资源的分配单元,线程则作为CPU的分配单元,进程内线程切换时不会引起进程切换,减少时空开销。

 与进程的比较

  1、调度:在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,在引入线程之后,线程则变为独立调用的基本单位,进程则是拥有资源 的基本单位;同一进程内线程切换不会引起进程的切换,但是不同进程间的线程切换则会引起进程的切换。

  2、拥有资源:进程是拥有资源的基本单位,而线程不拥有系统资源(除一些必不可少的资源),但是线程可以使用其进程的资源。

  3、系统开销:由于线程并不拥有系统资源,所以同一进程下线程在被调度到CPU执行时,只需保存和设置少量寄存器内容,而无需保存、更新进程在CPU运行的环境,所付出的时空开销相对变得更少。

  4、并发性:在引入线程的操作系统中,由于线程不论在创建、撤销或者在调度切换时时空消耗更低,且进程间的线程切换也不会引起进程的切换,所以在整体的并发性能上,引入线程的操作系统吞吐量更高。

总结

  进程:计算机的CPU在同一时刻只有一道程序运行,且CPU是高速的,若是CPU等待程序的其他资源就绪,就会造成CPU的性能浪费,若是并发执行程序,在等待当前程序的其他资源就绪时,先去运行别的程序,就可以尽量减少CPU性能的浪费;这时引入了进程的概念,且CPU是以时间片调度的方式运行进程,进程的出现使得多到程序并发执行具有良好的封闭性和可控,使得操作系统拥有可控、稳定的并发性能。

  线程:进程作为系统资源和调度的基本单元本身是没什么问题,但是随着程序的日渐复杂,进程所拥有的资源变多,在进程被调度到CPU进行切换时,CPU需要保存当前进程的运行环境和设置要执行进程的运行环境,这里所付出的时空开销会越来越大;为了减少在调度时的开销,引入了更轻量的进程-线程,这时进程不再作为调度的基本单元,线程变为调度的基本单元,线程在进行切换要比进程的切换的开销小很多,这时操作系统的并发性能能够得到更良好的应用。

  总结的知识点不是很多,深一层的运行机制、数据结构和调度算法等,因本人知识限制都没有涉及到,这里还需要后续的学习。

原文地址:https://www.cnblogs.com/cjm123/p/8624269.html

时间: 2024-07-31 14:21:58

菜鸟之旅——学习线程(基础)的相关文章

菜鸟之旅——学习线程(Task)

菜鸟之旅--学习线程(Task) 前面两篇回顾线程和线程池的使用方法,微软在.NET4.5推出了新的线程模型-Task.本篇将简单的介绍Task的使用方法. Task与线程 Task与线程或者说线程池关系紧密,可以说是基于线程池实现的,虽说任务最终还是要抛给线程去执行,但是Task仍然会比线程.线程池的开销要小,并且提供了可靠的API来控制线任务执行. 使用Task来执行的任务最终会交给线程池来执行,若该任务需要长时间执行,可以将其标记为LongRunning,这是便会单独去请求创建线程来执行该

菜鸟之旅——学习线程(线程和线程池)

愉悦的绅士 菜鸟之旅--学习线程(线程和线程池) 上一篇主要介绍了进程和线程的一些基本知识,现在回归正题,我们来学一下线程的使用,本篇主要是使用新建线程和线程池的方式. 线程 先来介绍简单的线程使用:使用new方法来创建线程,至于撤销线程,我们不必去管(我也不知道怎么去管XD),因为CLR已经替我们去管理了. 创建 先来看一个简单的使用线程的例子: static void Main(string[] args) { Thread t1 = new Thread(Menthod1); Thread

web菜鸟之旅首次发表感言

26岁了,大学时计算机嵌入式系统设计毕业,工作4年,从事销售工作(大学玩去了找工作时根本不敢找计算机方面的工作),发现自己并不很很合适做销售,当然其实在销售中也实现过当代社会中所谓的价值,由于思想的变化,毅然想换一份"技术活"让自己能过上稳定的生活,现在的我不为什么,只为让自己清楚之后的路该怎么走,在网上百度一下搜到了现在的培训学校"朗沃",其实自己也不清楚该学什么,来这儿培训当初只为一点,就是自己每天玩游戏的时间比正常上班的8小时都常,而且天天如此,就是这种所谓的

菜鸟的成长记录--linux基础命令

以下是我学习时接触的命令,后续会慢慢添加 1.tty:查看终端类型 虚拟终端:/dev/tty# 伪终端:/dev/pts/# 控制台:/dev/console 串行终端:/dev/ttyS# 2.startx:启动图形界面 3.ifconfig:查看网卡信息 4.cd:进入用户主目录 cd ~:进入用户主目录 cd ~USERNAME:进入其他用户主目录 cd -:在前一个目录和当前目录来回切换 cd .:当前目录 cd ..:上一级目录 cd ../..:返回上两级目录 cd !$:把上一个

CentOS6.5菜鸟之旅:纯转载Linux目录结构

来自:http://www.iteye.com/topic/1125162 使用linux也有一年多时间了  最近也是一直在维护网站系统主机  下面是linux目录结构说明 本人使用的是centos系统,很久没有发表博文了 近期会整理自己所用所了解知识点,发表linux相关的文章,记录自己的linux点点滴滴. linux 目录结构 /: 根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中/bin:/usr/bin: 可执

CentOS6.5菜鸟之旅:安装Realtek无线网卡驱动

一.前言 CentOS6.5不像CentOS7和Unbuntu那样自动安装好了无线网卡驱动,因此需要我们折腾一下. 二.安装前的准备工作   [a] 检查无线网卡驱动的安装情况(通过查看网络接口的安装情况来检查) 在虚拟终端下输入: #> iwconfig 若显示如下信息,则表示未安装无线网卡驱动 lo no wireless extensions. # 本地回环接口 eth0 no wireless extensions. # 以太网接口 若显示如下信息,则表示已安装了 lo no wirel

Nio学习3——基础模型:Reactor模式和多路复用

Reactor模式和NIO 本文可看成是对Doug Lea Scalable IO in Java一文的翻译. 当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作.他们都有一个共同的结构: 1. Read request 2. Decode request 3. Process service 4. Encode reply 5. Send reply 经典的网络服务的设计如下图,在每个线程中完成对数据的处理: 但这种模式在用户负载增加时,性能将下降

多线程实战(一) 线程基础

线程的好处,我想都不必多说,博客园太多了:但个人对线程了解还比较基础,决定把学习线程记录下来(有一些例子来之博客园): 创建线程 暂停线程 等待线程 线程传参数 lock Monitor 创建线程 Thread t = new Thread(PrintNumbers);//线程创建 t.Start();//开始线程PrintNumbers(); static void PrintNumbers() { Console.WriteLine("Starting..."); for (int

CentOS6.5菜鸟之旅:U盘安装CentOS64位

一.前言 之前下载了个CentOS7 32位版,一下就安装成功了,但由于其目录结构等与之前的CentOS版本有很大的不同,加上教程不多不利于我这种菜鸟学习,于是决定重装CentOS6.5来学习.本篇用于记录安装过程中所踩的坑,以便日后查阅. 二.国内下载源 163镜像:http://mirrors.163.com/ sohu镜像:http://mirrors.sohu.com/ 阿里镜像:http://mirrors.aliyun.com/ 三.准备工作 1. 下载CentOS-6.5-x86_