操作系统总结

1. Linux中线程互斥/同步有哪几种方式?

复制代码
线程互斥:

互斥锁:
• pthread_mutex_lock 
• pthread_mutex_unlock

线程同步:

1) 条件变量: 
• pthread_cond_wait 
• pthread_cond_signal; 
• pthread_cond_broadcast;

2) 信号量:
• sem_wait(sem_t* sem); 
• sem_post(sem_t* sem);
View Code
复制代码

互斥锁、条件变量、信号量、(读写锁

信号量其实和互斥锁+条件变量相似。

 

 http://blog.csdn.net/yusiguyuan/article/details/14161225【这篇文章让我明白了条件变量,认认真真从头看一遍】

 衍生:原子变量

看一下这篇文章:http://www.jianshu.com/p/9218692cb209

http://blog.csdn.net/wonderwander6642/article/details/8008241

 

2. 同样可以实现互斥,互斥锁和信号量有什么区别?

信号量是一种同步机制,可以当作锁来用,但也可以当做进程/线程之间通信使用,作为通信使用时不一定有锁的概念;(并不一定把它当锁来用,信号量是一个通信机制,是一个更通用的概念)

互斥锁是为了锁住一些资源,是为了对临界区做保护

 (互斥可以用来实现同步,但同步是一个更大的概念。)

 

3. 请用普通的互斥锁编程实现一个读写锁

 

4. 编程产生三个线程ABC,并让它们顺次打印ABC

 

5. 死锁是怎么产生的?如何避免?

 死锁的四个条件:互斥、持有并等待、不可剥夺、环形等待

 

6. Linux中进程通信有哪些方式?

 linux下进程间通信的几种主要手段简介:

1.管道(Pipe)及命名管道(named pipe):管道可用于具有亲缘关系进程间的通信,命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);
3.报文(Message)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

ref    ref2

 

7. Linux中进程空间布局

简述Linux进程内存空间分为哪几个段?作用分别是什么?

 

 ref1         ref2              ref3【总结的很详细,包括brk, malloc的一些原理】

8. Linux内存分配原理

伙伴系统。其思想是:把内存块分成不同的组(1,2,4,8,16,32....);分配内存时找到能够满足条件 的最小的块;如果找不到,就找大的块,然后一分为2,分配一块,留一块;回收时:如果有相邻的同样大小的块,则合并

ref1    ref2

9. malloc函数实现原理

 

10. 使用mmap读写文件为什么比普通读写函数要快?

 

 ref:用户空间和内核空间。里面有讲mmap,很详细。

11. 静态链接库、动态链接库原理

 

 ref1

12. Linux中signal实现原理

 ==============================================================================================

13. 小端、大端

二、什么是大端和小端  ref

Big-Endian和Little-Endian的定义如下:
1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。【所谓的低位字节就是权重低的数字】
2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12

--------------------------------------------------------------------------------

网络字节序、小端、大端   ref

网络字节序是大端;80x86机器里是小端。

 

14. 条件变量相关    ref    ref2   ref3 【先看完ref,再看ref2】

pthread_cond_wait(&cond,&mutex)是一个原子操作,当它执行时,首先对mutex解锁,这样另外的线程才能得到锁来修改条件,pthread_cond_wait解锁后,再将本身的线程/进程投入睡眠,另外,当该函数返回时,会再对mutex进行加锁,这样才能“执行某种操作”后unlock锁。

其实想一想,pthread_cond_wait函数也可以用一个while死循环来等待条件的成立,但要注意的是,使用while死循环会严重消耗CPU,而pthread_cond_wait则是采用线程睡眠的方式,它是一种等待模式,而不是一直的检查模式。

拓展:用条件变量实现生产者、消费者。ref3

 

15. 进程调度算法  ref

先来先服务(FCFS),轮转,最短进程优先(SPN),最短剩余时间优先(SRT),最高响应比优先(HRRN)

复制代码
FCFS: 先来先服务,也可以称为先进先出

轮转: 以一个周期性间隔产生时钟中断,此时当前正在运行的进程被置于就绪队列,基于FCFS选择下一个就绪进程运行。

SPN:最短进程优先,下一次选择所需处理时间最短的进程

SRT:最短剩余时间优先,总是选择预期剩余时间最短的进程

HRRN:最高响应比优先,R=(w+s)/s,其中R表示响应比,w表示已经等待的时间,s表示期待服务的时间

反馈:进程第一次进入系统是放置于RQ0,第一次被强占并返回就绪态时,放入RQ1,以后每次被强占就下降一级。如果进程处于最低等级,则不再降级,反复返回到该队列,直到结束。
View Code
复制代码

响应比公式:

 操作系统

 

 

======================================================================================

一些基础知识:

每个进程有独立的数据空间、文件描述符、进程ID,而线程共享数据空间、文件描述符、进程ID。

对于父进程,fork返回子进程的pid; 而对于子进程,fork函数返回0.

 

 

 

 

 =====================================

多线程常见面试题:

http://blog.163.com/tank_ge/blog/static/214396955201391110643740/

http://www.cnblogs.com/obama/archive/2013/04/12/3016509.html

 

 

 

 

 

 

 

 

多进程编程基础知识:http://blog.csdn.net/wallwind/article/details/6899330

条件变量: ref1      ref2      

 

posted @   Ryan in C++  阅读(486)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示