进程
操作系统进程相关概念
关键名词
- process:一个正在执行程序的实例,包括程序计数器、寄存器、变量的当前值。
- critical region:对共享内存进行访问的程序片段
- semaphore:可以同时操作共享内存的数目
- mutex:两种状态解锁和枷锁
进程线程区别
- 进程:每个进程都有一个地址空间(存放可执行的程序、程序的数据、程序堆栈)和一个控制线程。
进程 | 线程 |
---|---|
地址空间、全局变量、打开的文件 | 程序计数器 |
子进程 | 寄存器、堆栈 |
账户信息 | 状态 |
进程、线程实现
进程维护一个数据结构:包含进程所必须的先关资源(进程控制块)
线程:内核态、用户态、混合使用
进程通信
- pipe(一个命令的输出作为另一个命令的输入) :shell bash(>ps -e | grep vmware //显示vmware相关进程)
- 消息传递:kill -signal PID
- 套接字、共享内存、文件、信号量
进程调度
Cooperative Threads-Scheduling:程序自主控制
Preemptive Threads-Scheduling:优先级队列
Java多线程相关概念
基本的线程机制
- 定义任务:
implements Runnable
public class LiftOff implements Runnable {
protected int countDown = 10; //Default
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff(){}
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
return "#" + id + "(" +
(countDown > 0 ? countDown : "Liftoff!") + ").";
}
@Override
public void run() {
while(countDown-- > 0) {
System.out.print(status());
Thread.yield();
}
System.out.println(id);
}
}
- Thread类:使用
new Thread(Runnable object).start()
执行任务。由线程调度器调度执行。
public final static void main(String[] args) {
//new LiftOff().run(); // 通过方法在一个线程内调用
for(int i = 0; i < 5; i++) {
new Thread(new LiftOff()).start();
}
System.out.println("Waiting for LiftOff.");
}
- 使用Executor执行器
public static final void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
//Executors.newFixedThreadPool(5);
//Executors.newSingleThreadExecutor();
for(int i=0; i<5; i++) {
exec.execute(new LiftOff());
}
exec.shutdown();
System.out.println("Waiting for LiftOff.");
}
- 从任务中产生返回值
implements Callable<T>
- 休眠:
Thread.sleep(100);TimeUnit.MILLISECONDS.sleep(100);
- 优先级:
- 让步:
yield
共享受限资源
- 不正确访问时导致资源的竞争冲突。
- 解决共享资源竞争:
synchronized
、显示灵活的加锁Lock:new ReentrantLock()
对象 - 原子性与内存可见性
volatitle
变量和同步加锁 - 原子类
AtomicInteger, AtomicLong, AtomicReference
- 临界区·
synchronized(this)
对象同步代码块 - 在其他对象上加锁
synchronized(object)
- 线程本地存储
终结任务
- 统计进入各个门的人数。
- 阻塞的方法
- sleep
- wait —— notify、notifyAll(signal,signalAll)
- 等待输入、输出
- 获取同步控制方法时锁不可用
线程之间的协作
wait,notify,notifyAll
- 生产者、消费者:BlockingQueue
线程安全性、对象的共享
- race condition:由于不恰当的执行时序而出现不正确的结果。
- 例如:check-then-act;延迟初始化
- 解决:
- 原子变量类如java.util.concurrent.atomic.AtomicLong
- 内置锁(复合操作):
synchronized
——同步代码块、方法。内置锁的可重入性。 - 加锁机制既可以确保可见性又能确保原子性;volatile变量只能确保可见性。
//解决并发编程的方案
1、不在线程之间共享该状态变量
2、将状态变量修改为不可变的变量
3、在访问状态变量时使用同步锁
内存
虚拟内存
- 虚拟内存图解
- 页面置换算法