本博文主要讲诉核心操作系统的进程、线程等
进程
一个进程由一个执行环境和一个或多个线程组成。
执行环境:
资源管理的基本单位,它是一个进程的线程所能访问的由本地内核管理的资源集合,可以提供保护而不被外部线程访问。包含:
1. 一个地址空间:是一组虚拟内存的集合,由内核提供,包含一个固定的、包含程序代码的不可更改的正文区域;一个堆,能向高位扩展;一个栈,能向地位扩展。
2. 线程同步和通信资源,如信号量和通信接口(例如套接字)
3. 高级资源,如打开的文件和窗口
建立新进程:
由操作系统提供的一个不可分割的操作。例如,UNIX的fork系统调用创建一个新的进程,它的执行环境是从其调用进程拷贝得来的;UNIX的exec系统调用是将调用进程转化为执行一个指定名字的程序的代码的进程。
在分布式系统中,新进程的创建过程可以被划分为两个独立的方面:
1. 选择目标主机
2. 创建执行环境(和一个初始线程)
选择目标主机:(策略问题)
1. 转移策略决定是新进程是在本机运行还是转移给其他机器,是根据本机节点的负载来决定。可以是确定的(节点A转移到节点B),也可以是非确定的(节点A随机转移到B~E之间的任何节点)。
2. 定位策略决定是选择哪个节点来驻留被转移的进程,这取决于节点的相对负载情况、机器的体系结构和它是否拥有某些特殊资源。
创建执行环境:(两种方式)
1. 当地址空间是一个静态定义的格式时,地址空间区域可根据指定了地址空间区域范围的列表来创建,然后地址空间区域由一个可执行文件进程初始化或者零填满。
2. 根据一个已存在的执行环境来定义地址空间。例如UNIX
线程
优点:
1. 增加操作间并发执行程度
2. 线程的创建和管理开销比进程少
3. 共享一个执行环境,也就是说更容易共享资源
4. 线程间的切换代价低。
线程的创建:
为线程的栈分配一个区域并为处理器中的寄存器、线程执行状态(初始值可以是SUSPENDED或RUNNABLE),以及优先级提供一个初始值。
线程编程:(java)
1. Thread(ThreadGroup
2. setPriority(int
3. run()如果线程的目标对象有run()方法,线程执行其目标对象的run()方法,否则它执行自己的run()方法,(Thread实现Runnable)。
4. start()将线程的SUSPENDED状态转换为RUNNABLE状态。
5. sleep(long
6. yield()进入READY状态并调用调度程序
7. destroy()销毁程序
8. join(long
9. interrupt()中断thread,使其从导致它阻塞的方法(如sleep())返回。
10. wait(long
11. notify(),notifyAll()分别唤醒一个或多个在object上调用的wait()方法的线程。
线程同步:
共享对象并用于线程协调和合作。因为线程并没有静态(类)变量或对象实例变量的私有拷贝。
Java提供了synchronized关键字以便程序员为线程的协调指定监视器。程序员可以指定完整的方法,也可以指定任意代码块作为属于某个对象的监控器。监视器可以保证同一时刻最多只有一个线程在执行。
Java允许通过任何作为条件变量的对象来阻塞或唤醒线程。需要阻塞以等待某一条件的线程调用一个对象的wait()方法。所有的Java对象都实现这一方法,因为它属于Java的根Object类。另外一个线程调用notify()方法来为至多一个等待该对象的线程接触阻塞状态,也可以调用notifyAll()方法为所有等待该对象的线程接触阻塞状态。这两个方法也属于Object类。
由于博主知识有限,如有误,请指正点评,欢迎交流