有那么一些零碎的小知识点,偶尔很迷惑,偶尔被忽略,偶然却发现它们很重要,也是各大笔试和面试高频出现考点。这段时间正好在温习这些,就整理在这里,一起学习一起提高!后面还会继续补充。

——前言

1.进程和线程

  线程是指进程内的一个执行单元,也是进程内的可调度实体.

  与进程的区别:

  (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间(也有少量自己的地址空间);而进程有自己独立的地址空间(多个进程之间一般不会共享地址空间);

  (2)资源拥有:进程是资源拥有的单位,同一个进程内的线程共享进程的资源

  (3)线程是处理器调度和分派的基本单位.

  (4)二者均可并发执行.多线程程序的并发性高。

  (5)进程的切换代价远高于线程,同步和通信的实现也比线程复杂。

  进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,需要用多线程。

2.Unix和windows进程间通信的主要方式

  linux系统IPC:

  管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

  命名管道 (named pipe) : 命名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

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

  消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

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

  共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

  套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

  windows系统IPC:

  剪贴板(Clipboard):当用户在应用程序中执行剪切或复制操作时,应用程序将选定的数据以一个或多个标准或应用程序定义的格式放在剪贴板中。

  WM_COPYDATA消息:当一个应用向另一个应用传送数据时,发送方只需使用调用SendMessage函数, 接收方只需像处理其它消息那样处理WM_COPYDATA消息,这样收发双方就实现了数据共享,它在底层实际上是通过文件映射来实现的。

  文件映射(File Mapping ):使进程把文件内容当作进程地址区间一块内存那样来对待。只需简单的指针操作就可读取和修改文件的内容。 允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针,通过使用这些指针,不同进程就可以读写文件的内容,实现了对文件中数据的共享。

  共享内存(Shared Memory)是文件映射的一种特殊情况进程在创建文件映射对象时用0xFFFFFFFF来代替文件句柄(HANDLE),就表示了对应的文件映射对象是从操作系统页面文件访问内存,其它进程打开该文件映射对象就可以访问该内存块。由于共享内存是用 文件映射实现的, 所以它也有较好的安全性,也只能运行于同一计算机上的进程之间。

  动态数据交换(DDE):是使用共享内存在应用程序之间进行数据交换的一种进程间通信形式。应用程序可以使用DDE进行一次性数据传输,也可以当出现新数据时, 通过发送更新值在应用程序间动态交换数据。DDE和剪贴板一样既支持标准数据格式(如文本、位图等),又可以支持自己定义的数据格式。但它们的数据传输机制却不同,一个明显区别是剪贴板操作几乎总是用作对用户指定操作的一次性应答,如从菜单中选择Paste命令。尽管DDE也可以由用户启动,但它继续发挥作用一般不必用户进一步干预。可以发生在单机或网络中不同计算机的应用程序之间。

  邮件槽(Mailslot):提供进程间单向通信能力,任何进程都能建立邮件槽成为邮件槽服务器。其它进程称为邮件槽客户,可以通过邮件槽的名字给邮件槽服务器进程发送消息。进来的消息一直放在邮件槽中,直到服务器进程读取它为止。一个进程既可以是邮件槽服务器也可以是邮件槽客户,因此可建立多个 邮件槽实现进程间的双向通信。

  管道( pipe ):同上linux系统 & 命名管道

  套接字(Sockets  ):同上linux系统

3.死锁

  死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的僵局,若无外力作用,它们都将无法推进下去。

  产生死锁的四个必要条件

  1.互斥条件:一段时间内某资源只由一个进程占有。

  2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

  3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。

  4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

  预防死锁:需要打破必要条件的2,3,4中之一,由于施加的限制条件较严格,可能导致系统资源利用率和系统吞吐量降低。

  避免死锁:施加的限制条件较弱,使系统一直处于安全状态。比如银行家算法。

  检测死锁:资源分配图、死锁定理。

  解除死锁:剥夺起源、撤销进程。

4.windows下什么线程优先级最高

  SetThreadPriority  设置指定线程的优先级:

  BOOL SetThreadPriority(HANDLE hThread, int nPriority);

  参数说明:

  hThread  要设置的线程句柄

  nPriority 优先级别参数 可设置为一下参数

  THREAD_PRIORITY_ABOVE_NORMAL  比一般优先级高一个等级

  THREAD_PRIORITY_BELOW_NORMAL 比一般低一个等级

  THREAD_PRIORITY_HIGHEST               比一般高2个等级(最高)

  THREAD_PRIORITY_IDLE                      空闲

  THREAD_PRIORITY_LOWEST                比一般低2个等级(最低)

  THREAD_PRIORITY_NORMAL                一般等级

  THREAD_PRIORITY_TIME_CRITICAL    实时

5.linux下fork函数

  在fork()的调用处,创建一个子进程,并将整个父进程空间会原模原样地复制到子进程中,包括指令,变量值,程序调用栈,环境变量,缓冲区等。fork调用仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:

  (1)在父进程中,fork返回新创建子进程的进程ID;

  (2)在子进程中,fork返回0;

  (3)如果出现错误,fork返回一个负值;

  在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。

  fork出错可能有两种原因:

  1)当前的进程数已经达到了系统规定的上限,这时errno的值被设置为EAGAIN。

  2)系统内存不足,这时errno的值被设置为ENOMEM。

  创建新进程成功后,系统中出现两个基本完全相同的进程,这两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调度策略。

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 int main()
 4 {
 5    int i=0;
 6    for(i=0;i<3;i++) {
 7        pid_t fpid = fork();
 8        if(fpid==0)
 9           printf("son\n");
10        else
11           printf("father\n");
12    }
13    return 0;
14 }

  对于这种N次循环的情况,执行printf函数的次数为2*(2^N-1次,创建的子进程数为2^N-1个。输出中没有换行时缓冲区也会被复制,参见:http://www.oschina.net/question/195301_62902。

6.程序什么时候使用多线程好,什么时候单线程效率高

  1.耗时的操作使用线程,提高应用程序响应速度

  2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求

  3.多CPU系统中,使用线程提高CPU利用率

  4.改善程序结构。一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分,这样的程序会利于理解和修改。其他情况都使用单线程。

7.线程间通信

  互锁函数、临界段、内核对象(事件对象、互斥对象、信号量)

8.进程状态转换

  在操作系统中,进程一般有三种基本状态:运行状态,就绪状态和等待状态。

  1)就绪——执行:对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态;

  2)执行——等待:正在执行的进程因发生某等待事件而无法执行,如进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;

  3)等待——就绪:处于等待状态的进程,在其等待的事件已经发生,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态;

  4)执行——就绪:正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。

