美文网首页
计算机系统

计算机系统

作者: whupenger | 来源:发表于2019-03-13 16:49 被阅读0次

    进程和线程的区别

    • 进程是具有一定功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源调度和分配的一个独立单位。
    • 线程是进程的实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
      一个进程可以有多个线程,多个线程也可以并发执行

    线程同步的方式

    • 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
    • 信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。
    • 事件(信号):通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作

    进程间通信的方式

    • 管道(PIPE):可用于具有亲缘关系进程间的通信,允许一个进程和另一个与他有共同祖先的进程之间进行通信
    • 命名管道(FIFO):克服了管道没有名字的限制,除了具有管道的功能外,还允许无亲缘关系的进程间通信,命名管道在文件系统中有对应的文件名,命名管道通过命令mkfifo或系统调用mkfifo来创建
    • 信号(signal):用于通知接收进程有某种事件发生,出了用于进程间的通信外,进程还可以发送信号给进程本身
    • 消息队列(MessageQueue):是消息的链接表,包括Posix消息队列和system V消息队列,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息,消息对了克服了信号承载的信息量少,管道只能承载无格式的字节流以及缓冲区大小受限等缺陷
    • 共享内存(shareMemory):多个进程可以访问同一块内存空间,往往与其他通信机制结合,如信号量,达到进程间的同步和互斥
    • 内存映射(mapped memory):内存映射允许多个进程间的通信,每一个使用该机制的进程通过把一个共享的文件映射到自己的进程地址空间来实现它
    • 信号量(semaphore):作为进程间和同一进程不同线程间的同步手段
    • 套接口(socket):用于不同机器之间的进程间通信

    缓冲区溢出

    指当前计算机往缓冲区填充数据超过了缓冲区的大小,溢出的数据覆盖了合法数据

    • 程序崩溃,导致拒绝服务
    • 跳转并且执行一段恶意代码

    死锁

    在两个或多个并发进程中,每个进程持有某种资源而又等待其他进程释放他们持有的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁;通俗讲就是两个或多个进程无限期的阻塞,相互等待的一种状态。
    死锁产生的4个条件:

    • 互斥条件:一个资源只能被一个进程使用
    • 请求与保持条件:一个进程因请求某种资源而阻塞时,对已获得资源保持不放
    • 不可剥夺条件:进程获得的资源,在未完全使用完之前,不能强行剥夺
    • 循环等待条件:若干个进程之间形成一种头尾相接的环形等待资源关系

    预防死锁:

    • 打破互斥条件:允许某些资源可以被多个进程同时访问
    • 打破请求与保持条件:实行资源预分配,进程在运行一次前一次性的申请他所需的全部资源,只有全部资源得到满足,进程才开始运行,否则暂不运行。但是这个有几个缺点:
      • 有些进程在运行之前不知道他所需的全部资源,这是由于进程在执行时是动态的,不可预测的
      • 资源利用率低,有些资源可能是进程最后才用到,但是在进程生存期间却一直持有,造成长期不用的情况,是一种极大的浪费
      • 降低了进程的并发性。因为资源有限,加上存在浪费,能分配到所有资源的进程必然就少了
    • 打破不可剥夺条件:当一个进程请求某种资源不能立即满足时,它应该立刻释放自己占有的全部资源。这种方法实现起来困难,会降低系统的性能
    • 打破循环等待条件:实行资源有序分配策略,事先将资源编号,按号分配,所有进程对资源的请求必须按照资源号递增的顺序,进程占用了小号资源才能申请大号资源
      • 限制了进程对资源的请求,但是同时给系统中所有的资源编号也是很困难的事,增加了系统的开销
      • 为了遵循按编号申请的次序,暂不使用的资源也要提前申请,增加了进程对资源的占用时间

    银行家算法

    1.银行家算法中的数据结构
      (1) 可利用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。如果Available[j]=K,则表示系统中现有R_j类资源K个。
      (2) 最大需求矩阵Max。这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要R_j类资源的最大数目为K。
      (3) 分配矩阵Allocation。这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得R_j类资源的数目为K。
      (4) 需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要R_j类资源K个,方能完成其任务
    上述三个矩阵间存在下述关系:
    Need[i, j]=Max[i, j]-Allocation[i, j]
    2.银行家算法
      设Request_i是进程P_i的请求向量,如果Request_i[j]=K,表示进程P_i需要K个R_j类型的资源。当P_i发出资源请求后,系统按下述步骤进行检查:
      (1) 如果Request_i[j]≤Need[i,j],便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
      (2) 如果Request_i[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,P_i须等待。
      (3) 系统试探着把资源分配给进程P_i,并修改下面数据结构中的数值:
    Available[j]:= Available[j]-Request_i[j];
    Allocation[i,j]:= Allocation[i,j]+Request_i[j];
    Need[i,j]:= Need[i,j]-Request_i[j];
      (4) 系统执行安全性算法,检查此次资源分配后系统是否处于安全状态。若安全,才正式将资源分配给进程P_i,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程P_i等待。

    3.安全性算法
      系统所执行的安全性算法可描述如下:
      (1) 设置两个向量:
      ① 工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,它含有m个元素,在执行安全算法开始时,Work:=Available
      ② Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]:=false;当有足够资源分配给进程时,再令Finish[i]:=true

    (2) 从进程集合中找到一个能满足下述条件的进程:
      ① Finish[i]=false;
      ②Need[i,j]≤Work[j];若找到,执行步骤(3),否则,执行步骤(4)。

    (3) 当进程P_i获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
    Work[j]:= Work[j]+Allocation[i,j]
    Finish[i]:=true;
    go to step (2);

    (4) 如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态

    同步与异步,阻塞与非阻塞

    1. 同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
      所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。
    2. 阻塞与非阻塞
      阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
      阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
      非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

    相关文章

      网友评论

          本文标题:计算机系统

          本文链接:https://www.haomeiwen.com/subject/tcozpqtx.html