操作系统 - 线程

之前已经讨论过进程了,现在讨论线程。我在想如何用现实中的具体事物来比较进程和线程的关系。

举个我认为较恰当的例子。把进程比作一个工厂中的车间,车间中有若干个生产线,但是每条生产线都需要不同的零件,原料和员工。零件,原料和员工,是所有生产线都可以共同使用的资源。这里就把生产线当做线程吧。这样,每条生产线就只用管自己的生产过程。

就如讨论进程一样,这里还是列举一下线程所包含的实体。

Program counter

Register

Statck

State

不难发现,线程关心的只是下一刻CPU执行所需的必要实体,只需要知道PC等寄存器的信息,当前栈指针,不用关心我有没有子进程啊,我的地址空间在哪里,我打开了什么文件等等的信息。因为这些信息CPU已经知道了。

为什么要使用线程

在《现代操作系统》中已经说明了使用线程的种种优势,很容易就能看明白。其实根据上文,也能猜到答案。这里就不用说明了。

线程实现的方式

线程可以在内核中实现,也可以在用户空间实现。我自己的理解是这样的:在内核中实现就是操作系统提供线程支持;在用户空间中实现就是用户自己实现。本来以为JVM的线程就是在用户空间上实现的,但是搜了一下,貌似Linux平台下是调用Pthred库实现的。这里还是深入学习一下这两种线程的实现方式,为以后的工作和学习打下基础,说不定什么时候就用上了。看了几遍《现代操作系统》中的相关章节,可是自己还是云里雾里的,不是很清楚,这一次就好好的搞明白(不一定搞的明白,目前还没有接触过用户空间实现的线程,也许是我孤陋寡闻)。

用户空间实现线程

在这种情况下,内核不知道线程的存在。当一个进程中的线程执行完毕,不需要进行系统调用(Trap),不需要进行上下文交换,所以线程的切换非常快。

但是在发生I/O中断的时候,必须要内核去处理了。那么问题来了,内核会锁住当前线程所在的进程,因为内核不知道线程的存在,只知道进程。解决这个办法有点麻烦。《现代操作系统》中提出了一个解法,在某些UNIX版本中有一个select系统调用,它可以判断I/O操作是否会阻塞。如果阻塞就不执行I/O操作。这样run-time system(用的英文版教材,很多术语不会翻译或者乱翻译,囧)就知道是执行I/O,还是执行该进程的其它进程。

内核实现线程

内核实现线程和进程区别不大。但是在线程被销毁时,内核并不会销毁线程的数据结构,只是会标记该线程是不可执行的。这样,当新线程被创建时,覆盖不可执行的线程的数据,效率大大的提高了。

还有一个问题,当一个多线程的进程执行fork时,子进程是否需要复制父进程的所有线程还是个别线程,如何操作。这个,因为很少接触Linux下的C编程,所以暂时放在这里吧。

进程和线程的区别

面试的时候,这个问题可能是问的最多的,可以考察归纳能力和是否理解进程和线程。这里给出自己的理解。

首先,进程是操作系统资源分配和调度的基本单元,它包含了程序能够执行的必要资源。而线程也叫做轻权进程,只拥有CPU执行所需的必要资源。没有进程,线程无法单独执行。

其次,进程的执行一般是线程的,一条道走到黑。线程只是进程执行的不同路径,并发的执行。

就写这么多吧。

欢迎大家一起交流和学习啊。

-end-

时间: 2024-11-07 12:05:06

操作系统 - 线程的相关文章

erlang进程与操作系统线程

erlang多进程与多线程: 在erlang开发中,我们面对的最小执行单位是进程,当然这个进程并不是系统层面上的进程,也不是线程.而是基于erlang运行时系统的一个进程.那么erlang的多进程是如何变成系统级别上的多线程,进而被多核处理器处理呢? 其实,我们每启动一个erlang VM,实际上就启动了模拟器+erlang运行时系统.而每个erlang运行时系统会启动N个进程调度器,每个进程调度器都是一个独立的操作系统线程.这个调度器会处理一个进程池,进程池里面是M个erlang进程.也就是说

操作系统--线程同步和进程同步的区别

