操作系统

1.程序、进程与线程
       程序是一组有序指令的集合,进程是程序的一次执行,是一个程序及其数据在处理机上顺序执行时所发生的活动。
       进程是对运行时程序的封装,是系统进行调度和资源分配的的基本单位,实现了操作系统的并发。(进程就是运行着的程序)
       线程是进程的子任务,是系统调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发。
       线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器:独自的寄存器组,指令计数器和处理器状态。每个线程完成不同的任务,但是共享同一地址空间(也就是同样的动态内存,映射文件,目标代码等等),打开的文件队列和其他内核资源。
       区别:
       ①一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程依赖于进程而存在。
       ②进程在执行过程中拥有独立的内存单元,而多个线程共享进程的内存。(资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。)
       ③进程是资源分配的最小单位,线程是系统调度的最小单位;
       ④系统开销: 由于在创建或撤消进程时,系统都要为之分配或回收资源,如内存空间、I/o设备等。因此,操作系统所付出的开销将显著地大于在创建或撤消线程时的开销。类似地,在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置。而线程切换只须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。可见,进程切换的开销也远大于线程切换的开销。
       ⑤通信:由于同一进程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现,也变得比较容易。进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。在有的系统中,线程的切换、同步和通信都无须操作系统内核的干预
       ⑥进程编程调试简单可靠性高,但是创建销毁开销大;线程正相反,开销小,切换速度快,但是编程调试相对复杂。
       ⑦进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉
       ⑧进程适应于多核、多机分布;线程适用于多核
在这里插入图片描述

2.进程与线程的选择
       1)需要频繁创建销毁的优先用线程
这种原则最常见的应用就是Web服务器了,来一个连接建立一个线程,断了就销毁线程,要是用进程,创建和销毁的代价是很难承受的
       2)需要进行大量计算的优先使用线程
所谓大量计算,当然就是要耗费很多CPU,切换频繁了,这种情况下线程是最合适的。
这种原则最常见的是图像处理、算法处理。
       3)强相关的处理用线程,弱相关的处理用进程
什么叫强相关、弱相关?理论上很难定义,给个简单的例子就明白了。
一般的Server需要完成如下任务:消息收发、消息处理。“消息收发”和“消息处理”就是弱相关的任务,而“消息处理”里面可能又分为“消息解码”、“业务处理”,这两个任务相对来说相关性就要强多了。因此“消息收发”和“消息处理”可以分进程设计,“消息解码”、“业务处理”可以分线程设计。
当然这种划分方式不是一成不变的,也可以根据实际情况进行调整。
       4)可能要扩展到多机分布的用进程,多核分布的用线程

