程序员面试必问系列之操作系统(一)

简介: 程序员面试必问系列之操作系统(一)

1.进程与线程


对于有线程系统:


(1).进程是资源分配的独立单位;

(2).线程是资源调度的独立单位;


对于无线程系统:

(1).进程是资源调度、分配的独立单位;


2.进程间的通信方式及优缺点


管道


有名管道:一种半双工的通信方式,它允许无亲缘关系进程间的通信。

       优点:可以实现任意关系的进程间的通信;

       缺点:a.长期存于系统中,使用不当容易出错;b.缓冲区有限;


无名管道:一种半双工的通信方式,只能在具有亲缘关系的进程间使用(父子进程)

       优点:简单方便;

       缺点:a.局限于单向通信;b.只能创建在它的进程以及其有亲缘关系的进程之间;c.缓冲区有限;


信号量:一个计数器,可以用来控制多个线程对共享资源的访问

      优点:可以同步进程

      缺点:信号量有限


信号: 一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。


消息队列: 是消息的链表,存放在内核中并由消息队列标识符标识

      优点:可以实现任意进程间的通信,并通过系统调用函数来实现消息发送和接收之间的同步,无需考虑同步问题,方便

      缺点:信息的复制需要额外消耗 CPU 的时间,不适宜于信息量大或操作频繁的场合


共享内存:映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问

      优点:无须复制,快捷,信息量大

      缺点:a.通信是通过将共享空间缓冲区直接附加到进程的虚拟地址空间中来实现的,因此进程间的读写操作的同步问题b.利用内存缓冲区直接交换信息,内存的实体存在于计算机中,只能同一个计算机系统中的诸多进程共享,不方便网络通信


套接字socket:可用于不同及其间的进程通信

优点:a.传输数据为字节级,传输数据可自定义,数据量小效率高b.传输数据时间短,性能高c.适合于客户端和服务器端之间信息实时交互d.可以加密,数据安全性强

缺点:需对传输的数据进行解析,转化成应用级的数据。


3.线程之间的通信方式


锁机制:包括互斥锁/量(mutex)读写锁(reader-writer lock)自旋锁(spin lock)、条件变量(condition)

互斥锁/量(mutex):提供了以排他方式防止数据结构被并发修改的方法。

读写锁(reader-writer lock):允许多个线程同时读共享数据,而对写操作是互斥的。

自旋锁(spin lock):与互斥锁类似,都是为了保护共享资源。互斥锁是当资源被占用,申请者进入睡眠状态;而自旋锁则循环检测保持者是否已经释放锁。

条件变量(condition):可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。


信号量机制


a.无名线程信号量

b.有名线程信号量


信号机制(Signal):类似进程间的信号处理屏障:屏障允许每个线程等待,直到所有的合作线程都达到某一点,然后从该点继续执行。


4.进程之间私有和共享的资源


私有:地址空间、堆、全局变量、栈、寄存器

共享:代码段、公共数据、进程目录、进程 ID


5.线程之间私有和共享的资源


私有:线程栈、寄存器、程序计数器共享:堆、地址空间、全局变量、静态变量


6.多进程 vs 多线程


1.jpg

2.jpg


线程与进程选用规则:

a.需要频繁创建销毁的优先用线程;

b.需要进行大量计算的优先使用线程;

c.强相关的处理用线程,弱相关的处理用进程;

d.可能要扩展到多机分布的用进程,多核分布的用线程;

e.都满足需求的情况下,用你最熟悉、最拿手的方式;


7.Linux的内核同步方式


为什么需要内核同步:在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实像多进程、多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问。尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问。

内核同步方式:

a.原子操作;

b.信号量(semaphore);

c.读写信号量(rw_semaphore);

d.自旋锁(spinlock);

e.大内核锁(BKL,Big Kernel Lock);

f.读写锁(rwlock);

g.大读者锁(brlock-Big Reader Lock);

h.读-拷贝修改(RCU,Read-Copy Update);

i.顺序锁(seqlock);


8.死锁


定义:是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象。


死锁产生的条件


a.互斥

b.请求和保持

c.不可剥夺

d.环路等待


预防死锁

a.打破互斥条件:改造独占性资源为虚拟资源,大部分资源已无法改造。

b.打破不可抢占条件:当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。

c.打破占有且申请条件:采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。

d.打破循环等待条件:实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。

e.有序资源分配法

     f.银行家算法

相关文章
|
19天前
|
存储 Unix 程序员
面试题:Ctrl + C在不同操作系统下的应用
字节跳动面试题:Ctrl + C在不同操作系统下的应用
35 1
|
3月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
3月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
3月前
|
Java 程序员
【Leetcode 程序员面试金典 05.01】插入 —— 位运算
位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可
|
3月前
|
NoSQL Java MongoDB
程序员的50大MongoDB面试问题及答案
程序员的50大MongoDB面试问题及答案
|
3月前
|
算法 架构师 安全
10年Java面试总结:Java程序员面试必备的面试技巧
作为一名资深10年Java技术专家,我参与了无数次的面试,无论是作为面试者还是面试官。在这里,我将分享我的一些面试经历和面试技巧,希望能帮助即将面临面试的Java程序员们。回顾我的Java职业生涯,我清晰地记得一次特别的面试经历。那是我申请一家知名科技公司的Java开发岗位。为了这次面试,我花了几周的时间准备,这不仅包括Java的基础和高级知识,还有关于公司产品的研究。
148 0
|
2月前
|
运维 算法 程序员
程序员去国企:长城资产IT岗位秋招面试记录
【2月更文挑战第7天】本文介绍2024届秋招中,中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等~
|
2月前
|
消息中间件 调度 C++
C/C++工程师面试题(操作系统篇)
C/C++工程师面试题(操作系统篇)
33 0
|
3月前
|
SQL 缓存 Java
程序员的30大Mybatis面试问题及答案
程序员的30大Mybatis面试问题及答案
|
3月前
|
Java 程序员 应用服务中间件
程序员的31大Maven面试问题及答案
程序员的31大Maven面试问题及答案