面试八股文-操作系统

线程和进程

进程是操作系统进行资源分配和调度的最小单位,多个进程之间相互独立,如果一个进程崩溃,不会影响其他进程;

线程是CPU进行分配和调度的最小单位(或者说是进程的最小单位,进程的一部分),一个进程下可以有很多个线程共享该进程的所有资源,如果一个线程崩溃,整个进程就会崩溃。

进程和线程的区别

进程是操作系统进行资源分配和调度的最小单位,每个进程有自己的一部分独立的资源,如果一个进程崩溃,不会影响其他进程;线程是CPU进行分配和调度的最小单位,一个进程下可以有很多个线程共享该进程的所有资源,如果一个线程崩溃,整个进程就会崩溃。

线程一般是共享资源,在创建、或是进行调度的时候开销比进程小很多,通信同步也比较方便

通信方面进程间通讯需要同步或互斥手段的辅助,来保证数据的一致性,线程间可以直接读/写进程数据段(如全局变量)来进行通信。

简述多进程和多线程

线程间通讯和进程间通讯的方法

线程间:互斥锁、信号量、临界区…

互斥量(全局变量):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。

信号量:它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。

临界区:是一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待,有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用。

进程间

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

进程同步

目的:对多个相关进程在执行顺序上进行协调,使并发执行的进程可以有效的共享资源和相互合作,保证程序执行的可再现性。

进程死锁

多个并发的进程中,如果每个进程都持有某种资源由等待其他进程释放它现在保持的资源,这些资源都只允许一个进程占用,结果两个进程都不能继续执行,也不会释放自己占有的资源,所以这种双方循环等待的现象回无限期持续,发生死锁。

原因(4)

互斥条件:资源不能共享,只能一个进程用

请求与保持条件:已经得到资源的进程可以再次申请新的资源

非剥夺条件:已经分配的资源不能从相应进程中强制剥夺

循环等待条件:系统中若干进程形成环路,环路中的每个进程都在等待相邻进程正占用的资源

死锁处理

预防:破环四个原因中的一个或多个,但会影响到资源利用率及吞吐量

避免:在资源的动态分配中防止系统进入不安全状态

检测:死锁发生后,用一定的算法进行检测,并确定相关死锁相关的资源和进程,采取方法清楚死锁。

解除:对死锁相关进程,通过撤销或挂起的方式,释放一些资源

处理机调度

常用的调度算法

先来先服务调度:按进程到达的先后顺序依次调度

短作业优先调度:选择队列中估计时间较短的先进行处理

优先权调度:为不同队列设不同的优先级,等待时间长的适当提高优先级

时间片轮转:按进程到达的先后顺序放入队列,给队首进程分配CPU时间片,用完后计时器发出中断,暂停当前进程并将其放到队伍尾部,循环。

线程状态(5)

创建:new Thread®创建,有了相应的内存空间和其他资源,但还未开始执行

就绪:start()方法启动,进入线程队列排队,等待CPU服务

运行:获得处理器资源

阻塞:需要进行耗时的输入输出操作时,要等阻塞清除才能进入队列排队

终止:stop()、destory()或run()结束后,不在具有继续运行的能力

进程三态的转化(也有说5态的,和线程差不多)

运行状态:进程正在处理机上运行。在单处理机环境下,每一时刻最多只有一个进程处于运行状态。

就绪状态:进程已处于准备运行的状态,即进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行。(只缺处理机这个资源)

阻塞状态,又称等待状态:进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程也不能运行。(缺除了处理机之外的其他资源)

四个转换的过程

僵尸进程

僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。

孤儿进程

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

守护进程

守护进程是一个在后台运行并且不受任何终端控制的进程

内存泄漏

程序没有释放已经不再使用的内存,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,因此这段内存一直被占用,无法释放,造成空间的浪费。

怎么查

  1. 用封装的malloc函数,写代码时在malloc外封装一层,封装函数内打印一下malloc地址,free也是,然后运行时收集打印信息,可以用另外的脚本来分析内存的申请和释放是否一一对应。
  2. dmalloc库,第三个方案是valgrind工具 提一下常用的用法就行。

内存溢出

要求分配的内存超过了系统能给我的,系统不能满足需求。内存泄漏的堆积如果不及时处理最终会导致内存溢出

堆和栈的区别

  • 栈由系统自动分配,而堆是人为申请开辟
  • 栈获得的空间较小,而堆获得的空间较大
  • 栈由系统自动分配,速度较快,而堆一般速度比较慢;
  • 栈是连续的空间,而堆是不连续的空间

Linux

Linux常用命令

  • Ping 检查网络是否连接

  • Kill 杀死进程

  • Kill -9 强制杀死

  • ps 查看进程

  • Ps -ef 查看所有的进程

  • Netstat 查看网络状况

  • Netstat -apn 查看所有的端口

  • df 显示磁盘空间使用情况

  • top 查看进程资源占用

  • Ps -ef | grep 查看所有进程,通过管道找到相应的进程包名

  • Chmod 赋权命令

  • cd 进入目录里面

  • cd / 根目录

  • pwd 当前目录

  • mkdir 创建目录

  • rmdir 删除目录

  • ls 查看现有的目录

  • vi + 文件 编辑文件

  • Cat a.txt 查看文件,显示内容

  • rm -rf 强制删除

  • find / -name .txt 在根目录下面查找txt文件

  • cp -ai a.txt test 复制a.txt到test目录下

  • tail -f pin.log 显示pin.log文件末尾内容

  • Find 查找

  • grep 文本搜索

  • touch 如果没有就创建,有就不理它

| 是什么:

管道符,就是把符号左边命令本来要打印到终端上的信息当做右边命令的操作对象

猜你喜欢

转载自blog.csdn.net/weixin_44200259/article/details/128082733
今日推荐