操作系统笔记之进程与线程


背景

操作系统设计的7个主题:
1. 进程描述和控制
2. 内存管理
3. 调度
4. I/O和文件管理
5. 并发和分布式系统
6. 嵌入式系统
7. 安全

操作系统利用一个或多个处理器的硬件资源,为系统用户提供一组服务,还代表用户来管理辅助存储器和I/O设备。

CPU中断的分类:
1. 程序中断
2. 时钟中断
3. I/O中断
4. 硬件失效中断

DMA:直接内存存取

概述

典型计算机系统的三个重要接口:
1. 指令系统体系结构ISA
2. 应用程序二进制接口ABI
3. 应用程序编程接口API

进程

三个部分:
1. 一段可执行的程序,
2. 程序所需要的相关数据(变量,工作空间,缓冲区等),
3. 程序的执行上下文,又称进程状态。上下文包括操作系统管理进程和处理器正确执行进程所需要的所有信息,包括:

1. 处理器寄存器的内容,2. 进程的优先级

多线程技术

把执行一个应用程序的进程划分成可以同时运行的多个线程。
线程:
可分派的工作单元,他包括处理器上下文环境和栈中自己的数据区域。顺序执行,并且可中断。
进程:
一个或多个线程和 相关系统资源的集合。

多线程切换涉及的处理器开销比不同进程间切换开销少。

微软

81年基于MS-DOS开发的window 3.0, 雇佣戴夫.卡特勒89年基于VAX/VMS操作系统开发NT内核。

UNix

主要的内核组件的简要介绍:

  • 信号(Signal):内核通过信号通知进程。
  • 系统调用(System Call):进程通过系统调用来请求系统服务。一共有几百个系统调用,可以粗略的分为6类:文件系统,进程,调度,进程间通信,套接字和其他。
  • 进程和调度器:创建、管理、调度进程。
  • 虚拟内存
  • 文件系统
  • 网络协议
  • 字符设备驱动
  • 块设备驱动
  • 网络设备驱动
  • 陷阱和错误
  • 物理内存
  • 中断

Linux Vserver

chroot提供文件系统隔离。
chcontext分配一个新的安全上下文,提供进程隔离
chbind把产生的进程及其子进程锁定到一个特定的IP地址,提供网络隔离。
capability,提供根的隔离。

进程

进程可以唯一的表征为以下元素:

  • 标识符
  • 状态
  • 优先级
  • 程序计数器
  • 内存指针
  • 上下文数据
  • I/O状态信息
  • 记账信息
    一个处理器在任何时间最多只有一个进程在执行。

进程的五个状态:
- 新建,环境准备,但未进入内存
- 就绪
- 运行
- 阻塞/等待,I/O阻塞,等待资源或另一个进程信息
- 退出
- 针对虚拟内存的:挂起态

操作系统维护四种不同类型的表:

  • 内存 :跟踪内外存
  • I/O: I/O状态
  • 文件:文件状态,大部分状态可能由文件管理系统维护和使用
  • 进程:

Unix的进程状态

  • 用户态运行
  • 内核态运行
  • 就绪,驻留在内存
  • 睡眠,驻留在内存,等待某时间,一种阻塞态
  • 就绪,被交换
  • 睡眠,被交换
  • 被抢占 进程从内核态返回到用户态,但是被内核抢占
  • 创建
  • 僵死

Unix中有两个独特进程,进程0是系统启动时创建,预定义的数据结构,是交换进程,启动时进程0产生进程1,进程1称为初始进程。
Unix中创建进程是通过内核系统调用fork()实现的,fork请求时,系统执行以下功能:
1. 为新进程在进程表中分配一个空项。
2. 为紫禁城赋一个唯一的进程标识符
3. 声场一个父进程上下文的逻辑副本,不包括共享内存区
4. 增加父进程所有的文件的计数器
5. 把子进程置为就绪态
6. 向父进程返回子进程的进程号,对子进程返回零。

所有操作在父进程的内核态下完成。

线程