3.有了进程,为什么还要有线程
       线程产生的原因:
       进程可以使多个程序能并发执行,以提高资源的利用率和系统的吞吐量;但是其具有一些缺点:
       进程在同一时间只能干一件事
       进程在执行的过程中如果阻塞,整个进程就会挂起,即使进程中有些工作不依赖于等待的资源,仍然不会执行。

       因此,操作系统引入了比进程粒度更小的线程,作为并发执行的基本单位,从而减少程序在并发执行时所付出的时空开销,提高并发性。和进程相比,线程的优势如下:
       从资源上来讲,线程是一种非常"节俭"的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。
       从切换效率上来讲,运行于一个进程中的多个线程,它们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间。据统计,一个进程的开销大约是一个线程开销的30倍左右。(
       从通信机制上来讲,线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过进程间通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进城下的线程之间贡献数据空间,所以一个线程的数据可以直接为其他线程所用,这不仅快捷,而且方便。
       除以上优点外,多线程程序作为一种多任务、并发的工作方式,还有如下优点:
       ①使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。
       ②改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序才会利于理解和修改。

4.进程控制块(PCB)
       进程控制块是操作系统核心中一种数据结构,主要表示进程状态。它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息,是进程存在于系统中的唯一标志。
       由程序段、相关数据段和PCB三部分组成了进程实体。
       进程中断时,将CPU现场信息保存在PCB中,当进程再次被调度执行时用PCB恢复现场信息。
5.进程同步的方式
       进程同步:对多个相关进程在执行次序上进行协调,使并发执行的诸进程之间能按照一定的规则共享系统资源,从而使系统的执行具有可再现性。
       ①硬件同步机制
        ⑴关中断 在进入锁检测之前,关闭中断,知道完成锁检测并上锁之后才打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,自然不会发生进程或者线程切换。
       ⑵利用Test-and-Set 指令或Swap指令实现互斥(这属于硬件指令)
       为临界资源设置一个布尔变量lock,其值为FALSE表示临界资源空闲,TRUE,表示临界资源正在使用。
       利用TS机制和Swap机制,当临界资源忙碌时,其他访问进程会不断进行测试,让进程处于忙等状态,造成处理机时间的浪费,不符合让权等待原则。(让权等待:当进程不能进入自己的临界区时,需要让出处理机,以避免陷入“忙等”状态;)

       ②信号量同步机制
       ⑴记录信号量
       信号量S表示资源数目,除初始化外,仅能通过两个标准的原子操作进行修改:wait(S)和signal(S);这两个操作长期以来也别称为P、V操作;信号量是一个计数器,可以用来控制多个进程对共享资源的访问.
       PV操作由P操作原语和V操作原语组成(p指prolaag 荷兰语尝试减少,v指verhoog 荷兰语增加),原语指由若干条指令组成的,用于完成一定功能的过程,要么都执行要么都不执行。
       P操作顺序执行下述两个动作:
       ①信号量的值减1,即S=S-1;
       ②如果S≥0,则该进程继续执行。如果S<0,则把该进程的状态置为阻塞态,把相应的PCB连入该信号量队列的末尾,并放弃处理机,进行等待。
       V操作顺序执行下述两个动作:
       ①S值加1,即S=S+1;
       ②如果S>0,则该进程继续运行;如果S≤0,则释放信号量队列上的第一个PCB(即信号
量指量指针项所指向的PCB)所对应的进程(把阻塞态改为就绪态),执行V操作的进程继续运行.
        ⑵AND型信号量
       如果多个进程共享多个资源时仍旧采取这样单个的分配方法,就有可能发生死锁现象(哲学家进餐);为了避免这样的现象,提出来AND型信号量:将进程在整个运行过程中需要的所有资源,要么一次性全部分配给进程,然后使用完后再一起释放。要么一个都不分配,这样便可以避免死锁现象。
       ⑶信号量集
       前面介绍的几种信号量同步机制都是对某一资源进行一个单位的申请和释放。当一次需要N个的时候,就需要进行N次请求,这不但低效而且容易发生死锁情况;还有些情况下,为了保证系统的安全性,当所申请的资源低于某个值时,就需要停止对该类资源的分配。解决办法就是当进程申请某类临界资源时,都必须测试资源的数量,判断是否大于可分配的下限值,然后决定是否分配,由此形成的“信号量集”机制。
Swait(S1,t1,d1…Sn,tn,dn);表示对Si类资源的需求是di个,当Si的数量小于ti时就不再分配。
Ssignal(S1,d1…Sn,dn);表示归还Si类资源的数目是di个。
       ③管程机制
        信号量机制虽然是一种既方便又实用的进程同步机制,但是要访问临界资源的进程需要自备同步操作wait(S)和signal(S),这就使得对共享资源进行访问的代码遍布各个进程,不利于系统管理,还增加系统死锁的风险;管程机制是一种解决该问题的方法
       管程是一个由过程、变量等组成的模块(实际上是一个类),所有进程访问临界资源时,都只能通过管程间接访问,而管程每次只准许一个进程进入管程,从而实现互斥。
6.进程间通信IPC(Inter-Process Communication,进程间通信)
进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。
       ①管道
       管道,是指用于连接一个读进程和一个写进程以实现他们之间通讯的一个共享文件,写进程将信息以字符流的形式送入管道;而读进程将从管道中接受数据。
       ⑴ 普通管道PIPE:
       1)它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
       2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)
       3)它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值