• 操作系统总结


    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      

  • 相关阅读:
    Oracle 各种查询语句
    Win7下Eclipse中文字体太小
    ASP.NET MVC(Razor)上运用UEditor和xhEditor编辑器检测到有潜在危险的 Request.Form的真正解决办法
    Oracle 分页
    限制IIS访问流量提升IIS性能
    pl\sql工具导出表结构、序列和触发器方法
    JS 中面向对象的5种写法
    去除Windows 2003的登录CTRL+ALT+DEL
    List绑定时无法进行增删查改的解决办法
    .net工具
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4708823.html
Copyright © 2020-2023  润新知