在之前提出的进程概念包含两个特点:

  • 资源所有权:一个进程包括一个存放进程映像的虚拟地址空间。
  • 调度/执行:一个进程沿着可以通过一个或多个程序的执行路径执行。一个进程具有一个执行状态和一个被分配的优先级。它是一个可被操作系统调度和分派的实体。
    为了区分这两个特点,分派的单位成为线程或轻量级进程,而拥有资源所有权的单位称为进程process或task。

多线程

指在单个进程内支持多个并发执行路径的能力。
进程是操作系统的最小调度单位,线程是CPU的最小调度单位。

线程的优点:

  • 线程创建比Unix中进程创建快10倍。
  • 终止线程比进程快
  • 线程切换比进程块
  • 县城提高了不同执行程序间通信的效率。进程间通信需要内核的介入,同进程中的线程共享内存和文件。

多线程的特性在多处理器机器上才能生效,单处理器中主要简化在逻辑上完成若干项不同功能的程序的结构。

线程的分类

线程可以分为两大类:
1. 用户级线程
2. 内核级县城

用户级线程

有关线程管理都有应用程序完成,内核意识不到。任何应用程序都可以使用线程库pthread设计多线程程序。该程序在执行时从但县城开始运行被分配给一内核管理的进程。该程序的线程状态受限于内核进程状态。由此其线程状态也将影响进程状态。
优点:
1. 该程序所有线程在用户地址空间中,无需内核态特权,不需切换状态。
2. 自定义调度算法
3. 跨系统,可移植
缺点:
1. 线程阻塞导致进程阻塞
2. 无法使用多核性能,内核一次只把一个进程分配给一个处理器

内核级线程

所有线程管理都有内核完成。
优点:
1. 同时调度线程到多核处理器
2. 进程中一个线程堵塞时,内核可以调度该进程中另外一个线程
缺点:
1. 把控制从一个线程传到同一个进程的另外一个线程时,需要内核的状态切换。

多核与多线程

多处理器系统中使用线程的例子:

  • 前台和后台工作:电子表格处理,一个线程显示并读取输入,一个线程执行命令更新表格。
  • 异步处理:
  • 执行速度:在一个线程I/O被阻塞时,另外一个线程可以继续运行。

Linux的进程和线程管理

Linux的进程或任务有一个task_struct数据结构表示。包含了以下信息:

  • 状态
  • 调度信息
  • 标识符
  • 进程间通信
  • 链接
  • 时间和计时器
  • 文件系统
  • 地址空间
  • 处理器专用上下文

进程的执行状态有:

  • 运行
  • 可中断,阻塞状态,此状态等待一个事件(如I/O操作的结束),一个可用资源或另一个进程的信号
  • 不可中断,阻塞状态,此状态等待一个硬件条件,不接受任何信号
  • 停止
  • 僵死

Linux中复制当前进程的属性创建一个新进程。使用clone命令代替fork命令创建进程。没有为线程单独定义数据结构,当两个进程共享相同的虚拟内存时,它们可以当作是一个进程中的线程。clone()调用为每个进程创建独立的栈空间,共享同一内存空间。
当Linux内核执行进程切换时,它将检查当前进程的页目录地址是否和将被调度的进程相同,如果相同,此时上下文切换仅仅是从代码的一处跳到代码的另外一处。

总结

某些操作系统区分进程和线程的概念,前者涉及资源的所有权,后者涉及程序执行。
用户级的线程对操作系统是未知的,它们在用户空间的线程库创建并管理,此时线程的切换不需要状态转换,非常高效,但一个进程一次只有一个用户级线程可以执行,如果某一个线程阻塞,整个进程都被阻塞。
内核级线程由内核维护,由此同一个进程中的线程可以在多个处理器上并发执行,不会被某一个线程阻塞而阻塞整个进程,但当线程切换时需要进行模式转换。

时间: 2024-10-10 10:57:59

操作系统笔记之进程与线程的相关文章

操作系统中的进程与线程

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

C++windows内核编程笔记day13 进程、线程与信号量

