1进程和线程:进程是执行着的应用程序,而线程是进程内部的一个执行序列。
区别:a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。
b.通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。
c.进程切换概念:进行进程切换就是从正在运行的进程中收回处理器,然后再使待运行进程来占用处理器。从某个进程收回处理器,实质上就是把进程存放在处理器的寄存器中的中间数据存放在进程的私有堆栈,从而把处理器的寄存器腾出来让其他进程使用。
d.中断实现进程的切换:用软中断指令来中止当前进程的运行,并保存当前进程的PC值(程序计数器)和PSW(程序状态寄存器))值。其后,使用压栈指令把处理器其他寄存器的值压入进程私有堆栈。再从待运行进程的进程控制块中取出私有堆栈指针的值并存入处理器的寄存器SP(栈指针),之后从待运行进程的私有堆栈中弹出上下文进入处理器。最后,利用中断返回指令来实现从待运行进程的私有堆栈中弹出PSW值和从待运行进程的私有堆栈中弹出PC值的功能。
●保存处理器SP寄存器的值到被中止进程的进程控制块
●保存PC寄存器、PSW寄存器还有其他寄存器的值到被中止进程的私有堆栈;
●从待运行进程的进程控制块取SP值并存入处理器的寄存器SP;
●从待运行进程的私有堆栈恢复处理器各寄存器的值;
●从待运行进程的私有堆栈中弹出PSW值并送入处理器的PSW;
●从待运行进程的私有堆栈中弹出PC值并送入处理器的PC。
线程上下文切换比进程上下文切换要快得多。
附:C++ 引入头文件 thread, 实例化thread类对象来创建线程(至少要传入函数名作为参数)。在其他线程中,调用该线程对象的join和detach方法,意思是挂起当前线程a,等调用此方法的对象对应的线程执行结束后再继续。
Java创线程4方式:继承(extends)Thread类、实现(implements)Runnable接口、实现Callable接口、应用程序可以使用Executor框架来创建线程池
注:采用实现 Runnable、Callable 接口时还可继承其他类。使用继承 Thread 类时,编写简单,如需访问当前线程,则无需使用Thread.currentThread() 方法,直接使用 this 即可。
e.线程同步的常见方法:互斥锁、条件变量、读写锁、信号量
https://www.jianshu.com/p/b86474b204cc
1) 互斥锁是一种特殊的全局变量,拥有lock和unlock两种状态。unlock的互斥锁可以由某个线程获得,一旦获得,这个互斥锁会锁上变成lock状态,此后只有该线程由权力打开该锁,其他线程想要获得互斥锁,必须得到互斥锁再次被打开之后。
2) 条件变量:当线程在等待满足某些条件时,使线程进入睡眠状态;一旦条件满足,就换线因等待满足特定条件而睡眠的线程。
3) 读写锁比互斥锁更加具有适用性和并行性.
读写锁最适用于对数据结构的读操作读操作次数多余写操作次数的场合!
锁处于读模式时可以线程共享,而锁处于写模式时只能独占,所以读写锁又叫做共享-独占锁。
读写锁有两种策略:强读同步和强写同步
4) 互斥锁只允许一个线程进入临界区,而信号量允许多个线程进入临界区。
2 死锁四必要条件:a互斥:在一段时间内某资源仅为一个进程所占有。
b不剥夺: 进程所获资源在未使用完前,不能被其他进程强行夺走(需主动释放)
c请求和保持条件:进程已保持了一些资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放
d循环等待条件:存在进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。
附:多进程避免死锁:指定获取锁的顺序,所有进程都以同样顺序加锁和释放锁
2) 互斥锁:mutex;获取锁失败后会休眠,释放cpu。
自旋锁:spinlock;遇到锁时,占用cpu空等。
读写锁:rwlock;同一时刻只有一个线程可以获得写锁,可以有多线程获得读锁。
顺序锁:seqlock; 本质上是一个自旋锁+一个计数器。
3 1) 管道其实是一个在内核内存中维护的缓冲器,这个缓冲器的存储能力是有限的,不同的操作系统大小不一定相同。管道拥有文件的特质:读操作、写操作,
2) 匿名管道(pipe)没有文件实体。只能用于本地父子进程间通信,只提供单向通信,基于字节流
3) 有名管道(FIFO)提供了一个路径名与之关联,有文件实体,但不存储数据。可以按照操作文件的方式对管道进行操作。只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。
4 建立三个线程A、B、C,要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。
答:使用同步块和wait、notify的方法控制三个线程的执行次序。调用wait时,会执行以下步骤:①对绑定的unique_lock对象解锁;②判断调用对象的返回值。如果调用对象返回值为false,则wait就一直阻塞,一直等待被notify唤醒;如果调用对象为true,则会对绑定的unique_lock对象重新上锁,然后wait函数返回,继续执行后续的程序。当wait被notify唤醒时,会先重新对绑定的unique_lock对象上锁,然后执行上面的①②。
8 微服务架构
微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法(可在一台或多台服务器),每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常使用http资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务公用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的存储技术。
9 分布式系统
1) 分布式系统的核心理念是让多台服务器协同工作,完成单台服务器无法处理的任务,尤其是高并发或者大数据量的任务。分布式系统由独立的服务器通过网络松散耦合组成的。每个服务器都是一台独立的 PC 机,服务器之间通过内部网络连接,内部网络速度一般比较快。
2) 性能瓶颈是节点间网络传输开销,单个pc性能影响不大,用廉价Pc服务器。
3) 分布式是多台部署了不同子业务系统的服务器协同完成一个任务;集群是多台服务器都提供同一种服务和功能。
ls 查看目录
ll 查看包括隐藏目录
cd 目录切换
./: 当前目录(相对路径)
../: 当前目录的父目录(相对路径)
/: 根目录(绝对路径)
创建目录【增】 mkdir
删除目录或文件【删】rm eg:rm [-rf] 目录
目录修改【改】mv (重命名,剪切)和 cp(拷贝)
搜索目录【查】find
新建文件【增】touch
删除文件 【删】 rm
修改文件【改】 vi或vim 三种模式(底行模式退出用q 保存退出:wq 强退:q!)
打开文件:vi 文件名
文件查看命令:cat/more/less/tail
修改权限: chmod 600 id_rsa或者chmod 777 build sh
rwx:r表可读,w可写,x可执行,若rwx中字母变-则表不可读或写或执行。
mm rf 文件名∶删除文件(没有权限前加 sudo)
clear清除显示框记录
su用于用户之间的切换,普通用户间切换要密码
sudo可以让普通用户具有临时使用root权限