操作系统学习笔记(一) 进程与线程模型
进程可以说是操作系统最为核心的一个抽象,而线程可以认为是一种轻量级的进程,或者说一个进程内的多个迷你进程。
一、进程的模型
进程(process):进程是一个正在运行的程序的实例。对于一个单核的处理器,每个时刻只能运行一个程序,但在每一个时间段,它可能运行多个进程,这样就产生了并行的错觉。
从概念上说,每个进程拥有自己的虚拟CPU,好像它独占了CPU的使用权一样,虽然实际的CPU是不断切换的。进程的另外一大特性,是独立的虚拟地址空间。
进程的创建
有四种事件导致进程的创建:
(1)系统初始化。系统初始化会创建许多进程,如windows刚开机的时候。
(2)执行了正在运行的进程所调用的系统调用。如程序运行了一个fork()调用。
(3)用户请求创建一个进程。如命令行中输入./a.out。
(4)一个批处理作业的初始化。
进程的终止
进程是正在运行的程序的实例,一个程序是会运行完的,所以进程也有终止的时候:
(1)正常退出(自愿)。如程序正常结束。
(2)出错退出(自愿)。如编写一个程序,当错误时调用exit(num)。
(3)严重错误(非自愿)。
(4)被其他进程杀死(非自愿)。如另外一个进程调用了kill(pid)。
进程的层次结构
不同操作系统有不同的概念。Linux系统中区分父进程与子进程,windows系统则不区分。
进程的状态
进程有三种主要状态:
(1)运行态:正在CPU上运行的进程。
(2)就绪态:已经就绪但是还没有被调度程序选中。
(3)阻塞态:因为某种原因(如等待I/O完成)暂时无法执行,需要等待外部事件。
下面有一幅图画出了可能的转换关系。需要注意的是,阻塞态的进程必须先进入就绪态,等待处理器的调度。
进程的实现
进程的实现,相对于线程来说是比较确定的。操作系统内核维护一个进程表,也称为进程控制块(PCB)。进程表项为一个进程启动的必要信息,包括进程管理(寄存器,PC,PSW,调度信息,打开文件的状态等)、存储管理(代码段、数据段、堆栈段指针等)、文件管理(目录、PID等)信息。
当进程从运行态进入其他状态时,PCB保存着启动它的所有信息,当该进程再次被调度程序选中时,就要恢复这些信息。保存的步骤,包括:硬件压入PC等,把中断向量装入新的PC,然后通过汇编语言保存寄存器并设置新的堆栈,运行中断服务程序(通常为C),再通过调度程序选中一个进程,把它的运行信息载入寄存器以及PC等。
二、线程的模型
线程的使用,是因为进程创建、撤销、切换的代价很大,并且需要共享内存空间和数据,以及提高运行速度。一个例子是Web服务器,它如果采用进程的方式,那么一个页面请求被响应时,进程就进入了阻塞态,从而无法提供其他服务。而采用线程,可以使用一个线程接受请求,然后把请求分派给工作线程,实现同时响应,并且共享内存。
线程模型基于两个概念:资源分组处理与执行。线程的目的,是共享资源,并共同完成一个任务。
线程与进程非常类似,不过比进程轻量,原因在于:进程拥有独立的虚拟地址空间,而同一个进程中的线程,共享内存空间与资源。因此,线程只需要保存PC、寄存器、堆栈等,无需保存大量的文件、进程管理信息。线程之间也是没有保护并且平等的,因为它们共享了同样的资源,包括打开的文件、子进程等。
POSIX(portable operating system interface of UNIX)规定了UNIX系统的通用线程包pthread。
线程的实现
线程的实现,总的来说有两种:在用户空间中实现线程,以及在内核中实现线程。
用户空间中实现线程
这种情况下,内核是不知道线程存在的,调度单位是进程。因此,为了体现多线程的作用,就必须考虑阻塞的问题。
因为用户管理线程,所以每个进程都要有线程表,与进程表类似,不过记录的内容比较少。
用户级线程的优点有很多:
(1)可以在不支持线程的系统上运行。
(2)速度非常快,因为它不需要陷入内核,不需要上下文切换,也不需要cache刷新。
(3)可以允许每个进程定制自己的线程调度算法。
当然,因为内核不知道线程的存在,需要解决阻塞的问题,可以通过非阻塞系统调用,或者检查调用是否会阻塞(如select,包装器)。
另外,因为内核不知道线程的存在,进程内部没有时钟中断,所以线程必须主动让出CPU,不然其他线程无法抢占。
内核中实现线程
内核中实现线程,即在内核中维护一个线程表,而进程不维护。与用户空间中实现相比,优缺点基本是相反的。
内核中的实现,自然不需要非阻塞I/O,但是代价就是,线程的操作花销很大。
转载于:https://www.cnblogs.com/lustar/p/7648194.html
操作系统学习笔记(一) 进程与线程模型相关推荐
- 操作系统学习笔记-2.1.5线程概念和多线程模型
操作系统学习笔记-2019 王道考研 操作系统-2.1.5线程概念和多线程模型 文章目录 5线程概念和多线程模型 5.1知识概览 5.2 什么是线程?为什么要引入线程? 5.3引入线程及之后,有什么变 ...
- Python学习笔记:进程和线程(承)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- Python学习笔记:进程和线程(起)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- 哈工大操作系统学习笔记五——内核级线程实现
哈工大os学习笔记五(内核级线程实现) 文章目录 哈工大os学习笔记五(内核级线程实现) 一. 中断入口.中断出口(前后两段) 1. 从int中断进入内核(中断入口第一段) 2.中断出口(最后一段) ...
- Java学习笔记:进程与线程、BIO、NIO、Selector
文章目录 一.进程和线程 1.进程(Process) (1)概念 (2)从三个维度看进程模型
- 操作系统学习笔记_03_进程的概念与操作
1.进程的概念和状态 进程的概念常常和程序糅合在一起,但两者实际是不一样的.首先,"进程"所包含的内容比"程序"丰富."程序"这个概念可以用 ...
- 操作系统学习笔记7——进程管理中的数据结构:进程控制块
进程控制块(PCB)--最重要的记录型数据结构 PCB的作用 1.作为独立运行的基本单位的标志: 系统创建一个新进程时,就为它建立一个PCB,进程结束时回收PCB,进程也随之消亡,系统通过感应PCB来 ...
- 计算机操作系统学习笔记_6_进程管理 --死锁
一.死锁的概念 1.死锁的概念 系统中两个或两个以上的进程无限期地相互等待永远不会发生的条件,系统处于一种停滞状态,这种情况称为死锁. 2.死锁产生的原因 (1)进程推进顺序不当 (2)对互斥资源的分 ...
- Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS
Windows进程与线程学习笔记(八)-- 线程切换与TSS/FS 要点回顾 线程切换与TSS 内核堆栈 调用API进0环 实验:分析SwapContext 线程切换与FS 段描述符结构 分析Swap ...
- Windows进程与线程学习笔记(六)—— 线程切换
Windows进程与线程学习笔记(六)-- 线程切换 主动切换 分析KiSwapContext 分析SwapContext 分析KiSWapThread 总结 时钟中断切换 系统时钟 分析INT 0x ...
最新文章
- Ampere 携手 Rigetti 开发混合量子经典计算机
- Python3 多线程问题:ModuleNotFoundError: No module named 'thread',原因及解决办法。
- 笔记-项目质量管理-复习要点
- leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器
- 首次公开,阿里云开源PolarDB总体架构和企业级特性
- vue写js代码_vue.js弹出式音乐播放器特效代码
- 设置android 触摸灵敏,3D Press触屏灵敏度设置教程 魅族PRO 6 3D Press触控力度怎么调...
- TensorFlow:递归神经网络
- 项目缺少包如何和服务器,解决缺少服务器依赖包问题
- 分享小知识:善用Group By排序
- sudo apt-get 与 yum
- 漫游项目服务器,漫游Radius服务器的设计与实现
- matlab批量将csv转换成xls,如何批量将CSV格式的文件转化成excel格式 |
- Material Desion之Shape与shadow原理实现
- 初始C语言之简单认识C语言-1
- LTDC-DMA2D显示屏显示-编码标准(三)
- Oracle中如何计算时间差
- Yocto创建自己的分区(基于STM32MP1)
- Python爬虫百度云加速验证码问题
- 启动报错:HikariPool-1 - Exception during pool initialization.
热门文章
- MAC下载安装JDK
- 抗击疫情,宜复辟拱手礼
- MySQL的初次使用
- Adapter(适配)
- 线条边框简笔画图片大全_表情包丨表情包简笔画图片大全可爱
- mysql主从复制是拉模式吗,CentOS 7系统配置MySQL的主从复制模式 (Master-Slave Replication)...
- 协程asyncio_迭代器,生成器,协程
- hive xmlserde_各种数据格式的Hive建表语句
- idea 新建spring clound 项目_手把手教你spring源码搭建
- html编辑器全角 半角转换,javascript实现全角与半角字符的转换