进程至少包括一个主线程,还有工作线程狭隘的讲:线程通信就是进程范围内主线程与工作线程 或者 工作线程之间的通信 进程通信,是进程A(可以理解为主线程) 与 进程B(可以理解为主线程)之间的通信 这个 同步 的概念都是一至的. 不论是进程还是线程.不同在于所采用的同步方式, 进程的同步方式是线程的同步方式的子集. 换句话说, 进程之间的同步方式会比线程之间同步方式选择小. 就这样而已.. 线程通信一般是指同一进程内的线程进行通讯,由于在同一进程内,共享地址空间,因此交互比较容易,全局变量之类的都能

操作系统-线程与进程

首先要分清楚进程和线程的区别. 借用<操作系统概念>的一幅图: 线程由线程ID.程序计数器.寄存器集合和栈组成. 进程由代码段.数据段.文件.线程组成. 可以想象成一个进程可以有多个线程.而每个线程可以共享进程里面的代码段.数据段等. 举个例子. #include <stdio.h> #include <pthread.h> static int counter = 0; void* mythread(void* arg) { int i; for (i = 0; i

【转】java jvm 线程 与操作系统线程

原文链接:http://segmentfault.com/q/1010000000370403 Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故Java在JVM层面抽象了一套自己的线程机制,用以映射不同的操作系统的任务调度.如你所述的一些缺点,Java在1.1版本之后,这个线程模块就是基于内核级别线程[1]. 首先,如果一个机器上只有一个逻辑CPU,此时系统调度器通过轮换时间片的方式来调度任务,所以不存在真正的并行,只是并发:只有多个逻辑C

操作系统--线程介绍

线程介绍 线程是进程中的一个实体,是独立调度和分派的基本单位. 线程自身基本上不拥有系统资源,只拥有少许运行中必不可少的私有资源.线程可与同属一个进程的其他线程共享进程的全部资源. 线程使用的目标 线程使用的目标:既能提高进程并发度,又能降低系统的额外开销. 线程的实现 实现:将进程的资源申请和调度属性分开.即进程作为资源的申请和拥有者,但不作为调度的基本单位.这样,就产生了线程的概念. 线程状态 线程状态:就绪,执行,阻塞. 线程类型 用户级线程:用户级线程的创建,撤销及切换等操作全部由支持线

[操作系统] 线程和进程的简单解释

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握. 最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定工厂的电力有限,一次只能供给一个车间使用.也就是说,一个车间开工的时候,其他车间都必须停工.背后的含义就是,单个CPU一次只能运行一个任务. 3. 进程就好比工厂的车间,它代表CPU所能处理的单个任务.任一时刻,CPU总是运行一个进程,其

操作系统-线程引入

引入: 1.每个服务进程都有自己的独立的地址空间,不能共享信息 ,无并发,阻塞系统调用 2.从时间和空间开销上讲,进程相关的操作开销大,线程的开销小,并且线程之间相互通信无需调用内核,统一进程内的线程共享内存和文件 3.性能考虑:一个进程中有多个线程的话可以支持多个任务同时进行 概念: 进程中的一个运行实体,是CPU的调度单位,有时将线程称为轻量级进程 前面讲了,进程的两个基本属性:资源的拥有者,CPU调度单位,线程继承了后者 属性: 标识符ID 状态和状态转换 不运行时需要保存上下文(即每个线

操作系统中的进程与线程

操作系统中的进程与线程 转自:http://www.cnblogs.com/CareySon/archive/2012/05/04/ProcessAndThread.html 简介 在传统的操作系统中,进程拥有独立的内存地址空间和一个用于控制的线程.但是,现在的情况更多的情况下要求在同一地址空间下拥有多个线程并发执行.因此线程被引入操作系统. 为什么需要线程? 如果非要说是为什么需要线程,还不如说为什么需要进程中还有其它进程.这些进程中包含的其它迷你进程就是线程. 线程之所以说是迷你进程,是因为

操作系统中线程的实现模型

转自https://blog.csdn.net/fuzhongmin05/article/details/55802984 1.为什么需要线程? 首先需要回答一个问题,为什么操作系统需要线程.如果非要说是为什么需要线程,还不如说为什么需要进程中还有其它进程.这些进程中包含的其它迷你进程就是线程.进程有以下缺陷: 1.进程只能在一个时间内干一件事(执行一个程序执行流),而如果想同时干两件或多件事情,进程就不够用了.2.进程在执行过程中如果阻塞,例如等待输入,整个进程就将挂起,而无法继续执行.这样,