计算机操作系统常用知识
进程和线程的具体含义,作用和区别
进程
- 进程是具有一定功能的程序关于某个数据集合上的一次运行活动
- 进程是系统进行资源调度和分配的一个独立单位。
- 进程是正在运行的程序
线程
- 线程是进程的实体
- 线程是CPU调度和分派的基本单位。
- 线程是比进程更小的,能独立运行的基本单位。
区别
一个进程可以有多个线程(至少一个),多个线程也可以并发执行。
进程作为资源(如内存)分配的基本单位,其线程都是可以享用被分配的资源的,但是线程可以共享一块内存的资源,而进程则不能分享彼此间的资源的,进程只能通过进程间的通信机制来完成进程间通信。
进程间的通信机制有以下几种
- 管道(pipe 半双工),流管道(s_pipe,全双工),命名管道(name_pipe,半双工)
- 管道是一种半双工的通信方式,数据只能单项流动,并且只能在具有亲缘关系的进程间流动,进程的亲缘关系通常是父子进程。
- 命名管道: 半双工通信方式,它允许无亲缘关系的进程间进行通信
- 信号量 : 是一个计数器,用来控制多个进程对资源的访问,它通常作为一种锁机制。
- 信号:是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存: 共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。
- 共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。
- 套接字(socket):套接字是一种进程间的通信机制,与其他通信机制不同的是,它可以用于不同及其间的进程通信。
程序
- 程序是一个静态概念,它是指在计算机的文件系统里以文件形式存储的一段可运行代码。
程序和进程的区别
- 进程是个动态的概念,它通常是指操作系统里一个程序在一个数据集合上一次运行过程的体现。即进程是程序的运行逻辑实际运作起来的载体。
进程同步
- 进程同步机制的主要任务是对多个相关进程在执行次序上进行协调,是并发执行的进程之间能按照一定规则共享系统资源,并能很好地相互合作,从而是程序的执行具有可再现性。
- 并发的线程在一些关键点上可能需要相互等待与互通信息,这种相互制约的等待与互通信息称为线程同步
临界资源
- 指
一次仅仅允许一个线程使用的资源
,许多物理设备,如打印机都有这种性质。除了物理设备外,还有一些软件资源,若被多线程所共享也具有这一特点,如变量、数据、表格、队列等。它们虽可以为若干线程所共享,但一次只能为一个线程所利用。
临界区
- 临界区指的是一段访问共享资源(被多个线程共享的临界资源)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待。
同步机制遵循的规则
- 空闲让进
- 当没有进程进入临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效利用临界资源。
- 忙则等待
- 当已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
- 有限等待
- 对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入死等状态
- 让权等待
- 当进程不能进入自己的临界区时,应立即释放处理机,以免线程陷入忙等状态。
线程同步的方式
互斥量 Mutex
:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。信号量 Semaphore
:它允许同一时刻多个线程
访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。事件(信号)Event
:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作。
什么是缓冲区溢出?有什么危害?其原因是什么?
- 缓冲区溢出是指当计算机向缓冲区填充数据时超出了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
危害:
- 程序崩溃,导致拒绝服务
- 跳转并且执行一段恶意代码
- 造成溢出的原因:程序中没有仔细检查用户输入。
什么是死锁?死锁产生的条件?
- 在两个或多个并发进程中,如果每个进程
持有某种资源
而又等待其他进程释放它或它们现在保持的资源
,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。 - 通俗讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。
- 死锁产生的四个条件(
有一个条件不成立,则不会产生死锁
)互斥条件
:一个资源一次只能被一个进程使用请求与保持条件
:一个进程因请求资源而阻塞时,对已经获取资源保持不放。不剥夺条件
:进程获得的资源,在未完全使用完之前,不能强行剥夺。循环等待条件
:若干进程之间形成一种头尾相接的环形等待
资源关系
进程的状态
- 就绪:进程已经获得除处理机以外的所需资源,等待分配处理机资源
- 运行:占用处理机资源运行,处于此状态的进程数小于等于CPU数
- 阻塞状态:进程等待某种条件,在满足条件之前无法执行
分页和分段区别
段
是信息的逻辑单位
,它是根据用户的需要划分
的,因此段对用户是可见的
;页是信息的物理单位
,是为了管理主存
的方便而划分的,对用户是透明
的;- 段的
大小不固定
,有它所完成的功能决定
;页的大小固定
,由系统决定
。 - 段向用户提供
二维地址
空间;页向用户提供是一维地址
空间 - 段是信息的逻辑单位,
便于存储保护和信息共享
,页的保护和共享收到限制。
进程同步机制
- 原子操作
- 信号量机制
- 自旋锁管程
- 会合
- 分布式系统
进程调度策略
- FCFS
- 优先级
- 时间片轮转
- 多级反馈
常见调度算法
先来先服务调度算法(FCFS):就是按照各个作业进入系统的自然次序来调度作业。这种调度算法的优点是实现简单,公平。其缺点是没有考虑到系统中各种资源的综合使用情况,往往使
短作业的用户不满意
,因为短作业等待处理的时间可能比实际运行时间长得多。不利于短作业;短作业优先调度算法 (SPF): 就是
优先调度并处理短作业,所谓短是指作业的运行时间短
。而在作业未投入运行时,并不能知道它实际的运行时间的长短,因此需要用户在提交作业时同时提交作业运行时间的估计值。最高响应比优先算法(HRN):
FCFS可能造成短作业用户不满,SPF可能使得长作业用户不满,于是提出HRN,选择响应比最高的作业运行
。响应比=1+作业等待时间/作业处理时间。基于优先数调度算法(HPF):每一个作业规定一个表示该作业优先级别的整数,当需要将新的作业由输入井调入内存处理时,
优先选择优先数最高的作业
。
自底向上的分析技术 有:
( 1 )简单优先分析法
( 2 )算符优先分析法
( 3 )优先函数
( 4 ) LR 分析法
曼彻斯特编码的编码规则:
在信号位中电平从低到高跳变表示1
在信号位中电平从高到低跳变表示0
差分曼彻斯特编码的编码规则是:
在信号位开始时改变信号极性,表示辑”1”
在信号位开始时不改变信号极性,表示逻辑”0”
中间件
中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
时间重叠
- 让多个处理过程在时间上错开,轮流重叠的使用同一套硬件设备的各个部分,加快硬件使用的周转来赢得速度。——流水线处理机
资源重叠
- 通过重复设置硬件资源来提高性能或可靠性。——并行处理机、相联处理机
资源共享
- 用软件的方法让多个用户公用同一套资源,通过提高系统资源的利用率来提高系统的效率和性能。——多处理机**
阵列处理机
- 单指令流多数据流; 采用资源重复技术。
采用流水结构的单机系统
- 单指令流多数据流; 采用时间重复技术。
时间并行性概念的实现方式就是采用流水处理部件。这是一种非常经济而实用的 并行技术 ,能保证计算机系统具有较高的性能价格比。目前的高性能微型机几乎无一例外地使用了流水技术。
悲观锁和乐观锁
悲观锁
- 总是假设最坏的情况,
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿数据就会阻塞直到它拿到锁
。传统关系型数据库就用到了很多这种锁机制:行锁,表锁等,读锁,写锁等,都在做操作之前先上锁。再比如Java里的synchronized关键字的实现也是悲观锁。
乐观锁
- 想象着情况很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是
在更新的时候会判断一下在此期间别人有没有去更新这个数据
,可以使用版本号等机制。 - 乐观锁适用于多读的应用类型,这样可以提高吞吐量,想数据库提供的类似于write_condition机制,其实都是提供的乐观锁。
两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适