第一章——线程的介绍

1 什么是线程

线程,有时被称为轻量级进程,是程序执行的最小单元。一个标准的线程由线程ID、程序计数器(pc)、一组寄存器和堆栈组成。通常,一个进程由多个线程组成,每个线程之间共享进程的内存空间(包括代码段、数据段、堆等)及一些进程级的资源(如打开的文件描述符和信号)。如下图所示:

 

2 线程的访问权限

线程的访问非常自由,它可以访问进程内存里的所有数据,同时线程也拥有自己IDE私有存储空间,包括以下几方面:

1)栈

2)线程局部存储(TLS)。

3)寄存器(包括PC寄存器)

 

 

3 线程调度和优先级

在单处理器对应多线程的情况下,并发是一种模拟出来的。操作系统通过让多个线程轮流使用CPU,这样每个线程就“看起来”在同时执行。

在线程调度中,线程至少有三种状态,分别是:

1)运行:此时线程获得CPU正在执行

2)就绪:此时线程只有获得CPU就可以立刻执行

3)等待:此时线程正在等待某一事件发送,无法执行。

线程转换图:

4 Linux多线程

Linux对多线程的支持颇为贫乏,事实上,在Linux内核中并不存在真正意义上的线程概念。Linux将所有的执行实体(无论是线程还是进程)都称为任务,每一个任务类似于一个单线程的进程,具有内存空间、执行实体、文件资源等。

 

fork函数产生一个和当前进程完全一样的新进程,并和当前进程一样从fork函数里返回。

fork产生新任务的速度非常快,因为fork并不复制原任务的内存空间(这里指的是物理内存,父子进程的虚拟地址空间的独立的),而是和原任务一起共享一个写时复制(COW)的内存空间。所谓写时复制,指的是两个任务可以同时自由地读取内存,但任意一任务试图对内存进行修改时,内存就会复制一份提供给修改方单独使用,以免影响到其他的任务使用。

fork只能够产生本任务的镜像,如果要启动新任务,则使用exec。exec可以用新的可执行映像替换当前的可执行映像,因此在fork产生了一个新任务后,新任务可以exec来执行新的可执行文件。fork和exec都只用于产生新任务,而如果要产生新线程,则可以使用clone。

5 线程安全

多线程程序处于一个多变的环境中,可访问的全局变量和堆数据随时都可能被其他的线程改变。因此多线程程序在并发时数据的一致性变得非常重要。

5.1 竞争和原子操作

多个线程同时访问一个共享数据,可能造成错误的结果:

例如:

 

在许多体系结构上,++i的实现会如下:

1)读取i到某个寄存器X

2)X++

3)将X的内存存储回i

由于线程1和线程2的并发执行,因此两个线程的执行序列可能如下:

 

从程序的逻辑看,正确的结果应该是i为0.但是由于执行的序列问题,可能出现的结果有0,1,2。可见,两个线程同时操作一个共享数据会出现意想不到的结果。

很明显,这里出现错误的原因主要在于自增(++)操作被操作系统编译为汇编代码之后不止一条指令,因此在多线程环境下就可能出现执行了一半而被调度系统打断,去执行其他的代码。如果单条指令是原子的,则执行就不会被打断。问题是,尽管原子操作非常方便,但是它仅适用于比较简单的场合。

5.2 同步和锁

为了避免多个线程同时读写一个数据而出现不可预料的结果,我们需要将各种线程对同一数据的访问同步。所谓同步,即是指在一个线程访问数据未结束的时候,其他线程不得对同一个数据进行访问。

同步的最常见方法是加锁。锁是一种非强制机制,每一个线程在访问数据或资源之前首先试图获取锁,访问完后释放锁。

二元信号量是最简单的一种锁,它只有两种状态:占用和非占用。它适合只能被唯一一个线程访问的资源。

对于允许多个线程并发访问的资源,使用多元信号量。一个初始值为N的信号量允许N个线程并发访问。

互斥量和二元信号量类似。

临界区是一段访问临界资源的代码。临界区和互斥量和信号量的区别在于,互斥量和信号量在系统的任何进程都是可见的,也就是说,一个进程创建了一个互斥量或信号量,另一个进程试图去获取该锁是合法的。然而,临界区的作用仅限于同一进程内的不同线程之间的同步,不能用于进程的同步。

读写锁分为共享的和独占的。

 

条件变量,使用条件变量可以让许多线程一起等待某个事件的发生,当事件发生后,所有线程可以一起恢复。

6 可重入与线程安全

一个函数要成为可重入的,必须具有以下几个特点:

1)不使用任何(局部)静态或全局的非const变量

2)不返回任何(局部)静态或全局的非const变量的指针

3)仅依赖于调用方提供的参数

4)不依赖于单个资源的锁(mutex等)

5)不调用任何不可重入的函数

7 过度优化

有时候过度优化也会造成线程安全问题。

例如:

 

由于有锁的保护,x++的行为不会被并发所破坏,那么x似乎必然为2.然而,如果编译器为了提高x的访问速度,把x放入了某个寄存器中,那么我们知道不同线程的寄存器是各自独立的,此时就出现线程安全问题,例如:

 

可见,现在即使加锁也不能保证结果正确。

我们可以使用volatile关键字试图阻止过度优化。volatile可以阻止两件事情:

1)阻止编译器为了提高速度将一个变量缓存在寄存器内而不写回。

2)阻止编译器调整操作volatile变量的指令。

 

