diff --git a/docs/src/ch02-02-process-job-object.md b/docs/src/ch02-02-process-job-object.md index fc3a851..74b1afd 100644 --- a/docs/src/ch02-02-process-job-object.md +++ b/docs/src/ch02-02-process-job-object.md @@ -55,4 +55,25 @@ - NewProfile:此作业下的一个进程正在尝试创建新的配置文件。 - AmbientMarkVMOExec:此作业下的某个进程正在尝试使用带有ZX_HANDLE_INVALID的zx_vmo_replace_as_executable()作为第二个参数,而不是有效的ZX_RSRC_KIND_VMEX。 -## 进程Process \ No newline at end of file +## 进程Process + +进程是传统意义上程序的一个运行实例,包含一组指令和数据,这些指令将由一个或多个线程执行,并拥有一组资源。在具体实现上,进程包括如下内容: + +- Handles :大部分是进程用到的资源对象的句柄 +- Virtual Memory Address Regions:进程所在的内存地址空间 +- Threads:进程包含的线程组 + + + +进程包含在作业(Job)的管理范畴之中。从资源和权限限制以及生命周期控制的角度来看,允许将由多个进程组成的应用程序视为一个实体(即作业)。 + +### 生命周期(lifetime) +进程有自己的生命周期,从开始创建到直到被强制终止或程序退出为止。可通过调用`Process::create()`创建一个进程,并调用`Process::start()`开始执行 。该进程在以下情况下停止执行: + +- 最后一个线程终止或退出 +- 进程调用 `Process::exit()` +- 父作业(parent job)终止了该过程 +- 父作业(parent job)被销毁(destroied) + +注:`Process::start()`不能被调用两次。新线程不能被添加到已启动的进程。 + diff --git a/docs/src/ch02-03-thread-object.md b/docs/src/ch02-03-thread-object.md index 8bc0ca3..f94438a 100644 --- a/docs/src/ch02-03-thread-object.md +++ b/docs/src/ch02-03-thread-object.md @@ -1,15 +1,80 @@ # 线程管理:Thread 对象 -## 线程状态 +线程对象是代表分时CPU的执行上下文的一种结构。线程对象与特定的进程对象相关联,该进程对象为线程对象执行中涉及的I/O和计算提供提供必要的内存和其他对象的句柄。 + + +## 生命期 + +线程是通过调用Thread::create()创建的,但只有在调用Thread::create()或Process::start()时才开始执行。这两个系统调用的参数都是要执行的初始例程的入口。 + +传递给Process::start()的线程应该是在一个进程上开始执行的第一个线程。 + + +下列情况都可导致一个线程终止执行: + +- 通过调用 `CurrentThread::exit()` +- 当父进程终止时 +- 通过调用 `Task::kill()` +- 在生成没有处理程序或处理程序决定终止线程的异常之后。 + +从入口例程返回并不终止执行。入口点的最后一个动作应该是调用CurrentThread::exit()。 + + + +关闭一个线程的最后一个句柄并不终止执行。为了强行杀死一个没有可用句柄的线程,可以使用KernelObject::get_child()来获得该线程的句柄。但这种方法是非常不可取的。杀死一个正在执行的线程可能会使进程处于损坏的状态。 + +本地线程总是分离的(*detached*)。也就是说,不需要join()操作来做一个干净的终止(clean termination)。但一些内核之上的运行系统,如C11或POSIX可能需要线程被连接(be joined)。 + + + +## 信号 + +线程提供以下信号: + +- THREAD_TERMINATED +- THREAD_SUSPENDED +- THREAD_RUNNING + +当一个线程启动执行时,THREAD_RUNNING被设定。当它被暂停时,THREAD_RUNNING被取消,THREAD_SUSPENDED被设定。当线程恢复时,THREAD_SUSPENDED被取消,THREAD_RUNNING被设定。当线程终止时,THREAD_RUNNING和THREAD_SUSPENDED都被置位,THREAD_TERMINATED也被置位。 + +注意,信号经过“或”运算后进入KernelObject::wait_signal()函数系列所保持的状态 ,因此当它们返回时,你可能会看到所要求的信号的任何组合。 + + + +## 线程状态(ThreadState) > 状态转移:创建 -> 运行 -> 暂停 -> 退出,最好有个状态机的图 > > 实现 ThreadState,最好能加一个单元测试来验证转移过程 +```rust +pub enum ThreadState { + New, \\该线程已经创建,但还没有开始运行 + Running, \\该线程正在正常运行用户代码 + Suspended, \\由于zx_task_suspend()而暂停 + Blocked, \\在一个系统调用中或处理一个异常而阻塞 + Dying, \\线程正在被终止的过程中,但还没有停止运行 + Dead, \\该线程已停止运行 + BlockedException, \\该线程在一个异常中被阻塞 + BlockedSleeping, \\该线程在zx_nanosleep()中被阻塞 + BlockedFutex, \\该线程在zx_futex_wait()中被阻塞 + BlockedPort, \\该线程在zx_port_wait()中被被阻塞 + BlockedChannel, \\该线程在zx_channel_call()中被阻塞 + BlockedWaitOne, \\该线程在zx_object_wait_one()中被阻塞 + BlockedWaitMany, \\该线程在zx_object_wait_many()中被阻塞 + BlockedInterrupt, \\该线程在zx_interrupt_wait()中被阻塞 + BlockedPager, \\被Pager阻塞 (目前没用到???) +} +``` + + + ## 线程寄存器上下文 > 定义 ThreadState,实现 read_state,write_state + + ## Async 运行时和 HAL 硬件抽象层 > 简单介绍 async-std 的异步机制