add process/thread info

dev
Yu Chen 5 years ago
parent 4eeb775c7e
commit ce06a4ad2e

@ -55,4 +55,25 @@
- NewProfile此作业下的一个进程正在尝试创建新的配置文件。
- AmbientMarkVMOExec此作业下的某个进程正在尝试使用带有ZX_HANDLE_INVALID的zx_vmo_replace_as_executable作为第二个参数而不是有效的ZX_RSRC_KIND_VMEX。
## 进程Process
## 进程Process
进程是传统意义上程序的一个运行实例,包含一组指令和数据,这些指令将由一个或多个线程执行,并拥有一组资源。在具体实现上,进程包括如下内容:
- Handles :大部分是进程用到的资源对象的句柄
- Virtual Memory Address Regions进程所在的内存地址空间
- Threads进程包含的线程组
进程包含在作业Job的管理范畴之中。从资源和权限限制以及生命周期控制的角度来看允许将由多个进程组成的应用程序视为一个实体即作业
### 生命周期(lifetime)
进程有自己的生命周期,从开始创建到直到被强制终止或程序退出为止。可通过调用`Process::create()`创建一个进程,并调用`Process::start()`开始执行 。该进程在以下情况下停止执行:
- 最后一个线程终止或退出
- 进程调用 `Process::exit()`
- 父作业parent job终止了该过程
- 父作业parent job被销毁destroied
注:`Process::start()`不能被调用两次。新线程不能被添加到已启动的进程。

@ -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_statewrite_state
## Async 运行时和 HAL 硬件抽象层
> 简单介绍 async-std 的异步机制

Loading…
Cancel
Save