操作系统之进程管理

进程与线程
进程
进程是资源分配的基本单位。
进程控制块是操作系统核心中一种数据结构,主要表示进程状态,包括进程状态、程序计数器、CPU寄存器、CPU排版法、存储器管理、会计信息、输入输出状态。创建进程的时候会创建pcb、销毁进程的时候会销毁pcb。
虚拟地址空间
进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加粗样式加速页表的查找,这个Cache就是tlb。
由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也需要切换,页表切换后tlb就失效了,Cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢。线程共享进程资源,切换不会。
进程状态
进程在执行时,状态会改变。所谓状态,就是指进程目前的动作:
新生(new):进程新产生中。
执行(runing):正在执行。
等待(waiting):等待某事发生,例如等待用户输入完成。亦称“阻塞”(blocked)
就绪(ready):排班中,等待CPU。
结束(terminated):完成执行。
线程
线程是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程是独立调度和分派的基本单位。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但是同一进程中的多个线程有各自的调用栈,自己的寄存环境,自己的线程本地存储。
线程状态
产生(spawn)
阻塞(block)
非阻塞(unblock)
结束(finish)
线程的分类
从线程的运行空间来说,分为用户线程(user-level thread,ULT)和内核级线程(kernel-level,KLT)
**内核级线程:**这类线程依赖于内核,又称为内核支持的线程或轻量级进程。无论是在用户程序中的线程还是系统进程中的线程,它们的创建、撤销和切换都由内核实现。 比如英特尔i5-8250U是4核8线程,这里的线程就是内核级线程。
**用户级线程:**它仅存在于用户级中,这些线程是不依赖于操作系统核心的。应用进程利用线程库来完成其创建和管理,速度比较快,操作系统内核无法感知用户级线程的存在。

区别
拥有资源
进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。
调度
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。
系统开销
由于创建和撤销进程时,系统都需要为之分配和回收资源,如内存空间、I/O设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行CPU环境的保存及新调度进程CPU环境的设置,而线程的切换时只需保存和设置少量寄存器内容,开销很小。
通信方面
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助IPC(Inter-Process Communication,进程间传送数据或信号的一些技术或方法,如本地可以使用文件、共享内存等,远程可以通过http等。
进程状态的切换
只有就绪状态和运行状态可以互相转换,其他的都是单向转换。就绪状态的进程通过调度算法从而获得CPU时间,转为运行状态;而运行状态的进程,在分配给它的CPU时间片用完之后就会转为就绪状态,等待下一次调度。
阻塞状态是缺少需要的资源从而由运行状态转换而来,但该资源不包括CPU时间,缺少CPU时间会从运行态转为就绪态。

进程调度算法
先来先服务、短作业优先、最短剩余时间优先、时间片轮转、优先调度、多级反馈队列
进程同步
临界区
当多个线程访问一个独占性资源时,可以使用临界区对象。拥有临界区的线程可以访问被保护起来的资源或代码段,其他线程若想访问,则被挂起,直到临界区的线程放弃临界区为止。
优点:保证在某一时刻只有一个线程能访问数据的简便办法。
缺点:只能用来同步进程内的线程,而不可用来同步多个进程中的线程。(线程共享进程内的资源,所以需要实现进程间的互斥需要一个进程间共享的资源)

互斥量
为协调共同对一个共享资源的单独访问而设计的。互斥量跟临界区很类似,比临界区复杂,互斥对象只有一个(进程间共享的),只有拥有互斥对象的线程才具有访问资源的权限。
优点:使用互斥不仅仅能够在同一应用不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现资源的共享。
缺点:互斥量是可以命名的,也就是说它可以跨进程使用,所以创建互斥量需要的资源更多,所以如果只是为了进程内部使用的话使用临界区会带来速度上的优势并能够减少资源占用。

信号量
信号量(semaphore),是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaaphore对象的等待(wait)时,该值减一;当线程完成一次对semaphore对象的释放(release)时,计数值加一。当计数值为0,则线程等待该semaphore对象不再能成功直至该semaphore对象变成signaled状态。semaphore对象的计数值大于0,为signaled状态;计数值等于0,为nonsignaled状态。
使用:
为控制一个具有有限数量用户资源而设计。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。互斥量是信号量的一种特殊情况,当信号量的最大资源数=1就是互斥量了。
优点:适用于对Socket(套接字)程序中线程的同步。
缺点:信号量机制必须有公共内存,不能用于分布式操作系统,这是它最大的弱点。
PV操作
计数信号量具备两种操作动作,常称为V(signal())与P(wait())。V操作会增加信号标S的数值,P操作会减少它。
运作方式:

初始化,给一个非负数的整数值。
执行P(wait()),信号标S的值将被减少。企图进入临界区段的进程,需要先执行P(wait())。当信号标S减为负值时,进程会被挡住,不能继续;当信号标S不为负值时,进程可以获准进入临界区段。
执行V(signal()),信号标S的值会被增加。结束离开临界区段的进程,将会执行V(signal())。当信号标S不为负值时,先前被遮挡的其他进程,将可获准进入临界区段。

事件
用来通知线程有一些事情已发生,从而启动后继任务的开始。

优点:事件对象通过通知操作的方式来保持线程的同步,并且可以实现不同进程中的线程同步操作。

进程通信
管道
消息队列
信号量:它是一个计数器,用于为多个进程提供对象数据对象的访问。
共享存储:允许多个进程共享一个给定的存储区。因为数据不需要在进程之间复制,所以这是最快的一种IPC。

需要使用信号量来同步共享存储的访问。

多个进程可以将同一个文件映射到它们的地址空间从而实现共享内存。另外XSI共享内存不是使用文件,而是内存的匿名段。
套接字:与其它通信机制不同的是,它可用于不同机器间的进程通信。
信号:信号是一种比较复杂的通信方式,信号可以在任何时候发给某一个进程,而无需知道该进程的状态。用于程序终止、推出、定时等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值