9.内存地址:虚拟地址-线性地址-物理地址的区别与联系

  x86平台下的系统采用分段机制与分页机制对地址进行转换,其中分段机制把一个虚拟地址转换成线性地址;分页机制把一个线性地址转换成物理地址。

参考资料:

《计算机操作系统(第三版)》,西安电子科技大学出版社,汤小丹等

linux中fork()函数详解(原创!!实例讲解)

一个fork的面试题

——————————————————————————我是分割线————————————————————————

操作系统系列的暂时整理到这里吧,如果读者发现还有哪些这方面的经典常考知识点也请指出,待续~

转载请注明出处,谢谢!

转载于:https://www.cnblogs.com/webary/p/4782903.html

那些不能遗忘的知识点回顾——操作系统系列(笔试面试高频题)相关推荐

  1. 那些不能遗忘的知识点回顾——C/C++系列(笔试面试高频题)

    有那么一些零碎的小知识点,偶尔很迷惑,偶尔被忽略,偶然却发现它们很重要,这段时间正好在温习这些,就整理在这里,一起学习一起提高!后面还会继续补充. --前言 1.面向对象的特性 封装.继承.多态. 封 ...

  2. 2020年Android面试高频知识点小结+9家公司面试真题

    作者:小羊子说 前言 正直2020金九银十,第一次换工作或是面试候选人,我们都会对面试知识做一次总结梳理,毕竟开发技术无边界,不同人对技术的解读不同.文章总结了最近大半年中的面试考查点V1.0,希望对 ...

  3. 简单计算机面试题库及答案_460道Java后端面试高频题答案版【模块六:计算机操作系统】...

    写在前面 1. 计算机操作系统和计算机网络是每个后端开发工程师必须掌握的知识.因为你写的代码最终都是要在操作系统里跑的,弄懂操作系统的原理对你编写高质量代码.调优.排故都有很大的帮助.在这里说一下我作 ...

  4. Java高级工程师必看系列,面试真题解析

    前言 今年因为这个疫情,感觉这是从工作以来过的最久的一个年了,在家呆的时间不是一般的久,算一算有好几个月呢!我大概是3月底快4月了才出门,投了超多的简历,天天面试面试面试面试面试面试面试-庆幸的是还是 ...

  5. 面试宝典系列-mysql面试基础题

    为什么80%的码农都做不了架构师?>>>    1.char.varchar的区别是什么? varchar是变长而char的长度是固定的.如果你的内容是固定大小的,char的性能会更 ...

  6. 考研复试(控制工程专硕)及大学本科(物联网工程)知识点回顾(五)——其他重点内容

    复试所涉及的科目 随机问题 1.过程控制与运动控制的区别? 2.√ 模拟电子技术与数字电子技术的区别? 3.√√ I2C和SPI的区别? 4.推挽输出与开漏输出的区别? 5.√ 可编程逻辑器件与微机的 ...

  7. 【直播】李祖贤:集成学习答疑直播之八-- 集成知识点回顾与补充

    集成学习答疑直播之八-- 集成知识点回顾与补充 集成学习是首个横跨3个周期的长期组队学习,在第25期组队学习中进行到"第三期-模型融合与数据实战"阶段.组队学习期间,课程设计者每周 ...

  8. 【运筹学】线性规划数学模型 ( 知识点回顾 | 可行解 | 最优解 | 阶梯型矩阵 | 阶梯型矩阵向量 | 基 | 基向量 | 基变量 | 非基变量 )

    文章目录 一.知识点回顾 1.线性规划三要素 2.线性规划一般形式 3.线性规划标准形式 二.线性规划解.可行解.最优解 三.阶梯型矩阵 四.阶梯型矩阵向量 五.基.基向量.基变量.非基变量 一.知识 ...

  9. python_day02 上节课知识点回顾

    上节课知识点回顾: 1.python3和python2多版本共存问题 注:需要复制python36和python27目录下的python.exe后重命名,复制scripts下的pip.exe后重命名 ...

