操作系统进行总结

102 阅读11分钟

进程和线程 一个在程序中运行的程序。每个进程都有自己独立的一块空间,一个线程有多个进程。 线程 进程中的一个执行任务,负责当前进程中程序执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可以共享数据。 与进程不同的是同类的多个线程共享进程的堆和方法区 ,但每个线程有着自己的程序计数器,虚拟机和本地方法栈,所以系统在产生一个线程,或者是在各个线程中切换工作时,负担要比进程小的多,也正因为如此,线程也被称为轻量级进程,一个Jva程序运行是main线程和多个其他线程同时运行。 区别总结 根本区别:进程是操作系统资源分配的基本单位,线程是处理器任务调度和执行的基本单位。 资源开销:每个进程都有独立的代码和数据空间,程序间切换会有较大的开销;线程可以看作是轻量化进程,同一类线程 共享代码和数据空间,每个线程都有自己独立本地方法栈和程序计数器,线程之间切换开销小 包含关系:如果一个进程内有多个线程,则执行过程不是一条线,而是多条线共同完成的;线程是进程一部分,所以线程也被称为轻权进程或轻量级进程。 内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间地址空间和资源是相对独立的 影响关系:一个进程崩溃后 ,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。 执行过程:每个独立的进程有程序运行的入口,顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序提供多个线程执行控制,两者可并发执行。 从JVM角度说进程和线程之间关系 多个线程共享进程的方法区和堆(JDK1.8的元空间)但每个线程都有自己的程序计数器,虚拟机和本地方法栈。 程序计数器为什么私有 有两个作用: 1.程序计数器用于记录当前执行位置,从而当线程切换回来时候能够知道该线程上次运行到哪了。 2.字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制如顺序执行,选择,循环,异常处理。 如果执行native方法,那么程序计数器记录的是ubdefined地址,只有执行Java代码时程序计数器才是下一条地址。 程序计数器私有主要是为了线程切换恢复到正确的执行位置。 虚拟机和本地方法栈为什么是私有的 虚拟栈:每个方法在执行同时会 创建一个栈用于存储局部变量,操作数栈,常量池引用等信息,从方法调用直到执行完成的过程,就对应一个栈帧在java虚拟机中入栈和出栈的过程。 本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是虚拟机为虚拟机执行java方法(也就是字节码服务)而本地方法栈则为虚拟机使用到Native方法服务。在hotspot虚拟机中和java虚拟机栈合二为一。 为保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。 堆和方法区 是所有线程共享的资源,其中堆是进程中最大一块内存,主要用于存放新创建的对象(所有对象都在这里分配内存)方法区主要用于存放被加载的类信息,常量,静态变量即时编译器编译后的的代码数据。 多进程和多线程区别 多进程:操作系统中同时运行多个程序。 多线程:在同一进程中同时运行多个任务。 多线程运行时每次结果不一致,多线程存在随机性。cpu在瞬间不断切换去处理多个线程导致多个线程在抢一个CPU资源。 多线程不提高运行速度,可以提高运行效率,让CPU使用率高。如果多线程有安全问题,频繁上下文切换时,运行速度反而更低。 Java程序 有几个线程:主线程,垃圾回收线程。 进程和线程状态 进程五种状态:创建态,就绪态,运行态,阻塞态,终止态。 创建态:完成创建进程的一系列工作进入就绪态 就绪态:除CPU外以外的其他条件都已经具备,等待进程被调度则可以进入运行态,若时间已经到或处理机被抢占进程将返回就绪态。 运行态的进程用“系统调用的方式申请系统某个资源或等待某个事件发生时”,进程进入阻塞态。该过程是主动行为。 阻塞态中的进程若其申请的资源得到分配,或等待事件已发送,可重新进入就绪态。 运行态中的进程若运行结束或运行中遇到不可修复的错误则进入终止态。 线程可有6种状态:新创建,可运行,被阻塞,等待,计时等待,被终止。 进程线程同步 为了解决进程间松散协作关系,而引入进程同步; 为了解决进程间竞争关系而引入进程互斥; 为了解决进程间紧密的协作关系而引入进程通信 资源竞争出现两个控制问题 一个是死锁:一组进程如果都获得了部分资源,还想得到其他进程所占的资源,进程陷入死锁 一个是饥饿:一个进程由于其他进程总是优先于他而被无限期 拖延。 进程互斥是解决进程间竞争关系的手段。进程互斥若干进程使用同一共享资源时,最多允许一个进程去使用,其他资源进程必须等待,直到占有资源进程放弃掉该资源。 协作关系 某些进程为完成同一工作要分工合作,由于合作每一个进程都独立的以不可预知的速度推进,这需要相互协作的进程在某一个点上协调各自工作。当合作进程的一个到达协调点上后,在尚未得到其伙伴进程发来协调信号或消息后,被唤醒并执行。这种协作进程间相互等待对方消息或信号协调关系称为进程同步。 进程同步是解决进程间协作关系的手段。 进程同步指两个以上的进程基于某个条件来协调他们的活动。一个进程的执行依赖于另一个协作进程的消息或信号。当一个进程没有得到来自于另一个协作进程的消息或信号时需要等待,直到消息或信号到达。 进程间互斥关系是一种特殊的进程同步关系实质上解决好进程同步问题,进程同步是一种进程通信。 进程间通信方式 1.mmap(文件映射) 2.信号 3.管道 4.共享内存 5.消息队列 6.信号量集 7.网络 进程同步方法 linux下 1.信号量 2。管程 3.互斥量 4.文件锁 线程同步 1.信号量 2.互斥量 3.临界区 4.事件 四种进程同步互斥的方法 1.临界区:通过对多线程串行化来访问公共资源或一段代码,速度快,适合控制数据访问。 2.互斥量:协调共同对同一个资源的单独访问而设计的 3.信号量:为控制一个具有有限数量用户资源而设计。 4.事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界资源 是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有打印机,磁带机;软件有消息队列,变量数组,缓冲区等。诸进程采用互斥方式,实现对资源共享。 临界区 每个进程中访问临界资源的代码为临界区,每次只允许一个进程进入临界区,进入后,不允许其他进程进入。不论硬件资源还是软件资源,多个进程必须互斥对它进行访问。多个进程涉及同一个临界资源的临界区称为相关临界区。使用临界区时,一般不允许运行时间过长只要在临界区线程还没离开,其他进入临界区线程都被挂起等待状态,一定程度影响程序运行性能。 临界区只能在同一进程实现线程互斥。无需在用户态和核心态之间切换,所以工作效率很高。虽然临界区同步速度很快,但只能同步本线程进程,而不可用来同步多个线程的进程。 互斥量 互斥量跟临界区相似,只拥有互斥对象的线程才具有访问资源权限,由于互斥对象只有一个,因此决定了任何情况下共享资源都不会同时被多个线程访问,当前占据资源的线程在任务处理完后将拥有的对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区更复杂,因为使用互斥不仅仅在同一应用程序不同线程中实现安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。 信号量 信号量允许多个线程同时使用共享资源,这操作和系统中pv操作相同。它允许多个线程在同一时刻访问同一资源,但限制在同一时刻访问此资源的最大线程数。 事件 事件对象可以通过通知的方式保持线程同步。并且可以实现不同进程中的线程同步操作。 总结 1.互斥量与临界区作用非常相似,但互斥量可以命名,可以跨越进程使用。所以创建互斥量资源更多,如果只在进程内部使用会带来速度上优势并减少资源占用量。 2.互斥量,信号量,事件都可以被跨越进程使用采用同步操作,他对象数据同步无关,但对进程和线程来讲,如果线程和进程在运行状态无信号状态,推出后为有信号状态。 3.通过互斥量可以指定资源被独占方式使用,但有时无法使用。 临界区缺点:没法知道进入临界区线程是生是死,如果线程进入临界区后消除了,那么系统无法消除此临界区。 通信机制 管道,FIFO,消息队列,信号量,共享内存是进程的通信机制,信号量可以用在进程,线程同步也可以用在进程通信。 管道和管程,管程是进程的同步方式,管道是进程的通信方式。 linux下 进程间通信方式包括管道,FIFO,消息队列,信号量,内存共享。 1.管道,还有命名管道和非命名管道,非命名管道只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式。 2.消息队列,是用于两个进程之间通讯在一个进程创建一个消息队列,然后另一个进程从消息队列中取数据,消息队列是创建文件方式创建的,如果一个进程向某个消息队列写入数据后,另一个没有取出数据,即消息队列中的数据没有消失,也就是说下次从消息队列读取上次的数据。 3信号量 和windows一样。 4共享内存 创建一个共享内存区,其他进程按一定步骤访问到这个共享内存区的数据。 比较 1.管道:速度慢,容量有限,父子进程通讯 2.FIFO:任何进程都通讯,速度慢 3消息队列容量受到限制,第一次读时考虑上次没读完的问题 4.信号量:不能传递复杂消息只能同步 5.共享内存区:控制容量,速度快,但保持同步,一个进程在写时,另一个注意读写问题。