操作系统

进程与线程
进程:是系统进行分配和管理资源的基本单位,一段运行的程序 ,是系统进行资源分配和调度的一个独立单元。
​ 线程:进程的一个执行单元,是进程内调度的实体,是CPU调度和分派的基本单位,是比进程更小的独立运行的基本单位。线程也被称为轻量级进程,线程是程序执行的最小单位。系统分配处理器时间资源的基本单元。线程是进程的一个实体,是CPU调度和分派的基本单元。

进程和线程的区别

(1)一个线程只属于一个进程,一个进程包含一个或者多个线程

(2)进程拥有独立的内存单元,而多个线程共享内存

(3)进程结束后,它拥有的所有线程都将销毁,而线程的结束不会影响同一个进程中的其他线程

(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多。所有操作系统中的执行功能都是创建线程去完成的。

(5)线程中执行时一般都是进行同步和互斥的,因为他们共享同一进程的资源

https://www.cnblogs.com/inception6-lxc/p/9073983.html

这个博客总结的比较好,抄了一遍

1. 进程的常见状态,以及各种状态之间的转换条件

进程有三种状态:就绪、运行、阻塞,存在转换

  • 就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外所有的必要资源后,只要再获得CPU,便可立即执行
  • 执行:进程已经获得CPU,程序正在执行状态
  • 阻塞:正在执行的进程由于发生某事件(如 I/O请求,申请缓冲区失败等)暂时无法继续执行的状态

![image-20200805094913036](https://uploadfiles.nowcoder.com/images/20190919/56_1568900435177_29C080A5413E925FE3B3CCB4048AB99B Data\Typora\typora-user-images\image-20200805094913036.png)

2. 进程同步

进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效的共享资源和相互合作,而使程序的执行具有可再现性。(信号量那边的知识)

同步机制遵循的原则:

(1)空闲让进;

(2)忙则等待(保证对临界区的互斥访问)

(3)有限等待(有限代表有限的事件,避免死等)

(4)让权等待(当进程不能进入自己的临界区时,应该释放处理机。以免陷入忙等状态)

进程的通行方式有哪些:

​ 进程通信,是指进程之间的信息交换(信息量少则一个状态或数值,多则是成千上万个字节)。因此,对于用型号量进行的进程间的互斥和同步,由于其所交换的信息量少儿被归结为低级通信。

​ 所谓高级进程通行指:用户利用操作系统所提供的一组通信命令传送大量数据的一种通信方式。操作系统隐藏了进程通信的实现细节。或者说,通信过程对用户是透明的。

​ 高级通信机制可归结为三大类:

​ (1)共享存储器系统(存储器中划分的共享存储区):实际操作中对应的是“剪贴板”(剪贴板实际上是系统维护管理的一块内存区域)的通信方式,比如举例如下:word进程按下ctrl+c,在ppt进程按下ctrl+v,即完成了word进程和ppt进程之间的通信,复制时将数据放入到剪贴板,粘贴时从剪贴板中取出数据,然后显示在ppt窗口上。这个例子中的剪切板就是一块共享存储区域

​ (2)消息传递系统:进程间的数据交换以消息(message)为单位,当今最流行的微内核操作系统中,微内核域服务器之间的通信,无一例外都采用了消息传递机制。应用举例:邮槽(MailSlot)是基于广播通信体系设计出来的,它采用无连接的不可靠的数据传输。邮槽是一种单向通信机制,创建邮槽的服务器进程读取数据,打开邮槽的客户机进程写入数据。

​ (3)管道通信系统:(linux系统中实现的是管道通信系统

(管道即:连接读写进程以实现他们之间通信的共享文件(pipe文件,类似先进先出的队列,由一个进程写,另一进程读))。实际操作中,管道分为:匿名管道、命名管道。匿名管道是一个未命名的、单向管道,通过父进程和一个子进程之间传输数据。匿名管道只能实现本地机器上两个进程之间的通信,而不能实现跨网络的通信。命名管道不仅可以在本机上实现两个进程间的通信,还可以跨网络实现两个进程间的通信

linux系统中常用的五种同行方式

1.管道

管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的道端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样地,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞

注1:无名管道只能实现父子或者兄弟进程之间的通信,有名管道(FIFO)可以实现互不相关的两个进程之间的通信。

   注2:用FIFO让一个服务器和多个客户端进行交流时候,每个客户在向服务器发送信息前建立自己的读管道,或者让服务器在得到数据后再建立管道。使用客户的进程号(pid)作为管道名是一种常用的方法。客户可以先把自己的进程号告诉服务器,然后再到那个以自己进程号命名

的管道中读取回复

2.信号量

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其它进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

3.消息队列

是一个在系统内核中用来保存消 息的队列,它在系统内核中是以消息链表的形式出现的。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点

4.共享内存

共享内存允许两个或多个进程访问同一个逻辑内存。这一段内存可以被两个或两个以上的进程映射至自身的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个共享内存的进程,通过一个简单的内存读取读出,从而实现了进程间的通信。如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。共享内存是最快的IPC方式,它是针对其它进程间通信方式运行效率低而专门设计的。它往往与其它通信机制(如信号量)配合使用,来实现进程间的同步和通信

5.套接字

套接字也是一种进程间通信机制,与其它通信机制不同的是,它可用于不同机器间的进程通信

3 上下文切换

对于单核单线程CPU而言,在某一时刻只能执行一条CPU指令,上下文切换是一种将CPU资源从一个进程分配给另一个进程的机制。 从用户角度看,计算机能够并行运行多个进程,这恰恰是操作系统通过快速上下文切换造成的结果。在切换的过程中,操作系统需要先存储当前进程的状态(包括内存空间的指针,当前执行完的指令等等),再读入下一个进程的状态,然后执行此进程。好像手机里面都是跑多个应用软件

4. 进程与线程的区别和联系

进程与线程
进程:是系统进行分配和管理资源的基本单位,一段运行的程序 ,是系统进行资源分配和调度的一个独立单元。
线程:进程的一个执行单元,是进程内调度的实体,是CPU调度和分派的基本单位,是比进程更小的独立运行的基本单位。线程也被称为轻量级进程,线程是程序执行的最小单位。系统分配处理器时间资源的基本单元。线程是进程的一个实体,是CPU调度和分派的基本单元。

进程和线程的区别

(1)一个线程只属于一个进程,一个进程包含一个或者多个线程

(2)进程拥有独立的内存单元,而多个线程共享内存

(3)进程结束后,它拥有的所有线程都将销毁,而线程的结束不会影响同一个进程中的其他线程

(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多。所有操作系统中的执行功能都是创建线程去完成的。

(5)线程中执行时一般都是进行同步和互斥的,因为他们共享同一进程的资源

5. 进程调度

1. 调度种类

  • 高级调度:又称为作业调度,它决定后备作业调入内存运行
  • 中级调度:又称为在虚拟存储器中引入,在内、外存对换区进行进程对换
  • 低级调度:又称为进程调度,它决定把就绪队列的某进程获得CPU

2. 非抢占式调度与抢占式调度

  • 非抢占式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,知道进程完成或发生进程调度某事件而阻塞时,才把处理机分配给另一个进程。

  • 抢占式:操作系统将正在运行的进程强行暂停,由调度程序将CPU分配给其他就绪进程的调度方式。

调度算法:FIFO先来先服务

SJF SRJF 优先权调度, 轮转调度 多级队列调度

6 临界资源

  • 在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有一点必须资源)。但对于某些资源来说,其在同一时间只能被一个进程所占用。这些一次只能被一个进程所占用的资源就是所谓的临界资源。典型的临界资源比如物理界上的打印机,或是存在硬盘或内存中被多个进程所共享的一些变量和数据等(如果这类资源不被看成临界资源加以保护,那么很有可能造成丢数据的问题)
  • 对于临界资源的访问,必须是互斥进行。也就是当临界资源被占用时,另一个申请临界资源的进程会被阻塞,知道所申请的临界资源被释放。而进程内访问临界资源的代码被称为临界区。

7.一个程序从开始运行到结束的完整过程(四个过程)

    1. 预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。
    1. 编译:将预处理后的文件转换成汇编语言,生成.s文件
    1. 汇编:汇编变为目标代码(机器代码)生成.o的文件
    1. 连接:连接目标代码,生成可执行程序。.exe

8 内存池,进程池,线程池

池化技术:提前保存大量的资源,以备不时之需以及重复使用。池化技术应用广泛,如内存池,线程池,连接池等等。

由于在实际应用中,分配内存,创建进程、线程都会涉及到一些系统调用,系统调用需要导致程序从用户太切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放、进程、线程创建销毁等操作时,通常会使用内存池,进程池、线程池技术来提升程序的性能。

线程池:线程池的原理很简单,类似于操作系统的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体工作时,就会唤醒线程池中的某个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠转态,而不是将线程销毁。

进程池与线程池同理

内存池:内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的内存真正释放。

死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁?

死锁:死锁是指两个或者两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象。

死锁原因:系统资源不足,相互竞争资源。请求资源顺序不当

死锁的必要条件:

        1. 互斥条件:一个资源每次只能被一个进程使用。
        2. 请求和保持条件:一个进程因请求资源而阻塞时,对以获得的资源保持不放
        3. 不可剥夺条件:进程已获得的资源,在未使用完之前,不能强行剥夺,只能在进程使用完时自己释放
        4. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

避免死锁的方法:

​ 因为互斥时不可改变的,所以只能破坏其他三个条件中的一个来接触死锁,方法:剥夺资源,杀死其中一个线程。

避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序做操作来避免死锁。

全部评论

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务