操作系统4个特征
并发性:同一段时间内多个程序执行(注意区别并行和并发,并行:同一时刻的多个事件,并发:同一时间段内的多个事件)
共享性:系统中的资源可以被内存中多个并发执行的进线程共同使用
虚拟性:通过时分复用(如分时系统)以及空分复用(如虚拟内存)技术实现把一个物理实体虚拟为多个
不确定性:系统中的进程是以走走停停的方式执行的,且以一种不可预知的速度推进
进程
定义:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同数据集合上运行,乃至一个程序在同样数据集合上的多次运行都是不同的进程。
进程的三个基本状态
(1)执行状态:进程正在处理器上运行,在单处理器环境下,每一时刻最多只有一个进程处于运行状态。
(2)就绪状态:进程已处于准备运行的状态,即进程获得了除处理器之外的一切所需资源,一旦得到处理器即可运行。
(3)阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行,如等待某资源可用(不包括处理器)或等待输入/输出完成。即使处理器空闲,该进程也不能运行。
三种状态可以相互转换:
就绪->执行:当一个就绪进程获得处理器。
执行->就绪:当一个运行进程被剥夺处理器时,如用完系统分给它的时间片、出现更高优先级别的其他进程。
执行->阻塞:当一个运行进程因某事件受阻时,如所申请资源被占用、启动I/O输出未完成
阻塞->就绪:当所等待事件发生时,如得到申请资源、I/O传输完成
附:进程还有以下两种状态
(4)创建状态:进程正在被创建,尚未转到就绪状态
(5)结束状态:进程正从系统消失,可能是进程正常结束或其他原因中断退出运行
进程间通信(IPC,Inter-Process communication)
由于多个进程可以并发执行,所以进程间必然存在资源共享和相互合作的问题,进程通信是指各个进程交换信息的过程
同步:合作进程间的直接制约问题
互斥:申请临界资源进程间的间接制约问题(临界资源:在同一时间只能供一个进程使用的资源)
附:在每个进程中,访问临界资源的那段代码称为临界区(Critical Section)
进程间通信的几种主要方式
Linux:管道、共享内存、消息队列、信号量、socket、信号
Windows进程间通信:管道、共享内存、消息队列、信号量、socket
1)管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2)命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。3)共享内存SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
4)消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
5)信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
6)套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
7)信号 signal : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
线程
进程和线程的差别
进程是程序的一次执行;线程可以理解为进程中执行的一段程序片段。
进程是系统进行资源调度和分配的基本单位;线程是CPU调度的基本单位。
进程 = 资源 (包括寄存器值,PCB,内存映射表)+ TCB(栈结构);线程 = TCB(栈结构)
进程间的资源是分隔独立的,内存映射表不同,占用物理内存地址是分隔的;线程间的资源是共享的
线程是属于进程的,当进程退出时该进程所产生的线程都会被强制退出并清除;线程可以创建线程
进程的切换不仅要切换PC,还包括切换资源,即内存映射表;线程的切换,只是切换了PC,TCB(栈结构)
进程和线程的优缺点
进程执行开销大,但有利于资源的管理和保护;线程执行开销小,但不利于资源的管理和保护
进程可以跨机器迁移;线程适合于在SMP机器上运行
[SMP:对称多处理(Symmetrical Multi-Processing)简称SMP,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构]
线程间通信
Linux线程间通信:互斥体(互斥量)、信号量、条件变量
Windows线程间通信:临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(event)
临界区(Critical Section)和互斥体(Mutex)的区别
(1)临界区只能用来同步本进程内的线程,而不能用来同步多个进程中的线程;互斥量(Mutex)、信号量(Semaphore)、事件(event)都可以被跨越进程使用来进行同步数据操作。
(2)临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
(3)临界区和互斥体在Windows平台都可用,linux下只有互斥体可用。
死锁
两个以上的进程互相要求对方已经占有的资源导致无法继续运行下去的现象
死锁产生的原因
(1)系统资源不足
(2)进程推进顺序非法
(3)资源分配不当
死锁产生的必要条件
产生死锁必须满足以下四个条件,如果任一条件不成立,死锁就不会发生
(1)互斥条件:一个资源每次只能被一个进程使用
(2)不剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺
(3)请求和保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系
死锁处理策略
(1)预防死锁:破环产生死锁的四个必要条件中的一个或几个
(2)避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态。 银行家算法是著名的死锁避免算法。
(3)死锁的检测及解除:无须采取任何限制性措施,允许进程在运行过程中发生死锁,通过系统的检测机制及时地检测出死锁的发生,然后采取某种措施解除死锁。
死锁的检测可利用资源分配图来描述,死锁的解除主要方法有:资源剥夺法、撤销进程法、进程回退法。
内存管理
操作系统对内存的划分和动态分配
内存管理的功能
1)内存空间的分配与回收,包括内存的管理和共享
2)地址转换,把逻辑地址转换成相应的物理地址
3)内存空间的扩充,利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存
4)存储保护,保证各道作业在各自的存储空间内运行,互不干扰
逻辑地址空间与物理地址空间
逻辑地址:编译后,每个目标模块都是从0号单元开始编址,称为该目标模块的相对地址(逻辑地址)。
物理地址:内存中物理单元的集合,是地址转换的最终地址,进程在运行时执行指令和访问数据最后都要通过物理地址来存取内存。
Windows内存管理的方式
页式管理
基本原理:将各进程的虚拟空间划分为若干个长度相等的页(page);页式管理把内存空间按页的大小划分为片或页面,然后把页式虚拟地址与内存地址建立一一对应的页表;并用相应的硬件地址变换机构来解决离散地址变换问题。页式管理采用请求调页或预调页技术来实现内外存存储器的统一管理。
优点:没有外碎片,每个内碎片不超过页的大小。
缺点:程序全部装入内存,要求有相应的硬件支持。例如地址变换机构缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持,这增加了机器成本,增加了系统开销。
段式管理
基本原理:把程序按内容或过程函数关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址影射机构把段式虚拟地址转换为实际内存物理地址。
优点:可以分别编写和编译,可以针对不同类型的段采取不同的保护,可以按段为单位来进行共享,包括通过动态链接进行代码共享。
缺点:会产生碎片
段页式管理
基本原理:为实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放、缺段处理等。另外由于一个段又被划分成了若干页。每个段又必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然与页式管理时相同,页表中也要有相应的实现缺页中断处理和页面保护等功能的表项。
优点:段页式管理是段式管理与页式管理方案结合而成的,所以具有它们两者的优点。
缺点:由于管理软件的增加,复杂性和开销随之增加;由于需要的硬件以及占用内存的增加,使得执行速度下降
虚拟内存管理
虚拟存储器的定义和特征
虚拟内存的实现:请求分页存储管理、请求分段存储管理、请求段页式存储管理
需要的硬件支持:一定容量的内存和外存;页表机制,作为主要的数据结构;中断机构,当用户程序要访问的部分尚未调入内存,则产生中断;地址变换机构,逻辑地址到物理地址的变换。
段页式虚拟存储管理方案的特点:空间浪费小、存储共享容易、存储保护容易、能动态链接。
请求分页管理方式(置换算法)
请求分页系统中,只要求将当前需要的一部分页面装入内存,便可以启动作业运行。在作业执行过程中,当所要访问的页面不在内存时,再通过调页功能将其调入,同时还可以通过置换功能将暂时不用的页面换出到外存上,以便腾出内存空间。请求分页是目前最常用的一种实现虚拟存储器的方法。
置换算法:最佳置换算法(OPT)、先进先出页面置换算法(FIFO)、最近最久未使用(LRU)置换算法
(1)最佳置换算法(OPT):所选择的淘汰页面将是以后永不使用的,或在最长时间内不再被访问的页面。
是一种理论上的置换算法,该算法无法实现。
例:3个物理块,考虑页面引用串:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
(2)先进先出页面置换算法(FIFO):优先淘汰最早进入内存的页面
(3)最近最久未使用(LRU)置换算法:选择最近最长时间未访问过的页面予以淘汰
附:
抖动:非常频繁的换页活动
工作集:在某段时间间隔内,进程要访问的页面集合。为了防止抖动,要选择合理的工作集大小
Linux常用命令
目录和文件操作
cd(变换工作目录)
change directory的缩写,变换工作目录的指令
cd [目的目录]
//例子: cd /home
pwd(显示目前所在目录)
print working directory的缩写,显示目前所在目录的指令
pwd
mkdir(建立新目录)
mkdir /test1
//创建多层目录时,使用-p可以不用一层层建立目录
mkdir -p /home/testing/test1
rmdir(删除目录)
//删除空目录/test1
rmdir test1
//删除非空目录/test1
rmdir -r test1
ls(查看文件和目录)
ls
//查看全部
ls -l
cp(复制文件或目录)
//文件:将当前目录下的aaa文件复制到/tmp下,并更名为bbb
cp ./aaa /tmp/bbb
//目录:需要加上-r,将/etc目录下所有内容复制到/tmp下
cp /etc/ /tmp
rm(删除文件或目录)
//删除文件
rm 文件名
//删除目录
rm -r 目录名mv
mv(移动或更名文件/目录)
//更改目录的名称,由/home/test 变为/home/test2
mv /home/test /home/test2
查看文本文件内容
cat(第一行开始查看)
concatenate(连续)的简写,将一个文件的内容连续输出在屏幕上
//查看本目录下的aaa文件
cat ./aaa
tac(最后一行开始显示)
cat 和tac是倒置的,相反的
//将aaa文件从最后一行到第一行反向在屏幕上显示出来
tac ./aaa
nl(显示文件行号)
//显示文件内容的同时,显示文件行号
nl ./aaa
more(一页一页显示文件内容)
向后翻页
more ./aaa
less(一页一页显示文件内容)
可以向前翻页
less ./aaa
head(只显示前几行)
//显示文本文件的前number行
head -n number 文件名
注:若number为负数,则代表列出前面的所有行数,但不包括后面的number行,如
head -n -100 /etc/man.config //总共141行,则会显示41行,后面100行不显示
tail(显示后面几行)
//显示文本文件的后number行
tail -n number 文件名注
注:若number为正数,则代表列出后面的所有行数,但不包括前面的number行,如
tail -n +100 /etc/man.config //总共141行,则只会显示后面的41行,前面的0-99行不显示
touch(新建空文件)
//新建一个名为aaa的文件
touch aaa
grep(分析一行信息)
grep分析一行信息,若当中有我们所需要的信息,就将该行显示出来。
//例:将文件aaa中包含“root”的行的内容显示出来
cat aaa | grep "root"
或者
grep "root" aaa
注:当使用“grep -E”表示后面跟着的内容是延伸型正则表达式,等价于“egrep”
查看系统信息
df(检查硬盘空间使用情况)
列出文件系统的整体磁盘使用量,可以检查硬盘空间使用情况
ps(显示某时间点程序运行情况)
将某个时间点的程序运行情况显示出来
top(动态观察程序的变化)
top可以持续侦测程序运作的状态,查看内存使用率
参考:
操作系统基础知识总结(重要) - xdyixia - 博客园 (cnblogs.com)
进程间通讯的7种方式_zhaohong_bo的专栏-CSDN博客_进程间通信
操作系统基础知识整理 - mukekeheart - 博客园 (cnblogs.com)
《王道程序员面试宝典》
《程序员面试宝典》