2019-8-26 读书笔记

1:在计算机系统中,数值一律用补码来表示和存储。

2:正数的原码、反码、补码都是其本身。

3:进程和线程的区别:

     1.进程是系统分配内存的最小单位,线程是CPU调度的最小单位

     2.进程创建的开销更大,线程小

     3.线程间的通讯更加简单,因为他们共享同一块内存

     4.一个进程可以有多个线程,而一个线程只能有一个进程,没有进程就没有线程

     5.进程间不会相互影响,因为他们是独立的,而线程挂了一个,整个进程就会挂掉

4:进程间的通讯方式:

     1.管道通讯,有分为普通管道和命名管道,两者都是半双工,前者需要有血缘关系即父子进程,后者不需要血缘关系

     2.socket编程,socket还可以让2个不在同一个主机进行通讯

     3.信号,用于通知进程某个事件已经触发

     4.信号量,是一个计数器,原子操作,用于同步互斥

     5.共享内存,这是最快的方式,但是要实现同步,所以经常和信号量一起使用

5.线程间的通讯方式

     1.临界区,访问同一段代码或公共资源

     2.信号量,控制同一资源能同时被访问的数量

     3.互斥量或锁,用于控制同步互斥

     4.信号,用于通知线程

6.什么是虚拟内存

    计算机中只有一个内存,当一个程序创建时,就会建立一个虚拟内存,虚拟内存和物理内存形成一个映射的关系,但在程序创建时,这种映射的关系并不会马上建立,只有在正真进行操作的时候,才会映射,我们都知道计算机里面对内存的管理都是分段,分页的,这时候缺少某一页,就会发生一个缺页中断,malloc,new也是如此。

7.操作系统的内存模型

     1.栈,由编译器自动释放,用于存放局部变量,函数参数,内存地址由高到低,它必须是连续的,大小默认为1M,可以改变

      2.堆,由程序员自行分配,分配地址不连续,要调用搜索算法,所以比较慢,释放也是自行释放,地址由低到高

      3.全局变量和静态变量

      4.代码段

8.linux的四种锁

   1.互斥锁:只有一个线程能获取资源,若获取失败则进入阻塞状态,等待锁释放时被唤醒

   2.读写锁:只有一个写锁和n个读锁,若写锁被占有,则读锁就不能被占有,若读锁被占有,则写锁不能被占有,但随后读锁的申请会被阻塞,避免读模式占据过长的时间,若没有写锁请求,则可以同时并继续申请读锁,适用于读多写小的场景。

   3.自旋锁:只有一个线程能获取资源,若获取失败则进入原地自旋状态,等待锁释放,这就省去了从阻塞到唤醒的过程,但若加锁时间过长,则浪费CPU。

   4.RCU:即read-copy-update,在修改数据时,首先需要读取数据,然后生成一个副本,对副本进行修改。修改完成后,再将老数据update成新的数据。使用RCU时,读者几乎不需要同步开销,既不需要获得锁,也不使用原子指令,不会导致锁竞争,因此就不用考虑死锁问题了。而对于写者的同步开销较大,它需要复制被修改的数据,还必须使用锁机制同步并行其它写者的修改操作。在有大量读操作,少量写操作的情况下效率非常高。

发布了133 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/fbher/article/details/100054481