操作系统高频知识点

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。

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

对于这种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平台下的系统采用分段机制与分页机制对地址进行转换,其中分段机制把一个虚拟地址转换成线性地址;分页机制把一个线性地址转换成物理地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • word直接复制来了,格式就不改了。至于这门课怎么复习,只要平时实验都认真完成、报告认真写,平时分都很高;考试的话...
    Jozhn阅读 4,529评论 0 8
  • 又来到了一个老生常谈的问题,应用层软件开发的程序员要不要了解和深入学习操作系统呢? 今天就这个问题开始,来谈谈操...
    tangsl阅读 4,098评论 0 23
  • “夜是惹人醉,夜是迷人眼”,多少个夜夜陪伴而又悄然离去,多少个夜夜沉思而又淡然逝去,多少个夜夜感慨而又默然叹去。“...
    邪剑锋阅读 315评论 0 3
  • 以前看到过一个小故事,一个贵族孩子在上火车时一不小心一只鞋掉到了车底下,一个光脚捡煤的孩子帮他捡了起来,这时候火车...
    东奔西跑的狐阅读 344评论 0 0