背景

操作系统设计的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. 内核级县城

wKioL1j4XXDQ4pZdAAE1hrjvzQ8772.png-wh_50

用户级线程

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

内核级线程

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

多核与多线程

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

  • 前台和后台工作:电子表格处理,一个线程显示并读取输入,一个线程执行命令更新表格。

  • 异步处理:

  • 执行速度:在一个线程I/O被阻塞时,另外一个线程可以继续运行。

Linux的进程和线程管理

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

  • 状态

  • 调度信息

  • 标识符

  • 进程间通信

  • 链接

  • 时间和计时器

  • 文件系统

  • 地址空间

  • 处理器专用上下文

进程的执行状态有:

  • 运行

  • 可中断,阻塞状态,此状态等待一个事件(如I/O操作的结束),一个可用资源或另一个进程的信号

  • 不可中断,阻塞状态,此状态等待一个硬件条件,不接受任何信号

  • 停止

  • 僵死

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

总结

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