最新文章

  1. 数据结构 -- 散列表
  2. 二、应用层协议概述与HTTP
  3. python如何在手机上下载模块-Python 下载文件的 11 种方式
  4. Python中下划线---完全解读
  5. NYOJ 336 子序列
  6. 一文看懂Python(九)-----可变参数函数
  7. tab标签的另一种写法
  8. WinForm 自动完成控件实例代码简析
  9. 《精解 Windows 10》——2.10 触摸手势
  10. java作用域public ,private ,protected 及不写时的区别(转)
  11. 双系统linux清除勒索病毒,wannacry勒索病毒修复软件
  12. QThread之重写run() 实现线程与业务解耦
  13. IEEE Fellow、AAAS Fellow 同日公布,清华唐杰、京东郑宇等数十位华人入选
  14. 在服务系统部署MFC程序,出现DLL缺失情况的问题解决方式
  15. 科学计数法符号e 自然常数e
  16. mv 命令批量移动文件夹
  17. 应届生找互联网工作及实习指北
  18. Springboot学习1——通过JPA访问MySQL数据库
  19. 顺丰官网代码(自编)
  20. rust山洞造家坐标_魔兽世界怀旧服部落1-60任务流程攻略 任务怪坐标位置汇总

热门文章

  1. 使用Julia进行图像处理--图像分割
  2. r语言中对向量求条件语句_R中的条件语句
  3. linux与unix的区别_Linux与Unix
  4. Spring 4 Security MVC登录注销示例
  5. iOS UICollectionView示例教程
  6. 摄影获得最佳图像的十大要诀_十大最佳应用程序性能管理工具
  7. soap xml_SOAP XML消息–使用Liquid XML Studio进行了解和创建
  8. C++ 判断字符串是否全是数字
  9. Java常见面试题:对象的访问定位的两种方式
  10. [HNOI2015]开店