时间: 2025-01-01 06:25:26

第一章——线程的介绍的相关文章

第一章——计算机系统架构介绍

1 介绍 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决. 计算机系统u燃机系统结构的层次结构设计如下:   每个层次之间都需要相互通信,既然需要通信就必须有一个通信的协议,也就是接口.一般接口的下面那层就是接口的提供者,接口由它定义:接口的上层就是接口的使用者,它使用该接口来实现需要的功能. 例如,从整个层次结构来看,开发工具与应用程序属于同一层次,它们都是要运行库提供的接口,也就是应用程序编程接口.应用程序接口的提供者就是运行库,什么样的运行库提供什么样的API.而对于操作系统

超越Hadoop的大数据分析之第一章介绍:为什么超越Hadoop Map-Reduce

本文翻译自<BIG DATA ANALYTICS BEYOND HADOOP>译者:吴京润 译者注:本文是本书第一章的开头,第一章其它部分由其他人翻译. 你可能是一个视频服务提供商,而你想基于网络环境动态的选择合适的内容分发网络来优化终端用户的体验.或者你是一个政府监管机构,需要为互联网页进行色情或非色情的分类以便过滤色情页面,同时还要做到高吞吐量以及实时性.或者你是一个通讯/移动服务提供商--要么你在这样的公司工作--而你担心客户流失(客户流失意味着,老用户离开而选择竞争对手,或者新用户加入

第一章 andriod studio 安装与环境搭建

原文 http://blog.csdn.net/zhanghefu/article/details/9286123 第一章   andriod studio 安装与环境搭建   一.Android Studio简介 Android Studio是Google新发布的Android应用程序开发环境,Android Studio是基于IntelliJ IDEA开发而成的.在Android Studio开发环境中,Android开发者可以非常方便地调试Android应用程序,Android Studi

Frontpage2000中文教程:第一章 认识Frontpage2000

frontpage|教程|中文  你是否紧跟时代的潮流上了网?你在聊天室里是否听过别人聊起自己的个人主页,你会不会觉得自己没有个人主页就落伍了?有没有想过自己也要做一个主页?想过?那你还瞎呆在那里干什么?赶快阅读本教程,你就该学会制作自己的主页了. 本教程教你学会使用微软公司的Frontpage2000,学会干什么?当然是做你的个人主页啦.或许你认为制作主页是一门很深奥的工作,需要懂得大量的计算机知识.我现在要告诉你,你错了.在这个流行图形操作系统的今天,制作主页不再需要你去学习复杂,烦躁的HT

第一章 CSS的基本认识

CSS是『Cascading Style Sheets』的简称,中文翻为「串接样式表」,也有人只翻为「样式表」.CSS用以作为网页的排版与风格设计,在所谓的「新式网页」里 ,CSS不容置疑是相当重要的一环.CSS是以既有的基础,用以弥补既存HTML 规格里的不足,也让网页的设计更为灵活. 这份教学文件就要来为您介绍CSS的应用罗!在这边并不介绍CSS的所有规格 ,仅就您在网页写作上较常用到,较可能用到的语法部份及应用的方法来为您作介绍.也 由於现在两浏览器的相容是渐行渐远,将贴心地为您注明支援该

网页排版CSS教学第一章 CSS的基本认识

css|网页 第一章 CSS的基本认识 关 於 C S S 的 概 论 CSS是『Cascading Style Sheets』的简称,中文翻为「串接样式表」,也有人只翻为「样式表」.CSS用以作为网页的排版与风格设计,在所谓的「新式网页」里 ,CSS不容置疑是相当重要的一环.CSS是以既有的基础,用以弥补既存HTML 规格里的不足,也让网页的设计更为灵活. 这份教学文件就要来为您介绍CSS的应用罗!在这边并不介绍CSS的所有规格 ,仅就您在网页写作上较常用到,较可能用到的语法部份及应用的方法来

第一章 C#简介(rainbow 翻译) (转自重粒子空间)

<展现 C#> 第一章 C#简介(rainbow 翻译)   出处:http://www.informit.com/matter/ser0000001/chapter1/ch01.shtml 正文: 展现   C#  第一章                      C#    简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言?必须回答

《.net编程先锋C#》第一章 C#简介(转)

编程 第一章 C# 简介 欢迎您加入C#的世界! 这一章将把您引进C#的天地,并回答一些相关的问题,如:您为什么要使用C#,C++和C#的主要有什么不同点,以及为什么C#使开发更容易而且还使您感到很有趣.为什么是另外一种编程语言? 必须回答的一个问题:当您已经使用C++或VB从事企业开发时,为什么还要学习另一种语言? 市场式的回答就是:"在企业计算领域,C#将会变成为用于编写"下一代窗口服务"(Next Generation Windows Services,简写为NGWS

Programming Microsoft Office 2000 Web Components第一章

web 译者说明:<Programming Microsoft Office 2000 Web Components>是我从网上下载的一本讲述OWC技术的英文电子书,之所以要翻译这本书,是基于以下几个想法:1.阅读英文资料时常常会不求甚解,忽略很多细节和不容易阅读的句子,如果强迫自己逐句的翻译出来,则会对原来的英文资料有更加全面.详细和深刻的了解.2.可以锻炼自己在英语方面的能力.3.能够给其他需要这方面的资料的朋友提供一定的帮助. 这是本人初次进行这方面的工作,本人的技术和英文能力都很一般,