Windows进程 进程是一个容器,包含程序执行需要的代码.数据.资源等信息, windows进程的特点: 每个进程都有自己的ID号 每个进程都有自己的地址空间,进程之间无法访问对方的地址空间. 每个进程都有自己的安全属性 每个进程至少包含一个线程. 获取和释放环境信息 GetEnvironmentStrings FreeEnvironmentStrings 获取或设置 本程序的环境变量 GetEnvironmentVariable SetEnvironmentVariable 示例: char

操作系统学习之进程和线程

为什么会有进程 进程是一个计算机工程概念,进程包含一个程序运行的所有资源.进程提供程序的抽象 一个独立的逻辑流 一个私有的地址空间 逻辑控制流 如果使用调试器调试一个程序,就能看到一些列的(PC),这些PC的序列就是逻辑控制流. 并发流 一个逻辑流的执行在时间上与另一个流重叠,成为并发流,多个流并发地执行的一般现象称为并发.简单理解为同时做多件事. 并行: 一般出现在多个CPU上. 多任务: 一个进程和其他进程轮流运行的概念. 时间片: 一个进程执行他的控制流的每一时间片段. 私有地址空间 进程

python学习笔记(十) - 进程和线程

线程是最小的执行单元,而进程由至少一个线程组成.如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间. 一.多进程 1. multiprocessing模块时跨平台版本的多线程模块 process类代表一个进程对象,创建子进程时,只需要传入一个执行函数和函数的参数,使用start方法启动 join方法可以等待子进程结束后再继续往下运行,通常用于进程间同步. from multiprocessing import Process import os # 子进程要执行的

操作系统中的进程和线程

进程与进程的作用 当我们双击程序图标,开始运行程序时,就产生了一个进程.所以进程的本质是一个正在执行的程序.进程包含了程序运行的所需要的所有信息,如代码段,数据段,程序计数器(存放下一条指令所在的地址),进程标识符(PID)进程控制块(PCB,用来保存进程退出CPU时的现场信息)等等信息. 所以进程可以看做是容纳程序运行的所有信息的容器. 值得注意的是,一个程序如果运行了两遍,则算是两个进程.如运行了两个word程序,这两个进程除了代码段,其他信息都是不一样的,事实上,这两个进程共享代码段. 进

Python学习笔记 - day13 - 进程与线程

概述 我们都知道windows是支持多任务的操作系统. 什么叫"多任务"呢?简单地说,就是操作系统可以同时运行多个任务.打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行.还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已. 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务.由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案就是操作系统轮流让各个任务交替执行,任

操作系统:Linux进程与线程

这里是一部分内容,还会做修改. 一:目的及内容 学习fork(),exec,pthread库函数的使用,阅读源码,分析fork,exec,pthread_create函数的机理 代码实现: 进程A创建子进程B 子进程B与父进程A分别对应不同的可执行体:A打印Hello world,B实现sum累加 进程B具有三线程,主线程创建新的线程1实现sum累加(从1到参数x),线程2监控输入参数x 若输入x是非负整数,线程1开始计算:如果线程1正在计算前次程序,线程2的输入非负整数和最近一次的又不同,线程

(笔记)linux 进程和线程的区别

进程:进程是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集.从内核的观点看,进程的目的就是担当分配系统资源(CPU时间.内存等)的基本单位. 线程:线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构),线程与同属一个进程的其他的线程共享进程所拥有的全部资源. "进程——资源分配的最小单位,线程——程序执行的最小单位" 进程有独立的地址空间,

操作系统原理之进程和线程学习

进程 操作系统必须交替执行多个进程,在合理的响应时间范围内使处理器的利用率达到最大. 操作系统按照程序分配的优先级给进程分配资源,避免死锁. 操作系统支持进程间的通信和用户创建进程 定义:正在计算机上执行的程序实例,能分配给处理器并由处理器执行的实体(程序代码+代码相关数据集) 进程控制块:标识符(进程唯一标识符).状态.优先级.程序计数器(程序即将被执行的下一条指令地址).内存指针(程序和相关数据的指针.和其他进程共享内存块的指针).上下文数据(寄存器中的数据).I/O状态信息(显式的I/O请