校招准备系列6-操作系统

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/peopleqinlei/article/details/82956842

线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。

线程与进程的区别?

进程是程序的一次执行,线程是进程中的执行单元;
进程是资源分配的最小单位,同一进程内的线程共享进程的资源,地址空间。线程是程序执行流的最小单元。
与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。

多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了。而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

补充:
1、 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。

进程是程序的一次执行,线程是进程中的执行单元;
2、如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)共同完成的。
3、 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,除了CPU之外(线程在运行的时候要占用CPU资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源(内存空间等)。
4、 与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB中所保存的线程状态比PCB表中少多了。
5、 进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。

https://www.cnblogs.com/zhehan54/p/6130030.html

进程间通信方式和线程间通信方式

(1)进程间通信IPC方式:

  • 管道(pipe):
    管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用(有名管道)。进程的亲缘关系通常是指父子进程关系。
  • 信号量(semophore):
    信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  • 消息队列(message queue):
    消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享内存(shared memory):
    共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
  • 套接字(socket):
    套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

(2)线程间通信方式:

  • 全局变量;
  • Messages消息机制;
  • CEvent对象(MFC中的一种线程通信对象,通过其触发状态的改变实现同步与通信)。

进程间互斥与同步方式

记录锁(文件锁)、互斥量、信号量

线程间互斥与同步方式

四种进程或线程同步互斥的控制方法
1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。
2、互斥量:为协调共同对一个共享资源的单独访问而设计的。
3、信号量:为控制一个具有有限数量用户资源而设计。
4、事 件:用来通知线程有一些事件已发生,从而启动后继任务的开始。

临界区(Critical Section)(同一个进程内,实现互斥)

保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

互斥量(Mutex)(可以跨进程,实现互斥)

互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后应将拥有的互斥对象交出,以便其他线程在获得后得以访问资源。互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。所以创建互斥量需要的资源更多,所以如果只为了在进程内部是用的话使用临界区会带来速度上的优势并能够减少资源占用量。

信号量(Semaphores)(主要是实现同步,可以跨进程)

信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。一般是将当前可用资源计数设置为最大资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就会减1,只要当前可用资源计数是大于0的,就可以发出信号量信号。但是当前可用计数减小到0时则说明当前占用资源的线程数已经达到了所允许的最大数目,不能在允许其他线程的进入,此时的信号量信号将无法发出

事件(Event)(实现同步,可以跨进程)

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

信号量 与 互斥量的区别
1、互斥量用于线程的互斥,信号量用于线程的同步:
    互斥:指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排他性。但是互斥无法限制访问者对资源的访问顺序,所以访问是无序的;
    同步:指在互斥的基础上(多数情况),通过其他机制实现访问者对资源的有序访问。大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况指可以允许多个访问者同时访问资源。

2、互斥量值只能是0/1,信号量值可以为非负整数:
    一个互斥量只能用于一个资源的互斥访问不能实现多个资源的多线程互斥问题;
    一个信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量时,也可以完成一个资源的互斥访问;

3、互斥量的加锁和解锁必须由同一线程分别对应使用;而信号量可以由一个线程释放,另外一个线程得到。

信号量:多线程同步使用的;一个线程完成某个动作后通过信号告诉别的线程,别的线程才可以执行某些动作;
互斥量:多线程互斥使用的;一个线程占用某个资源,那么别的线程就无法访问,直到该线程离开,其他线程才可以访问该资源;

进程调度算法(处理器调度)

https://www.cnblogs.com/Blog-day/p/My_Blog_Days1-11.html

  • FCFS算法,先来先服务,建立队列,按队列顺序执行即可。
  • ​SJF短作业优先,建立链表每次选择needtime最短的运行。
  • 最短剩余算法,每当有新的进程就绪,就重新挑出当前最短剩余时间的进程。
  • 高响应比
  • 优先级队列,允许高优先权的新到进程抢占当前进程的处理机
  • RR(Round-Robin)轮转法,每隔一定时间片进行下一个进程的分配

线程调度算法

分时调度模式:让所有的线程轮流获得CPU的使用权,并且平均分配每个线程占用的CPU的时间片。
抢占式调度模式:让可运行池中优先级高的线程优先占用CPU,而对于优先级相同的线程,随机选择一个线程使其占用CPU,当它失去了CPU的使用权后,再随机选择其他线程使其占用CPU。

进程状态转换图(3状态)

https://blog.csdn.net/hyqsong/article/details/51592992
就绪、运行、阻塞。阻塞的进程要先回到就绪队列,不能直接运行。

线程状态转换图(7状态,Java)

https://blog.csdn.net/mikyz/article/details/69397183

内核态与用户态的区别

进程陷入内核代码中执行时,称该进程处于内核态。进程在用户代码中执行时,称该进程处于用户态。
特权级别不同。系统调用、异常、外部设备(鼠标键盘、磁盘、网络)会引起进程陷入内核态。

内存泄漏

用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元即为内存泄露。

同步、异步、阻塞与非阻塞

同步不一定就是阻塞,切记
https://www.jianshu.com/p/aed6067eeac9
https://www.zhihu.com/question/19732473

协程

定义:协程是一种用户态的轻量级线程。

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置;
线程是抢占式,而协程是协作式;

协程的优点:

  • 跨平台
  • 跨体系架构
  • 无需线程上下文切换的开销
  • 无需原子操作锁定及同步的开销
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

协程的缺点:

  • 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU;
  • 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序:这一点和事件驱动一样,可以使用异步IO操作来解决。

死锁的产生原因?解决方法?

互斥条件(Mutual exclusion) :资源不能被共享,只能由一个进程使用。
请求与保持条件(Hold and wait):进程已获得了一些资源,但因请求其它资源被阻塞时,对已获得的资源保持不放。
不可抢占条件(No pre-emption):有些系统资源是不可抢占的,当某个进程已获得这种资源后,系统不能强行收回,只能由进程使用完时自己释放。
循环等待条件(Circular wait) :若干个进程形成环形链,每个都占用对方申请的下一个资源。

鸵鸟算法:

该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

银行家算法:

所谓银行家算法,是指在分配资源之前先看清楚,资源分配后是否会导致系统死锁。如果会死锁,则不分配,否则就分配。

Need,Alloca,Avail三列

cache的作用和实现机制

在高低存储器层次之间增加一个中间层,旨在解决存储墙问题(momory wall)问题

cache中旧元素替换策略:FIFO、LRU和LEU,OPT

cache与页面置换算法

LRU设计(链表+hashtable,优先级队列)https://blog.csdn.net/elricboa/article/details/78847305

保持cache数据的一致性

同一个核心core上的Cache中的数据与内存上的数据不一致的解决方法,2种:
写通(Write through),
写回(Write back)

虚拟内存与内存分段分区

为什么引入虚拟内存?
1.进程间地址空间隔离 2.提高内存使用的效率(可以装载大于内存容量的程序,按需分页,使用页面swap即可)3.方便内存管理,程序编译后生成的地址是虚拟地址,到运行时MMU再翻译成物理地址(同一程序开2个,)

分段、分页、段页式管理:分段(代码段、数据段。。)、分页(程序的地址空间页映射到物理内存地址页帧)、段页式(先分段,再分页)

32位的虚拟地址会分为:10位的页目录地址,10位的页地址,12位的页内偏移。一页的大小是4KB。

https://www.cnblogs.com/thrillerz/p/6031561.html

TLB - translation lookaside buffer

快表,直译为旁路快表缓冲

由于页表存放在主存中,因此程序每次访存至少需要两次:一次访存获取物理地址,第二次访存才获得数据。提高访存性能的关键在于依靠页表的访问局部性。当一个转换的虚拟页号被使用时,它可能在不久的将来再次被使用到,。

全相连(每一个线性地址块可以对应任意的TLB表项),直接匹配(每一个线性地址块都可通过模运算对应到唯一的TLB表项),组相连(介于两者之间)

大端 小端和网络字节序说明

x86 小端法,TCP/IP网络字节序 大端法

https://www.cnblogs.com/langzou/p/9010899.html

堆和栈的区别

https://www.cnblogs.com/mysticCoder/p/4921724.html

gcc程序的编译过程和链接原理

https://www.2cto.com/kf/201610/559123.html

预处理(-E)得到.i,编译(-c)得到.s,汇编(-S)得到.o,链接(空)得到可执行程序,默认名为a.out

猜你喜欢

转载自blog.csdn.net/peopleqinlei/article/details/82956842